From 1a1c4f28f4956a265e142bac1502f301bd15f20f Mon Sep 17 00:00:00 2001 From: bbracker Date: Wed, 6 Oct 2021 16:51:31 -0400 Subject: [PATCH 001/132] update linker scripts to look for vmlinux files --- wally-pipelined/linux-testgen/linux-testvectors/tvLinker.sh | 3 +++ wally-pipelined/linux-testgen/linux-testvectors/tvUnlinker.sh | 3 +++ 2 files changed, 6 insertions(+) diff --git a/wally-pipelined/linux-testgen/linux-testvectors/tvLinker.sh b/wally-pipelined/linux-testgen/linux-testvectors/tvLinker.sh index f694b112a..70ef47109 100755 --- a/wally-pipelined/linux-testgen/linux-testvectors/tvLinker.sh +++ b/wally-pipelined/linux-testgen/linux-testvectors/tvLinker.sh @@ -2,4 +2,7 @@ echo "Warning: this script will only work if your repo is on Tera" ln -s /courses/e190ax/buildroot_boot/all.txt all.txt ln -s /courses/e190ax/buildroot_boot/bootmem.txt bootmem.txt ln -s /courses/e190ax/buildroot_boot/ram.txt ram.txt +ln -s /courses/e190ax/buildroot_boot/vmlinux.objdump vmlinux.objdump +ln -s /courses/e190ax/buildroot_boot/vmlinux.objdump.addr vmlinux.objdump.addr +ln -s /courses/e190ax/buildroot_boot/vmlinux.objdump.lab vmlinux.objdump.lab echo "Done!" diff --git a/wally-pipelined/linux-testgen/linux-testvectors/tvUnlinker.sh b/wally-pipelined/linux-testgen/linux-testvectors/tvUnlinker.sh index bded8a16e..acf155c00 100755 --- a/wally-pipelined/linux-testgen/linux-testvectors/tvUnlinker.sh +++ b/wally-pipelined/linux-testgen/linux-testvectors/tvUnlinker.sh @@ -3,4 +3,7 @@ unlink all.txt unlink bootmem.txt unlink ram.txt +unlink vmlinux.objdump +unlink vmlinux.objdump.addr +unlink vmlinux.objdump.lab echo "Done!" From a9052cb4552ec679cfb8e4776b8476d9bcf226e8 Mon Sep 17 00:00:00 2001 From: bbracker Date: Thu, 7 Oct 2021 00:58:33 -0400 Subject: [PATCH 002/132] don't log rf[0] to checkpoint --- .../linux-testgen/testvector-generation/parseState.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/wally-pipelined/linux-testgen/testvector-generation/parseState.py b/wally-pipelined/linux-testgen/testvector-generation/parseState.py index cd49ccdf8..5ab70aad0 100755 --- a/wally-pipelined/linux-testgen/testvector-generation/parseState.py +++ b/wally-pipelined/linux-testgen/testvector-generation/parseState.py @@ -47,7 +47,7 @@ for csr in listCSRs: # Initial State for Main Loop currState = 'regFile' regFileIndex = 0 -outFileName = 'checkpoint-regfile.txt' +outFileName = 'checkpoint-RF' outFile = open(outDir+outFileName, 'w') # Main Loop @@ -60,7 +60,9 @@ with open(stateGDBpath, 'r') as stateGDB: if (regFileIndex == 0 and name != 'zero'): print('Whoops! Expected regFile registers to come first, starting with zero') exit(1) - outFile.write(val+'\n') + if (name != 'zero'): + # Wally doesn't need to know zero=0 + outFile.write(val+'\n') regFileIndex += 1 if (regFileIndex == 32): outFile.close() From d45b8fa4dc9de9bf16549bb5083ca4369b745915 Mon Sep 17 00:00:00 2001 From: bbracker Date: Thu, 7 Oct 2021 04:27:45 -0400 Subject: [PATCH 003/132] more checkpoint reformatting --- .../testvector-generation/parseState.py | 23 ++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/wally-pipelined/linux-testgen/testvector-generation/parseState.py b/wally-pipelined/linux-testgen/testvector-generation/parseState.py index 5ab70aad0..50b80782b 100755 --- a/wally-pipelined/linux-testgen/testvector-generation/parseState.py +++ b/wally-pipelined/linux-testgen/testvector-generation/parseState.py @@ -34,12 +34,14 @@ stateGDBpath = outDir+'intermediate-outputs/stateGDB.txt' if not os.path.exists(stateGDBpath): sys.exit('Error input file '+stateGDBpath+'not found') -listCSRs = ['hpmcounter','pmpcfg','pmpaddr'] -singleCSRs = ['mip','mie','mscratch','mcause','mepc','mtvec','medeleg','mideleg','mcounteren','sscratch','scause','sepc','stvec','sedeleg','sideleg','scounteren','satp','mstatus'] +singleCSRs = ['mip','mie','mscratch','mcause','mepc','mtvec','medeleg','mideleg','sscratch','scause','sepc','stvec','sedeleg','sideleg','satp','mstatus'] +thirtyTwoBitCSRs = ['mcounteren','scounteren'] +listCSRs = ['hpmcounter','pmpaddr'] +pmpcfg = ['pmpcfg'] # Initialize List CSR files to empty # (because later we'll open them in append mode) -for csr in listCSRs: +for csr in listCSRs+pmpcfg: outFileName = 'checkpoint-'+csr.upper() outFile = open(outDir+outFileName, 'w') outFile.close() @@ -73,9 +75,24 @@ with open(stateGDBpath, 'r') as stateGDB: outFile = open(outDir+outFileName, 'w') outFile.write(val+'\n') outFile.close() + if name in thirtyTwoBitCSRs: + outFileName = 'checkpoint-'+name.upper() + outFile = open(outDir+outFileName, 'w') + val = int(val,16) & 0xffffffff + outFile.write(hex(val)[2:]+'\n') + outFile.close() elif name.strip('0123456789') in listCSRs: outFileName = 'checkpoint-'+name.upper().strip('0123456789') outFile = open(outDir+outFileName, 'a') outFile.write(val+'\n') outFile.close() + elif name.strip('0123456789') in pmpcfg: + outFileName = 'checkpoint-'+name.upper().strip('0123456789') + outFile = open(outDir+outFileName, 'a') + fourPmp = int(val,16) + for i in range(4): + byte = (fourPmp >> 4*i) & 0xf + outFile.write(hex(byte)[2:]+'\n') + outFile.close() + print("Finished parsing state!") From 6e75f8258975ead111639ff6cccf0fe69d31c846 Mon Sep 17 00:00:00 2001 From: bbracker Date: Thu, 7 Oct 2021 19:15:11 -0400 Subject: [PATCH 004/132] update linux wave-do --- wally-pipelined/regression/linux-wave.do | 393 +++++++++++------------ 1 file changed, 196 insertions(+), 197 deletions(-) diff --git a/wally-pipelined/regression/linux-wave.do b/wally-pipelined/regression/linux-wave.do index 7a0ee7bd9..7c7a300bd 100644 --- a/wally-pipelined/regression/linux-wave.do +++ b/wally-pipelined/regression/linux-wave.do @@ -2,6 +2,7 @@ onerror {resume} quietly WaveActivateNextPane {} 0 add wave -noupdate /testbench/clk add wave -noupdate /testbench/reset +add wave -noupdate -radix unsigned /testbench/InstrCountW add wave -noupdate /testbench/dut/hart/SATP_REGW add wave -noupdate -expand -group {Execution Stage} /testbench/dut/hart/ifu/PCE add wave -noupdate -expand -group {Execution Stage} /testbench/InstrEName @@ -30,25 +31,26 @@ add wave -noupdate -expand -group HDU -group traps /testbench/dut/hart/priv/trap add wave -noupdate -expand -group HDU -group interrupts /testbench/dut/hart/priv/trap/PendingIntsM add wave -noupdate -expand -group HDU -group interrupts /testbench/dut/hart/priv/trap/CommittedM add wave -noupdate -expand -group HDU -group interrupts /testbench/dut/hart/priv/trap/InstrValidM -add wave -noupdate -expand -group HDU -group hazards /testbench/dut/hart/hzu/BPPredWrongE -add wave -noupdate -expand -group HDU -group hazards /testbench/dut/hart/hzu/CSRWritePendingDEM -add wave -noupdate -expand -group HDU -group hazards /testbench/dut/hart/hzu/RetM -add wave -noupdate -expand -group HDU -group hazards -color Pink /testbench/dut/hart/hzu/TrapM -add wave -noupdate -expand -group HDU -group hazards /testbench/dut/hart/hzu/LoadStallD -add wave -noupdate -expand -group HDU -group hazards /testbench/dut/hart/hzu/StoreStallD -add wave -noupdate -expand -group HDU -group hazards /testbench/dut/hart/hzu/ICacheStallF -add wave -noupdate -expand -group HDU -group hazards /testbench/dut/hart/hzu/LSUStall -add wave -noupdate -expand -group HDU -group hazards /testbench/dut/hart/MulDivStallD +add wave -noupdate -expand -group HDU -expand -group hazards /testbench/dut/hart/hzu/BPPredWrongE +add wave -noupdate -expand -group HDU -expand -group hazards /testbench/dut/hart/hzu/CSRWritePendingDEM +add wave -noupdate -expand -group HDU -expand -group hazards /testbench/dut/hart/hzu/RetM +add wave -noupdate -expand -group HDU -expand -group hazards -color Pink /testbench/dut/hart/hzu/TrapM +add wave -noupdate -expand -group HDU -expand -group hazards /testbench/dut/hart/hzu/LoadStallD +add wave -noupdate -expand -group HDU -expand -group hazards /testbench/dut/hart/hzu/StoreStallD +add wave -noupdate -expand -group HDU -expand -group hazards /testbench/dut/hart/hzu/ICacheStallF +add wave -noupdate -expand -group HDU -expand -group hazards /testbench/dut/hart/hzu/LSUStall +add wave -noupdate -expand -group HDU -expand -group hazards /testbench/dut/hart/MulDivStallD +add wave -noupdate -expand -group HDU -expand -group hazards /testbench/dut/hart/hzu/DivBusyE add wave -noupdate -expand -group HDU -group Flush -color Yellow /testbench/dut/hart/hzu/FlushF add wave -noupdate -expand -group HDU -group Flush -color Yellow /testbench/dut/hart/FlushD add wave -noupdate -expand -group HDU -group Flush -color Yellow /testbench/dut/hart/FlushE add wave -noupdate -expand -group HDU -group Flush -color Yellow /testbench/dut/hart/FlushM add wave -noupdate -expand -group HDU -group Flush -color Yellow /testbench/dut/hart/FlushW -add wave -noupdate -expand -group HDU -group Stall -color Orange /testbench/dut/hart/StallF -add wave -noupdate -expand -group HDU -group Stall -color Orange /testbench/dut/hart/StallD -add wave -noupdate -expand -group HDU -group Stall -color Orange /testbench/dut/hart/StallE -add wave -noupdate -expand -group HDU -group Stall -color Orange /testbench/dut/hart/StallM -add wave -noupdate -expand -group HDU -group Stall -color Orange /testbench/dut/hart/StallW +add wave -noupdate -expand -group HDU -expand -group Stall -color Orange /testbench/dut/hart/StallF +add wave -noupdate -expand -group HDU -expand -group Stall -color Orange /testbench/dut/hart/StallD +add wave -noupdate -expand -group HDU -expand -group Stall -color Orange /testbench/dut/hart/StallE +add wave -noupdate -expand -group HDU -expand -group Stall -color Orange /testbench/dut/hart/StallM +add wave -noupdate -expand -group HDU -expand -group Stall -color Orange /testbench/dut/hart/StallW add wave -noupdate -group Bpred -color Orange /testbench/dut/hart/ifu/bpred/bpred/Predictor/DirPredictor/GHR add wave -noupdate -group Bpred -expand -group {branch update selection inputs} /testbench/dut/hart/ifu/bpred/bpred/Predictor/DirPredictor/BPPredF add wave -noupdate -group Bpred -expand -group {branch update selection inputs} {/testbench/dut/hart/ifu/bpred/bpred/Predictor/DirPredictor/InstrClassE[0]} @@ -158,12 +160,12 @@ add wave -noupdate -group {alu execution stage} /testbench/dut/hart/ieu/dp/Write add wave -noupdate -group {alu execution stage} /testbench/dut/hart/ieu/dp/ALUResultE add wave -noupdate -group {alu execution stage} /testbench/dut/hart/ieu/dp/SrcAE add wave -noupdate -group {alu execution stage} /testbench/dut/hart/ieu/dp/SrcBE -add wave -noupdate -group PCS /testbench/dut/hart/ifu/PCNextF -add wave -noupdate -group PCS /testbench/dut/hart/PCF -add wave -noupdate -group PCS /testbench/dut/hart/ifu/PCD -add wave -noupdate -group PCS /testbench/dut/hart/PCE -add wave -noupdate -group PCS /testbench/dut/hart/PCM -add wave -noupdate -group PCS /testbench/PCW +add wave -noupdate -expand -group PCS /testbench/dut/hart/ifu/PCNextF +add wave -noupdate -expand -group PCS /testbench/dut/hart/PCF +add wave -noupdate -expand -group PCS /testbench/dut/hart/ifu/PCD +add wave -noupdate -expand -group PCS /testbench/dut/hart/PCE +add wave -noupdate -expand -group PCS /testbench/dut/hart/PCM +add wave -noupdate -expand -group PCS /testbench/PCW add wave -noupdate -group muldiv /testbench/dut/hart/mdu/InstrD add wave -noupdate -group muldiv /testbench/dut/hart/mdu/SrcAE add wave -noupdate -group muldiv /testbench/dut/hart/mdu/SrcBE @@ -175,41 +177,38 @@ add wave -noupdate -group muldiv /testbench/dut/hart/mdu/StallW add wave -noupdate -group muldiv /testbench/dut/hart/mdu/FlushM add wave -noupdate -group muldiv /testbench/dut/hart/mdu/FlushW add wave -noupdate -group muldiv /testbench/dut/hart/mdu/MulDivResultW -add wave -noupdate -group muldiv /testbench/dut/hart/mdu/genblk1/div/start -add wave -noupdate -group muldiv /testbench/dut/hart/mdu/DivDoneM add wave -noupdate -group muldiv /testbench/dut/hart/mdu/DivBusyE -add wave -noupdate -group divider /testbench/dut/hart/mdu/genblk1/div/fsm1/CURRENT_STATE -add wave -noupdate -group divider /testbench/dut/hart/mdu/genblk1/div/N -add wave -noupdate -group divider /testbench/dut/hart/mdu/genblk1/div/D -add wave -noupdate -group divider /testbench/dut/hart/mdu/genblk1/div/Q -add wave -noupdate -group divider /testbench/dut/hart/mdu/genblk1/div/rem0 -add wave -noupdate -group icache -color Gold /testbench/dut/hart/ifu/icache/controller/CurrState -add wave -noupdate -group icache /testbench/dut/hart/ifu/icache/controller/NextState -add wave -noupdate -group icache /testbench/dut/hart/ifu/ITLBMissF -add wave -noupdate -group icache /testbench/dut/hart/ifu/icache/ITLBWriteF -add wave -noupdate -group icache /testbench/dut/hart/ifu/icache/ReadLineF -add wave -noupdate -group icache /testbench/dut/hart/ifu/icache/PCNextIndexF -add wave -noupdate -group icache /testbench/dut/hart/ifu/icache/ReadLineF -add wave -noupdate -group icache {/testbench/dut/hart/ifu/icache/MemWay[0]/ValidBits} -add wave -noupdate -group icache {/testbench/dut/hart/ifu/icache/MemWay[1]/ValidBits} -add wave -noupdate -group icache {/testbench/dut/hart/ifu/icache/MemWay[2]/ValidBits} -add wave -noupdate -group icache {/testbench/dut/hart/ifu/icache/MemWay[3]/ValidBits} -add wave -noupdate -group icache -expand -group {fsm out and control} /testbench/dut/hart/ifu/icache/controller/hit -add wave -noupdate -group icache -expand -group {fsm out and control} /testbench/dut/hart/ifu/icache/controller/spill -add wave -noupdate -group icache -expand -group {fsm out and control} /testbench/dut/hart/ifu/icache/controller/ICacheStallF -add wave -noupdate -group icache -expand -group {fsm out and control} /testbench/dut/hart/ifu/icache/controller/SavePC -add wave -noupdate -group icache -expand -group {fsm out and control} /testbench/dut/hart/ifu/icache/controller/spillSave -add wave -noupdate -group icache -expand -group {fsm out and control} /testbench/dut/hart/ifu/icache/controller/UnalignedSelect -add wave -noupdate -group icache -expand -group {fsm out and control} /testbench/dut/hart/ifu/icache/controller/spillSave -add wave -noupdate -group icache -expand -group {fsm out and control} /testbench/dut/hart/ifu/icache/controller/CntReset -add wave -noupdate -group icache -expand -group {fsm out and control} /testbench/dut/hart/ifu/icache/controller/PreCntEn -add wave -noupdate -group icache -expand -group {fsm out and control} /testbench/dut/hart/ifu/icache/controller/CntEn -add wave -noupdate -group icache -expand -group memory /testbench/dut/hart/ifu/icache/controller/FetchCountFlag -add wave -noupdate -group icache -expand -group memory /testbench/dut/hart/ifu/icache/FetchCount -add wave -noupdate -group icache -expand -group memory /testbench/dut/hart/ifu/icache/controller/InstrReadF -add wave -noupdate -group icache -expand -group memory /testbench/dut/hart/ifu/icache/controller/InstrAckF -add wave -noupdate -group icache -expand -group memory /testbench/dut/hart/ifu/icache/controller/ICacheMemWriteEnable -add wave -noupdate -group icache -expand -group memory /testbench/dut/hart/ifu/icache/ICacheMemWriteData +add wave -noupdate /testbench/dut/hart/mdu/genblk1/div/StartDivideE +add wave -noupdate /testbench/dut/hart/mdu/genblk1/div/BusyE +add wave -noupdate /testbench/dut/hart/mdu/genblk1/div/DivDoneM +add wave -noupdate /testbench/dut/hart/mdu/genblk1/div/DivInitE +add wave -noupdate -expand -group icache -color Gold /testbench/dut/hart/ifu/icache/controller/CurrState +add wave -noupdate -expand -group icache /testbench/dut/hart/ifu/icache/controller/NextState +add wave -noupdate -expand -group icache /testbench/dut/hart/ifu/ITLBMissF +add wave -noupdate -expand -group icache /testbench/dut/hart/ifu/icache/ITLBWriteF +add wave -noupdate -expand -group icache /testbench/dut/hart/ifu/icache/ReadLineF +add wave -noupdate -expand -group icache /testbench/dut/hart/ifu/icache/PCNextIndexF +add wave -noupdate -expand -group icache /testbench/dut/hart/ifu/icache/ReadLineF +add wave -noupdate -expand -group icache {/testbench/dut/hart/ifu/icache/MemWay[0]/ValidBits} +add wave -noupdate -expand -group icache {/testbench/dut/hart/ifu/icache/MemWay[1]/ValidBits} +add wave -noupdate -expand -group icache {/testbench/dut/hart/ifu/icache/MemWay[2]/ValidBits} +add wave -noupdate -expand -group icache {/testbench/dut/hart/ifu/icache/MemWay[3]/ValidBits} +add wave -noupdate -expand -group icache -expand -group {fsm out and control} /testbench/dut/hart/ifu/icache/controller/hit +add wave -noupdate -expand -group icache -expand -group {fsm out and control} /testbench/dut/hart/ifu/icache/controller/spill +add wave -noupdate -expand -group icache -expand -group {fsm out and control} /testbench/dut/hart/ifu/icache/controller/ICacheStallF +add wave -noupdate -expand -group icache -expand -group {fsm out and control} /testbench/dut/hart/ifu/icache/controller/SavePC +add wave -noupdate -expand -group icache -expand -group {fsm out and control} /testbench/dut/hart/ifu/icache/controller/spillSave +add wave -noupdate -expand -group icache -expand -group {fsm out and control} /testbench/dut/hart/ifu/icache/controller/UnalignedSelect +add wave -noupdate -expand -group icache -expand -group {fsm out and control} /testbench/dut/hart/ifu/icache/controller/spillSave +add wave -noupdate -expand -group icache -expand -group {fsm out and control} /testbench/dut/hart/ifu/icache/controller/CntReset +add wave -noupdate -expand -group icache -expand -group {fsm out and control} /testbench/dut/hart/ifu/icache/controller/PreCntEn +add wave -noupdate -expand -group icache -expand -group {fsm out and control} /testbench/dut/hart/ifu/icache/controller/CntEn +add wave -noupdate -expand -group icache -expand -group memory /testbench/dut/hart/ifu/icache/controller/FetchCountFlag +add wave -noupdate -expand -group icache -expand -group memory /testbench/dut/hart/ifu/icache/FetchCount +add wave -noupdate -expand -group icache -expand -group memory /testbench/dut/hart/ifu/icache/controller/InstrReadF +add wave -noupdate -expand -group icache -expand -group memory /testbench/dut/hart/ifu/icache/controller/InstrAckF +add wave -noupdate -expand -group icache -expand -group memory /testbench/dut/hart/ifu/icache/controller/ICacheMemWriteEnable +add wave -noupdate -expand -group icache -expand -group memory /testbench/dut/hart/ifu/icache/ICacheMemWriteData add wave -noupdate -group AHB -color Gold /testbench/dut/hart/ebu/BusState add wave -noupdate -group AHB /testbench/dut/hart/ebu/NextBusState add wave -noupdate -group AHB -expand -group {input requests} /testbench/dut/hart/ebu/AtomicMaskedM @@ -232,133 +231,133 @@ add wave -noupdate -group AHB /testbench/dut/hart/ebu/HADDRD add wave -noupdate -group AHB /testbench/dut/hart/ebu/HSIZED add wave -noupdate -group AHB /testbench/dut/hart/ebu/HWRITED add wave -noupdate -group AHB /testbench/dut/hart/ebu/StallW -add wave -noupdate -expand -group lsu -expand -group {LSU ARB} /testbench/dut/hart/lsu/arbiter/SelPTW -add wave -noupdate -expand -group lsu -expand -group dcache -color Gold /testbench/dut/hart/lsu/dcache/dcachefsm/CurrState -add wave -noupdate -expand -group lsu -expand -group dcache /testbench/dut/hart/lsu/dcache/WalkerPageFaultM -add wave -noupdate -expand -group lsu -expand -group dcache /testbench/dut/hart/lsu/dcache/WriteDataM -add wave -noupdate -expand -group lsu -expand -group dcache /testbench/dut/hart/lsu/dcache/SRAMBlockWriteEnableM -add wave -noupdate -expand -group lsu -expand -group dcache /testbench/dut/hart/lsu/dcache/SRAMWordWriteEnableM -add wave -noupdate -expand -group lsu -expand -group dcache /testbench/dut/hart/lsu/dcache/SRAMWayWriteEnable -add wave -noupdate -expand -group lsu -expand -group dcache /testbench/dut/hart/lsu/dcache/SRAMWordEnable -add wave -noupdate -expand -group lsu -expand -group dcache /testbench/dut/hart/lsu/dcache/SRAMBlockWayWriteEnableM -add wave -noupdate -expand -group lsu -expand -group dcache /testbench/dut/hart/lsu/dcache/SelAdrM -add wave -noupdate -expand -group lsu -expand -group dcache /testbench/dut/hart/lsu/dcache/ReadDataBlockM -add wave -noupdate -expand -group lsu -expand -group dcache -group flush -radix unsigned /testbench/dut/hart/lsu/dcache/FlushAdr -add wave -noupdate -expand -group lsu -expand -group dcache -group flush /testbench/dut/hart/lsu/dcache/FlushWay -add wave -noupdate -expand -group lsu -expand -group dcache -group flush /testbench/dut/hart/lsu/dcache/VictimDirtyWay -add wave -noupdate -expand -group lsu -expand -group dcache -group flush /testbench/dut/hart/lsu/dcache/VictimTag -add wave -noupdate -expand -group lsu -expand -group dcache -group flush /testbench/dut/hart/lsu/dcache/BasePAdrM -add wave -noupdate -expand -group lsu -expand -group dcache -group flush /testbench/dut/hart/lsu/dcache/FetchCount -add wave -noupdate -expand -group lsu -expand -group dcache -group flush /testbench/dut/hart/lsu/dcache/CacheableM -add wave -noupdate -expand -group lsu -expand -group dcache /testbench/dut/hart/lsu/dcache/DCacheMemWriteData -add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {Cache SRAM writes} -group way0 {/testbench/dut/hart/lsu/dcache/MemWay[0]/WriteEnable} -add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {Cache SRAM writes} -group way0 {/testbench/dut/hart/lsu/dcache/MemWay[0]/SetValid} -add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {Cache SRAM writes} -group way0 {/testbench/dut/hart/lsu/dcache/MemWay[0]/SetDirty} -add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {Cache SRAM writes} -group way0 -label TAG {/testbench/dut/hart/lsu/dcache/MemWay[0]/CacheTagMem/StoredData} -add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {Cache SRAM writes} -group way0 {/testbench/dut/hart/lsu/dcache/MemWay[0]/DirtyBits} -add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {Cache SRAM writes} -group way0 {/testbench/dut/hart/lsu/dcache/MemWay[0]/ValidBits} -add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {Cache SRAM writes} -group way0 -expand -group Way0Word0 {/testbench/dut/hart/lsu/dcache/MemWay[0]/word[0]/CacheDataMem/StoredData} -add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {Cache SRAM writes} -group way0 -expand -group Way0Word0 {/testbench/dut/hart/lsu/dcache/MemWay[0]/word[0]/CacheDataMem/WriteEnable} -add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {Cache SRAM writes} -group way0 -expand -group Way0Word1 {/testbench/dut/hart/lsu/dcache/MemWay[0]/word[1]/CacheDataMem/StoredData} -add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {Cache SRAM writes} -group way0 -expand -group Way0Word1 {/testbench/dut/hart/lsu/dcache/MemWay[0]/word[1]/CacheDataMem/WriteEnable} -add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {Cache SRAM writes} -group way0 -expand -group Way0Word2 {/testbench/dut/hart/lsu/dcache/MemWay[0]/word[2]/CacheDataMem/WriteEnable} -add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {Cache SRAM writes} -group way0 -expand -group Way0Word2 {/testbench/dut/hart/lsu/dcache/MemWay[0]/word[2]/CacheDataMem/StoredData} -add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {Cache SRAM writes} -group way0 -expand -group Way0Word3 {/testbench/dut/hart/lsu/dcache/MemWay[0]/word[3]/CacheDataMem/WriteEnable} -add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {Cache SRAM writes} -group way0 -expand -group Way0Word3 {/testbench/dut/hart/lsu/dcache/MemWay[0]/word[3]/CacheDataMem/StoredData} -add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {Cache SRAM writes} -group way1 {/testbench/dut/hart/lsu/dcache/MemWay[1]/DirtyBits} -add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {Cache SRAM writes} -group way1 {/testbench/dut/hart/lsu/dcache/MemWay[1]/ValidBits} -add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {Cache SRAM writes} -group way1 {/testbench/dut/hart/lsu/dcache/MemWay[1]/SetDirty} -add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {Cache SRAM writes} -group way1 {/testbench/dut/hart/lsu/dcache/MemWay[1]/WriteEnable} -add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {Cache SRAM writes} -group way1 {/testbench/dut/hart/lsu/dcache/MemWay[1]/WriteWordEnable} -add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {Cache SRAM writes} -group way1 -label TAG {/testbench/dut/hart/lsu/dcache/MemWay[1]/CacheTagMem/StoredData} -add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {Cache SRAM writes} -group way1 -expand -group Way1Word0 {/testbench/dut/hart/lsu/dcache/MemWay[1]/word[0]/CacheDataMem/WriteEnable} -add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {Cache SRAM writes} -group way1 -expand -group Way1Word0 {/testbench/dut/hart/lsu/dcache/MemWay[1]/word[0]/CacheDataMem/StoredData} -add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {Cache SRAM writes} -group way1 -expand -group Way1Word1 {/testbench/dut/hart/lsu/dcache/MemWay[1]/word[1]/CacheDataMem/WriteEnable} -add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {Cache SRAM writes} -group way1 -expand -group Way1Word1 {/testbench/dut/hart/lsu/dcache/MemWay[1]/word[1]/CacheDataMem/StoredData} -add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {Cache SRAM writes} -group way1 -expand -group Way1Word2 {/testbench/dut/hart/lsu/dcache/MemWay[1]/word[2]/CacheDataMem/WriteEnable} -add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {Cache SRAM writes} -group way1 -expand -group Way1Word2 {/testbench/dut/hart/lsu/dcache/MemWay[1]/word[2]/CacheDataMem/StoredData} -add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {Cache SRAM writes} -group way1 -expand -group Way1Word3 {/testbench/dut/hart/lsu/dcache/MemWay[1]/word[3]/CacheDataMem/WriteEnable} -add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {Cache SRAM writes} -group way1 -expand -group Way1Word3 {/testbench/dut/hart/lsu/dcache/MemWay[1]/word[3]/CacheDataMem/StoredData} -add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {Cache SRAM writes} -group way2 {/testbench/dut/hart/lsu/dcache/MemWay[2]/WriteEnable} -add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {Cache SRAM writes} -group way2 {/testbench/dut/hart/lsu/dcache/MemWay[2]/SetValid} -add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {Cache SRAM writes} -group way2 {/testbench/dut/hart/lsu/dcache/MemWay[2]/SetDirty} -add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {Cache SRAM writes} -group way2 -label TAG {/testbench/dut/hart/lsu/dcache/MemWay[2]/CacheTagMem/StoredData} -add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {Cache SRAM writes} -group way2 {/testbench/dut/hart/lsu/dcache/MemWay[2]/DirtyBits} -add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {Cache SRAM writes} -group way2 {/testbench/dut/hart/lsu/dcache/MemWay[2]/ValidBits} -add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {Cache SRAM writes} -group way2 -expand -group Way2Word0 {/testbench/dut/hart/lsu/dcache/MemWay[2]/word[0]/CacheDataMem/StoredData} -add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {Cache SRAM writes} -group way2 -expand -group Way2Word0 {/testbench/dut/hart/lsu/dcache/MemWay[2]/word[0]/CacheDataMem/WriteEnable} -add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {Cache SRAM writes} -group way2 -expand -group Way2Word1 {/testbench/dut/hart/lsu/dcache/MemWay[2]/word[1]/CacheDataMem/StoredData} -add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {Cache SRAM writes} -group way2 -expand -group Way2Word1 {/testbench/dut/hart/lsu/dcache/MemWay[2]/word[1]/CacheDataMem/WriteEnable} -add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {Cache SRAM writes} -group way2 -expand -group Way2Word2 {/testbench/dut/hart/lsu/dcache/MemWay[2]/word[2]/CacheDataMem/WriteEnable} -add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {Cache SRAM writes} -group way2 -expand -group Way2Word2 {/testbench/dut/hart/lsu/dcache/MemWay[2]/word[2]/CacheDataMem/StoredData} -add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {Cache SRAM writes} -group way2 -expand -group Way2Word3 {/testbench/dut/hart/lsu/dcache/MemWay[2]/word[3]/CacheDataMem/WriteEnable} -add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {Cache SRAM writes} -group way2 -expand -group Way2Word3 {/testbench/dut/hart/lsu/dcache/MemWay[2]/word[3]/CacheDataMem/StoredData} -add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {Cache SRAM writes} -group way3 {/testbench/dut/hart/lsu/dcache/MemWay[3]/WriteEnable} -add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {Cache SRAM writes} -group way3 {/testbench/dut/hart/lsu/dcache/MemWay[3]/SetValid} -add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {Cache SRAM writes} -group way3 {/testbench/dut/hart/lsu/dcache/MemWay[3]/SetDirty} -add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {Cache SRAM writes} -group way3 {/testbench/dut/hart/lsu/dcache/MemWay[3]/ClearDirty} -add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {Cache SRAM writes} -group way3 {/testbench/dut/hart/lsu/dcache/MemWay[3]/VDWriteEnable} -add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {Cache SRAM writes} -group way3 -label TAG {/testbench/dut/hart/lsu/dcache/MemWay[3]/CacheTagMem/StoredData} -add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {Cache SRAM writes} -group way3 {/testbench/dut/hart/lsu/dcache/MemWay[3]/DirtyBits} -add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {Cache SRAM writes} -group way3 {/testbench/dut/hart/lsu/dcache/MemWay[3]/ValidBits} -add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {Cache SRAM writes} -group way3 -expand -group Way3Word0 {/testbench/dut/hart/lsu/dcache/MemWay[3]/word[0]/CacheDataMem/StoredData} -add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {Cache SRAM writes} -group way3 -expand -group Way3Word0 {/testbench/dut/hart/lsu/dcache/MemWay[3]/word[0]/CacheDataMem/WriteEnable} -add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {Cache SRAM writes} -group way3 -expand -group Way3Word1 {/testbench/dut/hart/lsu/dcache/MemWay[3]/word[1]/CacheDataMem/StoredData} -add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {Cache SRAM writes} -group way3 -expand -group Way3Word1 {/testbench/dut/hart/lsu/dcache/MemWay[3]/word[1]/CacheDataMem/WriteEnable} -add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {Cache SRAM writes} -group way3 -expand -group Way3Word2 {/testbench/dut/hart/lsu/dcache/MemWay[3]/word[2]/CacheDataMem/WriteEnable} -add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {Cache SRAM writes} -group way3 -expand -group Way3Word2 {/testbench/dut/hart/lsu/dcache/MemWay[3]/word[2]/CacheDataMem/StoredData} -add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {Cache SRAM writes} -group way3 -expand -group Way3Word3 {/testbench/dut/hart/lsu/dcache/MemWay[3]/word[3]/CacheDataMem/WriteEnable} -add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {Cache SRAM writes} -group way3 -expand -group Way3Word3 {/testbench/dut/hart/lsu/dcache/MemWay[3]/word[3]/CacheDataMem/StoredData} -add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {Cache SRAM writes} -group valid/dirty /testbench/dut/hart/lsu/dcache/SetValid -add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {Cache SRAM writes} -group valid/dirty /testbench/dut/hart/lsu/dcache/ClearValid -add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {Cache SRAM writes} -group valid/dirty /testbench/dut/hart/lsu/dcache/SetDirty -add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {Cache SRAM writes} -group valid/dirty /testbench/dut/hart/lsu/dcache/ClearDirty -add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM read} /testbench/dut/hart/lsu/dcache/RAdr -add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM read} -expand -group way0 {/testbench/dut/hart/lsu/dcache/MemWay[0]/WayHit} -add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM read} -expand -group way0 {/testbench/dut/hart/lsu/dcache/MemWay[0]/Valid} -add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM read} -expand -group way0 {/testbench/dut/hart/lsu/dcache/MemWay[0]/Dirty} -add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM read} -expand -group way0 {/testbench/dut/hart/lsu/dcache/MemWay[0]/ReadTag} -add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM read} -expand -group way1 {/testbench/dut/hart/lsu/dcache/MemWay[1]/WayHit} -add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM read} -expand -group way1 {/testbench/dut/hart/lsu/dcache/MemWay[1]/Valid} -add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM read} -expand -group way1 {/testbench/dut/hart/lsu/dcache/MemWay[1]/Dirty} -add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM read} -expand -group way1 {/testbench/dut/hart/lsu/dcache/MemWay[1]/ReadTag} -add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM read} -expand -group way2 {/testbench/dut/hart/lsu/dcache/MemWay[2]/WayHit} -add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM read} -expand -group way2 {/testbench/dut/hart/lsu/dcache/MemWay[2]/Valid} -add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM read} -expand -group way2 {/testbench/dut/hart/lsu/dcache/MemWay[2]/Dirty} -add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM read} -expand -group way2 {/testbench/dut/hart/lsu/dcache/MemWay[2]/ReadTag} -add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM read} -expand -group way3 {/testbench/dut/hart/lsu/dcache/MemWay[3]/WayHit} -add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM read} -expand -group way3 {/testbench/dut/hart/lsu/dcache/MemWay[3]/Valid} -add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM read} -expand -group way3 {/testbench/dut/hart/lsu/dcache/MemWay[3]/Dirty} -add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM read} -expand -group way3 {/testbench/dut/hart/lsu/dcache/MemWay[3]/ReadTag} -add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM read} /testbench/dut/hart/lsu/dcache/WayHit -add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM read} /testbench/dut/hart/lsu/dcache/ReadDataBlockWayMaskedM -add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM read} /testbench/dut/hart/lsu/dcache/ReadDataWordM -add wave -noupdate -expand -group lsu -expand -group dcache -group {Cache SRAM read} /testbench/dut/hart/lsu/dcache/ReadDataWordMuxM -add wave -noupdate -expand -group lsu -expand -group dcache -group Victim /testbench/dut/hart/lsu/dcache/VictimTag -add wave -noupdate -expand -group lsu -expand -group dcache -group Victim /testbench/dut/hart/lsu/dcache/VictimWay -add wave -noupdate -expand -group lsu -expand -group dcache -group Victim /testbench/dut/hart/lsu/dcache/VictimDirtyWay -add wave -noupdate -expand -group lsu -expand -group dcache -group Victim /testbench/dut/hart/lsu/dcache/VictimDirty -add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {CPU side} /testbench/dut/hart/lsu/dcache/MemRWM -add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {CPU side} /testbench/dut/hart/lsu/dcache/MemAdrE -add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {CPU side} /testbench/dut/hart/lsu/dcache/MemPAdrM -add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {CPU side} /testbench/dut/hart/lsu/dcache/Funct3M -add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {CPU side} /testbench/dut/hart/lsu/dcache/Funct7M -add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {CPU side} /testbench/dut/hart/lsu/dcache/AtomicM -add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {CPU side} /testbench/dut/hart/lsu/dcache/CacheableM -add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {CPU side} /testbench/dut/hart/lsu/dcache/FlushDCacheM -add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {CPU side} /testbench/dut/hart/lsu/dcache/WriteDataM -add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {CPU side} /testbench/dut/hart/lsu/dcache/ReadDataM -add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {CPU side} /testbench/dut/hart/lsu/dcache/DCacheStall -add wave -noupdate -expand -group lsu -expand -group dcache -group status /testbench/dut/hart/lsu/dcache/WayHit -add wave -noupdate -expand -group lsu -expand -group dcache -group status -color {Medium Orchid} /testbench/dut/hart/lsu/dcache/CacheHit -add wave -noupdate -expand -group lsu -expand -group dcache -group status /testbench/dut/hart/lsu/dcache/FetchCount -add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {Memory Side} /testbench/dut/hart/lsu/dcache/AHBPAdr -add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {Memory Side} /testbench/dut/hart/lsu/dcache/AHBRead -add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {Memory Side} /testbench/dut/hart/lsu/dcache/AHBWrite -add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {Memory Side} /testbench/dut/hart/lsu/dcache/AHBAck -add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {Memory Side} /testbench/dut/hart/lsu/dcache/HRDATA -add wave -noupdate -expand -group lsu -expand -group dcache -expand -group {Memory Side} /testbench/dut/hart/lsu/dcache/HWDATA -add wave -noupdate -expand -group lsu -expand -group dcache /testbench/dut/hart/lsu/dcache/FlushWay +add wave -noupdate -expand -group lsu -group {LSU ARB} /testbench/dut/hart/lsu/arbiter/SelPTW +add wave -noupdate -expand -group lsu -group dcache -color Gold /testbench/dut/hart/lsu/dcache/dcachefsm/CurrState +add wave -noupdate -expand -group lsu -group dcache /testbench/dut/hart/lsu/dcache/WalkerPageFaultM +add wave -noupdate -expand -group lsu -group dcache /testbench/dut/hart/lsu/dcache/WriteDataM +add wave -noupdate -expand -group lsu -group dcache /testbench/dut/hart/lsu/dcache/SRAMBlockWriteEnableM +add wave -noupdate -expand -group lsu -group dcache /testbench/dut/hart/lsu/dcache/SRAMWordWriteEnableM +add wave -noupdate -expand -group lsu -group dcache /testbench/dut/hart/lsu/dcache/SRAMWayWriteEnable +add wave -noupdate -expand -group lsu -group dcache /testbench/dut/hart/lsu/dcache/SRAMWordEnable +add wave -noupdate -expand -group lsu -group dcache /testbench/dut/hart/lsu/dcache/SRAMBlockWayWriteEnableM +add wave -noupdate -expand -group lsu -group dcache /testbench/dut/hart/lsu/dcache/SelAdrM +add wave -noupdate -expand -group lsu -group dcache /testbench/dut/hart/lsu/dcache/ReadDataBlockM +add wave -noupdate -expand -group lsu -group dcache -group flush -radix unsigned /testbench/dut/hart/lsu/dcache/FlushAdr +add wave -noupdate -expand -group lsu -group dcache -group flush /testbench/dut/hart/lsu/dcache/FlushWay +add wave -noupdate -expand -group lsu -group dcache -group flush /testbench/dut/hart/lsu/dcache/VictimDirtyWay +add wave -noupdate -expand -group lsu -group dcache -group flush /testbench/dut/hart/lsu/dcache/VictimTag +add wave -noupdate -expand -group lsu -group dcache -group flush /testbench/dut/hart/lsu/dcache/BasePAdrM +add wave -noupdate -expand -group lsu -group dcache -group flush /testbench/dut/hart/lsu/dcache/FetchCount +add wave -noupdate -expand -group lsu -group dcache -group flush /testbench/dut/hart/lsu/dcache/CacheableM +add wave -noupdate -expand -group lsu -group dcache /testbench/dut/hart/lsu/dcache/DCacheMemWriteData +add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way0 {/testbench/dut/hart/lsu/dcache/MemWay[0]/WriteEnable} +add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way0 {/testbench/dut/hart/lsu/dcache/MemWay[0]/SetValid} +add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way0 {/testbench/dut/hart/lsu/dcache/MemWay[0]/SetDirty} +add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way0 -label TAG {/testbench/dut/hart/lsu/dcache/MemWay[0]/CacheTagMem/StoredData} +add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way0 {/testbench/dut/hart/lsu/dcache/MemWay[0]/DirtyBits} +add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way0 {/testbench/dut/hart/lsu/dcache/MemWay[0]/ValidBits} +add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way0 -expand -group Way0Word0 {/testbench/dut/hart/lsu/dcache/MemWay[0]/word[0]/CacheDataMem/StoredData} +add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way0 -expand -group Way0Word0 {/testbench/dut/hart/lsu/dcache/MemWay[0]/word[0]/CacheDataMem/WriteEnable} +add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way0 -expand -group Way0Word1 {/testbench/dut/hart/lsu/dcache/MemWay[0]/word[1]/CacheDataMem/StoredData} +add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way0 -expand -group Way0Word1 {/testbench/dut/hart/lsu/dcache/MemWay[0]/word[1]/CacheDataMem/WriteEnable} +add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way0 -expand -group Way0Word2 {/testbench/dut/hart/lsu/dcache/MemWay[0]/word[2]/CacheDataMem/WriteEnable} +add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way0 -expand -group Way0Word2 {/testbench/dut/hart/lsu/dcache/MemWay[0]/word[2]/CacheDataMem/StoredData} +add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way0 -expand -group Way0Word3 {/testbench/dut/hart/lsu/dcache/MemWay[0]/word[3]/CacheDataMem/WriteEnable} +add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way0 -expand -group Way0Word3 {/testbench/dut/hart/lsu/dcache/MemWay[0]/word[3]/CacheDataMem/StoredData} +add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way1 {/testbench/dut/hart/lsu/dcache/MemWay[1]/DirtyBits} +add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way1 {/testbench/dut/hart/lsu/dcache/MemWay[1]/ValidBits} +add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way1 {/testbench/dut/hart/lsu/dcache/MemWay[1]/SetDirty} +add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way1 {/testbench/dut/hart/lsu/dcache/MemWay[1]/WriteEnable} +add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way1 {/testbench/dut/hart/lsu/dcache/MemWay[1]/WriteWordEnable} +add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way1 -label TAG {/testbench/dut/hart/lsu/dcache/MemWay[1]/CacheTagMem/StoredData} +add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way1 -expand -group Way1Word0 {/testbench/dut/hart/lsu/dcache/MemWay[1]/word[0]/CacheDataMem/WriteEnable} +add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way1 -expand -group Way1Word0 {/testbench/dut/hart/lsu/dcache/MemWay[1]/word[0]/CacheDataMem/StoredData} +add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way1 -expand -group Way1Word1 {/testbench/dut/hart/lsu/dcache/MemWay[1]/word[1]/CacheDataMem/WriteEnable} +add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way1 -expand -group Way1Word1 {/testbench/dut/hart/lsu/dcache/MemWay[1]/word[1]/CacheDataMem/StoredData} +add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way1 -expand -group Way1Word2 {/testbench/dut/hart/lsu/dcache/MemWay[1]/word[2]/CacheDataMem/WriteEnable} +add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way1 -expand -group Way1Word2 {/testbench/dut/hart/lsu/dcache/MemWay[1]/word[2]/CacheDataMem/StoredData} +add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way1 -expand -group Way1Word3 {/testbench/dut/hart/lsu/dcache/MemWay[1]/word[3]/CacheDataMem/WriteEnable} +add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way1 -expand -group Way1Word3 {/testbench/dut/hart/lsu/dcache/MemWay[1]/word[3]/CacheDataMem/StoredData} +add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way2 {/testbench/dut/hart/lsu/dcache/MemWay[2]/WriteEnable} +add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way2 {/testbench/dut/hart/lsu/dcache/MemWay[2]/SetValid} +add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way2 {/testbench/dut/hart/lsu/dcache/MemWay[2]/SetDirty} +add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way2 -label TAG {/testbench/dut/hart/lsu/dcache/MemWay[2]/CacheTagMem/StoredData} +add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way2 {/testbench/dut/hart/lsu/dcache/MemWay[2]/DirtyBits} +add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way2 {/testbench/dut/hart/lsu/dcache/MemWay[2]/ValidBits} +add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way2 -expand -group Way2Word0 {/testbench/dut/hart/lsu/dcache/MemWay[2]/word[0]/CacheDataMem/StoredData} +add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way2 -expand -group Way2Word0 {/testbench/dut/hart/lsu/dcache/MemWay[2]/word[0]/CacheDataMem/WriteEnable} +add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way2 -expand -group Way2Word1 {/testbench/dut/hart/lsu/dcache/MemWay[2]/word[1]/CacheDataMem/StoredData} +add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way2 -expand -group Way2Word1 {/testbench/dut/hart/lsu/dcache/MemWay[2]/word[1]/CacheDataMem/WriteEnable} +add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way2 -expand -group Way2Word2 {/testbench/dut/hart/lsu/dcache/MemWay[2]/word[2]/CacheDataMem/WriteEnable} +add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way2 -expand -group Way2Word2 {/testbench/dut/hart/lsu/dcache/MemWay[2]/word[2]/CacheDataMem/StoredData} +add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way2 -expand -group Way2Word3 {/testbench/dut/hart/lsu/dcache/MemWay[2]/word[3]/CacheDataMem/WriteEnable} +add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way2 -expand -group Way2Word3 {/testbench/dut/hart/lsu/dcache/MemWay[2]/word[3]/CacheDataMem/StoredData} +add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way3 {/testbench/dut/hart/lsu/dcache/MemWay[3]/WriteEnable} +add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way3 {/testbench/dut/hart/lsu/dcache/MemWay[3]/SetValid} +add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way3 {/testbench/dut/hart/lsu/dcache/MemWay[3]/SetDirty} +add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way3 {/testbench/dut/hart/lsu/dcache/MemWay[3]/ClearDirty} +add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way3 {/testbench/dut/hart/lsu/dcache/MemWay[3]/VDWriteEnable} +add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way3 -label TAG {/testbench/dut/hart/lsu/dcache/MemWay[3]/CacheTagMem/StoredData} +add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way3 {/testbench/dut/hart/lsu/dcache/MemWay[3]/DirtyBits} +add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way3 {/testbench/dut/hart/lsu/dcache/MemWay[3]/ValidBits} +add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way3 -expand -group Way3Word0 {/testbench/dut/hart/lsu/dcache/MemWay[3]/word[0]/CacheDataMem/StoredData} +add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way3 -expand -group Way3Word0 {/testbench/dut/hart/lsu/dcache/MemWay[3]/word[0]/CacheDataMem/WriteEnable} +add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way3 -expand -group Way3Word1 {/testbench/dut/hart/lsu/dcache/MemWay[3]/word[1]/CacheDataMem/StoredData} +add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way3 -expand -group Way3Word1 {/testbench/dut/hart/lsu/dcache/MemWay[3]/word[1]/CacheDataMem/WriteEnable} +add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way3 -expand -group Way3Word2 {/testbench/dut/hart/lsu/dcache/MemWay[3]/word[2]/CacheDataMem/WriteEnable} +add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way3 -expand -group Way3Word2 {/testbench/dut/hart/lsu/dcache/MemWay[3]/word[2]/CacheDataMem/StoredData} +add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way3 -expand -group Way3Word3 {/testbench/dut/hart/lsu/dcache/MemWay[3]/word[3]/CacheDataMem/WriteEnable} +add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way3 -expand -group Way3Word3 {/testbench/dut/hart/lsu/dcache/MemWay[3]/word[3]/CacheDataMem/StoredData} +add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group valid/dirty /testbench/dut/hart/lsu/dcache/SetValid +add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group valid/dirty /testbench/dut/hart/lsu/dcache/ClearValid +add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group valid/dirty /testbench/dut/hart/lsu/dcache/SetDirty +add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group valid/dirty /testbench/dut/hart/lsu/dcache/ClearDirty +add wave -noupdate -expand -group lsu -group dcache -group {Cache SRAM read} /testbench/dut/hart/lsu/dcache/RAdr +add wave -noupdate -expand -group lsu -group dcache -group {Cache SRAM read} -expand -group way0 {/testbench/dut/hart/lsu/dcache/MemWay[0]/WayHit} +add wave -noupdate -expand -group lsu -group dcache -group {Cache SRAM read} -expand -group way0 {/testbench/dut/hart/lsu/dcache/MemWay[0]/Valid} +add wave -noupdate -expand -group lsu -group dcache -group {Cache SRAM read} -expand -group way0 {/testbench/dut/hart/lsu/dcache/MemWay[0]/Dirty} +add wave -noupdate -expand -group lsu -group dcache -group {Cache SRAM read} -expand -group way0 {/testbench/dut/hart/lsu/dcache/MemWay[0]/ReadTag} +add wave -noupdate -expand -group lsu -group dcache -group {Cache SRAM read} -expand -group way1 {/testbench/dut/hart/lsu/dcache/MemWay[1]/WayHit} +add wave -noupdate -expand -group lsu -group dcache -group {Cache SRAM read} -expand -group way1 {/testbench/dut/hart/lsu/dcache/MemWay[1]/Valid} +add wave -noupdate -expand -group lsu -group dcache -group {Cache SRAM read} -expand -group way1 {/testbench/dut/hart/lsu/dcache/MemWay[1]/Dirty} +add wave -noupdate -expand -group lsu -group dcache -group {Cache SRAM read} -expand -group way1 {/testbench/dut/hart/lsu/dcache/MemWay[1]/ReadTag} +add wave -noupdate -expand -group lsu -group dcache -group {Cache SRAM read} -expand -group way2 {/testbench/dut/hart/lsu/dcache/MemWay[2]/WayHit} +add wave -noupdate -expand -group lsu -group dcache -group {Cache SRAM read} -expand -group way2 {/testbench/dut/hart/lsu/dcache/MemWay[2]/Valid} +add wave -noupdate -expand -group lsu -group dcache -group {Cache SRAM read} -expand -group way2 {/testbench/dut/hart/lsu/dcache/MemWay[2]/Dirty} +add wave -noupdate -expand -group lsu -group dcache -group {Cache SRAM read} -expand -group way2 {/testbench/dut/hart/lsu/dcache/MemWay[2]/ReadTag} +add wave -noupdate -expand -group lsu -group dcache -group {Cache SRAM read} -expand -group way3 {/testbench/dut/hart/lsu/dcache/MemWay[3]/WayHit} +add wave -noupdate -expand -group lsu -group dcache -group {Cache SRAM read} -expand -group way3 {/testbench/dut/hart/lsu/dcache/MemWay[3]/Valid} +add wave -noupdate -expand -group lsu -group dcache -group {Cache SRAM read} -expand -group way3 {/testbench/dut/hart/lsu/dcache/MemWay[3]/Dirty} +add wave -noupdate -expand -group lsu -group dcache -group {Cache SRAM read} -expand -group way3 {/testbench/dut/hart/lsu/dcache/MemWay[3]/ReadTag} +add wave -noupdate -expand -group lsu -group dcache -group {Cache SRAM read} /testbench/dut/hart/lsu/dcache/WayHit +add wave -noupdate -expand -group lsu -group dcache -group {Cache SRAM read} /testbench/dut/hart/lsu/dcache/ReadDataBlockWayMaskedM +add wave -noupdate -expand -group lsu -group dcache -group {Cache SRAM read} /testbench/dut/hart/lsu/dcache/ReadDataWordM +add wave -noupdate -expand -group lsu -group dcache -group {Cache SRAM read} /testbench/dut/hart/lsu/dcache/ReadDataWordMuxM +add wave -noupdate -expand -group lsu -group dcache -group Victim /testbench/dut/hart/lsu/dcache/VictimTag +add wave -noupdate -expand -group lsu -group dcache -group Victim /testbench/dut/hart/lsu/dcache/VictimWay +add wave -noupdate -expand -group lsu -group dcache -group Victim /testbench/dut/hart/lsu/dcache/VictimDirtyWay +add wave -noupdate -expand -group lsu -group dcache -group Victim /testbench/dut/hart/lsu/dcache/VictimDirty +add wave -noupdate -expand -group lsu -group dcache -group {CPU side} /testbench/dut/hart/lsu/dcache/MemRWM +add wave -noupdate -expand -group lsu -group dcache -group {CPU side} /testbench/dut/hart/lsu/dcache/MemAdrE +add wave -noupdate -expand -group lsu -group dcache -group {CPU side} /testbench/dut/hart/lsu/dcache/MemPAdrM +add wave -noupdate -expand -group lsu -group dcache -group {CPU side} /testbench/dut/hart/lsu/dcache/Funct3M +add wave -noupdate -expand -group lsu -group dcache -group {CPU side} /testbench/dut/hart/lsu/dcache/Funct7M +add wave -noupdate -expand -group lsu -group dcache -group {CPU side} /testbench/dut/hart/lsu/dcache/AtomicM +add wave -noupdate -expand -group lsu -group dcache -group {CPU side} /testbench/dut/hart/lsu/dcache/CacheableM +add wave -noupdate -expand -group lsu -group dcache -group {CPU side} /testbench/dut/hart/lsu/dcache/FlushDCacheM +add wave -noupdate -expand -group lsu -group dcache -group {CPU side} /testbench/dut/hart/lsu/dcache/WriteDataM +add wave -noupdate -expand -group lsu -group dcache -group {CPU side} /testbench/dut/hart/lsu/dcache/ReadDataM +add wave -noupdate -expand -group lsu -group dcache -group {CPU side} /testbench/dut/hart/lsu/dcache/DCacheStall +add wave -noupdate -expand -group lsu -group dcache -group status /testbench/dut/hart/lsu/dcache/WayHit +add wave -noupdate -expand -group lsu -group dcache -group status -color {Medium Orchid} /testbench/dut/hart/lsu/dcache/CacheHit +add wave -noupdate -expand -group lsu -group dcache -group status /testbench/dut/hart/lsu/dcache/FetchCount +add wave -noupdate -expand -group lsu -group dcache -group {Memory Side} /testbench/dut/hart/lsu/dcache/AHBPAdr +add wave -noupdate -expand -group lsu -group dcache -group {Memory Side} /testbench/dut/hart/lsu/dcache/AHBRead +add wave -noupdate -expand -group lsu -group dcache -group {Memory Side} /testbench/dut/hart/lsu/dcache/AHBWrite +add wave -noupdate -expand -group lsu -group dcache -group {Memory Side} /testbench/dut/hart/lsu/dcache/AHBAck +add wave -noupdate -expand -group lsu -group dcache -group {Memory Side} /testbench/dut/hart/lsu/dcache/HRDATA +add wave -noupdate -expand -group lsu -group dcache -group {Memory Side} /testbench/dut/hart/lsu/dcache/HWDATA +add wave -noupdate -expand -group lsu -group dcache /testbench/dut/hart/lsu/dcache/FlushWay add wave -noupdate -expand -group lsu -group dtlb /testbench/dut/hart/lsu/dmmu/genblk1/tlb/tlbcontrol/EffectivePrivilegeMode add wave -noupdate -expand -group lsu -group dtlb /testbench/dut/hart/lsu/dmmu/genblk1/tlb/tlbcontrol/Translate add wave -noupdate -expand -group lsu -group dtlb /testbench/dut/hart/lsu/dmmu/genblk1/tlb/tlbcontrol/DisableTranslation @@ -383,19 +382,19 @@ add wave -noupdate -expand -group lsu -group pma /testbench/dut/hart/lsu/dmmu/PM add wave -noupdate -expand -group lsu -group pmp /testbench/dut/hart/lsu/dmmu/PMPInstrAccessFaultF add wave -noupdate -expand -group lsu -group pmp /testbench/dut/hart/lsu/dmmu/PMPLoadAccessFaultM add wave -noupdate -expand -group lsu -group pmp /testbench/dut/hart/lsu/dmmu/PMPStoreAccessFaultM -add wave -noupdate -expand -group lsu -group ptwalker -color Gold /testbench/dut/hart/lsu/hptw/genblk1/WalkerState -add wave -noupdate -expand -group lsu -group ptwalker /testbench/dut/hart/lsu/hptw/PCF -add wave -noupdate -expand -group lsu -group ptwalker /testbench/dut/hart/lsu/hptw/genblk1/TranslationVAdr -add wave -noupdate -expand -group lsu -group ptwalker /testbench/dut/hart/lsu/hptw/TranslationPAdr -add wave -noupdate -expand -group lsu -group ptwalker /testbench/dut/hart/lsu/hptw/HPTWReadPTE -add wave -noupdate -expand -group lsu -group ptwalker /testbench/dut/hart/lsu/hptw/PTE -add wave -noupdate -expand -group lsu -group ptwalker -expand -group types /testbench/dut/hart/lsu/hptw/ITLBMissF -add wave -noupdate -expand -group lsu -group ptwalker -expand -group types /testbench/dut/hart/lsu/hptw/DTLBMissM -add wave -noupdate -expand -group lsu -group ptwalker -expand -group types /testbench/dut/hart/lsu/hptw/ITLBWriteF -add wave -noupdate -expand -group lsu -group ptwalker -expand -group types /testbench/dut/hart/lsu/hptw/DTLBWriteM -add wave -noupdate -expand -group lsu -group ptwalker -expand -group types /testbench/dut/hart/lsu/hptw/WalkerInstrPageFaultF -add wave -noupdate -expand -group lsu -group ptwalker -expand -group types /testbench/dut/hart/lsu/hptw/WalkerLoadPageFaultM -add wave -noupdate -expand -group lsu -group ptwalker -expand -group types /testbench/dut/hart/lsu/hptw/WalkerStorePageFaultM +add wave -noupdate -expand -group lsu -expand -group ptwalker -color Gold /testbench/dut/hart/lsu/hptw/genblk1/WalkerState +add wave -noupdate -expand -group lsu -expand -group ptwalker /testbench/dut/hart/lsu/hptw/PCF +add wave -noupdate -expand -group lsu -expand -group ptwalker /testbench/dut/hart/lsu/hptw/genblk1/TranslationVAdr +add wave -noupdate -expand -group lsu -expand -group ptwalker /testbench/dut/hart/lsu/hptw/TranslationPAdr +add wave -noupdate -expand -group lsu -expand -group ptwalker /testbench/dut/hart/lsu/hptw/HPTWReadPTE +add wave -noupdate -expand -group lsu -expand -group ptwalker /testbench/dut/hart/lsu/hptw/PTE +add wave -noupdate -expand -group lsu -expand -group ptwalker -expand -group types /testbench/dut/hart/lsu/hptw/ITLBMissF +add wave -noupdate -expand -group lsu -expand -group ptwalker -expand -group types /testbench/dut/hart/lsu/hptw/DTLBMissM +add wave -noupdate -expand -group lsu -expand -group ptwalker -expand -group types /testbench/dut/hart/lsu/hptw/ITLBWriteF +add wave -noupdate -expand -group lsu -expand -group ptwalker -expand -group types /testbench/dut/hart/lsu/hptw/DTLBWriteM +add wave -noupdate -expand -group lsu -expand -group ptwalker -expand -group types /testbench/dut/hart/lsu/hptw/WalkerInstrPageFaultF +add wave -noupdate -expand -group lsu -expand -group ptwalker -expand -group types /testbench/dut/hart/lsu/hptw/WalkerLoadPageFaultM +add wave -noupdate -expand -group lsu -expand -group ptwalker -expand -group types /testbench/dut/hart/lsu/hptw/WalkerStorePageFaultM add wave -noupdate -group csr -color Gray90 -radix unsigned /testbench/dut/hart/priv/csr/genblk1/counters/genblk1/INSTRET_REGW add wave -noupdate -group csr /testbench/dut/hart/priv/csr/genblk1/counters/genblk1/HPMCOUNTER_REGW add wave -noupdate -group csr -expand -group machine /testbench/dut/hart/priv/csr/genblk1/csrm/MIE_REGW @@ -516,8 +515,8 @@ add wave -noupdate /testbench/dut/uncore/dtim/memwrite add wave -noupdate /testbench/dut/uncore/dtim/HWDATA add wave -noupdate /testbench/dut/uncore/dtim/risingHREADYTim TreeUpdate [SetDefaultTree] -WaveRestoreCursors {{Cursor 23} {209183247 ns} 0} {{Cursor 9} {209026335 ns} 0} -quietly wave cursor active 1 +WaveRestoreCursors {{Cursor 23} {209183247 ns} 0} {{Cursor 5} {37454355 ns} 0} +quietly wave cursor active 2 configure wave -namecolwidth 250 configure wave -valuecolwidth 314 configure wave -justifyvalue left @@ -532,4 +531,4 @@ configure wave -griddelta 40 configure wave -timeline 0 configure wave -timelineunits ns update -WaveRestoreZoom {209183151 ns} {209183343 ns} +WaveRestoreZoom {37454022 ns} {37455158 ns} From 3407b63c8a5c9d31ae085a8d370d3ed6eb974930 Mon Sep 17 00:00:00 2001 From: David Harris Date: Sat, 23 Oct 2021 06:15:26 -0700 Subject: [PATCH 005/132] Added -lint flag to vsim. Cleaned some lint errors. Moved lint-wally to regression directory for convenience. --- wally-pipelined/{ => regression}/lint-wally | 2 +- wally-pipelined/regression/regression-wally.py | 2 +- wally-pipelined/regression/wally-pipelined-batch.do | 2 +- wally-pipelined/regression/wally-pipelined.do | 2 +- wally-pipelined/src/fpu/cla52.sv | 1 + wally-pipelined/src/fpu/divconv_pipe.sv | 2 ++ wally-pipelined/testbench/testbench.sv | 4 ++-- 7 files changed, 9 insertions(+), 6 deletions(-) rename wally-pipelined/{ => regression}/lint-wally (97%) diff --git a/wally-pipelined/lint-wally b/wally-pipelined/regression/lint-wally similarity index 97% rename from wally-pipelined/lint-wally rename to wally-pipelined/regression/lint-wally index bb9984c59..b41ba88f5 100755 --- a/wally-pipelined/lint-wally +++ b/wally-pipelined/regression/lint-wally @@ -4,7 +4,7 @@ export PATH=$PATH:/usr/local/bin/ verilator=`which verilator` -basepath=$(dirname $0) +basepath=$(dirname $0)/.. for config in rv64g rv32g; do echo "$config linting..." if !($verilator --lint-only "$@" --top-module wallypipelinedsoc "-I$basepath/config/shared" "-I$basepath/config/$config" $basepath/src/*/*.sv --relative-includes); then diff --git a/wally-pipelined/regression/regression-wally.py b/wally-pipelined/regression/regression-wally.py index b560e75af..a997c2a7b 100755 --- a/wally-pipelined/regression/regression-wally.py +++ b/wally-pipelined/regression/regression-wally.py @@ -35,7 +35,7 @@ configs = [ ), TestCase( name="lints", - cmd="../lint-wally &> {}", + cmd="./lint-wally &> {}", grepstr="All lints run with no errors or warnings" ), ] diff --git a/wally-pipelined/regression/wally-pipelined-batch.do b/wally-pipelined/regression/wally-pipelined-batch.do index c663dd21c..242b33dbe 100644 --- a/wally-pipelined/regression/wally-pipelined-batch.do +++ b/wally-pipelined/regression/wally-pipelined-batch.do @@ -32,7 +32,7 @@ vlib work_${1}_${2} # default to config/rv64ic, but allow this to be overridden at the command line. For example: # do wally-pipelined-batch.do ../config/rv32ic rv32ic -vlog -work work_${1}_${2} +incdir+../config/$1 +incdir+../config/shared ../testbench/testbench.sv ../testbench/common/*.sv ../src/*/*.sv -suppress 2583 +vlog -lint -work work_${1}_${2} +incdir+../config/$1 +incdir+../config/shared ../testbench/testbench.sv ../testbench/common/*.sv ../src/*/*.sv -suppress 2583 # start and run simulation # remove +acc flag for faster sim during regressions if there is no need to access internal signals diff --git a/wally-pipelined/regression/wally-pipelined.do b/wally-pipelined/regression/wally-pipelined.do index fd7ef2939..477e3a125 100644 --- a/wally-pipelined/regression/wally-pipelined.do +++ b/wally-pipelined/regression/wally-pipelined.do @@ -37,7 +37,7 @@ vlib work #} # start and run simulation # remove +acc flag for faster sim during regressions if there is no need to access internal signals -vlog +incdir+../config/$1 +incdir+../config/shared ../testbench/testbench.sv ../testbench/common/*.sv ../src/*/*.sv -suppress 2583 +vlog -lint +incdir+../config/$1 +incdir+../config/shared ../testbench/testbench.sv ../testbench/common/*.sv ../src/*/*.sv -suppress 2583 vopt +acc work.testbench -G TEST=$2 -o workopt vsim workopt diff --git a/wally-pipelined/src/fpu/cla52.sv b/wally-pipelined/src/fpu/cla52.sv index 0d8967db0..5f818fbd8 100644 --- a/wally-pipelined/src/fpu/cla52.sv +++ b/wally-pipelined/src/fpu/cla52.sv @@ -215,6 +215,7 @@ module cla_sub52 (S, X, Y); wire LOGIC0; wire CIN; wire CO_52; + wire CO_64; assign Bbar = ~B; assign LOGIC0 = 0; diff --git a/wally-pipelined/src/fpu/divconv_pipe.sv b/wally-pipelined/src/fpu/divconv_pipe.sv index 4e3b843d6..e3002cb91 100755 --- a/wally-pipelined/src/fpu/divconv_pipe.sv +++ b/wally-pipelined/src/fpu/divconv_pipe.sv @@ -65,6 +65,8 @@ module divconv_pipe (q1, qm1, qp1, q0, qm0, qp0, rega_out, regb_out, regc_out, r logic [59:0] d2, n2; logic [11:0] d3; + logic muxr_out, cout1, cout2, cout3, cout4, cout5, cout6, cout7; + // Check if exponent is odd for sqrt // If exp_odd=1 and sqrt, then M/2 and use ia_addr=0 as IA assign d2 = (exp_odd&op_type) ? {vss,d,6'h0} : {d,7'h0}; diff --git a/wally-pipelined/testbench/testbench.sv b/wally-pipelined/testbench/testbench.sv index bf6769218..aa597aa04 100644 --- a/wally-pipelined/testbench/testbench.sv +++ b/wally-pipelined/testbench/testbench.sv @@ -27,7 +27,7 @@ `include "wally-config.vh" `include "tests.vh" -module testbench (); +module testbench; parameter TESTSPERIPH = 0; // set to 0 for regression parameter TESTSPRIV = 0; // set to 0 for regression parameter DEBUG=0; @@ -331,7 +331,7 @@ logic [3:0] dummy; endmodule -module riscvassertions(); +module riscvassertions; // Legal number of PMP entries are 0, 16, or 64 initial begin assert (`PMP_ENTRIES == 0 || `PMP_ENTRIES==16 || `PMP_ENTRIES==64) else $error("Illegal number of PMP entries: PMP_ENTRIES must be 0, 16, or 64"); From 8b854bb1c29316d2a71e14f8f7fa5e3d5b624ba6 Mon Sep 17 00:00:00 2001 From: David Harris Date: Sat, 23 Oct 2021 06:28:49 -0700 Subject: [PATCH 006/132] Cleaned up LINT erors --- wally-pipelined/regression/lint-wally | 2 +- wally-pipelined/src/cache/sram1rw.sv | 6 +++++ wally-pipelined/src/fpu/divconv_pipe.sv | 2 +- wally-pipelined/src/ifu/SRAM2P1R1W.sv | 32 ++++++++++++------------- wally-pipelined/src/privileged/csru.sv | 1 - wally-pipelined/testbench/testbench.sv | 4 ++-- 6 files changed, 26 insertions(+), 21 deletions(-) diff --git a/wally-pipelined/regression/lint-wally b/wally-pipelined/regression/lint-wally index b41ba88f5..631a172b4 100755 --- a/wally-pipelined/regression/lint-wally +++ b/wally-pipelined/regression/lint-wally @@ -7,7 +7,7 @@ verilator=`which verilator` basepath=$(dirname $0)/.. for config in rv64g rv32g; do echo "$config linting..." - if !($verilator --lint-only "$@" --top-module wallypipelinedsoc "-I$basepath/config/shared" "-I$basepath/config/$config" $basepath/src/*/*.sv --relative-includes); then + if !($verilator --lint-only --Wall "$@" --top-module wallypipelinedsoc "-I$basepath/config/shared" "-I$basepath/config/$config" $basepath/src/*/*.sv --relative-includes); then echo "Exiting after $config lint due to errors or warnings" exit 1 fi diff --git a/wally-pipelined/src/cache/sram1rw.sv b/wally-pipelined/src/cache/sram1rw.sv index 2b2c2d60b..d2b4b8470 100644 --- a/wally-pipelined/src/cache/sram1rw.sv +++ b/wally-pipelined/src/cache/sram1rw.sv @@ -1,4 +1,7 @@ // Depth is number of bits in one "word" of the memory, width is number of such words + +/* verilator lint_off ASSIGNDLY */ + module sram1rw #(parameter DEPTH=128, WIDTH=256) ( input logic clk, // port 1 is read only @@ -19,3 +22,6 @@ module sram1rw #(parameter DEPTH=128, WIDTH=256) ( end end endmodule + +/* verilator lint_on ASSIGNDLY */ + diff --git a/wally-pipelined/src/fpu/divconv_pipe.sv b/wally-pipelined/src/fpu/divconv_pipe.sv index 49496aa33..3388acc3f 100755 --- a/wally-pipelined/src/fpu/divconv_pipe.sv +++ b/wally-pipelined/src/fpu/divconv_pipe.sv @@ -66,7 +66,7 @@ module divconv_pipe (q1, qm1, qp1, q0, qm0, qp0, rega_out, regb_out, regc_out, r logic [59:0] d2, n2; logic [11:0] d3; - logic muxr_out, cout1, cout2, cout3, cout4, cout5, cout6, cout7; + logic cout1, cout2, cout3, cout4, cout5, cout6, cout7; // Check if exponent is odd for sqrt // If exp_odd=1 and sqrt, then M/2 and use ia_addr=0 as IA diff --git a/wally-pipelined/src/ifu/SRAM2P1R1W.sv b/wally-pipelined/src/ifu/SRAM2P1R1W.sv index 046aacc63..8426ef43b 100644 --- a/wally-pipelined/src/ifu/SRAM2P1R1W.sv +++ b/wally-pipelined/src/ifu/SRAM2P1R1W.sv @@ -36,8 +36,8 @@ `include "wally-config.vh" module SRAM2P1R1W - #(parameter int Depth = 10, - parameter int Width = 2 + #(parameter int DEPTH = 10, + parameter int WIDTH = 2 ) (input logic clk, @@ -45,35 +45,35 @@ module SRAM2P1R1W input logic reset, // port 1 is read only - input logic [Depth-1:0] RA1, - output logic [Width-1:0] RD1, + input logic [DEPTH-1:0] RA1, + output logic [WIDTH-1:0] RD1, input logic REN1, // port 2 is write only - input logic [Depth-1:0] WA1, - input logic [Width-1:0] WD1, + input logic [DEPTH-1:0] WA1, + input logic [WIDTH-1:0] WD1, input logic WEN1, - input logic [Width-1:0] BitWEN1 + input logic [WIDTH-1:0] BitWEN1 ); - logic [Depth-1:0] RA1Q, WA1Q; + logic [DEPTH-1:0] RA1Q, WA1Q; logic WEN1Q; - logic [Width-1:0] WD1Q; + logic [WIDTH-1:0] WD1Q; - logic [Width-1:0] memory [2**Depth-1:0]; + logic [WIDTH-1:0] mem[2**DEPTH-1:0]; // SRAMs address busses are always registered first. - flopenr #(Depth) RA1Reg(.clk(clk), + flopenr #(DEPTH) RA1Reg(.clk(clk), .reset(reset), .en(REN1), .d(RA1), .q(RA1Q)); - flopenr #(Depth) WA1Reg(.clk(clk), + flopenr #(DEPTH) WA1Reg(.clk(clk), .reset(reset), .en(REN1), .d(WA1), @@ -85,22 +85,22 @@ module SRAM2P1R1W .d(WEN1), .q(WEN1Q)); - flopenr #(Width) WD1Reg(.clk(clk), + flopenr #(WIDTH) WD1Reg(.clk(clk), .reset(reset), .en(REN1), .d(WD1), .q(WD1Q)); // read port - assign RD1 = memory[RA1Q]; + assign RD1 = mem[RA1Q]; genvar index; // write port generate - for (index = 0; index < Width; index = index + 1) begin:mem + for (index = 0; index < WIDTH; index = index + 1) begin:bitwrite always_ff @ (posedge clk) begin if (WEN1Q & BitWEN1[index]) begin - memory[WA1Q][index] <= WD1Q[index]; + mem[WA1Q][index] <= WD1Q[index]; end end end diff --git a/wally-pipelined/src/privileged/csru.sv b/wally-pipelined/src/privileged/csru.sv index 22ed4dcb3..0ad2053f8 100644 --- a/wally-pipelined/src/privileged/csru.sv +++ b/wally-pipelined/src/privileged/csru.sv @@ -47,7 +47,6 @@ module csru #(parameter generate if (`F_SUPPORTED | `D_SUPPORTED) begin logic [4:0] FFLAGS_REGW; - logic WriteFFLAGSM, WriteFRMM; //, WriteFCSRM; logic [2:0] NextFRMM; logic [4:0] NextFFLAGSM; diff --git a/wally-pipelined/testbench/testbench.sv b/wally-pipelined/testbench/testbench.sv index aa597aa04..5999f5d9c 100644 --- a/wally-pipelined/testbench/testbench.sv +++ b/wally-pipelined/testbench/testbench.sv @@ -323,8 +323,8 @@ logic [3:0] dummy; if (`BPRED_ENABLED == 1) begin : bpred initial begin - $readmemb(`TWO_BIT_PRELOAD, dut.hart.ifu.bpred.bpred.Predictor.DirPredictor.PHT.memory); - $readmemb(`BTB_PRELOAD, dut.hart.ifu.bpred.bpred.TargetPredictor.memory.memory); + $readmemb(`TWO_BIT_PRELOAD, dut.hart.ifu.bpred.bpred.Predictor.DirPredictor.PHT.mem); + $readmemb(`BTB_PRELOAD, dut.hart.ifu.bpred.bpred.TargetPredictor.memory.mem); end end endgenerate From 0e2efca490c2d71f38463e49e6985070f9a3d89c Mon Sep 17 00:00:00 2001 From: "James E. Stine" Date: Sat, 23 Oct 2021 10:02:47 -0500 Subject: [PATCH 007/132] Remove redundant logic value --- wally-pipelined/src/fpu/divconv_pipe.sv | 2 -- 1 file changed, 2 deletions(-) diff --git a/wally-pipelined/src/fpu/divconv_pipe.sv b/wally-pipelined/src/fpu/divconv_pipe.sv index 49496aa33..240000c28 100755 --- a/wally-pipelined/src/fpu/divconv_pipe.sv +++ b/wally-pipelined/src/fpu/divconv_pipe.sv @@ -66,8 +66,6 @@ module divconv_pipe (q1, qm1, qp1, q0, qm0, qp0, rega_out, regb_out, regc_out, r logic [59:0] d2, n2; logic [11:0] d3; - logic muxr_out, cout1, cout2, cout3, cout4, cout5, cout6, cout7; - // Check if exponent is odd for sqrt // If exp_odd=1 and sqrt, then M/2 and use ia_addr=0 as IA assign d2 = (exp_odd&op_type) ? {vss, d, 6'h0} : {d, 7'h0}; From ff409d4fe7938e847614240d09fba2e47de2e0c4 Mon Sep 17 00:00:00 2001 From: David Harris Date: Sat, 23 Oct 2021 08:39:21 -0700 Subject: [PATCH 008/132] Lint cleanup --- .../src/cache/cachereplacementpolicy.sv | 6 ++--- wally-pipelined/src/muldiv/intdivrestoring.sv | 16 ++++++------ wally-pipelined/src/muldiv/redundantmul.sv | 25 +++++++++++++------ 3 files changed, 28 insertions(+), 19 deletions(-) diff --git a/wally-pipelined/src/cache/cachereplacementpolicy.sv b/wally-pipelined/src/cache/cachereplacementpolicy.sv index 01d225b1c..fa115586a 100644 --- a/wally-pipelined/src/cache/cachereplacementpolicy.sv +++ b/wally-pipelined/src/cache/cachereplacementpolicy.sv @@ -46,11 +46,11 @@ module cachereplacementpolicy always_ff @(posedge clk, posedge reset) begin if (reset) begin for(int index = 0; index < NUMLINES; index++) - ReplacementBits[index] = '0; + ReplacementBits[index] <= '0; end else begin - BlockReplacementBits = ReplacementBits[RAdr]; + BlockReplacementBits <= ReplacementBits[RAdr]; if (LRUWriteEn) begin - ReplacementBits[MemPAdrM[INDEXLEN+OFFSETLEN-1:OFFSETLEN]] = NewReplacement; + ReplacementBits[MemPAdrM[INDEXLEN+OFFSETLEN-1:OFFSETLEN]] <= NewReplacement; end end end diff --git a/wally-pipelined/src/muldiv/intdivrestoring.sv b/wally-pipelined/src/muldiv/intdivrestoring.sv index cf0d5341b..dd92c9692 100644 --- a/wally-pipelined/src/muldiv/intdivrestoring.sv +++ b/wally-pipelined/src/muldiv/intdivrestoring.sv @@ -115,19 +115,19 @@ module intdivrestoring ( always_ff @(posedge clk) if (reset) begin - state = IDLE; + state <= IDLE; end else if (DivStartE) begin - step = 0; - if (Div0E) state = DONE; - else state = BUSY; + step <= 1; + if (Div0E) state <= DONE; + else state <= BUSY; end else if (state == BUSY) begin // pause one cycle at beginning of signed operations for absolute value - step = step + 1; if (step[STEPBITS] | (`XLEN==64) & W64E & step[STEPBITS-1]) begin // complete in half the time for W-type instructions - state = DONE; + state <= DONE; end + step <= step + 1; end else if (state == DONE) begin - if (StallM) state = DONE; - else state = IDLE; + if (StallM) state <= DONE; + else state <= IDLE; end endmodule diff --git a/wally-pipelined/src/muldiv/redundantmul.sv b/wally-pipelined/src/muldiv/redundantmul.sv index 9c8ade60a..70fdc8b57 100644 --- a/wally-pipelined/src/muldiv/redundantmul.sv +++ b/wally-pipelined/src/muldiv/redundantmul.sv @@ -4,7 +4,15 @@ // Written: David_Harris@hmc.edu and ssanghai@hm.edu 10/11/2021 // Modified: // -// Purpose: redundant multiplier +// Purpose: multiplier with output in redundant carry-sum form +// This can be faster than a mutiplier that requires a final adder to obtain the nonredundant answer. +// The module has several implementations controlled by the DESIGN_COMPILER flag. +// When DESIGN_COMPILER = 1, use the Synopsys DesignWare DW02_multp block. This will give highest quality results +// but doesn't work in simulation or when using different tools +// When DESIGN_COMPILER = 2, use the Wally mult_cs block with Radix 2 Booth encoding and a Wallace Tree +// This simulates and synthesizes, but quality of results ae lower than DesignWare +// Otherwise, just use a nonredundant multiplier and set one word to 0. This is best for FPGAs, which have +// block multipliers, and also simulates fastest. // // A component of the Wally configurable RISC-V project. // @@ -29,18 +37,19 @@ module redundantmul #(parameter WIDTH =8)( input logic [WIDTH-1:0] a,b, output logic [2*WIDTH-1:0] out0, out1); - logic [2*WIDTH-1+2:0] tmp_out0; - logic [2*WIDTH-1+2:0] tmp_out1; + // generate - if (`DESIGN_COMPILER == 1) + if (`DESIGN_COMPILER == 1) begin - DW02_multp #(WIDTH, WIDTH, 2*WIDTH+2) mul(.a, .b, .tc(1'b0), .out0(tmp_out0), .out1(tmp_out1)); - assign out0 = tmp_out0[2*WIDTH-1:0]; - assign out1 = tmp_out1[2*WIDTH-1:0]; + logic [2*WIDTH-1+2:0] tmp_out0; // DW02_ + logic [2*WIDTH-1+2:0] tmp_out1; + DW02_multp #(WIDTH, WIDTH, 2*WIDTH+2) mul(.a, .b, .tc(1'b0), .out0(tmp_out0), .out1(tmp_out1)); + assign out0 = tmp_out0[2*WIDTH-1:0]; + assign out1 = tmp_out1[2*WIDTH-1:0]; end else if (`DESIGN_COMPILER == 2) - mult_cs #(WIDTH) mul(.a, .b, .tc(1'b0), .sum(out0), .carry(out1)); + mult_cs #(WIDTH) mul(.a, .b, .tc(1'b0), .sum(out0), .carry(out1)); else begin // force a nonredunant multipler. This will simulate properly and also is appropriate for FPGAs. assign out0 = a * b; assign out1 = 0; From 7732d38c36d09f8bdd5f4ffbd53c9017a0b64133 Mon Sep 17 00:00:00 2001 From: David Harris Date: Sat, 23 Oct 2021 08:53:32 -0700 Subject: [PATCH 009/132] lint cleaning and moved files into subdirectories --- tests/wally-riscv-arch-test/.gitignore | 11 + tests/wally-riscv-arch-test/CHANGELOG.md | 413 ++ tests/wally-riscv-arch-test/CONTRIBUTION.md | 66 + tests/wally-riscv-arch-test/COPYING.APACHE | 202 + tests/wally-riscv-arch-test/COPYING.BSD | 9 + tests/wally-riscv-arch-test/COPYING.CC | 395 ++ tests/wally-riscv-arch-test/Makefile | 123 + tests/wally-riscv-arch-test/Makefile.include | 28 + tests/wally-riscv-arch-test/README.md | 74 + tests/wally-riscv-arch-test/doc/.gitignore | 6 + tests/wally-riscv-arch-test/doc/ChangeLog | 147 + .../wally-riscv-arch-test/doc/MIGRATION.adoc | 88 + tests/wally-riscv-arch-test/doc/Makefile | 82 + tests/wally-riscv-arch-test/doc/README.adoc | 460 ++ .../wally-riscv-arch-test/doc/custom.wordlist | 73 + .../wally-riscv-arch-test/doc/file-struct.jpg | Bin 0 -> 656873 bytes .../riscv-ovpsim/README.md | 43 + .../riscv-ovpsim/riscvOVPsim.jpg | Bin 0 -> 82365 bytes .../riscv-test-env/LICENSE | 24 + .../riscv-test-env/arch_test.h | 1 + .../riscv-test-env/encoding.h | 1 + .../riscv-test-env/p/link.ld | 22 + .../riscv-test-env/p/riscv_test.h | 251 ++ .../riscv-test-env/pm/link.ld | 17 + .../riscv-test-env/pm/riscv_test.h | 11 + .../riscv-test-env/pt/link.ld | 17 + .../riscv-test-env/pt/riscv_test.h | 69 + .../riscv-test-env/v/entry.S | 125 + .../riscv-test-env/v/link.ld | 17 + .../riscv-test-env/v/riscv_test.h | 71 + .../riscv-test-env/v/string.c | 114 + .../riscv-test-env/v/vm.c | 273 ++ .../riscv-test-env/verify.sh | 68 + .../riscv-test-suite/Makefile.include | 58 + .../riscv-test-suite/README.md | 66 + .../riscv-test-suite/env/arch_test.h | 1184 ++++++ .../riscv-test-suite/env/encoding.h | 1495 +++++++ .../rv32e_unratified/C/Makefile | 3 + .../rv32e_unratified/C/Makefrag | 61 + .../C/references/cadd-01.reference_output | 580 +++ .../C/references/caddi-01.reference_output | 375 ++ .../references/caddi16sp-01.reference_output | 72 + .../references/caddi4spn-01.reference_output | 19 + .../C/references/cand-01.reference_output | 586 +++ .../C/references/candi-01.reference_output | 374 ++ .../C/references/cbeqz-01.reference_output | 84 + .../C/references/cbnez-01.reference_output | 84 + .../C/references/cj-01.reference_output | 17 + .../C/references/cjal-01.reference_output | 18 + .../C/references/cjalr-01.reference_output | 15 + .../C/references/cjr-01.reference_output | 15 + .../C/references/cli-01.reference_output | 17 + .../C/references/clui-01.reference_output | 15 + .../C/references/clw-01.reference_output | 13 + .../C/references/clwsp-01.reference_output | 15 + .../C/references/cmv-01.reference_output | 85 + .../C/references/cnop-01.reference_output | 14 + .../C/references/cor-01.reference_output | 582 +++ .../C/references/cslli-01.reference_output | 86 + .../C/references/csrai-01.reference_output | 85 + .../C/references/csrli-01.reference_output | 87 + .../C/references/csub-01.reference_output | 581 +++ .../C/references/csw-01.reference_output | 68 + .../C/references/cswsp-01.reference_output | 70 + .../C/references/cxor-01.reference_output | 580 +++ .../rv32e_unratified/C/src/cadd-01.S | 2980 +++++++++++++ .../rv32e_unratified/C/src/caddi-01.S | 1950 +++++++++ .../rv32e_unratified/C/src/caddi16sp-01.S | 430 ++ .../rv32e_unratified/C/src/caddi4spn-01.S | 165 + .../rv32e_unratified/C/src/cand-01.S | 3005 +++++++++++++ .../rv32e_unratified/C/src/candi-01.S | 1940 +++++++++ .../rv32e_unratified/C/src/cbeqz-01.S | 490 +++ .../rv32e_unratified/C/src/cbnez-01.S | 490 +++ .../rv32e_unratified/C/src/cj-01.S | 155 + .../rv32e_unratified/C/src/cjal-01.S | 160 + .../rv32e_unratified/C/src/cjalr-01.S | 150 + .../rv32e_unratified/C/src/cjr-01.S | 150 + .../rv32e_unratified/C/src/cli-01.S | 160 + .../rv32e_unratified/C/src/clui-01.S | 150 + .../rv32e_unratified/C/src/clw-01.S | 135 + .../rv32e_unratified/C/src/clwsp-01.S | 150 + .../rv32e_unratified/C/src/cmv-01.S | 500 +++ .../rv32e_unratified/C/src/cnop-01.S | 140 + .../rv32e_unratified/C/src/cor-01.S | 2985 +++++++++++++ .../rv32e_unratified/C/src/cslli-01.S | 500 +++ .../rv32e_unratified/C/src/csrai-01.S | 495 +++ .../rv32e_unratified/C/src/csrli-01.S | 505 +++ .../rv32e_unratified/C/src/csub-01.S | 2980 +++++++++++++ .../rv32e_unratified/C/src/csw-01.S | 410 ++ .../rv32e_unratified/C/src/cswsp-01.S | 425 ++ .../rv32e_unratified/C/src/cxor-01.S | 2975 +++++++++++++ .../rv32e_unratified/E/Makefile | 3 + .../rv32e_unratified/E/Makefrag | 73 + .../E/references/add-01.reference_output | 583 +++ .../E/references/addi-01.reference_output | 561 +++ .../E/references/and-01.reference_output | 588 +++ .../E/references/andi-01.reference_output | 554 +++ .../E/references/auipc-01.reference_output | 63 + .../E/references/beq-01.reference_output | 590 +++ .../E/references/bge-01.reference_output | 586 +++ .../E/references/bgeu-01.reference_output | 728 ++++ .../E/references/blt-01.reference_output | 586 +++ .../E/references/bltu-01.reference_output | 727 ++++ .../E/references/bne-01.reference_output | 585 +++ .../E/references/jal-01.reference_output | 16 + .../E/references/jalr-01.reference_output | 27 + .../E/references/lb-align-01.reference_output | 18 + .../references/lbu-align-01.reference_output | 17 + .../E/references/lh-align-01.reference_output | 16 + .../references/lhu-align-01.reference_output | 16 + .../E/references/lui-01.reference_output | 63 + .../E/references/lw-align-01.reference_output | 16 + .../E/references/or-01.reference_output | 589 +++ .../E/references/ori-01.reference_output | 557 +++ .../E/references/sb-align-01.reference_output | 78 + .../E/references/sh-align-01.reference_output | 71 + .../E/references/sll-01.reference_output | 88 + .../E/references/slli-01.reference_output | 89 + .../E/references/slt-01.reference_output | 581 +++ .../E/references/slti-01.reference_output | 561 +++ .../E/references/sltiu-01.reference_output | 697 +++ .../E/references/sltu-01.reference_output | 722 ++++ .../E/references/sra-01.reference_output | 90 + .../E/references/srai-01.reference_output | 87 + .../E/references/srl-01.reference_output | 89 + .../E/references/srli-01.reference_output | 88 + .../E/references/sub-01.reference_output | 584 +++ .../E/references/sw-align-01.reference_output | 68 + .../E/references/xor-01.reference_output | 583 +++ .../E/references/xori-01.reference_output | 559 +++ .../rv32e_unratified/E/src/add-01.S | 3000 +++++++++++++ .../rv32e_unratified/E/src/addi-01.S | 2890 +++++++++++++ .../rv32e_unratified/E/src/and-01.S | 3025 +++++++++++++ .../rv32e_unratified/E/src/andi-01.S | 2850 +++++++++++++ .../rv32e_unratified/E/src/auipc-01.S | 390 ++ .../rv32e_unratified/E/src/beq-01.S | 3030 +++++++++++++ .../rv32e_unratified/E/src/bge-01.S | 3015 +++++++++++++ .../rv32e_unratified/E/src/bgeu-01.S | 3720 ++++++++++++++++ .../rv32e_unratified/E/src/blt-01.S | 3010 +++++++++++++ .../rv32e_unratified/E/src/bltu-01.S | 3715 ++++++++++++++++ .../rv32e_unratified/E/src/bne-01.S | 3010 +++++++++++++ .../rv32e_unratified/E/src/jal-01.S | 155 + .../rv32e_unratified/E/src/jalr-01.S | 215 + .../rv32e_unratified/E/src/lb-align-01.S | 165 + .../rv32e_unratified/E/src/lbu-align-01.S | 165 + .../rv32e_unratified/E/src/lh-align-01.S | 155 + .../rv32e_unratified/E/src/lhu-align-01.S | 160 + .../rv32e_unratified/E/src/lui-01.S | 390 ++ .../rv32e_unratified/E/src/lw-align-01.S | 160 + .../rv32e_unratified/E/src/or-01.S | 3035 ++++++++++++++ .../rv32e_unratified/E/src/ori-01.S | 2865 +++++++++++++ .../rv32e_unratified/E/src/sb-align-01.S | 465 ++ .../rv32e_unratified/E/src/sh-align-01.S | 435 ++ .../rv32e_unratified/E/src/sll-01.S | 520 +++ .../rv32e_unratified/E/src/slli-01.S | 525 +++ .../rv32e_unratified/E/src/slt-01.S | 2990 +++++++++++++ .../rv32e_unratified/E/src/slti-01.S | 2890 +++++++++++++ .../rv32e_unratified/E/src/sltiu-01.S | 3565 ++++++++++++++++ .../rv32e_unratified/E/src/sltu-01.S | 3695 ++++++++++++++++ .../rv32e_unratified/E/src/sra-01.S | 530 +++ .../rv32e_unratified/E/src/srai-01.S | 515 +++ .../rv32e_unratified/E/src/srl-01.S | 525 +++ .../rv32e_unratified/E/src/srli-01.S | 520 +++ .../rv32e_unratified/E/src/sub-01.S | 3005 +++++++++++++ .../rv32e_unratified/E/src/sw-align-01.S | 415 ++ .../rv32e_unratified/E/src/xor-01.S | 3000 +++++++++++++ .../rv32e_unratified/E/src/xori-01.S | 2880 +++++++++++++ .../rv32e_unratified/M/Makefile | 3 + .../rv32e_unratified/M/Makefrag | 43 + .../M/references/div-01.reference_output | 581 +++ .../M/references/divu-01.reference_output | 729 ++++ .../M/references/mul-01.reference_output | 585 +++ .../M/references/mulh-01.reference_output | 591 +++ .../M/references/mulhsu-01.reference_output | 654 +++ .../M/references/mulhu-01.reference_output | 724 ++++ .../M/references/rem-01.reference_output | 586 +++ .../M/references/remu-01.reference_output | 725 ++++ .../rv32e_unratified/M/src/div-01.S | 2990 +++++++++++++ .../rv32e_unratified/M/src/divu-01.S | 3730 +++++++++++++++++ .../rv32e_unratified/M/src/mul-01.S | 3010 +++++++++++++ .../rv32e_unratified/M/src/mulh-01.S | 3040 ++++++++++++++ .../rv32e_unratified/M/src/mulhsu-01.S | 3355 +++++++++++++++ .../rv32e_unratified/M/src/mulhu-01.S | 3700 ++++++++++++++++ .../rv32e_unratified/M/src/rem-01.S | 3015 +++++++++++++ .../rv32e_unratified/M/src/remu-01.S | 3715 ++++++++++++++++ .../riscv-test-suite/rv32i_m/.gitgnore | 6 + .../riscv-test-suite/rv32i_m/C/Makefile | 3 + .../riscv-test-suite/rv32i_m/C/Makefrag | 62 + .../riscv-test-suite/rv32i_m/F/Makefile | 3 + .../riscv-test-suite/rv32i_m/F/Makefrag | 160 + .../riscv-test-suite/rv32i_m/I/.gitignore | 0 .../riscv-test-suite/rv32i_m/I/Makefile | 3 + .../riscv-test-suite/rv32i_m/I/Makefrag | 74 + .../rv32i_m/K_unratified/Makefile | 4 + .../rv32i_m/K_unratified/Makefrag | 96 + .../riscv-test-suite/rv32i_m/M/Makefile | 3 + .../riscv-test-suite/rv32i_m/M/Makefrag | 43 + .../rv32i_m/Zifencei/Makefile | 3 + .../rv32i_m/Zifencei/Makefrag | 35 + .../rv32i_m/privilege/Makefile | 3 + .../rv32i_m/privilege/Makefrag | 50 + .../riscv-test-suite/rv64i_m/.gitgnore | 6 + .../riscv-test-suite/rv64i_m/C/Makefile | 3 + .../riscv-test-suite/rv64i_m/C/Makefrag | 35 + .../C/references/cadd-01.reference_output | 1340 ++++++ .../C/references/caddi-01.reference_output | 880 ++++ .../references/caddi16sp-01.reference_output | 264 ++ .../references/caddi4spn-01.reference_output | 40 + .../C/references/caddiw-01.reference_output | 876 ++++ .../C/references/caddw-01.reference_output | 1356 ++++++ .../C/references/cand-01.reference_output | 1344 ++++++ .../C/references/candi-01.reference_output | 880 ++++ .../C/references/cbeqz-01.reference_output | 300 ++ .../C/references/cbnez-01.reference_output | 300 ++ .../C/references/cebreak-01.reference_output | 8 + .../C/references/cj-01.reference_output | 36 + .../C/references/cjalr-01.reference_output | 64 + .../C/references/cjr-01.reference_output | 64 + .../C/references/cld-01.reference_output | 28 + .../C/references/cldsp-01.reference_output | 64 + .../C/references/cli-01.reference_output | 64 + .../C/references/clui-01.reference_output | 64 + .../C/references/clw-01.reference_output | 28 + .../C/references/clwsp-01.reference_output | 64 + .../C/references/cmv-01.reference_output | 300 ++ .../C/references/cnop-01.reference_output | 28 + .../C/references/cor-01.reference_output | 1360 ++++++ .../C/references/csd-01.reference_output | 264 ++ .../C/references/csdsp-01.reference_output | 264 ++ .../C/references/cslli-01.reference_output | 296 ++ .../C/references/csrai-01.reference_output | 296 ++ .../C/references/csrli-01.reference_output | 300 ++ .../C/references/csub-01.reference_output | 1344 ++++++ .../C/references/csubw-01.reference_output | 1340 ++++++ .../C/references/csw-01.reference_output | 264 ++ .../C/references/cswsp-01.reference_output | 268 ++ .../C/references/cxor-01.reference_output | 1328 ++++++ .../riscv-test-suite/rv64i_m/I/.gitignore | 0 .../riscv-test-suite/rv64i_m/I/Makefile | 3 + .../riscv-test-suite/rv64i_m/I/Makefrag | 37 + .../I/references/add-01.reference_output | 1360 ++++++ .../riscv-test-suite/rv64i_m/I/src/add-01.S | 3479 +++++++++++++++ .../rv64i_m/K_unratified/Makefile | 4 + .../rv64i_m/K_unratified/Makefrag | 31 + .../references/aes64ds-01.reference_output | 116 + .../references/aes64ds-rwp1.reference_output | 156 + .../references/aes64dsm-01.reference_output | 116 + .../references/aes64dsm-rwp1.reference_output | 156 + .../references/aes64es-01.reference_output | 116 + .../references/aes64es-rwp1.reference_output | 156 + .../references/aes64esm-01.reference_output | 116 + .../references/aes64esm-rwp1.reference_output | 156 + .../references/aes64im-01.reference_output | 300 ++ .../references/aes64im-rwp1.reference_output | 488 +++ .../references/aes64im-rwp2.reference_output | 112 + .../references/aes64ks1i-01.reference_output | 172 + .../references/aes64ks2-01.reference_output | 440 ++ .../references/andn-01.reference_output | 1048 +++++ .../references/clmul-01.reference_output | 1052 +++++ .../references/clmulh-01.reference_output | 1052 +++++ .../references/orn-01.reference_output | 1052 +++++ .../references/pack-01.reference_output | 1048 +++++ .../references/packh-01.reference_output | 1052 +++++ .../references/packu-01.reference_output | 1044 +++++ .../references/packuw-01.reference_output | 1052 +++++ .../references/packw-01.reference_output | 1052 +++++ .../references/rev.b-01.reference_output | 520 +++ .../references/rev8-01.reference_output | 520 +++ .../references/rev8.w-01.reference_output | 520 +++ .../references/rol-01.reference_output | 1052 +++++ .../references/rolw-01.reference_output | 1052 +++++ .../references/ror-01.reference_output | 1052 +++++ .../references/rori-01.reference_output | 580 +++ .../references/roriw-01.reference_output | 572 +++ .../references/rorw-01.reference_output | 1052 +++++ .../references/sha256sig0-01.reference_output | 300 ++ .../sha256sig0-rwp1.reference_output | 488 +++ .../sha256sig0-rwp2.reference_output | 112 + .../references/sha256sig1-01.reference_output | 300 ++ .../sha256sig1-rwp1.reference_output | 488 +++ .../sha256sig1-rwp2.reference_output | 112 + .../references/sha256sum0-01.reference_output | 300 ++ .../sha256sum0-rwp1.reference_output | 488 +++ .../sha256sum0-rwp2.reference_output | 112 + .../references/sha256sum1-01.reference_output | 300 ++ .../sha256sum1-rwp1.reference_output | 488 +++ .../sha256sum1-rwp2.reference_output | 112 + .../references/sha512sig0-01.reference_output | 300 ++ .../sha512sig0-rwp1.reference_output | 488 +++ .../sha512sig0-rwp2.reference_output | 112 + .../references/sha512sig1-01.reference_output | 300 ++ .../sha512sig1-rwp1.reference_output | 488 +++ .../sha512sig1-rwp2.reference_output | 112 + .../references/sha512sum0-01.reference_output | 300 ++ .../sha512sum0-rwp1.reference_output | 488 +++ .../sha512sum0-rwp2.reference_output | 112 + .../references/sha512sum1-01.reference_output | 300 ++ .../sha512sum1-rwp1.reference_output | 488 +++ .../sha512sum1-rwp2.reference_output | 112 + .../references/sm3p0-01.reference_output | 300 ++ .../references/sm3p0-rwp1.reference_output | 488 +++ .../references/sm3p0-rwp2.reference_output | 112 + .../references/sm3p1-01.reference_output | 300 ++ .../references/sm3p1-rwp1.reference_output | 488 +++ .../references/sm3p1-rwp2.reference_output | 112 + .../references/sm4ed-01.reference_output | 564 +++ .../references/sm4ed-rwp1.reference_output | 52 + .../references/sm4ks-01.reference_output | 564 +++ .../references/sm4ks-rwp1.reference_output | 52 + .../references/xnor-01.reference_output | 1052 +++++ .../references/xperm.b-01.reference_output | 1092 +++++ .../references/xperm.n-01.reference_output | 1092 +++++ .../rv64i_m/K_unratified/src/aes64ds-01.S | 364 ++ .../rv64i_m/K_unratified/src/aes64ds-rwp1.S | 389 ++ .../rv64i_m/K_unratified/src/aes64dsm-01.S | 364 ++ .../rv64i_m/K_unratified/src/aes64dsm-rwp1.S | 389 ++ .../rv64i_m/K_unratified/src/aes64es-01.S | 364 ++ .../rv64i_m/K_unratified/src/aes64es-rwp1.S | 389 ++ .../rv64i_m/K_unratified/src/aes64esm-01.S | 364 ++ .../rv64i_m/K_unratified/src/aes64esm-rwp1.S | 389 ++ .../rv64i_m/K_unratified/src/aes64im-01.S | 1279 ++++++ .../rv64i_m/K_unratified/src/aes64im-rwp1.S | 969 +++++ .../rv64i_m/K_unratified/src/aes64im-rwp2.S | 304 ++ .../rv64i_m/K_unratified/src/aes64ks1i-01.S | 509 +++ .../rv64i_m/K_unratified/src/aes64ks2-01.S | 1184 ++++++ .../rv64i_m/K_unratified/src/andn-01.S | 2711 ++++++++++++ .../rv64i_m/K_unratified/src/clmul-01.S | 2711 ++++++++++++ .../rv64i_m/K_unratified/src/clmulh-01.S | 2716 ++++++++++++ .../rv64i_m/K_unratified/src/orn-01.S | 2716 ++++++++++++ .../rv64i_m/K_unratified/src/pack-01.S | 2706 ++++++++++++ .../rv64i_m/K_unratified/src/packh-01.S | 2711 ++++++++++++ .../rv64i_m/K_unratified/src/packu-01.S | 2696 ++++++++++++ .../rv64i_m/K_unratified/src/packuw-01.S | 2711 ++++++++++++ .../rv64i_m/K_unratified/src/packw-01.S | 2711 ++++++++++++ .../rv64i_m/K_unratified/src/rev.b-01.S | 2161 ++++++++++ .../rv64i_m/K_unratified/src/rev8-01.S | 2161 ++++++++++ .../rv64i_m/K_unratified/src/rev8.w-01.S | 2161 ++++++++++ .../rv64i_m/K_unratified/src/rol-01.S | 2716 ++++++++++++ .../rv64i_m/K_unratified/src/rolw-01.S | 2711 ++++++++++++ .../rv64i_m/K_unratified/src/ror-01.S | 2711 ++++++++++++ .../rv64i_m/K_unratified/src/rori-01.S | 1531 +++++++ .../rv64i_m/K_unratified/src/roriw-01.S | 1516 +++++++ .../rv64i_m/K_unratified/src/rorw-01.S | 2711 ++++++++++++ .../rv64i_m/K_unratified/src/sha256sig0-01.S | 1279 ++++++ .../K_unratified/src/sha256sig0-rwp1.S | 969 +++++ .../K_unratified/src/sha256sig0-rwp2.S | 304 ++ .../rv64i_m/K_unratified/src/sha256sig1-01.S | 1279 ++++++ .../K_unratified/src/sha256sig1-rwp1.S | 969 +++++ .../K_unratified/src/sha256sig1-rwp2.S | 304 ++ .../rv64i_m/K_unratified/src/sha256sum0-01.S | 1279 ++++++ .../K_unratified/src/sha256sum0-rwp1.S | 969 +++++ .../K_unratified/src/sha256sum0-rwp2.S | 304 ++ .../rv64i_m/K_unratified/src/sha256sum1-01.S | 1279 ++++++ .../K_unratified/src/sha256sum1-rwp1.S | 969 +++++ .../K_unratified/src/sha256sum1-rwp2.S | 304 ++ .../rv64i_m/K_unratified/src/sha512sig0-01.S | 1279 ++++++ .../K_unratified/src/sha512sig0-rwp1.S | 969 +++++ .../K_unratified/src/sha512sig0-rwp2.S | 304 ++ .../rv64i_m/K_unratified/src/sha512sig1-01.S | 1279 ++++++ .../K_unratified/src/sha512sig1-rwp1.S | 969 +++++ .../K_unratified/src/sha512sig1-rwp2.S | 304 ++ .../rv64i_m/K_unratified/src/sha512sum0-01.S | 1279 ++++++ .../K_unratified/src/sha512sum0-rwp1.S | 969 +++++ .../K_unratified/src/sha512sum0-rwp2.S | 304 ++ .../rv64i_m/K_unratified/src/sha512sum1-01.S | 1279 ++++++ .../K_unratified/src/sha512sum1-rwp1.S | 969 +++++ .../K_unratified/src/sha512sum1-rwp2.S | 304 ++ .../rv64i_m/K_unratified/src/sm3p0-01.S | 1279 ++++++ .../rv64i_m/K_unratified/src/sm3p0-rwp1.S | 969 +++++ .../rv64i_m/K_unratified/src/sm3p0-rwp2.S | 304 ++ .../rv64i_m/K_unratified/src/sm3p1-01.S | 1279 ++++++ .../rv64i_m/K_unratified/src/sm3p1-rwp1.S | 969 +++++ .../rv64i_m/K_unratified/src/sm3p1-rwp2.S | 304 ++ .../rv64i_m/K_unratified/src/sm4ed-01.S | 1489 +++++++ .../rv64i_m/K_unratified/src/sm4ed-rwp1.S | 415 ++ .../rv64i_m/K_unratified/src/sm4ks-01.S | 1489 +++++++ .../rv64i_m/K_unratified/src/sm4ks-rwp1.S | 415 ++ .../rv64i_m/K_unratified/src/xnor-01.S | 2711 ++++++++++++ .../rv64i_m/K_unratified/src/xperm.b-01.S | 2816 +++++++++++++ .../rv64i_m/K_unratified/src/xperm.n-01.S | 2816 +++++++++++++ .../riscv-test-suite/rv64i_m/M/Makefile | 3 + .../riscv-test-suite/rv64i_m/M/Makefrag | 35 + .../M/references/div-01.reference_output | 1356 ++++++ .../M/references/divu-01.reference_output | 1648 ++++++++ .../M/references/divuw-01.reference_output | 1644 ++++++++ .../M/references/divw-01.reference_output | 1344 ++++++ .../M/references/mul-01.reference_output | 1364 ++++++ .../M/references/mulh-01.reference_output | 1356 ++++++ .../M/references/mulhsu-01.reference_output | 1484 +++++++ .../M/references/mulhu-01.reference_output | 1628 +++++++ .../M/references/mulw-01.reference_output | 1344 ++++++ .../M/references/rem-01.reference_output | 1332 ++++++ .../M/references/remu-01.reference_output | 1644 ++++++++ .../M/references/remuw-01.reference_output | 1636 ++++++++ .../M/references/remw-01.reference_output | 1352 ++++++ .../rv64i_m/Zifencei/Makefile | 3 + .../rv64i_m/Zifencei/Makefrag | 34 + .../references/Fencei.reference_output | 4 + .../rv64i_m/Zifencei/src/Fencei.S | 96 + .../rv64i_m/privilege/Makefile | 3 + .../rv64i_m/privilege/Makefrag | 35 + .../references/ebreak.reference_output | 8 + .../references/ecall.reference_output | 8 + .../misalign-beq-01.reference_output | 132 + .../misalign-bge-01.reference_output | 132 + .../misalign-bgeu-01.reference_output | 132 + .../misalign-blt-01.reference_output | 132 + .../misalign-bltu-01.reference_output | 132 + .../misalign-bne-01.reference_output | 132 + .../misalign-jal-01.reference_output | 132 + .../misalign-ld-01.reference_output | 144 + .../misalign-lh-01.reference_output | 132 + .../misalign-lhu-01.reference_output | 132 + .../misalign-lw-01.reference_output | 136 + .../misalign-lwu-01.reference_output | 136 + .../misalign-sd-01.reference_output | 144 + .../misalign-sh-01.reference_output | 132 + .../misalign-sw-01.reference_output | 136 + .../misalign1-jalr-01.reference_output | 132 + .../misalign2-jalr-01.reference_output | 132 + .../spec/TestFormatSpec.adoc | 606 +++ tests/wally-riscv-arch-test/spec/testpool.jpg | Bin 0 -> 75124 bytes wally-pipelined/src/generic/flop/flop.sv | 37 + wally-pipelined/src/generic/flop/flopen.sv | 37 + wally-pipelined/src/generic/flop/flopenl.sv | 39 + wally-pipelined/src/generic/flop/flopenr.sv | 38 + wally-pipelined/src/generic/flop/flopenrc.sv | 40 + .../mux.sv => generic/flop/flopens.sv} | 51 +- wally-pipelined/src/generic/flop/flopr.sv | 38 + wally-pipelined/src/generic/flop/floprc.sv | 41 + wally-pipelined/src/muldiv/div/README | 1 - wally-pipelined/src/muldiv/div/README.md | 22 - wally-pipelined/src/muldiv/div/div | Bin 16696 -> 0 bytes wally-pipelined/src/muldiv/div/div.c | 37 - wally-pipelined/src/muldiv/div/div64.out | 107 - .../src/muldiv/div/div64_sim/div.sv | 1535 ------- .../src/muldiv/div/div64_sim/flop.sv | 108 - .../src/muldiv/div/div64_sim/iter32.do | 50 - .../src/muldiv/div/div64_sim/iter64.do | 50 - .../src/muldiv/div/div64_sim/test_iter32.sv | 74 - .../src/muldiv/div/div64_sim/test_iter64.sv | 72 - wally-pipelined/src/muldiv/div/divide4x32.sv | 1006 ----- wally-pipelined/src/muldiv/div/divide4x64.sv | 1453 ------- .../src/muldiv/div/imperas-riscv-tests | 1 - wally-pipelined/src/muldiv/div/int32div.do | 114 - wally-pipelined/src/muldiv/div/int64div.do | 116 - wally-pipelined/src/muldiv/div/iter32.do | 50 - wally-pipelined/src/muldiv/div/iter64.do | 50 - wally-pipelined/src/muldiv/div/mux_div.sv | 51 - wally-pipelined/src/muldiv/div/shift.sv | 151 - wally-pipelined/src/muldiv/div/shift_left.do | 55 - wally-pipelined/src/muldiv/div/shift_left.out | 79 - .../src/muldiv/div/shift_left_tb.sv | 71 - wally-pipelined/src/muldiv/div/shift_right.do | 55 - .../src/muldiv/div/shift_right.out | 24 - .../src/muldiv/div/shift_right_tb.sv | 64 - wally-pipelined/src/muldiv/div/shifter.sv | 18 - .../src/muldiv/div/shifters_div.sv | 106 - .../src/muldiv/div/test_int32div.sv | 50 - .../src/muldiv/div/test_int64div.sv | 71 - wally-pipelined/src/muldiv/div/test_iter32.sv | 74 - wally-pipelined/src/muldiv/div/test_iter64.sv | 72 - wally-pipelined/src/muldiv/div/udiv | Bin 16696 -> 0 bytes wally-pipelined/src/muldiv/div/udiv.c | 24 - 464 files changed, 311135 insertions(+), 5850 deletions(-) create mode 100644 tests/wally-riscv-arch-test/.gitignore create mode 100644 tests/wally-riscv-arch-test/CHANGELOG.md create mode 100644 tests/wally-riscv-arch-test/CONTRIBUTION.md create mode 100644 tests/wally-riscv-arch-test/COPYING.APACHE create mode 100644 tests/wally-riscv-arch-test/COPYING.BSD create mode 100644 tests/wally-riscv-arch-test/COPYING.CC create mode 100644 tests/wally-riscv-arch-test/Makefile create mode 100644 tests/wally-riscv-arch-test/Makefile.include create mode 100644 tests/wally-riscv-arch-test/README.md create mode 100644 tests/wally-riscv-arch-test/doc/.gitignore create mode 100644 tests/wally-riscv-arch-test/doc/ChangeLog create mode 100644 tests/wally-riscv-arch-test/doc/MIGRATION.adoc create mode 100644 tests/wally-riscv-arch-test/doc/Makefile create mode 100644 tests/wally-riscv-arch-test/doc/README.adoc create mode 100644 tests/wally-riscv-arch-test/doc/custom.wordlist create mode 100644 tests/wally-riscv-arch-test/doc/file-struct.jpg create mode 100644 tests/wally-riscv-arch-test/riscv-ovpsim/README.md create mode 100644 tests/wally-riscv-arch-test/riscv-ovpsim/riscvOVPsim.jpg create mode 100644 tests/wally-riscv-arch-test/riscv-test-env/LICENSE create mode 120000 tests/wally-riscv-arch-test/riscv-test-env/arch_test.h create mode 120000 tests/wally-riscv-arch-test/riscv-test-env/encoding.h create mode 100644 tests/wally-riscv-arch-test/riscv-test-env/p/link.ld create mode 100644 tests/wally-riscv-arch-test/riscv-test-env/p/riscv_test.h create mode 100644 tests/wally-riscv-arch-test/riscv-test-env/pm/link.ld create mode 100644 tests/wally-riscv-arch-test/riscv-test-env/pm/riscv_test.h create mode 100644 tests/wally-riscv-arch-test/riscv-test-env/pt/link.ld create mode 100644 tests/wally-riscv-arch-test/riscv-test-env/pt/riscv_test.h create mode 100644 tests/wally-riscv-arch-test/riscv-test-env/v/entry.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-env/v/link.ld create mode 100644 tests/wally-riscv-arch-test/riscv-test-env/v/riscv_test.h create mode 100644 tests/wally-riscv-arch-test/riscv-test-env/v/string.c create mode 100644 tests/wally-riscv-arch-test/riscv-test-env/v/vm.c create mode 100755 tests/wally-riscv-arch-test/riscv-test-env/verify.sh create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/Makefile.include create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/README.md create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/env/arch_test.h create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/env/encoding.h create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/C/Makefile create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/C/Makefrag create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/C/references/cadd-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/C/references/caddi-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/C/references/caddi16sp-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/C/references/caddi4spn-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/C/references/cand-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/C/references/candi-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/C/references/cbeqz-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/C/references/cbnez-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/C/references/cj-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/C/references/cjal-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/C/references/cjalr-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/C/references/cjr-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/C/references/cli-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/C/references/clui-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/C/references/clw-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/C/references/clwsp-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/C/references/cmv-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/C/references/cnop-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/C/references/cor-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/C/references/cslli-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/C/references/csrai-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/C/references/csrli-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/C/references/csub-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/C/references/csw-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/C/references/cswsp-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/C/references/cxor-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/C/src/cadd-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/C/src/caddi-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/C/src/caddi16sp-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/C/src/caddi4spn-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/C/src/cand-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/C/src/candi-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/C/src/cbeqz-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/C/src/cbnez-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/C/src/cj-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/C/src/cjal-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/C/src/cjalr-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/C/src/cjr-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/C/src/cli-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/C/src/clui-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/C/src/clw-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/C/src/clwsp-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/C/src/cmv-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/C/src/cnop-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/C/src/cor-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/C/src/cslli-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/C/src/csrai-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/C/src/csrli-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/C/src/csub-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/C/src/csw-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/C/src/cswsp-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/C/src/cxor-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/E/Makefile create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/E/Makefrag create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/E/references/add-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/E/references/addi-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/E/references/and-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/E/references/andi-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/E/references/auipc-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/E/references/beq-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/E/references/bge-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/E/references/bgeu-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/E/references/blt-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/E/references/bltu-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/E/references/bne-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/E/references/jal-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/E/references/jalr-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/E/references/lb-align-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/E/references/lbu-align-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/E/references/lh-align-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/E/references/lhu-align-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/E/references/lui-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/E/references/lw-align-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/E/references/or-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/E/references/ori-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/E/references/sb-align-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/E/references/sh-align-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/E/references/sll-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/E/references/slli-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/E/references/slt-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/E/references/slti-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/E/references/sltiu-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/E/references/sltu-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/E/references/sra-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/E/references/srai-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/E/references/srl-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/E/references/srli-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/E/references/sub-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/E/references/sw-align-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/E/references/xor-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/E/references/xori-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/E/src/add-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/E/src/addi-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/E/src/and-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/E/src/andi-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/E/src/auipc-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/E/src/beq-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/E/src/bge-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/E/src/bgeu-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/E/src/blt-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/E/src/bltu-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/E/src/bne-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/E/src/jal-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/E/src/jalr-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/E/src/lb-align-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/E/src/lbu-align-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/E/src/lh-align-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/E/src/lhu-align-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/E/src/lui-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/E/src/lw-align-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/E/src/or-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/E/src/ori-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/E/src/sb-align-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/E/src/sh-align-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/E/src/sll-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/E/src/slli-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/E/src/slt-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/E/src/slti-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/E/src/sltiu-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/E/src/sltu-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/E/src/sra-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/E/src/srai-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/E/src/srl-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/E/src/srli-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/E/src/sub-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/E/src/sw-align-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/E/src/xor-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/E/src/xori-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/M/Makefile create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/M/Makefrag create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/M/references/div-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/M/references/divu-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/M/references/mul-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/M/references/mulh-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/M/references/mulhsu-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/M/references/mulhu-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/M/references/rem-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/M/references/remu-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/M/src/div-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/M/src/divu-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/M/src/mul-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/M/src/mulh-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/M/src/mulhsu-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/M/src/mulhu-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/M/src/rem-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32e_unratified/M/src/remu-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32i_m/.gitgnore create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32i_m/C/Makefile create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32i_m/C/Makefrag create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32i_m/F/Makefile create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32i_m/F/Makefrag create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32i_m/I/.gitignore create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32i_m/I/Makefile create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32i_m/I/Makefrag create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32i_m/K_unratified/Makefile create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32i_m/K_unratified/Makefrag create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32i_m/M/Makefile create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32i_m/M/Makefrag create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32i_m/Zifencei/Makefile create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32i_m/Zifencei/Makefrag create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32i_m/privilege/Makefile create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32i_m/privilege/Makefrag create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/.gitgnore create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/Makefile create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/Makefrag create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cadd-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/caddi-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/caddi16sp-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/caddi4spn-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/caddiw-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/caddw-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cand-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/candi-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cbeqz-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cbnez-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cebreak-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cj-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cjalr-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cjr-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cld-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cldsp-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cli-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/clui-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/clw-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/clwsp-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cmv-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cnop-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cor-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/csd-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/csdsp-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cslli-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/csrai-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/csrli-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/csub-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/csubw-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/csw-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cswsp-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cxor-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/I/.gitignore create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/I/Makefile create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/I/Makefrag create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/I/references/add-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/I/src/add-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/Makefile create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/Makefrag create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/aes64ds-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/aes64ds-rwp1.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/aes64dsm-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/aes64dsm-rwp1.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/aes64es-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/aes64es-rwp1.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/aes64esm-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/aes64esm-rwp1.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/aes64im-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/aes64im-rwp1.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/aes64im-rwp2.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/aes64ks1i-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/aes64ks2-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/andn-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/clmul-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/clmulh-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/orn-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/pack-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/packh-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/packu-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/packuw-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/packw-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/rev.b-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/rev8-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/rev8.w-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/rol-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/rolw-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/ror-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/rori-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/roriw-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/rorw-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha256sig0-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha256sig0-rwp1.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha256sig0-rwp2.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha256sig1-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha256sig1-rwp1.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha256sig1-rwp2.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha256sum0-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha256sum0-rwp1.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha256sum0-rwp2.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha256sum1-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha256sum1-rwp1.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha256sum1-rwp2.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha512sig0-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha512sig0-rwp1.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha512sig0-rwp2.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha512sig1-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha512sig1-rwp1.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha512sig1-rwp2.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha512sum0-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha512sum0-rwp1.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha512sum0-rwp2.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha512sum1-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha512sum1-rwp1.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha512sum1-rwp2.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sm3p0-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sm3p0-rwp1.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sm3p0-rwp2.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sm3p1-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sm3p1-rwp1.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sm3p1-rwp2.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sm4ed-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sm4ed-rwp1.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sm4ks-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sm4ks-rwp1.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/xnor-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/xperm.b-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/xperm.n-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/src/aes64ds-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/src/aes64ds-rwp1.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/src/aes64dsm-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/src/aes64dsm-rwp1.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/src/aes64es-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/src/aes64es-rwp1.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/src/aes64esm-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/src/aes64esm-rwp1.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/src/aes64im-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/src/aes64im-rwp1.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/src/aes64im-rwp2.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/src/aes64ks1i-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/src/aes64ks2-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/src/andn-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/src/clmul-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/src/clmulh-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/src/orn-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/src/pack-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/src/packh-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/src/packu-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/src/packuw-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/src/packw-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/src/rev.b-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/src/rev8-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/src/rev8.w-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/src/rol-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/src/rolw-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/src/ror-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/src/rori-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/src/roriw-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/src/rorw-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/src/sha256sig0-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/src/sha256sig0-rwp1.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/src/sha256sig0-rwp2.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/src/sha256sig1-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/src/sha256sig1-rwp1.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/src/sha256sig1-rwp2.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/src/sha256sum0-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/src/sha256sum0-rwp1.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/src/sha256sum0-rwp2.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/src/sha256sum1-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/src/sha256sum1-rwp1.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/src/sha256sum1-rwp2.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/src/sha512sig0-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/src/sha512sig0-rwp1.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/src/sha512sig0-rwp2.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/src/sha512sig1-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/src/sha512sig1-rwp1.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/src/sha512sig1-rwp2.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/src/sha512sum0-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/src/sha512sum0-rwp1.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/src/sha512sum0-rwp2.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/src/sha512sum1-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/src/sha512sum1-rwp1.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/src/sha512sum1-rwp2.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/src/sm3p0-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/src/sm3p0-rwp1.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/src/sm3p0-rwp2.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/src/sm3p1-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/src/sm3p1-rwp1.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/src/sm3p1-rwp2.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/src/sm4ed-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/src/sm4ed-rwp1.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/src/sm4ks-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/src/sm4ks-rwp1.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/src/xnor-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/src/xperm.b-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/src/xperm.n-01.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/M/Makefile create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/M/Makefrag create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/M/references/div-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/M/references/divu-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/M/references/divuw-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/M/references/divw-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/M/references/mul-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/M/references/mulh-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/M/references/mulhsu-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/M/references/mulhu-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/M/references/mulw-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/M/references/rem-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/M/references/remu-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/M/references/remuw-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/M/references/remw-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/Zifencei/Makefile create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/Zifencei/Makefrag create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/Zifencei/references/Fencei.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/Zifencei/src/Fencei.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/Makefile create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/Makefrag create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/ebreak.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/ecall.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign-beq-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign-bge-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign-bgeu-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign-blt-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign-bltu-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign-bne-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign-jal-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign-ld-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign-lh-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign-lhu-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign-lw-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign-lwu-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign-sd-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign-sh-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign-sw-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign1-jalr-01.reference_output create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign2-jalr-01.reference_output create mode 100644 tests/wally-riscv-arch-test/spec/TestFormatSpec.adoc create mode 100644 tests/wally-riscv-arch-test/spec/testpool.jpg create mode 100644 wally-pipelined/src/generic/flop/flop.sv create mode 100644 wally-pipelined/src/generic/flop/flopen.sv create mode 100644 wally-pipelined/src/generic/flop/flopenl.sv create mode 100644 wally-pipelined/src/generic/flop/flopenr.sv create mode 100644 wally-pipelined/src/generic/flop/flopenrc.sv rename wally-pipelined/src/{muldiv/div/div64_sim/mux.sv => generic/flop/flopens.sv} (54%) create mode 100644 wally-pipelined/src/generic/flop/flopr.sv create mode 100644 wally-pipelined/src/generic/flop/floprc.sv delete mode 100755 wally-pipelined/src/muldiv/div/README delete mode 100644 wally-pipelined/src/muldiv/div/README.md delete mode 100755 wally-pipelined/src/muldiv/div/div delete mode 100644 wally-pipelined/src/muldiv/div/div.c delete mode 100644 wally-pipelined/src/muldiv/div/div64.out delete mode 100755 wally-pipelined/src/muldiv/div/div64_sim/div.sv delete mode 100644 wally-pipelined/src/muldiv/div/div64_sim/flop.sv delete mode 100755 wally-pipelined/src/muldiv/div/div64_sim/iter32.do delete mode 100755 wally-pipelined/src/muldiv/div/div64_sim/iter64.do delete mode 100755 wally-pipelined/src/muldiv/div/div64_sim/test_iter32.sv delete mode 100755 wally-pipelined/src/muldiv/div/div64_sim/test_iter64.sv delete mode 100755 wally-pipelined/src/muldiv/div/divide4x32.sv delete mode 100755 wally-pipelined/src/muldiv/div/divide4x64.sv delete mode 160000 wally-pipelined/src/muldiv/div/imperas-riscv-tests delete mode 100755 wally-pipelined/src/muldiv/div/int32div.do delete mode 100755 wally-pipelined/src/muldiv/div/int64div.do delete mode 100755 wally-pipelined/src/muldiv/div/iter32.do delete mode 100755 wally-pipelined/src/muldiv/div/iter64.do delete mode 100644 wally-pipelined/src/muldiv/div/mux_div.sv delete mode 100644 wally-pipelined/src/muldiv/div/shift.sv delete mode 100755 wally-pipelined/src/muldiv/div/shift_left.do delete mode 100644 wally-pipelined/src/muldiv/div/shift_left.out delete mode 100644 wally-pipelined/src/muldiv/div/shift_left_tb.sv delete mode 100755 wally-pipelined/src/muldiv/div/shift_right.do delete mode 100644 wally-pipelined/src/muldiv/div/shift_right.out delete mode 100755 wally-pipelined/src/muldiv/div/shift_right_tb.sv delete mode 100644 wally-pipelined/src/muldiv/div/shifter.sv delete mode 100644 wally-pipelined/src/muldiv/div/shifters_div.sv delete mode 100755 wally-pipelined/src/muldiv/div/test_int32div.sv delete mode 100644 wally-pipelined/src/muldiv/div/test_int64div.sv delete mode 100755 wally-pipelined/src/muldiv/div/test_iter32.sv delete mode 100755 wally-pipelined/src/muldiv/div/test_iter64.sv delete mode 100755 wally-pipelined/src/muldiv/div/udiv delete mode 100644 wally-pipelined/src/muldiv/div/udiv.c diff --git a/tests/wally-riscv-arch-test/.gitignore b/tests/wally-riscv-arch-test/.gitignore new file mode 100644 index 000000000..3203a4378 --- /dev/null +++ b/tests/wally-riscv-arch-test/.gitignore @@ -0,0 +1,11 @@ +# Ignore editor backup files +*~ +# Ignore transients generated by the tests +/.cproject +/.project +/work/ +/setup.env +#ignore Mac file system artifacts +*.DS_Store + +riscv-target/ diff --git a/tests/wally-riscv-arch-test/CHANGELOG.md b/tests/wally-riscv-arch-test/CHANGELOG.md new file mode 100644 index 000000000..cf6144267 --- /dev/null +++ b/tests/wally-riscv-arch-test/CHANGELOG.md @@ -0,0 +1,413 @@ +# CHANGELOG + +## [2.5.3] - 2021-10-15 + - fix the lower case `i` in the `RVTEST_CASE` macros used in the shift operation tests. + +## [2.5.2] - 2021-10-14 + - update format for aes32 and sm4 instructions + - update reference signature for sha256 and sm3 instructions in rv64i_m/K_unratified + - delete zip and unzip tests in rv64i_m/K_unratified + - update tests for aes64ks1i, sm4ed and sm4ks to use byte_count with overlap = "Y" to improve the coverage of S-boxes + +## [2.5.1] - 2021-10-07 + - added styles files to the F coverage report directories. + +## [2.5.0] - 2021-10-01 + - Added rv32f tests, references, coverage files and data propagation reports + - fixed broken links in READMEs across the repo. + - corrected string "EBREAK" in io string macro to "ECALL" for ecall.S tests. #207 + - fixed typo `.alive` --> `.align` in `riscv-target/example_target/model_test.h`. + +## [2.4.7] - 2021-10-01 + - Fix for the issue #206 + +## [2.4.6] - 2021-08-02 + - Added rv32e tests in riscv-test-suite + +## [2.4.5] - 2021-07-29 + - fix for issue #195 + +## [2.4.4] - 2021-07-19 + - Annotating tags during releases + +## [2.4.3] - 2021-05-20 + - added new 64-bit K crypto tests as per the test-plan presented by the scalar crypto task group + [here](https://github.com/riscv/riscv-crypto/blob/d89dfee25780f79c162da4eb69cd9076dd701c88/tests/compliance/test-plan-scalar.adoc) + - added new 32-bit K crypto tests as per the above mentioned test-plan. + - added coverage and data propagation reports for the above tests. + - updated README in riscv-test-suite + - added missing semi-colon in example target Makefile.include files + +## [2.4.2] - 2021-04-20 + - changed all occurances of SPTBR to the new name SATP + +## [2.4.1] - 2021-04-01 + - updated issue number in TestFormatSpec to be consistent with doc history + - adding a contribution guideline + - updated comment on usage of RISCV_DEVICE in Makefile.include + - updated licenses that are currently used by tests + - renamed K tests to K_unratified + - updated ci to build and upload pdf for testformatspec + +## [2.4.0] - 2021-03-26 +2021-03-26 Duncan Graham + - Added new K Crypto (scalar) (0.8.1) tests from Imperas + +## [2.3.1] - 2021-03-20 +### Changed + - Compliance Task Group changed to Architecture Test SIG in all docs and comments + - replacing old riscv-compliance link with new riscv-arch-test links + - fixed ci for release +### Removed + - spec/TestFormatSpec.pdf is removed since its old. Keeping only adoc file + - removing obsolete and commented out portions from doc/README + +## [2.3] - 2021-03-11 +### Added + - updated maintainers list in root-level readme + - updated the links to riscof, isac and ctg repos and docs in root-level readme + - adding CI to update versions automatically +### Removed + - replaced spike target with a REAMDE pointing to riscv-isa-sim/arch_test_target/README.md + +## [2.2] - 2021-01-28 + 2021-01-22 Tobias Wölfel + * Add missing base ISA check in riscv-test-suite + + 2021-01-20 Xiretza + * Deduplicate makefiles in riscv-test-suite + * Makefile: Fix ordering of simulate and verify targets to allow multi-job runs (make -j) + * Makefile.include: Document RISCV_TEST + * Makefile: use $(TARGETDIR) variable for postverify target instead of hard-coded path + + 2021-01-16 S Pawan Kumar + * Fixed NARGS macro defintion to work correctly. + + 2021-01-15 Xiretza + * style: Add a missing space to the "OK" message in verify.sh + + 2020-12-17 Neel Gala + * remove env folder symlinks from all riscv-test-suite src folders + * fixed assertion macros for ovpsim + * renamed RVTEST_ASSERT to RVMODEL_ASSERT in the Makefile and ovpsim macros + * tests updated with right set of "correctvals" + + 2020-11-24 Neel Gala + * added MIGRATION.adoc in doc directory to indicate how old framework targets can work with + changes made as part of this PR + * updated doc/README.adoc to avoid the word "compliance" and updated the section on porting a new + target to the framework. + * Added an example_target directory to host dummy files which can be used as a starting point for + porting targets. This was provided by MarcKarasek. + * migrated/ported existing targets (except codasip and sifive-formal) to the new framework + changes. + * in riscv-test-env/p/riscv_test.h changed names of RVTEST_[CODE/DATA]_[BEGIN/END] to + RVTEST_[CODE/DATA]_[BEGIN/END]_OLD respectively to avoid conflicts with the new framework macros. + * in riscv-test-env/p/riscv_test.h re-strutucture RVTEST_DATA_BEGIN_OLD/END to ensure that all + target specific data contents are introduced in RVTEST_DATA_END after the signature. + * added new file riscv-test-suite/env/arch_test.h which contains the macros used by the new set of + tests. A symlink to this in the riscv-test-env directory is also created. The arch_test also + includes aliases for the old macros. + * encoding.h moved to riscv-test-suite/env and a symlink to this file exists in riscv-test-env. + This was done to ensure that the arch_test.h and encoding.h are not to be modified by the + targets + * Added riscv-test-stats which includes coverage and data propagation reports for the tests + available in the riscv-test-suite directory. + * upddted the directory structure of the riscv-test-suite as per definition found in the + TestFormatSpec document. + * new set of tests with better coverage for rv[32/64][I,M,C, Zifencei] added. Almost all tests + were generated using the open source riscv_ctg tool. A few tests like fence, fencei, ebreak, + ecall, etc were handwritten/modified to follow the new macro conventions. + * Updated TestFormatSpec to avoid the word compliance and also updated the definitions of macros + and signatures + * created a root-level Makefile.include to decouple the Makefile and target specific settings. + * Added riscv-target and Makefile.include to the .gitignore file to stop tracking target specific + changes. + * Added special targets for compile(build), simulate(run) and verify in the Makefiles of each + test-suite. + * the existing riscv-targets have been either updated for the new framework or migrated to the + framework. + + 2020-10-15 Simon Davidmann + * riscvOVPsim enhanced and moved to its own respository: github.com/riscv-ovpsim + + 2020-04-24 Allen Baum + * fixed the I-SB-01.S and I-SH-01.S tests and associated reference signatures to account + of tests with negative offsets (which causes stores outside the signature area) + + 2020-03-19 Neel Gala + * restructuring the riscv-test-suite to indicate clearly what is deprecated, wip and usable + tests. + * based on the above fixed the directory structure for riscv-targets where-ever applicable. Only + tested riscvOVPsim and spike. + * fixed script bugs for spike as well + * renamed rv32i/I-IO.S to rv32i/I-IO-01.S along with necessary changes to the reference files + and Makefrag + * renamed mbadaddr csr to mtval as raised in issue #31 + * C.SWSP-01.S test updated to fix issue #37 + + 2020-03-18 Neel Gala + * fixed doc/README.adoc with correct version to pass the sanity-check in the doc/Makefile + + 2020-02-07 Prashanth Mundkur + * Support F extension on RV32 sail-riscv-c. + + 2019-12-01 Allen Baum + * modified macro names to conformn to riscof naming convention of model specific vs. pre-defined + * add more complete list of macros, their uses, parameters, and whether they are required or optional + * minor structural changes (moving sentences, renumbering) and typo fixes + * clarified impact of debug macros + * clarified how SIGUPD and BASEUPD must be used + * remove section about test taxonomy, binary tests, emulated ops + * clarify/fix boundary between test target and framework responsibilities + (split test target into test target and test shell) + * remove To Be discussed items that have been discussed + * remove default case condition; if conditions are unchanged, part of same case + * minor grammatical changes related to the above + + 2019-10-16 Allen Baum + * spec/TestFormatSpec.adoc: changed the format of the signature to fixed physical address size, fixed 32b data size extracted from COMPLIANCE_DATA_BEGIN/END range. + + * more gramatical fixes, clarifications added + * added To Be Discussed items regarding emulated instruction and binary tests + + 2019-09-11 Allen Baum + * spec/TestFormatSpec.adoc: more grammar and typo corrections and changes + clarified and added To Be Discussed issues + + 2019-09-11 Allen Baum + * spec/TestFormatSpec.adoc: many grammar and typo corrections and changes + removed many "to Be Discussed items and made them official + Added wording to clarify spec intent (work in progress/goal rather than final) + Added macros to ease test authoring: RVTEST_SIGBASE, RVTEST_SIGUPDATE, RVTEST_CASE + Added detail on proposals for connection to framework (how framework selects tests). + Expanded definition of signature format + Changed the (proposed) directory structure and naming convention to eliminate ambiguities, add consistancy and slightly better match existing structure + Added many "future work" items related to the above + Added examples and comments to code examples to indicate how proposed macros would be used + * .gitignore: added condition to ignore Mac file system artifacts + + + 2019-11-05 Lee Moore + * Restructured RV32I to move Zicsr and Zifencei into their own suites + + 2019-10-14 Lee Moore + * Added Ability to run a single test by using the Make Variable RISCV_TEST + for example, to only run the test I-ADD-01 from the rv32i suite + make RISCV_ISA=rv32i RISCV_TEST=I-ADD-01 + * Added Top Level Variable to Makefile RISCV_TARGET_FLAGS, + in the case of the RISCV_TARGET this can be passed and appended to the invocation + commandline configuration, for example to pass a command line flag to the RISCV_TARGET + to perform tracing. The value of this flag will be target specific + make RISCV_ISA=rv32i RISCV_TEST=I-ADD-01 RISCV_TARGET_FLAGS="--trace" + This is has also been added to all other targets to allow target configuration from + the commandline + + 2019-10-07 Philipp Wagner + * When executing the test suite, Ibex always writes an instruction + log. Update the Makefile to write it to a test-specific location + (next to all other log files). + * On Ibex, provide an additional .objdump-noalias disassembly file + with no aliases and numeric register names (instead of ABI names). + This file matches the Ibex trace and can be used to debug the test + runs. + + 2019-08-29 Robert Balas + * Added support for using RI5CY as a target. + * Added subdirectory riscv-target/ri5cy + + 2019-08-08 Lee Moore + * Added support for lowRISC/ibex RTL as a target using Verilator. + In conjunction with Philipp Wagner of lowRISC phw@lowrisc.org + + 2019-07-18 Paul Donahue + * Fix typos/grammar and use correct architectural terms. + + 2019-06-21 Ben Selfridge + * Added support for using the the GRIFT simulator as a target. + * Added subdirectory riscv-target/grift + * updated README.md and doc/README.adoc + + 2019-05-23 Prashanth Mundkur + * Added support and instructions for using the C and OCaml simulators from the Sail RISC-V formal model as targets. + * added subdirectories riscv-target/sail-riscv-c and riscv-target/sail-riscv-ocaml + * updated README.md and doc/README.adoc + + 2019-04-05 Allen Baum + * spec/TestFormatSpec.adoc: Adding details, minor corrections, ToBeDiscussed + items and clarifications to the specification of the future compliance test + suite. Also removing restrictions on having absolate addresses in signature + + 2019-02-21 Lee Moore + * Fixed bug in RVTEST_IO_ASSERT_GPR_EQ which was not preserving register t0 + * Corrected commit I-LUI-01.S, register target changed but missed assertion + + 2019-02-21 Deborah Soung + * added RiscvFormalSpec as a target with its own unique environment + + 2019-02-15 Radek Hajek + * updated rv32i tests to support all registers (x31) with assertions + * updated spec/TestFormatSpec.adoc example ISA test with new assertions + + 2019-02-05 Deborah Soung + * [Issue #33] fixing rv32si/ma_fetch.S test + * [Issue #32] fixing breakpoint test + + 2019-02-01 Lee Moore + * updated Infrastructure macros to support non-volatile registers + * updated riscvOVPsim + + 2019-01-29 Deborah Soung + * Added Rocket Chip generated cores as a target + * riscv-target/rocket/compliance_io.h created + * riscv-target/rocket/compliance_test.h created + * riscv-target/rocket/*/Makefile.include created for existing test suites + * README.adoc updated with instructions for using Rocket cores as targets + + 2019-01-22 Premysl Vaclavik + * feature: initial version of Compliance Test Format Specification + * This new document outlines how we should like the compliance + system to work going forward. By contrast the doc/README.adoc file + describes the current system as it is. + * Approved at Compliance TG meeting of 9 Jan 2019. + + 2019-01-02 Radek Hajek + * unified macros in all compliance tests + + 2018-12-20 Lee Moore + * fixed riscvOVPsim + + 2018-11-22 Simon Davidmann + * added information on test suite status + + 2018-11-21 Olof Kindgren + * Added support for using external target directories with $TARGETDIR + + 2018-11-21 Neel Gala + * riscv-test-suite/rv_/references/_.reference_output: changed signature + format for all tests to include only 4-bytes per line starting with the + most significant byte on the left. + * riscv-target/spike/device/rv_/Makefile.include: Added a patch for + spike-device Makefiles where the old-signature format is post-processed + to generate a signature in the new format at the end of each test. + * riscv-target/riscvOVPsim/device/rv_/Makefile.include: same patch as above. + * Makefile: default target for Makefile is now to run all tests supported by + the target mentioned defined by RISCV_TARGET variable. + + 2018-10-11 Simon Davidmann + * Ported github riscv/riscv-tests for RV32 processors to this compliance env + * rv32ua rv32uc rv32ud rv32uf rv32ud rv32ui + + 2018-09-10 Lee Moore + * Added tests to RV32I to improve coverage, usage of Imperas Mutating Fault Simulator to + identify untested usage cases + * Macro renames to support GPR, (S)FPR, (D)FPR + * Added test suite RV32IM to test 32 bit Multiply and Divide instructions + * Added test suite RV32IMC to test 32 bit Compressed instructions + * Added test suite RV64I to test 64 bit Integer instructions + * Added test suite RV64IM to test 64 bit Multiply and Divide instructions + + + 2018-06-15 Radek Hajek + + Modifications to support Codasip simulator. + + The simulator is renamed as Codasip-simulator (was + Codasip-IA-simulator), compliance_test.h has been moved to target + directories and a COMPILE_TARGET has been added to Makefile to + allow use of LLVM. + + * Makefile: Include Codasip simulator target. + * riscv-target/codasip-IA-simulator/compliance_io.h: Renamed as + riscv-target/Codasip-simulator/compliance_io.h. + * riscv-target/Codasip-simulator/compliance_io.h: Renamed from + riscv-target/codasip-IA-simulator/compliance_io. + * riscv-target/Codasip-simulator/compliance_test.h: Created. + * riscv-target/codasip-IA-simulator/device/rv32i/Makefile.include: + Renamed as + riscv-target/Codasip-simulator/device/rv32i/Makefile.include + * riscv-target/Codasip-simulator/device/rv32i/Makefile.include: + Renamed from + riscv-target/codasip-IA-simulator/device/rv32i/Makefile.include. + * riscv-test-env/compliance_test.h: Renamed as + riscv-target/riscvOVPsim/compliance_test.h. + * riscv-target/riscvOVPsim/compliance_test.h: Renamed from + riscv-test-env/compliance_test.h. + * riscv-target/riscvOVPsim/device/rv32i/Makefile.include: Updated + for new environment. + * riscv-target/spike/compliance_test.h: Created. + * riscv-target/spike/device/rv32i/Makefile.include: Updated for + new environment. + * riscv-test-suite/rv32i/Makefile: Likewise. + + 2018-06-10 Jeremy Bennett + + Put placeholders in empty directories to make sure they show in + the GitHub hierarchy. + + * riscv-test-suite/rv32i/.gitignore: Created. + * riscv-test-suite/rv32m/.gitignore: Created. + + 2018-06-10 Jeremy Bennett + + * README.md: Make references to files in the repo into links. + + 2018-06-09 Jeremy Bennett + + * .gitignore: Ignore editor backup files. + + 2018-06-09 Jeremy Bennett + + * README.md: Add better link to documentation README.md. + + 2018-06-08 Jeremy Bennett + + * README.md: Move AsciiDoc details into new README.md in the doc + directory. + + 2018-06-08 Jeremy Bennett + + * README.md: Fix typo in link to AsciiDoc cheat sheet + + 2018-06-08 Jeremy Bennett + + * COPYING.BSD: Created. + * COPYING.CC: Created. + * README.md: Add git process, licensing and engineering process. + + 2018-06-08 Jeremy Bennett + + * README.md: Correct details for running the compliance tests and + directory for OVPsim. + + 2018-06-08 Jeremy Bennett + + Clean restructuring to just the work of interest. + + * thought-experiments: Directory removed. + * .gitignore: Merged with TestStructure/.gitignore + * Makefile: Renamed from TestStructure/Makefile. + * TestStructure/Makefile: Renamed as Makefile. + * README.md: Merged with TestStructure/README.md. + * TestStructure/.gitignore: Deleted and contents moved into + .gitignore. + * TestStructure/README.md: Deleted and contents moved into + README.md. + * TestStructure/doc: Directory deleted. + * TestStructure/riscv-target: Directory moved to riscv-target. + * riscv-target: Directory moved from TestStructure/riscv-target + * TestStructure/riscv-test-env: Directory moved to riscv-test-env. + * riscv-test-env: Directory moved from + TestStructure/riscv-test-env. + * TestStructure/riscv-test-suite: Directory moved to + riscv-test-suite. + * riscv-test-suite: Directory moved from + TestStructure/riscv-test-suite. + * thought-experiments: Directory deleted. + + 2018-05-21 Jeremy Bennett + + Initial commit to populate the repository. + + * ChangeLog: Created. + * README.md: Created. diff --git a/tests/wally-riscv-arch-test/CONTRIBUTION.md b/tests/wally-riscv-arch-test/CONTRIBUTION.md new file mode 100644 index 000000000..01f4424c7 --- /dev/null +++ b/tests/wally-riscv-arch-test/CONTRIBUTION.md @@ -0,0 +1,66 @@ +# Contributing to RISC-V Architecture Tests + +Your inputs are welcome and greatly appreciated! We want to make contributing to this project as easy and transparent as possible, whether it's: + +- Reporting a bug +- Discussing the current state of the code +- Submitting a fix +- Proposing new features +- Becoming a maintainer + +## We develop with Github +We use github to host code, to track issues and feature requests, as well as accept pull requests. + +## We use a simple git flow where all code changes happen through Pull Requests + +Pull requests are the best way to propose changes to the codebase. We actively welcome your pull requests: + +1. Fork the repo and create your branch from `master`. +2. If you have added new tests, please ensure they adhere to the latest TestFormatSpec and that you have run them on the RVI approved reference + models (if support in those models is available). +3. If you have updated any test-macros make sure to update the documentation as well. +4. If you have updated the docs, ensure that they render correctly in the respective format. +5. Make sure to create an entry in the CHANGELOG.md. Please refer to the section on versioning below + to choose an appropriate version number. +6. Ensure the existing tests are not broken and still pass on the the RVI approved reference models. +7. Please include a comment with the SPDX license identifier in all source files, for example: + ``` + // SPDX-License-Identifier: BSD-3-Clause + ``` +8. Issue that pull request! + +## Versioning + +When issuing pull requests, an entry in the CHANGELOG.md is mandatory. The arch-test-repo adheres to +the [`Semantic Versioning`](https://semver.org/spec/v2.0.0.html) scheme. Following guidelines must +be followed while assigning a new version number : + +- Patch-updates: all doc updates (like typos, more clarification,etc) and updates to unratified extensions. +- Minor-updates: Updates to ratified extensions OR migration of extensions to ratified OR changes in docs regarding policies or spec. +- Major-updates: Changes to the framework flow (backward compatible or incompatible). + +Note: You can have either a patch or minor or major update. +Note: In case of a conflict, the maintainers will decide the final version to be assigned. + +## Any contributions you make will be under the permissive open-source License +In short, when you submit code changes, your submissions are understood to be under a permissive open source license like BSD-3, Apache-2.0 and CC, etc that covers the project. Feel free to contact the maintainers if that's a concern. + +## Report bugs using Github's [issues](https://github.com/riscv/riscv-arch-test/issues) +We use GitHub issues to track public bugs. Report a bug by [opening a new issue](https://github.com/riscv/riscv-arch-test/issues/new); it's that easy! + +## Write bug reports with detail, background, and sample code + +**Great Bug Reports** tend to have: + +- A quick summary and/or background +- Steps to reproduce + - Be specific! + - Give sample code if you can. +- What you expected would happen +- What actually happens +- Notes (possibly including why you think this might be happening, or stuff you tried that didn't work) + +## License +By contributing, you agree that your contributions will be licensed under its permissive open source +licenses. + diff --git a/tests/wally-riscv-arch-test/COPYING.APACHE b/tests/wally-riscv-arch-test/COPYING.APACHE new file mode 100644 index 000000000..d64569567 --- /dev/null +++ b/tests/wally-riscv-arch-test/COPYING.APACHE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/tests/wally-riscv-arch-test/COPYING.BSD b/tests/wally-riscv-arch-test/COPYING.BSD new file mode 100644 index 000000000..1d9da10ca --- /dev/null +++ b/tests/wally-riscv-arch-test/COPYING.BSD @@ -0,0 +1,9 @@ +Copyright (c) . All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. +3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/tests/wally-riscv-arch-test/COPYING.CC b/tests/wally-riscv-arch-test/COPYING.CC new file mode 100644 index 000000000..0fb847eb0 --- /dev/null +++ b/tests/wally-riscv-arch-test/COPYING.CC @@ -0,0 +1,395 @@ +Attribution 4.0 International + +======================================================================= + +Creative Commons Corporation ("Creative Commons") is not a law firm and +does not provide legal services or legal advice. Distribution of +Creative Commons public licenses does not create a lawyer-client or +other relationship. Creative Commons makes its licenses and related +information available on an "as-is" basis. Creative Commons gives no +warranties regarding its licenses, any material licensed under their +terms and conditions, or any related information. Creative Commons +disclaims all liability for damages resulting from their use to the +fullest extent possible. + +Using Creative Commons Public Licenses + +Creative Commons public licenses provide a standard set of terms and +conditions that creators and other rights holders may use to share +original works of authorship and other material subject to copyright +and certain other rights specified in the public license below. The +following considerations are for informational purposes only, are not +exhaustive, and do not form part of our licenses. + + Considerations for licensors: Our public licenses are + intended for use by those authorized to give the public + permission to use material in ways otherwise restricted by + copyright and certain other rights. Our licenses are + irrevocable. Licensors should read and understand the terms + and conditions of the license they choose before applying it. + Licensors should also secure all rights necessary before + applying our licenses so that the public can reuse the + material as expected. Licensors should clearly mark any + material not subject to the license. This includes other CC- + licensed material, or material used under an exception or + limitation to copyright. More considerations for licensors: + wiki.creativecommons.org/Considerations_for_licensors + + Considerations for the public: By using one of our public + licenses, a licensor grants the public permission to use the + licensed material under specified terms and conditions. If + the licensor's permission is not necessary for any reason--for + example, because of any applicable exception or limitation to + copyright--then that use is not regulated by the license. Our + licenses grant only permissions under copyright and certain + other rights that a licensor has authority to grant. Use of + the licensed material may still be restricted for other + reasons, including because others have copyright or other + rights in the material. A licensor may make special requests, + such as asking that all changes be marked or described. + Although not required by our licenses, you are encouraged to + respect those requests where reasonable. More considerations + for the public: + wiki.creativecommons.org/Considerations_for_licensees + +======================================================================= + +Creative Commons Attribution 4.0 International Public License + +By exercising the Licensed Rights (defined below), You accept and agree +to be bound by the terms and conditions of this Creative Commons +Attribution 4.0 International Public License ("Public License"). To the +extent this Public License may be interpreted as a contract, You are +granted the Licensed Rights in consideration of Your acceptance of +these terms and conditions, and the Licensor grants You such rights in +consideration of benefits the Licensor receives from making the +Licensed Material available under these terms and conditions. + + +Section 1 -- Definitions. + + a. Adapted Material means material subject to Copyright and Similar + Rights that is derived from or based upon the Licensed Material + and in which the Licensed Material is translated, altered, + arranged, transformed, or otherwise modified in a manner requiring + permission under the Copyright and Similar Rights held by the + Licensor. For purposes of this Public License, where the Licensed + Material is a musical work, performance, or sound recording, + Adapted Material is always produced where the Licensed Material is + synched in timed relation with a moving image. + + b. Adapter's License means the license You apply to Your Copyright + and Similar Rights in Your contributions to Adapted Material in + accordance with the terms and conditions of this Public License. + + c. Copyright and Similar Rights means copyright and/or similar rights + closely related to copyright including, without limitation, + performance, broadcast, sound recording, and Sui Generis Database + Rights, without regard to how the rights are labeled or + categorized. For purposes of this Public License, the rights + specified in Section 2(b)(1)-(2) are not Copyright and Similar + Rights. + + d. Effective Technological Measures means those measures that, in the + absence of proper authority, may not be circumvented under laws + fulfilling obligations under Article 11 of the WIPO Copyright + Treaty adopted on December 20, 1996, and/or similar international + agreements. + + e. Exceptions and Limitations means fair use, fair dealing, and/or + any other exception or limitation to Copyright and Similar Rights + that applies to Your use of the Licensed Material. + + f. Licensed Material means the artistic or literary work, database, + or other material to which the Licensor applied this Public + License. + + g. Licensed Rights means the rights granted to You subject to the + terms and conditions of this Public License, which are limited to + all Copyright and Similar Rights that apply to Your use of the + Licensed Material and that the Licensor has authority to license. + + h. Licensor means the individual(s) or entity(ies) granting rights + under this Public License. + + i. Share means to provide material to the public by any means or + process that requires permission under the Licensed Rights, such + as reproduction, public display, public performance, distribution, + dissemination, communication, or importation, and to make material + available to the public including in ways that members of the + public may access the material from a place and at a time + individually chosen by them. + + j. Sui Generis Database Rights means rights other than copyright + resulting from Directive 96/9/EC of the European Parliament and of + the Council of 11 March 1996 on the legal protection of databases, + as amended and/or succeeded, as well as other essentially + equivalent rights anywhere in the world. + + k. You means the individual or entity exercising the Licensed Rights + under this Public License. Your has a corresponding meaning. + + +Section 2 -- Scope. + + a. License grant. + + 1. Subject to the terms and conditions of this Public License, + the Licensor hereby grants You a worldwide, royalty-free, + non-sublicensable, non-exclusive, irrevocable license to + exercise the Licensed Rights in the Licensed Material to: + + a. reproduce and Share the Licensed Material, in whole or + in part; and + + b. produce, reproduce, and Share Adapted Material. + + 2. Exceptions and Limitations. For the avoidance of doubt, where + Exceptions and Limitations apply to Your use, this Public + License does not apply, and You do not need to comply with + its terms and conditions. + + 3. Term. The term of this Public License is specified in Section + 6(a). + + 4. Media and formats; technical modifications allowed. The + Licensor authorizes You to exercise the Licensed Rights in + all media and formats whether now known or hereafter created, + and to make technical modifications necessary to do so. The + Licensor waives and/or agrees not to assert any right or + authority to forbid You from making technical modifications + necessary to exercise the Licensed Rights, including + technical modifications necessary to circumvent Effective + Technological Measures. For purposes of this Public License, + simply making modifications authorized by this Section 2(a) + (4) never produces Adapted Material. + + 5. Downstream recipients. + + a. Offer from the Licensor -- Licensed Material. Every + recipient of the Licensed Material automatically + receives an offer from the Licensor to exercise the + Licensed Rights under the terms and conditions of this + Public License. + + b. No downstream restrictions. You may not offer or impose + any additional or different terms or conditions on, or + apply any Effective Technological Measures to, the + Licensed Material if doing so restricts exercise of the + Licensed Rights by any recipient of the Licensed + Material. + + 6. No endorsement. Nothing in this Public License constitutes or + may be construed as permission to assert or imply that You + are, or that Your use of the Licensed Material is, connected + with, or sponsored, endorsed, or granted official status by, + the Licensor or others designated to receive attribution as + provided in Section 3(a)(1)(A)(i). + + b. Other rights. + + 1. Moral rights, such as the right of integrity, are not + licensed under this Public License, nor are publicity, + privacy, and/or other similar personality rights; however, to + the extent possible, the Licensor waives and/or agrees not to + assert any such rights held by the Licensor to the limited + extent necessary to allow You to exercise the Licensed + Rights, but not otherwise. + + 2. Patent and trademark rights are not licensed under this + Public License. + + 3. To the extent possible, the Licensor waives any right to + collect royalties from You for the exercise of the Licensed + Rights, whether directly or through a collecting society + under any voluntary or waivable statutory or compulsory + licensing scheme. In all other cases the Licensor expressly + reserves any right to collect such royalties. + + +Section 3 -- License Conditions. + +Your exercise of the Licensed Rights is expressly made subject to the +following conditions. + + a. Attribution. + + 1. If You Share the Licensed Material (including in modified + form), You must: + + a. retain the following if it is supplied by the Licensor + with the Licensed Material: + + i. identification of the creator(s) of the Licensed + Material and any others designated to receive + attribution, in any reasonable manner requested by + the Licensor (including by pseudonym if + designated); + + ii. a copyright notice; + + iii. a notice that refers to this Public License; + + iv. a notice that refers to the disclaimer of + warranties; + + v. a URI or hyperlink to the Licensed Material to the + extent reasonably practicable; + + b. indicate if You modified the Licensed Material and + retain an indication of any previous modifications; and + + c. indicate the Licensed Material is licensed under this + Public License, and include the text of, or the URI or + hyperlink to, this Public License. + + 2. You may satisfy the conditions in Section 3(a)(1) in any + reasonable manner based on the medium, means, and context in + which You Share the Licensed Material. For example, it may be + reasonable to satisfy the conditions by providing a URI or + hyperlink to a resource that includes the required + information. + + 3. If requested by the Licensor, You must remove any of the + information required by Section 3(a)(1)(A) to the extent + reasonably practicable. + + 4. If You Share Adapted Material You produce, the Adapter's + License You apply must not prevent recipients of the Adapted + Material from complying with this Public License. + + +Section 4 -- Sui Generis Database Rights. + +Where the Licensed Rights include Sui Generis Database Rights that +apply to Your use of the Licensed Material: + + a. for the avoidance of doubt, Section 2(a)(1) grants You the right + to extract, reuse, reproduce, and Share all or a substantial + portion of the contents of the database; + + b. if You include all or a substantial portion of the database + contents in a database in which You have Sui Generis Database + Rights, then the database in which You have Sui Generis Database + Rights (but not its individual contents) is Adapted Material; and + + c. You must comply with the conditions in Section 3(a) if You Share + all or a substantial portion of the contents of the database. + +For the avoidance of doubt, this Section 4 supplements and does not +replace Your obligations under this Public License where the Licensed +Rights include other Copyright and Similar Rights. + + +Section 5 -- Disclaimer of Warranties and Limitation of Liability. + + a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE + EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS + AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF + ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, + IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, + WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, + ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT + KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT + ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. + + b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE + TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, + NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, + INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, + COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR + USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN + ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR + DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR + IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. + + c. The disclaimer of warranties and limitation of liability provided + above shall be interpreted in a manner that, to the extent + possible, most closely approximates an absolute disclaimer and + waiver of all liability. + + +Section 6 -- Term and Termination. + + a. This Public License applies for the term of the Copyright and + Similar Rights licensed here. However, if You fail to comply with + this Public License, then Your rights under this Public License + terminate automatically. + + b. Where Your right to use the Licensed Material has terminated under + Section 6(a), it reinstates: + + 1. automatically as of the date the violation is cured, provided + it is cured within 30 days of Your discovery of the + violation; or + + 2. upon express reinstatement by the Licensor. + + For the avoidance of doubt, this Section 6(b) does not affect any + right the Licensor may have to seek remedies for Your violations + of this Public License. + + c. For the avoidance of doubt, the Licensor may also offer the + Licensed Material under separate terms or conditions or stop + distributing the Licensed Material at any time; however, doing so + will not terminate this Public License. + + d. Sections 1, 5, 6, 7, and 8 survive termination of this Public + License. + + +Section 7 -- Other Terms and Conditions. + + a. The Licensor shall not be bound by any additional or different + terms or conditions communicated by You unless expressly agreed. + + b. Any arrangements, understandings, or agreements regarding the + Licensed Material not stated herein are separate from and + independent of the terms and conditions of this Public License. + + +Section 8 -- Interpretation. + + a. For the avoidance of doubt, this Public License does not, and + shall not be interpreted to, reduce, limit, restrict, or impose + conditions on any use of the Licensed Material that could lawfully + be made without permission under this Public License. + + b. To the extent possible, if any provision of this Public License is + deemed unenforceable, it shall be automatically reformed to the + minimum extent necessary to make it enforceable. If the provision + cannot be reformed, it shall be severed from this Public License + without affecting the enforceability of the remaining terms and + conditions. + + c. No term or condition of this Public License will be waived and no + failure to comply consented to unless expressly agreed to by the + Licensor. + + d. Nothing in this Public License constitutes or may be interpreted + as a limitation upon, or waiver of, any privileges and immunities + that apply to the Licensor or You, including from the legal + processes of any jurisdiction or authority. + + +======================================================================= + +Creative Commons is not a party to its public +licenses. Notwithstanding, Creative Commons may elect to apply one of +its public licenses to material it publishes and in those instances +will be considered the “Licensor.†The text of the Creative Commons +public licenses is dedicated to the public domain under the CC0 Public +Domain Dedication. Except for the limited purpose of indicating that +material is shared under a Creative Commons public license or as +otherwise permitted by the Creative Commons policies published at +creativecommons.org/policies, Creative Commons does not authorize the +use of the trademark "Creative Commons" or any other trademark or logo +of Creative Commons without its prior written consent including, +without limitation, in connection with any unauthorized modifications +to any of its public licenses or any other arrangements, +understandings, or agreements concerning use of licensed material. For +the avoidance of doubt, this paragraph does not form part of the +public licenses. + +Creative Commons may be contacted at creativecommons.org. diff --git a/tests/wally-riscv-arch-test/Makefile b/tests/wally-riscv-arch-test/Makefile new file mode 100644 index 000000000..8e817231d --- /dev/null +++ b/tests/wally-riscv-arch-test/Makefile @@ -0,0 +1,123 @@ +# +# Ensure the compiler and necessary executables are on the search PATH +# + +# +# Ensure you have set the following Variables +# +# +export ROOTDIR = $(shell pwd) +export WORK ?= $(ROOTDIR)/work + +include Makefile.include + +pipe:= | +empty:= +comma:= , +space:= $(empty) $(empty) + +RISCV_ISA_ALL = $(shell ls $(TARGETDIR)/$(RISCV_TARGET)/device/rv$(XLEN)i_m) +RISCV_ISA_OPT = $(subst $(space),$(pipe),$(RISCV_ISA_ALL)) + +RISCV_ISA_ALL := $(filter-out Makefile.include,$(RISCV_ISA_ALL)) + +ifeq ($(RISCV_DEVICE),) + RISCV_DEVICE = I + DEFAULT_TARGET=all_variant +else + DEFAULT_TARGET=variant +endif +export SUITEDIR = $(ROOTDIR)/riscv-test-suite/rv$(XLEN)i_m/$(RISCV_DEVICE) + +$(info ) +$(info ============================ VARIABLE INFO ==================================) +$(info ROOTDIR: ${ROOTDIR} [origin: $(origin ROOTDIR)]) +$(info WORK: ${WORK} [origin: $(origin WORK)]) +$(info TARGETDIR: ${TARGETDIR} [origin: $(origin TARGETDIR)]) +$(info RISCV_TARGET: ${RISCV_TARGET} [origin: $(origin RISCV_TARGET)]) +$(info XLEN: ${XLEN} [origin: $(origin XLEN)]) +$(info RISCV_DEVICE: ${RISCV_DEVICE} [origin: $(origin RISCV_DEVICE)]) +$(info =============================================================================) +$(info ) + +RVTEST_DEFINES = +ifeq ($(RISCV_ASSERT),1) + RVTEST_DEFINES += -DRVMODEL_ASSERT +endif +export RVTEST_DEFINES + +VERBOSE ?= 0 +ifeq ($(VERBOSE),1) + export V= + export REDIR1 = + export REDIR2 = +else + export V=@ + export REDIR1 = 1>/dev/null + export REDIR2 = 2>/dev/null +endif + +default: $(DEFAULT_TARGET) + +variant: simulate verify + +all_variant: + @for isa in $(RISCV_ISA_ALL); do \ + $(MAKE) $(JOBS) RISCV_TARGET=$(RISCV_TARGET) RISCV_TARGET_FLAGS="$(RISCV_TARGET_FLAGS)" RISCV_DEVICE=$$isa variant; \ + rc=$$?; \ + if [ $$rc -ne 0 ]; then \ + exit $$rc; \ + fi \ + done + +build: compile +run: simulate +clean_all: clean + +compile: + $(MAKE) $(JOBS) \ + RISCV_TARGET=$(RISCV_TARGET) \ + RISCV_DEVICE=$(RISCV_DEVICE) \ + compile -C $(SUITEDIR) + +simulate: + $(MAKE) $(JOBS) \ + RISCV_TARGET=$(RISCV_TARGET) \ + RISCV_DEVICE=$(RISCV_DEVICE) \ + run -C $(SUITEDIR) + +verify: simulate + riscv-test-env/verify.sh + +postverify: +ifeq ($(wildcard $(TARGETDIR)/$(RISCV_TARGET)/postverify.sh),) + $(info No post verify script found $(TARGETDIR)/$(RISCV_TARGET)/postverify.sh) +else + $(TARGETDIR)/$(RISCV_TARGET)/postverify.sh +endif + +clean: + $(MAKE) $(JOBS) \ + RISCV_TARGET=$(RISCV_TARGET) \ + RISCV_DEVICE=$(RISCV_DEVICE) \ + clean -C $(SUITEDIR) + +help: + @echo "RISC-V Architectural Tests" + @echo "" + @echo " Makefile Environment Variables to be set per Target" + @echo " -- TARGETDIR=''" + @echo " -- XLEN=''" + @echo " -- RISCV_TARGET=''" + @echo " -- RISCV_TARGET_FLAGS=''" + @echo " -- RISCV_DEVICE='$(RISCV_ISA_OPT)' [ leave empty to run all devices ]" + @echo " -- RISCV_TEST=' + * README.adoc: Documentation for rocket chip as target. + +2019-02-05 Deborah Soung + * README.adoc: Update documentation for rocket chip as target (fixed rv32si/ma_fetch.S). + * README.adoc: Update documentation for rocket chip as target (fixed breakpoint.S). + +2019-01-29 Deborah Soung + * README.adoc: Documentation for rocket chip as target. + +2018-11-21 Olof Kindgren + + * README.adoc (Repository structure) Added documentation for the $TARGETDIR environmental variable + +2018-11-21 Neel Gala + * README.adoc: Added new signature format spec. + +2018-06-18 Jeremy Bennett + + * README.adoc (Future work): Reflect changes made to support + Codasip simulator. + (Repository structure): Diagrammatic representation of the file + structure deleted. + +2018-06-12 Jeremy Bennett + + * .gitignore: Add custom.dict. + +2018-06-12 Jeremy Bennett + + Document issue 1.8 Draft. + + * README.adoc (Introduction): Add Future work section and bump + version. + * custom.wordlist: Add words needed for Future work section. + +2018-06-12 Jeremy Bennett + + * README.adoc: Remove special apostrophe from "licensor's". + * custom.wordlist: Updated with more words to be ignored. + +2018-06-12 Jeremy Bennett + + * README-old.md: Deleted. + * README.adoc: Include details of how to contribute and installing + the tools from the old README and reference the licence as an + appendix. + +2018-06-11 Jeremy Bennett + + This makes the document appear directly as the README of the doc + directory, so there is now no longer a need to publish to GitHub + pages. + + * .gitignore: Change name of files ignored. + * Makefile: Remove publish target. + * README.adoc: Symbolic link removed and replaced by design.adoc, + to which the CC license text has been added. + * design.adoc: Renamed as README.adoc. + * publish.sh: Deleted. + +2018-06-11 Jeremy Bennett + + * README.md: Previous version moved to README-old.md for the time + being. + * README.adoc: Created as symbolic link to design.adoc. + +2018-06-10 Jeremy Bennett + + * README.md: Note about make publish. + * design.adoc (Overall structure): Make list or instruction sets + and extensions compact representation. + +2018-06-10 Jeremy Bennett + + * publish.sh: Only publish from clean and committed master branch + to avoid difficult use of git stash. + +2018-06-10 Jeremy Bennett + + * publish.sh: Don't rely on doc directory being available on + gh-pages branch. + +2018-06-10 Jeremy Bennett + + * publish.sh: Make executable and correctly set top level + repository directory. + +2018-06-10 Jeremy Bennett + + Add a mechanism to make the latest documentation available via + GitHub pages. This means that design.html is no longer part of + the master branch, but is published by copying to index.html on + the gh-pages branch. + + * .gitignore: Ignore design.html. + * Makefile: Add publish target and delete design.html when cleaning. + * README.md: Link to GitHub pages for latest documentation. + * design.adoc: Deal with AsciiDoc apparent bug with consecutive + comment blogs. + * design.html: Deleted. + * publish.sh: Created. + +2018-06-10 Jeremy Bennett + + * README.md: Fix link to generated documentation. + * design.html: Regenerated. + +2018-06-09 Jeremy Bennett + + * Makefile: Add sanity check for version number and spell target. + * design.adoc: Fix trivial typo. + * design.html: Regenerated. + +2018-06-09 Jeremy Bennett + + * .gitignore: Don't ignore .html or .xml + * README.md: Note location of old documentation, give link to HTML + and explain how to contribute. + * custom.wordlist: Created. + * design.adoc: Cleaned up from top to bottom and spell checked. + * design.html: Generated. + +2018-06-08 Jeremy Bennett + + * Makefile: Clean up and add license header. + * README.md: Created. + * design.adoc: Add licensing and SPDX license identifier. + * legacy.adoc: Deleted. + +2018-06-04 Jeremy Bennett + + This is the first version of the document taken from Simon + Davidmann's MS Word document. The main document is design.adoc, + legacy material, currently just appendices C and D has been moved + to legacy.adoc. + + design.adoc is correct AsciiDoc. legacy.adoc is just a raw dump, + which needs cleaning up. + + The next step will be restructuring design.adoc as agreed. + + * .gitignore: Created. + * ChangeLog: Created. + * Makefile: Created. + * design.adoc: Created. + * legacy.adoc: Created. diff --git a/tests/wally-riscv-arch-test/doc/MIGRATION.adoc b/tests/wally-riscv-arch-test/doc/MIGRATION.adoc new file mode 100644 index 000000000..d9801c661 --- /dev/null +++ b/tests/wally-riscv-arch-test/doc/MIGRATION.adoc @@ -0,0 +1,88 @@ += Migration guide +:toc: +:icons: font +:numbered: +:source-highlighter: rouge + +This document serves as a guide to users of the architectural suite to migrate their targets from an +older version to a newer version with minimal changes. This guide thus provides a patch scheme to get +the previous versions of the targets up and running with the new versions of the framework. + +However, users are strongly encouraged to completely migrate to the newer versions, as and when +available, and avoid using these patches. + +== Migration from v0.1 to v0.2 + +This section will describe the changes required to transition your targets ported on v0.1 to v0.2 +framework. For examples please see: `riscv-target/riscvOVPsim_0p1` and `riscv-target/spike_0p1`. + +=== Change header filename + +In version v0.1 the target specific assembly macros were split across two files: `compliance_test.h` +and `compliance_io.h`. In version v0.2 these macros are to merged into a single file named +`model_test.h`. The following commands can the achieve the above: + +---- +mv compliance_test.h model_test.h +cat compliance_io.h >> model_test.h +rm compliance_io.h +---- + +=== Change device directory structure + +In version v0.1 a target would have one or multiple of the directories defined to indicate supported +extensions: `rv32i`, `rv32im`, `rv32imc`, `rv32Zicsr` and `rv32Zifencei`. In version v0.2 the +directories of the extensions have changed in order to provide more consistency and less ambiguity. + +For version v0.2, the `device` directory first needs to have either a `rv32i_m` directory to indicate +that the target is a 32-bit machine. The extension directories, as supported by the target, are +now to be created in each of these directories using the following mapping scheme: + +. device/rv32i -> device/rv32i_m/I +. device/rv32im -> device/rv32i_m/M +. device/rv32imc -> device/rv32i_m/C +. device/rv32Zicsr -> device/rv32i_m/privilege +. device/rv32Zifencei -> device/rv32i_m/Zifencei + +The contents of the extension directories need not change, unless there are dependencies on the path +of the directory itself. The following commands will achieve the above: + +---- +cd device +mkdir rv32i_m +mv rv32i rv32i_m/I +mv rv32im rv32i_m/M +mv rv32imc rv32i_m/C +mv rv32Zicsr rv32i_m/privilege +mv rv32Zifencei rv32i_m/Zifencei +---- + +=== Changes in target macro names. + +Since some of the macros from the old framework have been re-purposed in the new v0.2 framework, +there will be name conflicts rendering the old ones useless. In order to retain the old macros, they +have been renamed with a post-fix `_OLD`. The macros that have been renamed are given below: + +. `RVTEST_CODE_BEGIN` -> `RVTEST_CODE_BEGIN_OLD` +. `RVTEST_CODE_END` -> `RVTEST_CODE_END_OLD` +. `RVTEST_DATA_BEGIN` -> `RVTEST_DATA_BEGIN_OLD` +. `RVTEST_DATA_END` -> `RVTEST_DATA_END_OLD` + +The user is thus required to make the above changes in the new `model_test.h` that was created +as part of this migration. The following commands will help achieve the above: + +---- +sed -i 's/RVTEST_CODE_BEGIN/RVTEST_CODE_BEGIN_OLD/g' model_test.h +sed -i 's/RVTEST_CODE_END/RVTEST_CODE_END_OLD/g' model_test.h +sed -i 's/RVTEST_DATA_BEGIN/RVTEST_DATA_BEGIN_OLD/g' model_test.h +sed -i 's/RVTEST_DATA_END/RVTEST_DATA_END_OLD/g' model_test.h + +---- + +note:: the RVTEST_DATA_END in v0.1 enforced a 16-byte alignment before the signature end. This +constraint has been removed. + +=== Changes in device Makefile.include files + +No changes required. + diff --git a/tests/wally-riscv-arch-test/doc/Makefile b/tests/wally-riscv-arch-test/doc/Makefile new file mode 100644 index 000000000..697d89cdc --- /dev/null +++ b/tests/wally-riscv-arch-test/doc/Makefile @@ -0,0 +1,82 @@ +# Makefile for RISC-V Architectural Test SIG documentation + +# This file is part of the RISC-V Foundation Architectural Test SIG +# tool set and documentation. + +# Copyright (C) 2017 CodaSip Limited +# Copyright (C) 2018 Embecosm Limited . +# Copyright (C) 2018 Imperas Limited + +# All rights reserved. + +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: + +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# 3. Neither the name of mosquitto nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. + +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +# SPDX-License-Identifier: BSD-3-Clause + +ROOT = README +SRC = $(ROOT).adoc +SRC_STRIPPED = $(ROOT)-stripped.adoc + +.PHONY: all +all: pdf html + +.PHONY: pdf +pdf: $(ROOT).pdf + +$(ROOT).pdf: sanity-check $(SRC) + asciidoctor-pdf -d article $(SRC) + +.PHONY: html +html: $(ROOT).html + +$(ROOT).html: sanity-check $(SRC) + asciidoctor -d article -b html $(SRC) + +# It is all too easy for the document history and title page to have diverging +# version numbers. This target checks first. + +.PHONY: sanity-check +sanity-check: + @s=$$(sed -n < $(SRC) -e '3s/Issue //p') ; \ + t=$$(sed -n < $(SRC) -e "/== Document history/,/^$$/p" | \ + grep -c "$${s}") ; \ + if [ $${t} -ne 1 ] ; \ + then \ + echo "Version number of title and document history do not match" ; \ + exit 1 ; \ + fi + +custom.dict: custom.wordlist + aspell --lang=en create master ./$@ < $< + +.PHONY: spell +spell: custom.dict $(SRC) + sed < $(SRC) > $(SRC_STRIPPED) -e 's/`[^`]\+`//gp' -e '/^----$$/,/^----$$/d' + aspell --master=en_US --mode=none --add-extra-dicts=./custom.dict \ + -c $(SRC_STRIPPED) + $(RM) $(SRC_STRIPPED) + +clean: + rm -f $(ROOT)-stripped.adoc $(ROOT).pdf $(ROOT).html custom.dict diff --git a/tests/wally-riscv-arch-test/doc/README.adoc b/tests/wally-riscv-arch-test/doc/README.adoc new file mode 100644 index 000000000..fa7129b39 --- /dev/null +++ b/tests/wally-riscv-arch-test/doc/README.adoc @@ -0,0 +1,460 @@ += RISC-V Architectural Testing Framework = +RISC-V Foundation Architecture Test SIG +Issue 1.16 Draft +:toc: +:icons: font +:numbered: +:source-highlighter: rouge + +//// +SPDX-License-Identifier: CC-BY-4.0 + +Document conventions: +- one line per paragraph (don't fill lines - this makes changes clearer) +- Wikipedia heading conventions (First word only capitalized) +- US spelling throughout. +- Run "make spell" before committing changes. +- Build the HTML and commit it with any changed source. +- Do not commit the PDF! +//// + +== Introduction +=== About + +This document describes the RISC-V Architectural Testing framework which is used to test if a RISC-V device's has understood and implemented the specifications correctly + +* It explains the framework around the tests, the running of individual tests, and the suites of tests. + +* It explains how to set up targets to run the tests. + +This document is made freely available under a <>. + +=== Intent of the architectural test suite + +The RISC-V Architectural Tests are an evolving set of tests that are created to help ensure that software written for a given RISC-V Profile/Specification will run on all implementations that comply with that profile. + +These tests also help ensure that the implementer has both understood and implemented the specification correctly. + +The RISC-V Architectural Test suite is a minimal filter. Passing the tests and having the results approved by RISC-V International is a prerequisite to licensing the RISC-V trademarks in connection with the design. Passing the RISC-V Architectural Tests does not mean that the design complies with the RISC-V Architecture. These are only a basic set of tests checking important aspects of the specification without focusing on details. + +The RISC-V Architectural Tests are not a substitute for rigorous design verification. + +The result that the architecture tests provide to the user is an assurance that the specification has been interpreted correctly and the implementation under test (DUT) can be declared as RISC-V Architecture Test compliant. + +=== Intended audience + +This document is intended for design and verification engineers who wish to check if their RISC-V implementation (simulation models, HDL models, etc.) is compliant to the RISC-V specification. + +For those who wish to develop new architectural tests and/or to write or adapt their own test framework are suggested to read the link:../spec/TestFormatSpec.adoc[`Test Format Spec`]. + + +=== Contribute + +You are encouraged to contribute to this repository (including changes to this document) by submitting pull requests and by commenting on pull requests submitted by other people as described in the link:../README.md[`README.md`] file in the top level directory. + +While submitting a pull request note that some directories use `ChangeLog` files to track changes in the code and documentation. Please honor these, keeping them up to date and including the ChangeLog entry in the _git_ commit message. + +Make sure to also include a comment with the SPDX license identifier in all source files, for example: +``` +// SPDX-License-Identifier: BSD-3-Clause +``` + +NOTE: Don't forget to add your own name to the list of contributors in the document. + +== Licensing + +In general: + +* code is licensed under the BSD 3-clause license (SPDX license identifier `BSD-3-Clause`); +* documentation is licensed under the Creative Commons Attribution 4.0 International license (SPDX license identifier `CC-BY-4.0`). + +The files link:../COPYING.BSD[`COPYING.BSD`] and link:../COPYING.CC[`COPYING.CC`] in the top level directory contain the complete text of these licenses. + +NOTE: The riscv-ovpsim simulator is licensed under an Imperas license. There is no dependency on this and it is included as a convenience to users. + + +==== AsciiDoc + +This is a structured text format used by this document. Simple usage should be fairly self evident. + +* Comprehensive information on the format is on the http://www.methods.co.nz/asciidoc/[AsciiDoc website]. + +* Comprehensive information on the tooling on the https://asciidoctor.org/[AsciiDoctor website]. + +* You may find this https://asciidoctor.org/docs/asciidoc-syntax-quick-reference/[cheat sheet] helpful. + +==== Installing tools + +To generate the documentation as HTML you need _asciidoctor_ and to generate as +PDF you need _asciidoctor-pdf_. + +* These are the https://asciidoctor.org/docs/install-toolchain/[installation instructions for asciidoctor]. + +* These are the https://asciidoctor.org/docs/asciidoctor-pdf/#install-the-published-gem[installation instructions for asciidoctor-pdf]. + +To spell check you need _aspell_ installed. + +==== Building the documentation + +To build HTML: +[source,make] +---- +make html +---- + +To build PDF: +[source,make] +---- +make pdf +---- + +To build both: +[source,make] +---- +make +---- + +To check the spelling (excludes any listing or code phrases): +[source,make] +---- +make spell +---- + +Any custom words for spell checking should be added to link:./custom.wordlist[`custom.wordlist`]. + +=== Contributors + +This document has been created by the following people (in alphabetical order of surname). + +* Jeremy Bennett +* Mary Bennett +* Simon Davidmann +* Neel Gala +* Radek Hajek +* Lee Moore +* Milan Nostersky +* Marcela Zachariasova + +=== Document history +[cols="<1,<2,<3,<4",options="header,pagewidth",] +|================================================================================ +| _Revision_ | _Date_ | _Author_ | _Modification_ +| 1.16 Draft | 23 September 2020 | Neel Gala| Changed Compliance to Architecture/Architectural. Refined the steps to port a new target. Removed simulator and target specific docs. Added vocabulary from the Test Format Specification +| 1.15 Draft | 14 March 2019 | +Prashanth Mundkur | + +Added support and instructions for using the C and OCaml simulators from the Sail RISC-V formal model as targets. +| 1.14 Draft | 21 February 2019 | +Deborah Soung | + +Documented how to use SiFive's RISC-V ISA Formal Specification model as a target. +| 1.13 Draft | 29 January 2019 | +Deborah Soung | + +Added documentation on how to use Rocket Chip generated cores as targets. +| 1.12 Draft | 22 November 2018 | +Simon Davidmann | + +Updated notes on Test Suites. +| 1.11 Draft | 21 November 2018 | +Neel Gala | + +Added new signature format specs . +| 1.10 Draft | 20 June 2018 | + +Simon Davidmann, Lee Moore | + +Cleaned up description of updated framework and inclusion of riscvOVPsim. + +| 1.9 Draft | 12 June 2018 | + +Jeremy Bennett | + +Update Future work section to take account of Codasip changes. Remove diagrammatic directory structure. + +| 1.8 Draft | 12 June 2018 | + +Jeremy Bennett | + +Add Future work section. + +| 1.7 Draft | 12 June 2018 | + +Jeremy Bennett | + +Add CC license as an appendix. + +| 1.6 Draft | 10 June 2018 | + +Jeremy Bennett | + +Tidy up areas that are flawed in HTML version. + +| 1.5 Draft | 8 June 2018 | + +Jeremy Bennett | + +General tidy up. + +| 1.4 Draft | 8 June 2018 | + +Jeremy Bennett | + +Added license preamble. + +| 1.3 Draft | 5 June 2018 | + +Simon Davidmann | + +Updated to reflect directory structure and trace macros. + +| 1.2 Draft | 3 June 2018 | + +Jeremy Bennett | + +Converted to AsciiDoc, cleaned up and restructured. + +| 1.1 Draft | 1 June 2018 | + +Simon Davidmann +Lee Moore | + +Revised format and expand to describe framework, usage of many tests groups, +and different Targets + +|1.0 | 24 December 2017 | + +Radek Hajek +Milan Nostersky +Marcela Zachariasova | + +First version of the document. + +|================================================================================ + +== Repository structure + +The top level directory contains : + + - a `README.md` file providing high-level details about the RISC-V Architecture Testing Framework. + - top level `Makefile` for running the tests on a RISC-V implementation. + - `ChangeLog` for logging changes with respect to code. + - complete license files for the Creative Commons and BSD licenses used by the task group. + +There are then five top level directories. + +`doc`:: All the documentation for the project, written using _AsciiDoc_. + +`coverage`:: This directory contains a sub-directory structure similar to the `riscv-test-suite` directory. The coverage reports of each test-suite are available in the corresponding directories. The reports are available in the html and yaml formats. The directory also contains multiple coverpoint YAMLs which capture all the coverpoints of interest which are covered by all the tests in the `riscv-test-suite` directory. + +`riscv-target`:: Contains a further subdirectory for each target, within which are placed the `model_test.h` header for that target and a `device` directory for all the devices of that target. If the `$TARGETDIR` environment variable is set to another directory, the scripts will search this directory for targets instead. + +`riscv-test-env`:: This contains the `verify.sh` script which checks if the signatures generated the riscv-target device match the statically hosted reference signatures at the end of simulation. The directory also contains symbolic-links to the `arch_test.h` and `encoding.h` files present in the `riscv-test-suite/env` directory. + +`riscv-test-suite`:: This contains a further `env` subdirectory which contains the `arch_test.h` and the `encoding.h` file which includes common assembly macros and routines which is used across the tests in the suite. Further directories are present which contain the actual architectural tests. The names and structure of these directories is based on the link:../test-pool structure guideline highlighted above. + +`riscv-ovpsim`:: This contains a README pointing to the Imperas OVP riscvOVPsim simulator for use in architectural testing. + +== Vocabulary +=== The architectural test + +At the heart of the testing infrastructure is the detailed <> available as `.S` assembly files. The specification and format of the tests is defined in the link:./TestFormatSpec.adoc[`Test Format Specification`]. + +=== The architectural test pool + +The <> are grouped into different functional test suites targeting the different subsets of the RISC-V specification. For more details on the test-pool structure, hierarchy and conventions please refer to the link:./TestFormatSpec.adoc[`Test Format Specification`]. + +For information on the currently supported different test suites, look here: link:../riscv-test-suite/README.md[../riscv-test-suite/README.md] + +=== The test signature + +Each test in the <> generates a <>, which represents the data written into specific memory locations during the execution of the test. The signature typically will record values (or sanitised values) of the operations carried out in the test. More details on the format and nature of the signatures is available in the link:./TestFormatSpec.adoc[`Test Format Specification`] + +=== The reference signature + +In order to claim that a device/implementation has passed the RISC-V Architecture Tests, the <> obtained from the execution of the tests on the implementation need to be compared against a set of _golden_ <>. These reference signatures are currently generated by the link:https://github.com/rems-project/sail-riscv[`RISC-V SAIL`] formal model and statically hosted in the repository for each test. + +=== The test target +The <> can be either a RISC-V Instruction Set Simulator (ISS), a RISC-V emulator, a RISC-V RTL model running on an HDL simulator, a RISC-V FPGA implementation or a physical chip. Each of the target types offers specific features and represents specific interface challenges. It is a role of the <> to handle different targets while using the same <> as a test source. + +=== The target shell +The <> is the software and hardware environment around the <> that enables it to communicate with the framework, including assembling and linking tests, loading tests into memory, executing tests, and extracting the signature. The input to the <> is a .S <> file, and the output is a <>. + + +== Porting a new target + + +In this section, a short tutorial on how to add a user target to the RISC-V Architectural Test Framework is provided. + +The following steps demonstrate an example in which a target was replaced by the RISCV-ISA-SIM +(a.k.a Spike). In a similar way, any RISC-V ISA simulator or any RTL simulation model of the +RISC-V processor can be ported as a potential target for testing. + +=== Setup environment variables + +NOTE: `ROOTDIR` will always point to the riscv-arch-test repo. + +1. Clone the repository: + + --- + git clone https://github.com/riscv/riscv-arch-test.git + cd riscv-arch-test + + --- + +2. Open the `Makefile.include` available in the root folder of the repository and edit the following +variables based on your target: + + a. `TARGETDIR` : set `TARGETDIR` to point to the directory which contains a sub-folder in the same name + as the target. For example, the arch-test repo includes the targets: sail-riscv-c and spike + under the `riscv-target` folder, in which case we set the `TARGETDIR` to riscv-target as shown + below. One can set this completely arbitrary paths as suitable by the user. + + + --- + export TARGETDIR ?= $(ROOTDIR)/riscv-target + + --- + + b. `XLEN`: set XLEN to max supported XLEN. Allowed values are 32 and 64. + + --- + export XLEN ?= 64 + + --- + +c. `RISCV_TARGET`: set this variable to the name of the target. A folder of the same name must exist in +the `TARGETDIR` directory + + --- + export RISCV_TARGET ?= spike + + --- + +d. `RISCV_DEVICE`: set the `RISCV_DEVICE` environment to the extension you want to compile, simulate and verify. Leave +this blank if you want to iterate through all the supported extensions of the target. Allowed values +are the individual names of the extensions supported by your target like: I, M, C or Zifencei, etc. Multiple extensions are not be provided. + + --- + export RISCV_DEVICE ?= + + --- + +e. `RISCV_TARGET_FLAGS`: set this to a string which needs to be passed to your target's Makefile.include files + + --- + export RISCV_TARGET_FLAGS ?= + + --- + +f. `RISCV_ASSERT`: set this if you want to enable assertions on the test-suites. **Currently no tests use assertions.** + + --- + export RISCV_ASSERT ?= 0 + + --- + +g. `JOBS`: set the number of parallel jobs (along with any other arguments) you would like to +execute. Note that the target needs to be coded in such a way to support parallel execution. Some +targets use common intermediate files, rather than unique files, which makes them unsuitable for +parallel execution, these targets will need to be re-coded. + + --- + JOBS= -j1 + + --- + +3. Now inside your `TARGETDIR/RISCV_TARGET` directory you will need to create the following files: + +a. `model_test.h`: A header file containing the definition of the various target specific +assembly macros that are required to compile and simulate the tests. The list and definition of the +required target specific macros is available in the link:../spec/TestFormatSpec.adoc[Test Format +Specification] + +b. `link.ld`: A linker script to compile the tests for your target. + +c. Any other files required by the target (configuration scripts, logs, etc.) can also be placed in +this directory. + +4. Inside the `TARGETDIR/RISCV_TARGET` directory create a new folder named: `device`. If your device +is a 32-bit target then create a directory `device/rv32i_m`. If your device is a 64-bit target then +create a directory `device/rv64i_m`. If your target is configurable on the `XLEN` parameter then +both the folders need to be created. + +5. Within the `rv32i_m`/`rv64i_m` directories sub-folders in the name of the extensions supported +by the target need to be created. For eg. A target supporting the ISA RV32IMC_Zifence will have the +following directory structure: + + --- + - rv32i_m/I + - rv32i_m/M + - rv32i_m/C + - rv32i_m/privilege + - rv32i_m/Zifencei + + --- + +6. Each of the above extension directories will now need to include a file: `Makefile.include` which +defines the following Makefile variables: + +a. `RUN_TARGET`:: This variable needs to include commands and steps to execute an ELF on target device. Note here that this variable should include all the necessary steps and arguments to run that specific test-suite. For example, in case of spike for the `rv32i_m/C` test-suite the corresponding `Makefile.include` has the `--isa=rv32ic` argument as opposed to just `--isa=rv32i` for the base `rv32i_m/I` test-suite. This variable should also include other steps to extract and sanitize the signature file as well for each test. The only argument available to this variable is the compiled `elf` file. + +b. `COMPILE_TARGET`:: This variable should include the commands and steps required to compile an assembly test for the target for each extension mentioned above. Note, currently only the GCC compiler is supported. This compiler takes `march` and `mabi` arguments from the corresponding architectural suite framework. `COMPILE_TARGET` will more or less be the same across test-suites. The only argument available to `COMPILE_TARGET` is the assembly file of one architectural test. + +The following figure depicts the final directory structure of a target device that should get created at the end of the above steps: + +[#img-testStruct] +.File Structure of the Target directory +image::./file-struct.jpg[TargetStruct] + + +=== Generating Signature + +As previously mentioned the execution of each test on the target must generate a signature file. The name of the signature file should be ``. The signature file should follow the guidelines mentioned in the link:../spec/TestFormatSpec.adoc[`Test Format Specification`]. + +In case of spike, we have ensured that the signature region is bounded by the labels: `begin_signature` and `end_signature`. This is enforced in the `RVMODEL_DATA_BEGIN` and `RVMODEL_DATA_END` macros defined in the `riscv-target/spike/model_test.h` file. Additionally, if you look closely at the `RUN_TARGET` variable defined in the `Makefile.include` files of the spike target, it includes a few bash commands to sanitize the signature produced from spike. This is done to conform the final signature file to the specification defined in the link:../spec/TestFormatSpec.adoc[`Test Format Specification`]. + +=== Compile, simulate and verify the tests + +Once you have ported your target to the riscv-arch-test framework by following the above steps, you +are now ready to compile, simulate and verify the tests on your target + +If you would like to compile, simulate and verify all the extension tests applicable to your target +simply run `make` from the `ROOTDIR`. + +NOTE: For the above to work the `RISCV_DEVICE` in `ROOTDIR/Makefile.include` must be left empty. + +If you would like to only compile the tests for a particular extension you can use the following +command. + + make RISCV_DEVICE=M compile + make RISCV_DEVICE=C compile + +The arguments to the `RISCV_DEVICE` variable must be the extensions supported by the target. +NOTE: If `RISCV_DEVICE` is not defined/empty it will default to the `I` extension which is necessary +for all targets. + +To simulate the compiled tests on your target: + + make RISCV_DEVICE=M simulate + make RISCV_DEVICE=Zifencei simulate + +NOTE: If `RISCV_DEVICE` is not defined/empty it will default to the `I` extension which is necessary +for all targets. + +To verify if the generated signatures match the corresponding reference signatures. + + make RISCV_DEVICE=M verify + +NOTE: If `RISCV_DEVICE` is not defined/empty it will default to the `I` extension which is necessary +for all targets. + +All the above steps create and modify files in the `work` directory created in `ROOTDIR` folder. To +clean the `workdir` simple run : + + make clean + +By default the working directory is set to `ROOTDIR/work`. This can be overwritten by assigning a +new working directory path via the command line. Note, the path must be absolute and not relative : + + make WORK=/home/me/my_path/mywork clean compile simulate diff --git a/tests/wally-riscv-arch-test/doc/custom.wordlist b/tests/wally-riscv-arch-test/doc/custom.wordlist new file mode 100644 index 000000000..2efdc5925 --- /dev/null +++ b/tests/wally-riscv-arch-test/doc/custom.wordlist @@ -0,0 +1,73 @@ +AsciiDoc +asciidoc +AsciiDoctor +asciidoctor +aspell +autotools +CGEN +cmake +Codasip +creativecommons +CY +Davidmann +discoverable +DUT +EF +enforceability +FPGA +GDB +Generis +github +Hajek +HDL +http +https +IC +ies +immunities +Imperas +io +IM +ISA +legalcode +licensor +licensors +licensor's +LLVM +makefile +makefiles +Marcela +md +merchantability +Nostersky +nz +pagewidth +parameterization +pdf +publicdomain +Radek +README +riscv +riscvOVPsim +RTL +rv +RVTEST +SiFive +spdx +src +subdirectory +sublicensable +synched +tbd +testbench +toc +toolchain +TVM +URI +Verilator +Verilog +waivable +WIPO +wordlist +www +Zachariasova diff --git a/tests/wally-riscv-arch-test/doc/file-struct.jpg b/tests/wally-riscv-arch-test/doc/file-struct.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7ddee1e848c765df80915163569aea2d43176ff1 GIT binary patch literal 656873 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⪙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%0AidLx%m}8zX%k>Q#DKE+)<$P-xwY4bQ_W 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

OzqSP@3e+R{{~VMnY*auvxve++U+dCR3J^U$ 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 literal 0 HcmV?d00001 diff --git a/tests/wally-riscv-arch-test/riscv-test-env/LICENSE b/tests/wally-riscv-arch-test/riscv-test-env/LICENSE new file mode 100644 index 000000000..48fe522ac --- /dev/null +++ b/tests/wally-riscv-arch-test/riscv-test-env/LICENSE @@ -0,0 +1,24 @@ +Copyright (c) 2012-2015, The Regents of the University of California (Regents). +All Rights Reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +3. Neither the name of the Regents nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, +SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING +OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS +BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED +HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE +MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. diff --git a/tests/wally-riscv-arch-test/riscv-test-env/arch_test.h b/tests/wally-riscv-arch-test/riscv-test-env/arch_test.h new file mode 120000 index 000000000..c1b8c50bc --- /dev/null +++ b/tests/wally-riscv-arch-test/riscv-test-env/arch_test.h @@ -0,0 +1 @@ +../riscv-test-suite/env/arch_test.h \ No newline at end of file diff --git a/tests/wally-riscv-arch-test/riscv-test-env/encoding.h b/tests/wally-riscv-arch-test/riscv-test-env/encoding.h new file mode 120000 index 000000000..fd1833f03 --- /dev/null +++ b/tests/wally-riscv-arch-test/riscv-test-env/encoding.h @@ -0,0 +1 @@ +../riscv-test-suite/env/encoding.h \ No newline at end of file diff --git a/tests/wally-riscv-arch-test/riscv-test-env/p/link.ld b/tests/wally-riscv-arch-test/riscv-test-env/p/link.ld new file mode 100644 index 000000000..392e74f9e --- /dev/null +++ b/tests/wally-riscv-arch-test/riscv-test-env/p/link.ld @@ -0,0 +1,22 @@ +OUTPUT_ARCH( "riscv" ) +ENTRY(_start) + +SECTIONS +{ + . = 0x00000000; + .text.trap : { *(.text.trap) } + + . = 0x80000000; + .text.init : { *(.text.init) } + + . = ALIGN(0x1000); + .tohost : { *(.tohost) } + . = ALIGN(0x1000); + .text : { *(.text) } + . = ALIGN(0x1000); + .data : { *(.data) } + .data.string : { *(.data.string)} + .bss : { *(.bss) } + _end = .; +} + diff --git a/tests/wally-riscv-arch-test/riscv-test-env/p/riscv_test.h b/tests/wally-riscv-arch-test/riscv-test-env/p/riscv_test.h new file mode 100644 index 000000000..e452261c4 --- /dev/null +++ b/tests/wally-riscv-arch-test/riscv-test-env/p/riscv_test.h @@ -0,0 +1,251 @@ +// See LICENSE for license details. + +#ifndef _ENV_PHYSICAL_SINGLE_CORE_H +#define _ENV_PHYSICAL_SINGLE_CORE_H + +#include "../encoding.h" + +//----------------------------------------------------------------------- +// Begin Macro +//----------------------------------------------------------------------- + +#define RVTEST_RV64U \ + .macro init; \ + .endm + +#define RVTEST_RV64UF \ + .macro init; \ + RVTEST_FP_ENABLE; \ + .endm + +#define RVTEST_RV32U \ + .macro init; \ + .endm + +#define RVTEST_RV32UF \ + .macro init; \ + RVTEST_FP_ENABLE; \ + .endm + +#define RVTEST_RV64M \ + .macro init; \ + RVTEST_ENABLE_MACHINE; \ + .endm + +#define RVTEST_RV64S \ + .macro init; \ + RVTEST_ENABLE_SUPERVISOR; \ + .endm + +#define RVTEST_RV32M \ + .macro init; \ + RVTEST_ENABLE_MACHINE; \ + .endm + +#define RVTEST_RV32S \ + .macro init; \ + RVTEST_ENABLE_SUPERVISOR; \ + .endm + +#if __riscv_xlen == 64 +# define CHECK_XLEN li a0, 1; slli a0, a0, 31; bgez a0, 1f; RVTEST_PASS; 1: +#else +# define CHECK_XLEN li a0, 1; slli a0, a0, 31; bltz a0, 1f; RVTEST_PASS; 1: +#endif + +#define INIT_PMP \ + la t0, 1f; \ + csrw mtvec, t0; \ + li t0, -1; /* Set up a PMP to permit all accesses */ \ + csrw pmpaddr0, t0; \ + li t0, PMP_NAPOT | PMP_R | PMP_W | PMP_X; \ + csrw pmpcfg0, t0; \ + .align 2; \ +1: + +#define INIT_SATP \ + la t0, 1f; \ + csrw mtvec, t0; \ + csrwi satp, 0; \ + .align 2; \ +1: + +#define DELEGATE_NO_TRAPS \ + la t0, 1f; \ + csrw mtvec, t0; \ + csrwi medeleg, 0; \ + csrwi mideleg, 0; \ + csrwi mie, 0; \ + .align 2; \ +1: + +#define RVTEST_ENABLE_SUPERVISOR \ + li a0, MSTATUS_MPP & (MSTATUS_MPP >> 1); \ + csrs mstatus, a0; \ + li a0, SIP_SSIP | SIP_STIP; \ + csrs mideleg, a0; \ + +#define RVTEST_ENABLE_MACHINE \ + li a0, MSTATUS_MPP; \ + csrs mstatus, a0; \ + +#define RVTEST_FP_ENABLE \ + li a0, MSTATUS_FS & (MSTATUS_FS >> 1); \ + csrs mstatus, a0; \ + csrwi fcsr, 0 + +#define RISCV_MULTICORE_DISABLE \ + csrr a0, mhartid; \ + 1: bnez a0, 1b + +#define EXTRA_TVEC_USER +#define EXTRA_TVEC_MACHINE +#define EXTRA_INIT +#define EXTRA_INIT_TIMER + +// +// undefine some unusable CSR Accesses if no PRIV Mode present +// +#if defined(PRIV_MISA_S) +# if (PRIV_MISA_S==0) +# undef INIT_SATP +# define INIT_SATP +# undef INIT_PMP +# define INIT_PMP +# undef DELEGATE_NO_TRAPS +# define DELEGATE_NO_TRAPS +# undef RVTEST_ENABLE_SUPERVISOR +# define RVTEST_ENABLE_SUPERVISOR +# endif +#endif +#if defined(PRIV_MISA_U) +# if (PRIV_MISA_U==0) +# endif +#endif +#if defined(TRAPHANDLER) +#include TRAPHANDLER +#endif + +#define INTERRUPT_HANDLER j other_exception /* No interrupts should occur */ + +#define RVTEST_CODE_BEGIN_OLD \ + .section .text.init; \ + .align 6; \ + .weak stvec_handler; \ + .weak mtvec_handler; \ + .globl _start; \ +_start: \ + /* reset vector */ \ + j reset_vector; \ + .align 2; \ +trap_vector: \ + /* test whether the test came from pass/fail */ \ + csrr t5, mcause; \ + li t6, CAUSE_USER_ECALL; \ + beq t5, t6, write_tohost; \ + li t6, CAUSE_SUPERVISOR_ECALL; \ + beq t5, t6, write_tohost; \ + li t6, CAUSE_MACHINE_ECALL; \ + beq t5, t6, write_tohost; \ + /* if an mtvec_handler is defined, jump to it */ \ + la t5, mtvec_handler; \ + beqz t5, 1f; \ + jr t5; \ + /* was it an interrupt or an exception? */ \ + 1: csrr t5, mcause; \ + bgez t5, handle_exception; \ + INTERRUPT_HANDLER; \ +handle_exception: \ + /* we don't know how to handle whatever the exception was */ \ + other_exception: \ + /* some unhandlable exception occurred */ \ + 1: ori TESTNUM, TESTNUM, 1337; \ + write_tohost: \ + sw TESTNUM, tohost, t5; \ + j write_tohost; \ +reset_vector: \ + RISCV_MULTICORE_DISABLE; \ + INIT_SATP; \ + INIT_PMP; \ + DELEGATE_NO_TRAPS; \ + li TESTNUM, 0; \ + la t0, trap_vector; \ + csrw mtvec, t0; \ + CHECK_XLEN; \ + /* if an stvec_handler is defined, delegate exceptions to it */ \ + la t0, stvec_handler; \ + beqz t0, 1f; \ + csrw stvec, t0; \ + li t0, (1 << CAUSE_LOAD_PAGE_FAULT) | \ + (1 << CAUSE_STORE_PAGE_FAULT) | \ + (1 << CAUSE_FETCH_PAGE_FAULT) | \ + (1 << CAUSE_MISALIGNED_FETCH) | \ + (1 << CAUSE_USER_ECALL) | \ + (1 << CAUSE_BREAKPOINT); \ + csrw medeleg, t0; \ + csrr t1, medeleg; \ + bne t0, t1, other_exception; \ +1: csrwi mstatus, 0; \ + init; \ + EXTRA_INIT; \ + EXTRA_INIT_TIMER; \ + la t0, 1f; \ + csrw mepc, t0; \ + csrr a0, mhartid; \ + mret; \ +1: \ +begin_testcode: + + +//----------------------------------------------------------------------- +// End Macro +//----------------------------------------------------------------------- + +#define RVTEST_CODE_END_OLD \ +end_testcode: \ + ecall; + +//----------------------------------------------------------------------- +// Pass/Fail Macro +//----------------------------------------------------------------------- +#define RVTEST_SYNC fence +//#define RVTEST_SYNC nop + +#define RVTEST_PASS \ + RVTEST_SYNC; \ + li TESTNUM, 1; \ + SWSIG (0, TESTNUM); \ + ecall + +#define TESTNUM gp +#define RVTEST_FAIL \ + RVTEST_SYNC; \ +1: beqz TESTNUM, 1b; \ + sll TESTNUM, TESTNUM, 1; \ + or TESTNUM, TESTNUM, 1; \ + SWSIG (0, TESTNUM); \ + la x1, end_testcode; \ + jr x1; + +//----------------------------------------------------------------------- +// Data Section Macro +//----------------------------------------------------------------------- + +#define EXTRA_DATA + +#define RVTEST_DATA_BEGIN_OLD \ + .align 4; .global begin_signature; begin_signature: + +#define RVTEST_DATA_END_OLD \ + .align 4; .global end_signature; end_signature: \ + EXTRA_DATA \ + .pushsection .tohost,"aw",@progbits; \ + .align 8; .global tohost; tohost: .dword 0; \ + .align 8; .global fromhost; fromhost: .dword 0; \ + .popsection; \ + .align 8; .global begin_regstate; begin_regstate: \ + .word 128; \ + .align 8; .global end_regstate; end_regstate: \ + .word 4; + +#endif diff --git a/tests/wally-riscv-arch-test/riscv-test-env/pm/link.ld b/tests/wally-riscv-arch-test/riscv-test-env/pm/link.ld new file mode 100644 index 000000000..b3e315e78 --- /dev/null +++ b/tests/wally-riscv-arch-test/riscv-test-env/pm/link.ld @@ -0,0 +1,17 @@ +OUTPUT_ARCH( "riscv" ) +ENTRY(_start) + +SECTIONS +{ + . = 0x80000000; + .text.init : { *(.text.init) } + . = ALIGN(0x1000); + .tohost : { *(.tohost) } + . = ALIGN(0x1000); + .text : { *(.text) } + . = ALIGN(0x1000); + .data : { *(.data) } + .bss : { *(.bss) } + _end = .; +} + diff --git a/tests/wally-riscv-arch-test/riscv-test-env/pm/riscv_test.h b/tests/wally-riscv-arch-test/riscv-test-env/pm/riscv_test.h new file mode 100644 index 000000000..38a0e86b8 --- /dev/null +++ b/tests/wally-riscv-arch-test/riscv-test-env/pm/riscv_test.h @@ -0,0 +1,11 @@ +// See LICENSE for license details. + +#ifndef _ENV_PHYSICAL_MULTI_CORE_H +#define _ENV_PHYSICAL_MULTI_CORE_H + +#include "../p/riscv_test.h" + +#undef RISCV_MULTICORE_DISABLE +#define RISCV_MULTICORE_DISABLE + +#endif diff --git a/tests/wally-riscv-arch-test/riscv-test-env/pt/link.ld b/tests/wally-riscv-arch-test/riscv-test-env/pt/link.ld new file mode 100644 index 000000000..b3e315e78 --- /dev/null +++ b/tests/wally-riscv-arch-test/riscv-test-env/pt/link.ld @@ -0,0 +1,17 @@ +OUTPUT_ARCH( "riscv" ) +ENTRY(_start) + +SECTIONS +{ + . = 0x80000000; + .text.init : { *(.text.init) } + . = ALIGN(0x1000); + .tohost : { *(.tohost) } + . = ALIGN(0x1000); + .text : { *(.text) } + . = ALIGN(0x1000); + .data : { *(.data) } + .bss : { *(.bss) } + _end = .; +} + diff --git a/tests/wally-riscv-arch-test/riscv-test-env/pt/riscv_test.h b/tests/wally-riscv-arch-test/riscv-test-env/pt/riscv_test.h new file mode 100644 index 000000000..34c2a331a --- /dev/null +++ b/tests/wally-riscv-arch-test/riscv-test-env/pt/riscv_test.h @@ -0,0 +1,69 @@ +// See LICENSE for license details. + +#ifndef _ENV_PHYSICAL_SINGLE_CORE_TIMER_H +#define _ENV_PHYSICAL_SINGLE_CORE_TIMER_H + +#include "../p/riscv_test.h" + +#define TIMER_INTERVAL 2 + +#undef EXTRA_INIT_TIMER +#define EXTRA_INIT_TIMER \ + li a0, MIP_MTIP; \ + csrs mie, a0; \ + csrr a0, mtime; \ + addi a0, a0, TIMER_INTERVAL; \ + csrw mtimecmp, a0; \ + +#if SSTATUS_XS != 0x18000 +# error +#endif +#define XS_SHIFT 15 + +#undef INTERRUPT_HANDLER +#define INTERRUPT_HANDLER \ + slli t5, t5, 1; \ + srli t5, t5, 1; \ + add t5, t5, -IRQ_M_TIMER; \ + bnez t5, other_exception; /* other interrups shouldn't happen */\ + csrr t5, mtime; \ + addi t5, t5, TIMER_INTERVAL; \ + csrw mtimecmp, t5; \ + mret; \ + +//----------------------------------------------------------------------- +// Data Section Macro +//----------------------------------------------------------------------- + +#undef EXTRA_DATA +#define EXTRA_DATA \ + .align 3; \ +regspill: \ + .dword 0xdeadbeefcafebabe; \ + .dword 0xdeadbeefcafebabe; \ + .dword 0xdeadbeefcafebabe; \ + .dword 0xdeadbeefcafebabe; \ + .dword 0xdeadbeefcafebabe; \ + .dword 0xdeadbeefcafebabe; \ + .dword 0xdeadbeefcafebabe; \ + .dword 0xdeadbeefcafebabe; \ + .dword 0xdeadbeefcafebabe; \ + .dword 0xdeadbeefcafebabe; \ + .dword 0xdeadbeefcafebabe; \ + .dword 0xdeadbeefcafebabe; \ + .dword 0xdeadbeefcafebabe; \ + .dword 0xdeadbeefcafebabe; \ + .dword 0xdeadbeefcafebabe; \ + .dword 0xdeadbeefcafebabe; \ + .dword 0xdeadbeefcafebabe; \ + .dword 0xdeadbeefcafebabe; \ + .dword 0xdeadbeefcafebabe; \ + .dword 0xdeadbeefcafebabe; \ + .dword 0xdeadbeefcafebabe; \ + .dword 0xdeadbeefcafebabe; \ + .dword 0xdeadbeefcafebabe; \ + .dword 0xdeadbeefcafebabe; \ +evac: \ + .skip 32768; \ + +#endif diff --git a/tests/wally-riscv-arch-test/riscv-test-env/v/entry.S b/tests/wally-riscv-arch-test/riscv-test-env/v/entry.S new file mode 100644 index 000000000..97196620f --- /dev/null +++ b/tests/wally-riscv-arch-test/riscv-test-env/v/entry.S @@ -0,0 +1,125 @@ +#include "riscv_test.h" + +#if __riscv_xlen == 64 +# define STORE sd +# define LOAD ld +# define REGBYTES 8 +#else +# define STORE sw +# define LOAD lw +# define REGBYTES 4 +#endif + +#define STACK_TOP (_end + 4096) + + .section ".text.init","ax",@progbits + .globl _start +_start: + j handle_reset + + /* NMI vector */ +nmi_vector: + j wtf + +trap_vector: + j wtf + +handle_reset: + la t0, trap_vector + csrw mtvec, t0 + la sp, STACK_TOP - SIZEOF_TRAPFRAME_T + csrr t0, mhartid + slli t0, t0, 12 + add sp, sp, t0 + csrw mscratch, sp + la a0, userstart + j vm_boot + + .globl pop_tf +pop_tf: + LOAD t0,33*REGBYTES(a0) + csrw sepc,t0 + LOAD x1,1*REGBYTES(a0) + LOAD x2,2*REGBYTES(a0) + LOAD x3,3*REGBYTES(a0) + LOAD x4,4*REGBYTES(a0) + LOAD x5,5*REGBYTES(a0) + LOAD x6,6*REGBYTES(a0) + LOAD x7,7*REGBYTES(a0) + LOAD x8,8*REGBYTES(a0) + LOAD x9,9*REGBYTES(a0) + LOAD x11,11*REGBYTES(a0) + LOAD x12,12*REGBYTES(a0) + LOAD x13,13*REGBYTES(a0) + LOAD x14,14*REGBYTES(a0) + LOAD x15,15*REGBYTES(a0) + LOAD x16,16*REGBYTES(a0) + LOAD x17,17*REGBYTES(a0) + LOAD x18,18*REGBYTES(a0) + LOAD x19,19*REGBYTES(a0) + LOAD x20,20*REGBYTES(a0) + LOAD x21,21*REGBYTES(a0) + LOAD x22,22*REGBYTES(a0) + LOAD x23,23*REGBYTES(a0) + LOAD x24,24*REGBYTES(a0) + LOAD x25,25*REGBYTES(a0) + LOAD x26,26*REGBYTES(a0) + LOAD x27,27*REGBYTES(a0) + LOAD x28,28*REGBYTES(a0) + LOAD x29,29*REGBYTES(a0) + LOAD x30,30*REGBYTES(a0) + LOAD x31,31*REGBYTES(a0) + LOAD a0,10*REGBYTES(a0) + sret + + .global trap_entry +trap_entry: + csrrw sp, sscratch, sp + + # save gprs + STORE x1,1*REGBYTES(sp) + STORE x3,3*REGBYTES(sp) + STORE x4,4*REGBYTES(sp) + STORE x5,5*REGBYTES(sp) + STORE x6,6*REGBYTES(sp) + STORE x7,7*REGBYTES(sp) + STORE x8,8*REGBYTES(sp) + STORE x9,9*REGBYTES(sp) + STORE x10,10*REGBYTES(sp) + STORE x11,11*REGBYTES(sp) + STORE x12,12*REGBYTES(sp) + STORE x13,13*REGBYTES(sp) + STORE x14,14*REGBYTES(sp) + STORE x15,15*REGBYTES(sp) + STORE x16,16*REGBYTES(sp) + STORE x17,17*REGBYTES(sp) + STORE x18,18*REGBYTES(sp) + STORE x19,19*REGBYTES(sp) + STORE x20,20*REGBYTES(sp) + STORE x21,21*REGBYTES(sp) + STORE x22,22*REGBYTES(sp) + STORE x23,23*REGBYTES(sp) + STORE x24,24*REGBYTES(sp) + STORE x25,25*REGBYTES(sp) + STORE x26,26*REGBYTES(sp) + STORE x27,27*REGBYTES(sp) + STORE x28,28*REGBYTES(sp) + STORE x29,29*REGBYTES(sp) + STORE x30,30*REGBYTES(sp) + STORE x31,31*REGBYTES(sp) + + csrrw t0,sscratch,sp + STORE t0,2*REGBYTES(sp) + + # get sr, epc, badvaddr, cause + csrr t0,sstatus + STORE t0,32*REGBYTES(sp) + csrr t0,sepc + STORE t0,33*REGBYTES(sp) + csrr t0,sbadaddr + STORE t0,34*REGBYTES(sp) + csrr t0,scause + STORE t0,35*REGBYTES(sp) + + move a0, sp + j handle_trap diff --git a/tests/wally-riscv-arch-test/riscv-test-env/v/link.ld b/tests/wally-riscv-arch-test/riscv-test-env/v/link.ld new file mode 100644 index 000000000..b3e315e78 --- /dev/null +++ b/tests/wally-riscv-arch-test/riscv-test-env/v/link.ld @@ -0,0 +1,17 @@ +OUTPUT_ARCH( "riscv" ) +ENTRY(_start) + +SECTIONS +{ + . = 0x80000000; + .text.init : { *(.text.init) } + . = ALIGN(0x1000); + .tohost : { *(.tohost) } + . = ALIGN(0x1000); + .text : { *(.text) } + . = ALIGN(0x1000); + .data : { *(.data) } + .bss : { *(.bss) } + _end = .; +} + diff --git a/tests/wally-riscv-arch-test/riscv-test-env/v/riscv_test.h b/tests/wally-riscv-arch-test/riscv-test-env/v/riscv_test.h new file mode 100644 index 000000000..8ca9ffd76 --- /dev/null +++ b/tests/wally-riscv-arch-test/riscv-test-env/v/riscv_test.h @@ -0,0 +1,71 @@ +// See LICENSE for license details. + +#ifndef _ENV_VIRTUAL_SINGLE_CORE_H +#define _ENV_VIRTUAL_SINGLE_CORE_H + +#include "../p/riscv_test.h" + +//----------------------------------------------------------------------- +// Begin Macro +//----------------------------------------------------------------------- + +#undef RVTEST_FP_ENABLE +#define RVTEST_FP_ENABLE fssr x0 + +#undef RVTEST_CODE_BEGIN +#define RVTEST_CODE_BEGIN \ + .text; \ + .global userstart; \ +userstart: \ + init + +//----------------------------------------------------------------------- +// Pass/Fail Macro +//----------------------------------------------------------------------- + +#undef RVTEST_PASS +#define RVTEST_PASS li a0, 1; scall + +#undef RVTEST_FAIL +#define RVTEST_FAIL sll a0, TESTNUM, 1; 1:beqz a0, 1b; or a0, a0, 1; scall; + +//----------------------------------------------------------------------- +// Data Section Macro +//----------------------------------------------------------------------- + +#undef RVTEST_DATA_END +#define RVTEST_DATA_END + +//----------------------------------------------------------------------- +// Supervisor mode definitions and macros +//----------------------------------------------------------------------- + +#define MAX_TEST_PAGES 63 // this must be the period of the LFSR below +#define LFSR_NEXT(x) (((((x)^((x)>>1)) & 1) << 5) | ((x) >> 1)) + +#define PGSHIFT 12 +#define PGSIZE (1UL << PGSHIFT) + +#define SIZEOF_TRAPFRAME_T ((__riscv_xlen / 8) * 36) + +#ifndef __ASSEMBLER__ + +typedef unsigned long pte_t; +#define LEVELS (sizeof(pte_t) == sizeof(uint64_t) ? 3 : 2) +#define PTIDXBITS (PGSHIFT - (sizeof(pte_t) == 8 ? 3 : 2)) +#define VPN_BITS (PTIDXBITS * LEVELS) +#define VA_BITS (VPN_BITS + PGSHIFT) +#define PTES_PER_PT (1UL << RISCV_PGLEVEL_BITS) +#define MEGAPAGE_SIZE (PTES_PER_PT * PGSIZE) + +typedef struct +{ + long gpr[32]; + long sr; + long epc; + long badvaddr; + long cause; +} trapframe_t; +#endif + +#endif diff --git a/tests/wally-riscv-arch-test/riscv-test-env/v/string.c b/tests/wally-riscv-arch-test/riscv-test-env/v/string.c new file mode 100644 index 000000000..4ffedc0a4 --- /dev/null +++ b/tests/wally-riscv-arch-test/riscv-test-env/v/string.c @@ -0,0 +1,114 @@ +#include +#include +#include + +void* memcpy(void* dest, const void* src, size_t len) +{ + if ((((uintptr_t)dest | (uintptr_t)src | len) & (sizeof(uintptr_t)-1)) == 0) { + const uintptr_t* s = src; + uintptr_t *d = dest; + while (d < (uintptr_t*)(dest + len)) + *d++ = *s++; + } else { + const char* s = src; + char *d = dest; + while (d < (char*)(dest + len)) + *d++ = *s++; + } + return dest; +} + +void* memset(void* dest, int byte, size_t len) +{ + if ((((uintptr_t)dest | len) & (sizeof(uintptr_t)-1)) == 0) { + uintptr_t word = byte & 0xFF; + word |= word << 8; + word |= word << 16; + word |= word << 16 << 16; + + uintptr_t *d = dest; + while (d < (uintptr_t*)(dest + len)) + *d++ = word; + } else { + char *d = dest; + while (d < (char*)(dest + len)) + *d++ = byte; + } + return dest; +} + +size_t strlen(const char *s) +{ + const char *p = s; + while (*p) + p++; + return p - s; +} + +int strcmp(const char* s1, const char* s2) +{ + unsigned char c1, c2; + + do { + c1 = *s1++; + c2 = *s2++; + } while (c1 != 0 && c1 == c2); + + return c1 - c2; +} + +int memcmp(const void* s1, const void* s2, size_t n) +{ + if ((((uintptr_t)s1 | (uintptr_t)s2) & (sizeof(uintptr_t)-1)) == 0) { + const uintptr_t* u1 = s1; + const uintptr_t* u2 = s2; + const uintptr_t* end = u1 + (n / sizeof(uintptr_t)); + while (u1 < end) { + if (*u1 != *u2) + break; + u1++; + u2++; + } + n -= (const void*)u1 - s1; + s1 = u1; + s2 = u2; + } + + while (n--) { + unsigned char c1 = *(const unsigned char*)s1++; + unsigned char c2 = *(const unsigned char*)s2++; + if (c1 != c2) + return c1 - c2; + } + + return 0; +} + +char* strcpy(char* dest, const char* src) +{ + char* d = dest; + while ((*d++ = *src++)) + ; + return dest; +} + +long atol(const char* str) +{ + long res = 0; + int sign = 0; + + while (*str == ' ') + str++; + + if (*str == '-' || *str == '+') { + sign = *str == '-'; + str++; + } + + while (*str) { + res *= 10; + res += *str++ - '0'; + } + + return sign ? -res : res; +} diff --git a/tests/wally-riscv-arch-test/riscv-test-env/v/vm.c b/tests/wally-riscv-arch-test/riscv-test-env/v/vm.c new file mode 100644 index 000000000..8064b7baf --- /dev/null +++ b/tests/wally-riscv-arch-test/riscv-test-env/v/vm.c @@ -0,0 +1,273 @@ +// See LICENSE for license details. + +#include +#include +#include + +#include "riscv_test.h" + +void trap_entry(); +void pop_tf(trapframe_t*); + +volatile uint64_t tohost; +volatile uint64_t fromhost; + +static void do_tohost(uint64_t tohost_value) +{ + while (tohost) + fromhost = 0; + tohost = tohost_value; +} + +#define pa2kva(pa) ((void*)(pa) - DRAM_BASE - MEGAPAGE_SIZE) +#define uva2kva(pa) ((void*)(pa) - MEGAPAGE_SIZE) + +#define flush_page(addr) asm volatile ("sfence.vma %0" : : "r" (addr) : "memory") + +static uint64_t lfsr63(uint64_t x) +{ + uint64_t bit = (x ^ (x >> 1)) & 1; + return (x >> 1) | (bit << 62); +} + +static void cputchar(int x) +{ + do_tohost(0x0101000000000000 | (unsigned char)x); +} + +static void cputstring(const char* s) +{ + while (*s) + cputchar(*s++); +} + +static void terminate(int code) +{ + do_tohost(code); + while (1); +} + +void wtf() +{ + terminate(841); +} + +#define stringify1(x) #x +#define stringify(x) stringify1(x) +#define assert(x) do { \ + if (x) break; \ + cputstring("Assertion failed: " stringify(x) "\n"); \ + terminate(3); \ +} while(0) + +#define l1pt pt[0] +#define user_l2pt pt[1] +#if __riscv_xlen == 64 +# define NPT 4 +#define kernel_l2pt pt[2] +# define user_l3pt pt[3] +#else +# define NPT 2 +# define user_l3pt user_l2pt +#endif +pte_t pt[NPT][PTES_PER_PT] __attribute__((aligned(PGSIZE))); + +typedef struct { pte_t addr; void* next; } freelist_t; + +freelist_t user_mapping[MAX_TEST_PAGES]; +freelist_t freelist_nodes[MAX_TEST_PAGES]; +freelist_t *freelist_head, *freelist_tail; + +void printhex(uint64_t x) +{ + char str[17]; + for (int i = 0; i < 16; i++) + { + str[15-i] = (x & 0xF) + ((x & 0xF) < 10 ? '0' : 'a'-10); + x >>= 4; + } + str[16] = 0; + + cputstring(str); +} + +static void evict(unsigned long addr) +{ + assert(addr >= PGSIZE && addr < MAX_TEST_PAGES * PGSIZE); + addr = addr/PGSIZE*PGSIZE; + + freelist_t* node = &user_mapping[addr/PGSIZE]; + if (node->addr) + { + // check accessed and dirty bits + assert(user_l3pt[addr/PGSIZE] & PTE_A); + uintptr_t sstatus = set_csr(sstatus, SSTATUS_SUM); + if (memcmp((void*)addr, uva2kva(addr), PGSIZE)) { + assert(user_l3pt[addr/PGSIZE] & PTE_D); + memcpy((void*)addr, uva2kva(addr), PGSIZE); + } + write_csr(sstatus, sstatus); + + user_mapping[addr/PGSIZE].addr = 0; + + if (freelist_tail == 0) + freelist_head = freelist_tail = node; + else + { + freelist_tail->next = node; + freelist_tail = node; + } + } +} + +void handle_fault(uintptr_t addr, uintptr_t cause) +{ + assert(addr >= PGSIZE && addr < MAX_TEST_PAGES * PGSIZE); + addr = addr/PGSIZE*PGSIZE; + + if (user_l3pt[addr/PGSIZE]) { + if (!(user_l3pt[addr/PGSIZE] & PTE_A)) { + user_l3pt[addr/PGSIZE] |= PTE_A; + } else { + assert(!(user_l3pt[addr/PGSIZE] & PTE_D) && cause == CAUSE_STORE_PAGE_FAULT); + user_l3pt[addr/PGSIZE] |= PTE_D; + } + flush_page(addr); + return; + } + + freelist_t* node = freelist_head; + assert(node); + freelist_head = node->next; + if (freelist_head == freelist_tail) + freelist_tail = 0; + + uintptr_t new_pte = (node->addr >> PGSHIFT << PTE_PPN_SHIFT) | PTE_V | PTE_U | PTE_R | PTE_W | PTE_X; + user_l3pt[addr/PGSIZE] = new_pte | PTE_A | PTE_D; + flush_page(addr); + + assert(user_mapping[addr/PGSIZE].addr == 0); + user_mapping[addr/PGSIZE] = *node; + + uintptr_t sstatus = set_csr(sstatus, SSTATUS_SUM); + memcpy((void*)addr, uva2kva(addr), PGSIZE); + write_csr(sstatus, sstatus); + + user_l3pt[addr/PGSIZE] = new_pte; + flush_page(addr); + + __builtin___clear_cache(0,0); +} + +void handle_trap(trapframe_t* tf) +{ + if (tf->cause == CAUSE_USER_ECALL) + { + int n = tf->gpr[10]; + + for (long i = 1; i < MAX_TEST_PAGES; i++) + evict(i*PGSIZE); + + terminate(n); + } + else if (tf->cause == CAUSE_ILLEGAL_INSTRUCTION) + { + assert(tf->epc % 4 == 0); + + int* fssr; + asm ("jal %0, 1f; fssr x0; 1:" : "=r"(fssr)); + + if (*(int*)tf->epc == *fssr) + terminate(1); // FP test on non-FP hardware. "succeed." + else + assert(!"illegal instruction"); + tf->epc += 4; + } + else if (tf->cause == CAUSE_FETCH_PAGE_FAULT || tf->cause == CAUSE_LOAD_PAGE_FAULT || tf->cause == CAUSE_STORE_PAGE_FAULT) + handle_fault(tf->badvaddr, tf->cause); + else + assert(!"unexpected exception"); + + pop_tf(tf); +} + +static void coherence_torture() +{ + // cause coherence misses without affecting program semantics + unsigned int random = ENTROPY; + while (1) { + uintptr_t paddr = DRAM_BASE + ((random % (2 * (MAX_TEST_PAGES + 1) * PGSIZE)) & -4); +#ifdef __riscv_atomic + if (random & 1) // perform a no-op write + asm volatile ("amoadd.w zero, zero, (%0)" :: "r"(paddr)); + else // perform a read +#endif + asm volatile ("lw zero, (%0)" :: "r"(paddr)); + random = lfsr63(random); + } +} + +void vm_boot(uintptr_t test_addr) +{ + unsigned int random = ENTROPY; + if (read_csr(mhartid) > 0) + coherence_torture(); + + _Static_assert(SIZEOF_TRAPFRAME_T == sizeof(trapframe_t), "???"); + +#if (MAX_TEST_PAGES > PTES_PER_PT) || (DRAM_BASE % MEGAPAGE_SIZE) != 0 +# error +#endif + // map user to lowermost megapage + l1pt[0] = ((pte_t)user_l2pt >> PGSHIFT << PTE_PPN_SHIFT) | PTE_V; + // map kernel to uppermost megapage +#if __riscv_xlen == 64 + l1pt[PTES_PER_PT-1] = ((pte_t)kernel_l2pt >> PGSHIFT << PTE_PPN_SHIFT) | PTE_V; + kernel_l2pt[PTES_PER_PT-1] = (DRAM_BASE/RISCV_PGSIZE << PTE_PPN_SHIFT) | PTE_V | PTE_R | PTE_W | PTE_X | PTE_A | PTE_D; + user_l2pt[0] = ((pte_t)user_l3pt >> PGSHIFT << PTE_PPN_SHIFT) | PTE_V; + uintptr_t vm_choice = SATP_MODE_SV39; +#else + l1pt[PTES_PER_PT-1] = (DRAM_BASE/RISCV_PGSIZE << PTE_PPN_SHIFT) | PTE_V | PTE_R | PTE_W | PTE_X | PTE_A | PTE_D; + uintptr_t vm_choice = SATP_MODE_SV32; +#endif + write_csr(satp, ((uintptr_t)l1pt >> PGSHIFT) | + (vm_choice * (SATP_MODE & ~(SATP_MODE<<1)))); + + // Set up PMPs if present, ignoring illegal instruction trap if not. + uintptr_t pmpc = PMP_NAPOT | PMP_R | PMP_W | PMP_X; + asm volatile ("la t0, 1f\n\t" + "csrrw t0, mtvec, t0\n\t" + "csrw pmpaddr0, %1\n\t" + "csrw pmpcfg0, %0\n\t" + ".align 2\n\t" + "1:" + : : "r" (pmpc), "r" (-1UL) : "t0"); + + // set up supervisor trap handling + write_csr(stvec, pa2kva(trap_entry)); + write_csr(sscratch, pa2kva(read_csr(mscratch))); + write_csr(medeleg, + (1 << CAUSE_USER_ECALL) | + (1 << CAUSE_FETCH_PAGE_FAULT) | + (1 << CAUSE_LOAD_PAGE_FAULT) | + (1 << CAUSE_STORE_PAGE_FAULT)); + // FPU on; accelerator on; allow supervisor access to user memory access + write_csr(mstatus, MSTATUS_FS | MSTATUS_XS); + write_csr(mie, 0); + + random = 1 + (random % MAX_TEST_PAGES); + freelist_head = pa2kva((void*)&freelist_nodes[0]); + freelist_tail = pa2kva(&freelist_nodes[MAX_TEST_PAGES-1]); + for (long i = 0; i < MAX_TEST_PAGES; i++) + { + freelist_nodes[i].addr = DRAM_BASE + (MAX_TEST_PAGES + random)*PGSIZE; + freelist_nodes[i].next = pa2kva(&freelist_nodes[i+1]); + random = LFSR_NEXT(random); + } + freelist_nodes[MAX_TEST_PAGES-1].next = 0; + + trapframe_t tf; + memset(&tf, 0, sizeof(tf)); + tf.epc = test_addr - DRAM_BASE; + pop_tf(&tf); +} diff --git a/tests/wally-riscv-arch-test/riscv-test-env/verify.sh b/tests/wally-riscv-arch-test/riscv-test-env/verify.sh new file mode 100755 index 000000000..f69a4c633 --- /dev/null +++ b/tests/wally-riscv-arch-test/riscv-test-env/verify.sh @@ -0,0 +1,68 @@ +#!/bin/bash + +printf "\n\nCompare to reference files ... \n\n"; +FAIL=0 +RUN=0 + +for ref in ${SUITEDIR}/references/*.reference_output; +do + base=$(basename ${ref}) + stub=${base//".reference_output"/} + + if [ "${stub}" = "*" ]; then + echo "No Reference Files ${SUITEDIR}/references/*.reference_output" + break + fi + + sig=${WORK}/rv${XLEN}i_m/${RISCV_DEVICE}/${stub}.signature.output + dif=${WORK}/rv${XLEN}i_m/${RISCV_DEVICE}/${stub}.diff + + RUN=$((${RUN} + 1)) + + # + # Ensure both files exist + # + if [ -f ${ref} ] && [ -f ${sig} ]; then + echo -n "Check $(printf %-24s ${stub}) " + else + echo -e "Check $(printf %-24s ${stub}) \e[33m ... IGNORE \e[39m" + continue + fi + diff --ignore-case --strip-trailing-cr ${ref} ${sig} &> /dev/null + if [ $? == 0 ] + then + echo -e "\e[32m ... OK \e[39m" + else + echo -e "\e[31m ... FAIL \e[39m" + FAIL=$((${FAIL} + 1)) + sdiff ${ref} ${sig} > ${dif} + fi +done + +# warn on missing reverse reference +for sig in ${WORK}/rv${XLEN}i_m/${RISCV_DEVICE}/*.signature.output; +do + base=$(basename ${sig}) + stub=${base//".signature.output"/} + ref=${SUITEDIR}/references/${stub}.reference_output + + if [ -f $sig ] && [ ! -f ${ref} ]; then + echo -e "\e[31m Error: sig ${sig} no corresponding ${ref} \e[39m" + FAIL=$((${FAIL} + 1)) + fi +done + +declare -i status=0 +if [ ${FAIL} == 0 ] +then + echo "--------------------------------" + echo -n -e "\e[32m OK: ${RUN}/${RUN} " + status=0 +else + echo "--------------------------------" + echo -n -e "\e[31m FAIL: ${FAIL}/${RUN} " + status=1 +fi +echo -e "RISCV_TARGET=${RISCV_TARGET} RISCV_DEVICE=${RISCV_DEVICE} XLEN=${XLEN} \e[39m" +echo +exit ${status} diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/Makefile.include b/tests/wally-riscv-arch-test/riscv-test-suite/Makefile.include new file mode 100644 index 000000000..080aa1ee7 --- /dev/null +++ b/tests/wally-riscv-arch-test/riscv-test-suite/Makefile.include @@ -0,0 +1,58 @@ +#======================================================================= +# Makefile for riscv-tests/isa +#----------------------------------------------------------------------- + +act_dir := . +src_dir := $(act_dir)/src +work_dir := $(WORK) +work_dir_isa := $(work_dir)/rv$(XLEN)i_m/$(RISCV_DEVICE) + +include $(act_dir)/Makefrag +ifneq ($(RISCV_TEST),) + target_tests = $(RISCV_TEST).elf +endif + +default: all + +#-------------------------------------------------------------------- +# Build rules +#-------------------------------------------------------------------- + +vpath %.S $(act_dir) + +INCLUDE=$(TARGETDIR)/$(RISCV_TARGET)/device/rv$(XLEN)i_m/$(RISCV_DEVICE)/Makefile.include +ifeq ($(wildcard $(INCLUDE)),) + $(error Cannot find '$(INCLUDE)`. Check that RISCV_TARGET and RISCV_DEVICE are set correctly.) +endif +-include $(INCLUDE) + +#------------------------------------------------------------ +# Build and run assembly tests + +%.log: %.elf + $(V) echo "Execute $(@)" + $(V) $(RUN_TARGET) + + +define compile_template + +$(work_dir_isa)/%.elf: $(src_dir)/%.S + $(V) echo "Compile $$(@)" + @mkdir -p $$(@D) + $(V) $(COMPILE_TARGET) + +.PRECIOUS: $(work_dir_isa)/%.elf + +endef + +target_elf = $(foreach e,$(target_tests),$(work_dir_isa)/$(e)) +target_log = $(patsubst %.elf,%.log,$(target_elf)) + +compile: $(target_elf) +run: $(target_log) + +#------------------------------------------------------------ +# Clean up + +clean: + rm -rf $(work_dir) diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/README.md b/tests/wally-riscv-arch-test/riscv-test-suite/README.md new file mode 100644 index 000000000..2e585c2f6 --- /dev/null +++ b/tests/wally-riscv-arch-test/riscv-test-suite/README.md @@ -0,0 +1,66 @@ +# RISC-V Test Suites + +The tests are grouped based on the different extension subsets of the RISC-V unprivileged ISA. +The tests strictly follow the [Test format](../spec/TestFormatSpec.adoc) specification. + +Directory names postfixed with "\_unratified" indicate that tests for extensions that have not yet +been ratified by RVI. + +The coverage report (in html format) of the tests available in this suite is generated through +[RISCOF](https://github.com/riscv-software-src/riscof) and is available here: [Coverage Report](../riscv-test-stats/coverage/README.md). + +These tests have been generated using the open source Compatibility Test Generator from InCore Semiconductors available +at: [CTG](https://github.com/riscv/riscv-ctg). + +The reference signatures are generated using [SAIL](https://github.com/riscv/sail-riscv) or +[SPIKE](https://github.com/riscv-software-src/riscv-isa-sim). + +Test directories with the "\_unratified" post-fix indicate test-suites for extensions which have not been +ratified (but are stable and near ratification) + +Directory structure +``` + +├── env # contains the architectural test header files +└── rv32i_m # top level folder indicate rv32 tests for machine mode + ├── C # include tests and references for "C" extension + │   ├── references # static references signatures for "C" extension + │   └── src # assembly tests for "C" extension + ├── F # include tests and references for "rv32F" extension + │   ├── references # static references signatures for "rv32F" extension + │   └── src # assembly tests for "rv32F" extension + ├── I # include tests and references for "I" extension + │   ├── references # static references signatures for "I" extension + │   └── src # assembly tests for "I" extension + ├── M # include tests and references for "M" extension + │ ├── references # static references signatures for "M" extension + │ └── src # assembly tests for "M" extension + ├── K_unratified # include tests and references for "K" extension + │ ├── references # static references signatures for "K" extension + │ └── src # assembly tests for "K" extension + ├── privilege # include tests and references for tests which require Privilege Spec + │ ├── references # static references signatures for tests which require Privilege Spec + │ └── src # assembly tests for tests which require Privilege Spec + └── Zifencei # include tests and references for "Zifencei" extension + ├── references # static references signatures for "Zifencei" extension + └── src # assembly tests for "Zifencei" extension +└── rv64i_m # top level folder indicate rv64 tests for machine mode + ├── C # include tests and references for "C" extension + │   ├── references # static references signatures for "C" extension + │   └── src # assembly tests for "C" extension + ├── I # include tests and references for "I" extension + │   ├── references # static references signatures for "I" extension + │   └── src # assembly tests for "I" extension + ├── M # include tests and references for "M" extension + │ ├── references # static references signatures for "M" extension + │ └── src # assembly tests for "M" extension + ├── K_unratified # include tests and references for "K" extension + │ ├── references # static references signatures for "K" extension + │ └── src # assembly tests for "K" extension + ├── privilege # include tests and references for tests which require Privilege Spec + │ ├── references # static references signatures for tests which require Privilege Spec + │ └── src # assembly tests for tests which require Privilege Spec + └── Zifencei # include tests and references for "Zifencei" extension + ├── references # static references signatures for "Zifencei" extension + └── src # assembly tests for "Zifencei" extension +``` diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/env/arch_test.h b/tests/wally-riscv-arch-test/riscv-test-suite/env/arch_test.h new file mode 100644 index 000000000..286a64744 --- /dev/null +++ b/tests/wally-riscv-arch-test/riscv-test-suite/env/arch_test.h @@ -0,0 +1,1184 @@ +#include "encoding.h" +// TODO the following should come from the YAML. +#ifndef NUM_SPECD_INTCAUSES + #define NUM_SPECD_INTCAUSES 16 +#endif +//#define RVTEST_FIXED_LEN +#ifndef UNROLLSZ + #define UNROLLSZ 5 +#endif +// #ifndef rvtest_gpr_save +// #define rvtest_gpr_save +// #endif + +#define TEST_CASE_1 + +//----------------------------------------------------------------------- +// RV Arch Test Macros +//----------------------------------------------------------------------- +#ifndef RVMODEL_SET_MSW_INT + #warning "RVMODEL_SET_MSW_INT is not defined by target. Declaring as empty macro" + #define RVMODEL_SET_MSW_INT +#endif + +#ifndef RVMODEL_CLEAR_MSW_INT + #warning "RVMODEL_CLEAR_MSW_INT is not defined by target. Declaring as empty macro" + #define RVMODEL_CLEAR_MSW_INT +#endif + +#ifndef RVMODEL_CLEAR_MTIMER_INT + #warning "RVMODEL_CLEAR_MTIMER_INT is not defined by target. Declaring as empty macro" + #define RVMODEL_CLEAR_MTIMER_INT +#endif + +#ifndef RVMODEL_CLEAR_MEXT_INT + #warning "RVMODEL_CLEAR_MEXT_INT is not defined by target. Declaring as empty macro" + #define RVMODEL_CLEAR_MEXT_INT +#endif + +#ifdef RVTEST_FIXED_LEN + #define LI(reg, val)\ + .option push;\ + .option norvc;\ + .align UNROLLSZ;\ + li reg,val;\ + .align UNROLLSZ;\ + .option pop; + + #define LA(reg, val)\ + .option push;\ + .option norvc;\ + .align UNROLLSZ;\ + la reg,val;\ + .align UNROLLSZ;\ + .option pop; + +#else + #define LI(reg,val);\ + .option push;\ + .option norvc;\ + li reg,val;\ + .option pop; + + #define LA(reg,val);\ + .option push;\ + .option norvc;\ + la reg,val;\ + .option pop; +#endif +#if XLEN==64 + #define SREG sd + #define LREG ld + #define REGWIDTH 8 + #define MASK 0xFFFFFFFFFFFFFFFF + +#else + #if XLEN==32 + #define SREG sw + #define LREG lw + #define REGWIDTH 4 + #define MASK 0xFFFFFFFF + + #endif +#endif + +#if FLEN==64 + #define FLREG fld + #define FSREG fsd + #define FREGWIDTH 8 + +#else + #if FLEN==32 + #define FLREG flw + #define FSREG fsw + #define FREGWIDTH 4 + #endif +#endif + +#if XLEN==64 + #if FLEN==32 + #define SREG sw + #define LREG lW + #define REGWIDTH 4 + #define MASK 0xFFFFFFFF + #endif +#endif + +#define MMODE_SIG 3 +#define RLENG (REGWIDTH<<3) + +#define RVTEST_ISA(_STR) + +#ifndef DATA_REL_TVAL_MSK + #define DATA_REL_TVAL_MSK 0x0F05 << (REGWIDTH*8-16) +#endif + +#ifndef CODE_REL_TVAL_MSK + #define CODE_REL_TVAL_MSK 0xD008 << (REGWIDTH*8-16) +#endif + + +// ----------------------------------- CODE BEGIN w/ TRAP HANDLER START ------------------------ // + +.macro RVTEST_CODE_BEGIN + .align UNROLLSZ + .section .text.init; + .globl rvtest_init; \ + rvtest_init: +#ifdef rvtest_mtrap_routine + LA(x1, rvtest_trap_prolog ); + jalr ra, x1 + rvtest_prolog_done: +#endif + LI (x1, (0xFEEDBEADFEEDBEAD & MASK)); + LI (x2, (0xFF76DF56FF76DF56 & MASK)); + LI (x3, (0x7FBB6FAB7FBB6FAB & MASK)); + LI (x4, (0xBFDDB7D5BFDDB7D5 & MASK)); + LA (x5, rvtest_code_begin); + LA (x6, rvtest_data_begin); + LI (x7, (0xB7FBB6FAB7FBB6FA & MASK)); + LI (x8, (0x5BFDDB7D5BFDDB7D & MASK)); + LI (x9, (0xADFEEDBEADFEEDBE & MASK)); + LI (x10, (0x56FF76DF56FF76DF & MASK)); + LI (x11, (0xAB7FBB6FAB7FBB6F & MASK)); + LI (x12, (0xD5BFDDB7D5BFDDB7 & MASK)); + LI (x13, (0xEADFEEDBEADFEEDB & MASK)); + LI (x14, (0xF56FF76DF56FF76D & MASK)); + LI (x15, (0xFAB7FBB6FAB7FBB6 & MASK)); + #ifndef RVTEST_E + LI (x16, (0x7D5BFDDB7D5BFDDB & MASK)); + LI (x17, (0xBEADFEEDBEADFEED & MASK)); + LI (x18, (0xDF56FF76DF56FF76 & MASK)); + LI (x19, (0x6FAB7FBB6FAB7FBB & MASK)); + LI (x20, (0xB7D5BFDDB7D5BFDD & MASK)); + LI (x21, (0xDBEADFEEDBEADFEE & MASK)); + LI (x22, (0x6DF56FF76DF56FF7 & MASK)); + LI (x23, (0xB6FAB7FBB6FAB7FB & MASK)); + LI (x24, (0xDB7D5BFDDB7D5BFD & MASK)); + LI (x25, (0xEDBEADFEEDBEADFE & MASK)); + LI (x26, (0x76DF56FF76DF56FF & MASK)); + LI (x27, (0xBB6FAB7FBB6FAB7F & MASK)); + LI (x28, (0xDDB7D5BFDDB7D5BF & MASK)); + LI (x29, (0xEEDBEADFEEDBEADF & MASK)); + LI (x30, (0xF76DF56FF76DF56F & MASK)); + LI (x31, (0xFBB6FAB7FBB6FAB7 & MASK)); + #endif + .globl rvtest_code_begin + rvtest_code_begin: +.endm + +// --------------------------------- CODE BEGIN w/ TRAP HANDLER END -----------------------------// + +.macro RVTEST_CODE_END + .align 4; + .global rvtest_code_end + rvtest_code_end: +#ifdef rvtest_mtrap_routine + .option push + .option norvc + j exit_cleanup + + rvtest_trap_prolog: + /******************************************************************************/ + /**** Prolog, to be run before any tests ****/ + /**** #include 1 copy of this per mode in rvmodel_boot code? ****/ + /**** ------------------------------------------------------------------- ****/ + /**** if xTVEC isn't completely RW, then we need to change the code at its ****/ + /**** target. The entire trap trampoline and mtrap handler replaces the ****/ + /**** area pointed to by mtvec, after saving its original contents first. ****/ + /**** If it isn't possible to fully write that area, restore and fail. ****/ + /******************************************************************************/ + + //trap_handler_prolog; enter with t1..t6 available + + init_mscratch: + la t1, trapreg_sv + csrrw t1, CSR_MSCRATCH, t1 // swap old mscratch. mscratch not points to trapreg_sv + la t2, mscratch_save + SREG t1, 0(t2) // save old mscratch in mscratch_save region + csrr t1, CSR_MSCRATCH // read the trapreg_sv address + LA( t2, mtrap_sigptr ) // locate the start of the trap signature + SREG t2, 0(t1) // save mtrap_sigptr at first location of trapreg_sv + init_mtvec: + la t1, mtrampoline + la t4, mtvec_save + csrrw t2, CSR_MTVEC, t1 // swap mtvec and trap_trampoline + SREG t2, 0(t4) // save orig mtvec + csrr t3, CSR_MTVEC // now read new_mtval back + beq t3, t1, rvtest_prolog_done // if mtvec==trap_trampoline, mtvec is writable, continue + + /****************************************************************/ + /**** fixed mtvec, can't move it so move trampoline instead ****/ + /**** t1=trampoline, t2=oldmtvec, t3=save area, t4=save end ****/ + /****************************************************************/ + + // t2 = dut's original mtvec setting + // t1 = mtrampoline address + init_tramp: /**** copy trampoline at mtvec tgt ****/ + + csrw CSR_MTVEC, t2 // restore orig mtvec, will now attemp to copy trampoline to it + la t3, tramptbl_sv // addr of save area + addi t4, t3, NUM_SPECD_INTCAUSES*4 // end of save area + + overwrite_tt: // now build new trampoline table with offsets base from curr mtvec + lw t6, 0(t2) // get original mtvec target + sw t6, 0(t3) // save it + lw t5, 0(t1) // get trampoline src + sw t5, 0(t2) // overwrite mtvec target + lw t6, 0(t2) // rd it back to make sure it was written + bne t6, t5, resto_tramp // table isn't fully writable, restore and give up + addi t1, t1, 4 // next src index + addi t2, t2, 4 // next tgt index + addi t3, t3, 4 // next save index + bne t3, t4, overwrite_tt // not done, loop + j rvtest_prolog_done + + resto_tramp: // vector table not writeable, restore + LREG t1, 16(t4) // load mscratch_SAVE at fixed offset from table end + csrw CSR_MSCRATCH, t1 // restore mscratch + LREG t4, 8(t4) // load mtvec_SAVE (used as end of loop marker) + + + resto_loop: // goes backwards, t2= dest vec tbl ptr, t3=src save area ptr, t4=vec tbl begin + lw t6, 0(t3) // read saved tgt entry + sw t6, 0(t2) // restore original tgt + addi t2, t2, -4 // prev tgt index + addi t3, t3, -4 // prev save index + bne t2, t4, resto_loop // didn't restore to begining yet, loop + + j rvtest_end // failure to replace trampoline + + + #define mhandler \ + csrrw sp, CSR_MSCRATCH, sp; \ + SREG t6, 6*REGWIDTH(sp); \ + jal t6, common_prolog; + + /**********************************************************************/ + /**** This is the entry point for all m-modetraps, vectored or not.****/ + /**** At entry, mscratch will contain a pointer to a scratch area. ****/ + /**** This is an array of branches at 4B intevals that spreads out ****/ + /**** to an array of 32B mhandler macros for specd int causes, and ****/ + /**** to a return for anything above that (which causes a mismatch)****/ + /**********************************************************************/ + mtrampoline: // 64 or 32 entry table + value = 0 + .rept NUM_SPECD_INTCAUSES // located at each possible int vectors + j mtrap_handler + 12*(value) //offset < +/- 1MB + value = value + 1 + .endr + .rept RLENG-NUM_SPECD_INTCAUSES // fill at each impossible entry + mret + .endr + + mtrap_handler: /* after executing, sp points to temp save area, t4 is PC */ + .rept NUM_SPECD_INTCAUSES + mhandler + .endr + + common_prolog: + la t5, common_mhandler + jr t5 + /*********************************************************************/ + /**** common code for all ints & exceptions, will fork to handle ****/ + /**** each separately. The common handler first stores trap mode+ ****/ + /**** vector, and mcause signatures. All traps have 4wd sigs, but ****/ + /**** sw and timer ints only store 3 of the 4. ****/ + /**** sig offset Exception ExtInt SWInt TimerInt ****/ + /**** 0: tval IntID -1 -1 ****/ + /**** 4: mepc mip mip mip ****/ + /**** 8: <---------------------- mcause -------------> ****/ + /**** 12: <--------------------- Vect+mode ----------> ****/ + /*********************************************************************/ + /* in general, CSRs loaded in t2, addresses into t3 */ + + common_mhandler: /* enter with link in t6 */ + SREG t5, 5*REGWIDTH(sp) + SREG t4, 4*REGWIDTH(sp) + SREG t3, 3*REGWIDTH(sp) + SREG t2, 2*REGWIDTH(sp) + SREG t1, 1*REGWIDTH(sp) /* save other temporaries */ + + LREG t1, 0(sp) /* load trap sig pointer (runs backwards from DATA_END) */ + + LA( t3, mtrampoline) + sub t2, t6, t3 /* reloc “link†to 0..63 to show which int vector was taken */ + addi t2, t2, MMODE_SIG /* insert mode# into 1:0 */ + SREG t2, 0*REGWIDTH(t1) /* save 1st sig value, (vect, trapmode) */ + sv_mcause: + csrr t2, CSR_MCAUSE + SREG t2, 1*REGWIDTH(t1) /* save 2nd sig value, (mcause) */ + + bltz t2, common_mint_handler /* this is a interrupt, not a trap */ + + /********************************************************************/ + /**** This is the exceptions specific code, storing relative mepc****/ + /**** & relative tval signatures. tval is relocated by code or ****/ + /**** data start, or 0 depending on mcause. mepc signature value ****/ + /**** is relocated by code start, and restored adjusted depending****/ + /**** on op alignment so trapped op isn't re-executed. ****/ + /********************************************************************/ + common_mexcpt_handler: + csrr t2, CSR_MEPC + sv_mepc: + LA( t3, rvtest_prolog_done) /* offset to compensate for different loader offsets */ + sub t4, t2, t3 /* convert mepc to rel offset of beginning of test*/ + SREG t4, 2*REGWIDTH(t1) /* save 3rd sig value, (rel mepc) into trap signature area */ + adj_mepc: //adj mepc so there is padding after op, and its 8B aligned + andi t4, t2, 0x2 /* set to 2 if mepc was misaligned */ + sub t2, t2, t4 /* adjust mepc to prev 4B alignment */ + addi t2, t2, 0x8 /* adjust mepc, so it skips past the op, has padding & is 4B aligned */ + csrw CSR_MEPC, t2 /* restore adjusted value, has 1,2, or 3 bytes of padding */ + + + /* calculate relative mtval if it’s an address (by code_begin or data_begin amt) */ + /* note that masks that determine this are implementation specific from YAML */ + + /* masks are bit reversed, so mcause==0 bit is in MSB (so different for RV32 and RV64) */ + + adj_mtval: + csrr t2, CSR_MCAUSE /* code begin adjustment amount already in t3 */ + + LI(t4, CODE_REL_TVAL_MSK) /* trap#s 12, 3,1,0, -- adjust w/ code_begin */ + sll t4, t4, t2 /* put bit# in MSB */ + bltz t4, sv_mtval /* correct adjustment is code_begin in t3 */ + + LA( t3, mtrap_sigptr) /* adjustment assuming access is to signature region */ + LI(t4, DATA_REL_TVAL_MSK) /* trap#s not 14, 11..8, 2 adjust w/ data_begin */ + sll t4, t4, t2 /* put bit# in MSB */ + bgez t4, no_adj /* correct adjustment is data_begin in t3 */ + sigbound_chk: + csrr t4, CSR_MTVAL /* do a bounds check on mtval */ + bge t3, t4, sv_mtval /* if mtval is greater than the rvmodel_data_begin then use that as anchor */ + LA( t3, rvtest_data_begin) /* else change anchor to rvtest_data_begin */ + blt t3, t4, sv_mtval /* before the signature, use data_begin adj */ + mv t4, t3 /* use sig relative adjust */ + no_adj: + LI(t3, 0) /* else zero adjustment amt */ + + // For Illegal op handling + addi t2, t2, -2 /* check if mcause==2 (illegal op) */ + bnez t2, sv_mtval /* not illegal op, no special treatment */ + csrr t2, CSR_MTVAL + bnez t2, sv_mtval /* mtval isn’t zero, no special treatment */ + illop: + LI(t5, 0x20000) /* get mprv mask */ + csrrs t5, CSR_MSTATUS, t5 /* set mprv while saving the old value */ + csrr t3, CSR_MEPC + lhu t2, 0(t3) /* load 1st 16b of opc w/ old priv, endianess*/ + andi t4, t2, 0x3 + addi t4, t4, -0x3 /* does opcode[1:0]==0b11? (Meaning >16b op) */ + bnez t4, sv_mtval /* entire mtval is in tt2, adj amt will be set to zero */ + lhu t4, 2(t3) + sll t4, t4, 16 + or t3, t2, t4 /* get 2nd hwd, align it & insert it into opcode */ + csrw CSR_MSTATUS, t5 /* restore mstatus */ + +/*******FIXME: this will not handle 48 or 64b opcodes in an RV64) ********/ + + sv_mtval: + csrr t2, CSR_MTVAL + sub t2, t2, t3 /* perform mtval adjust by either code or data position or zero*/ + SREG t2, 3*REGWIDTH(t1) /* save 4th sig value, (rel mtval) into trap signature area */ + + resto_rtn: /* restore and return */ + addi t1, t1,4*REGWIDTH /* adjust trap signature ptr (traps always save 4 words) */ + SREG t1, 0*REGWIDTH(sp) /* save updated trap sig pointer (pts to trap_sigptr */ + + LREG t1, 1*REGWIDTH(sp) + LREG t2, 2*REGWIDTH(sp) + LREG t3, 3*REGWIDTH(sp) + LREG t4, 4*REGWIDTH(sp) + LREG t5, 5*REGWIDTH(sp) + LREG t6, 6*REGWIDTH(sp) /* restore temporaries */ + + csrrw sp, CSR_MSCRATCH, sp /* restore sp from scratch */ + mret + + common_mint_handler: /* t1 has sig ptr, t2 has mcause */ + + LI(t3, 1) + sll t3, t3, t2 /* create mask 1<


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 IMC(KEpUACj6951J literal 0 HcmV?d00001 diff --git a/wally-pipelined/src/generic/flop/flop.sv b/wally-pipelined/src/generic/flop/flop.sv new file mode 100644 index 000000000..2558c10df --- /dev/null +++ b/wally-pipelined/src/generic/flop/flop.sv @@ -0,0 +1,37 @@ +/////////////////////////////////////////// +// flop.sv +// +// Written: David_Harris@hmc.edu 9 January 2021 +// Modified: +// +// Purpose: various flavors of flip-flops +// +// A component of the Wally configurable RISC-V project. +// +// Copyright (C) 2021 Harvey Mudd College & Oklahoma State University +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, +// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software +// is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +// BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT +// OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +/////////////////////////////////////////// + +`include "wally-config.vh" + +// ordinary flip-flop +module flop #(parameter WIDTH = 8) ( + input logic clk, + input logic [WIDTH-1:0] d, + output logic [WIDTH-1:0] q); + + always_ff @(posedge clk) + q <= #1 d; +endmodule + diff --git a/wally-pipelined/src/generic/flop/flopen.sv b/wally-pipelined/src/generic/flop/flopen.sv new file mode 100644 index 000000000..618b02e7f --- /dev/null +++ b/wally-pipelined/src/generic/flop/flopen.sv @@ -0,0 +1,37 @@ +/////////////////////////////////////////// +// flopen.sv +// +// Written: David_Harris@hmc.edu 9 January 2021 +// Modified: +// +// Purpose: various flavors of flip-flops +// +// A component of the Wally configurable RISC-V project. +// +// Copyright (C) 2021 Harvey Mudd College & Oklahoma State University +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, +// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software +// is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +// BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT +// OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +/////////////////////////////////////////// + +`include "wally-config.vh" + +// flop with enable +module flopen #(parameter WIDTH = 8) ( + input logic clk, en, + input logic [WIDTH-1:0] d, + output logic [WIDTH-1:0] q); + + always_ff @(posedge clk) + if (en) q <= #1 d; +endmodule + diff --git a/wally-pipelined/src/generic/flop/flopenl.sv b/wally-pipelined/src/generic/flop/flopenl.sv new file mode 100644 index 000000000..acf3f2a0d --- /dev/null +++ b/wally-pipelined/src/generic/flop/flopenl.sv @@ -0,0 +1,39 @@ +/////////////////////////////////////////// +// flopenl.sv +// +// Written: David_Harris@hmc.edu 9 January 2021 +// Modified: +// +// Purpose: various flavors of flip-flops +// +// A component of the Wally configurable RISC-V project. +// +// Copyright (C) 2021 Harvey Mudd College & Oklahoma State University +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, +// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software +// is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +// BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT +// OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +/////////////////////////////////////////// + +`include "wally-config.vh" + +// flop with enable, asynchronous load +module flopenl #(parameter WIDTH = 8, parameter type TYPE=logic [WIDTH-1:0]) ( + input logic clk, load, en, + input TYPE d, + input TYPE val, + output TYPE q); + + always_ff @(posedge clk, posedge load) + if (load) q <= #1 val; + else if (en) q <= #1 d; +endmodule + diff --git a/wally-pipelined/src/generic/flop/flopenr.sv b/wally-pipelined/src/generic/flop/flopenr.sv new file mode 100644 index 000000000..9db912eae --- /dev/null +++ b/wally-pipelined/src/generic/flop/flopenr.sv @@ -0,0 +1,38 @@ +/////////////////////////////////////////// +// flopenr.sv +// +// Written: David_Harris@hmc.edu 9 January 2021 +// Modified: +// +// Purpose: various flavors of flip-flops +// +// A component of the Wally configurable RISC-V project. +// +// Copyright (C) 2021 Harvey Mudd College & Oklahoma State University +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, +// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software +// is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +// BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT +// OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +/////////////////////////////////////////// + +`include "wally-config.vh" + +// flop with enable, asynchronous reset +module flopenr #(parameter WIDTH = 8) ( + input logic clk, reset, en, + input logic [WIDTH-1:0] d, + output logic [WIDTH-1:0] q); + + always_ff @(posedge clk, posedge reset) + if (reset) q <= #1 0; + else if (en) q <= #1 d; +endmodule + diff --git a/wally-pipelined/src/generic/flop/flopenrc.sv b/wally-pipelined/src/generic/flop/flopenrc.sv new file mode 100644 index 000000000..d8806196c --- /dev/null +++ b/wally-pipelined/src/generic/flop/flopenrc.sv @@ -0,0 +1,40 @@ +/////////////////////////////////////////// +// flopenrc.sv +// +// Written: David_Harris@hmc.edu 9 January 2021 +// Modified: +// +// Purpose: various flavors of flip-flops +// +// A component of the Wally configurable RISC-V project. +// +// Copyright (C) 2021 Harvey Mudd College & Oklahoma State University +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, +// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software +// is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +// BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT +// OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +/////////////////////////////////////////// + +`include "wally-config.vh" + +// flop with enable, asynchronous reset, synchronous clear +module flopenrc #(parameter WIDTH = 8) ( + input logic clk, reset, clear, en, + input logic [WIDTH-1:0] d, + output logic [WIDTH-1:0] q); + + always_ff @(posedge clk, posedge reset) + if (reset) q <= #1 0; + else if (en) + if (clear) q <= #1 0; + else q <= #1 d; +endmodule + diff --git a/wally-pipelined/src/muldiv/div/div64_sim/mux.sv b/wally-pipelined/src/generic/flop/flopens.sv similarity index 54% rename from wally-pipelined/src/muldiv/div/div64_sim/mux.sv rename to wally-pipelined/src/generic/flop/flopens.sv index da2682462..d51659b8b 100644 --- a/wally-pipelined/src/muldiv/div/div64_sim/mux.sv +++ b/wally-pipelined/src/generic/flop/flopens.sv @@ -1,10 +1,10 @@ /////////////////////////////////////////// -// mux.sv +// flopens.sv // // Written: David_Harris@hmc.edu 9 January 2021 // Modified: // -// Purpose: Various flavors of multiplexers +// Purpose: various flavors of flip-flops // // A component of the Wally configurable RISC-V project. // @@ -23,44 +23,17 @@ // OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. /////////////////////////////////////////// -module mux2 #(parameter WIDTH = 8) ( - input logic [WIDTH-1:0] d0, d1, - input logic s, - output logic [WIDTH-1:0] y); +`include "wally-config.vh" - assign y = s ? d1 : d0; +// flop with enable, asynchronous set +module flopens #(parameter WIDTH = 8) ( + input logic clk, set, en, + input logic [WIDTH-1:0] d, + output logic [WIDTH-1:0] q); + + always_ff @(posedge clk, posedge set) + if (set) q <= #1 1; + else if (en) q <= #1 d; endmodule -module mux3 #(parameter WIDTH = 8) ( - input logic [WIDTH-1:0] d0, d1, d2, - input logic [1:0] s, - output logic [WIDTH-1:0] y); - assign y = s[1] ? d2 : (s[0] ? d1 : d0); -endmodule - -module mux4 #(parameter WIDTH = 8) ( - input logic [WIDTH-1:0] d0, d1, d2, d3, - input logic [1:0] s, - output logic [WIDTH-1:0] y); - - assign y = s[1] ? (s[0] ? d3 : d2) : (s[0] ? d1 : d0); -endmodule - -module mux5 #(parameter WIDTH = 8) ( - input logic [WIDTH-1:0] d0, d1, d2, d3, d4, - input logic [2:0] s, - output logic [WIDTH-1:0] y); - - assign y = s[2] ? d4 : (s[1] ? (s[0] ? d3 : d2) : (s[0] ? d1 : d0)); -endmodule - -module mux6 #(parameter WIDTH = 8) ( - input logic [WIDTH-1:0] d0, d1, d2, d3, d4, d5, - input logic [2:0] s, - output logic [WIDTH-1:0] y); - - assign y = s[2] ? (s[0] ? d5 : d4) : (s[1] ? (s[0] ? d3 : d2) : (s[0] ? d1 : d0)); -endmodule - -/* verilator lint_on DECLFILENAME */ diff --git a/wally-pipelined/src/generic/flop/flopr.sv b/wally-pipelined/src/generic/flop/flopr.sv new file mode 100644 index 000000000..5ff6a5a91 --- /dev/null +++ b/wally-pipelined/src/generic/flop/flopr.sv @@ -0,0 +1,38 @@ +/////////////////////////////////////////// +// flopr.sv +// +// Written: David_Harris@hmc.edu 9 January 2021 +// Modified: +// +// Purpose: various flavors of flip-flops +// +// A component of the Wally configurable RISC-V project. +// +// Copyright (C) 2021 Harvey Mudd College & Oklahoma State University +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, +// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software +// is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +// BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT +// OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +/////////////////////////////////////////// + +`include "wally-config.vh" + +// flop with asynchronous reset +module flopr #(parameter WIDTH = 8) ( + input logic clk, reset, + input logic [WIDTH-1:0] d, + output logic [WIDTH-1:0] q); + + always_ff @(posedge clk, posedge reset) + if (reset) q <= #1 0; + else q <= #1 d; +endmodule + diff --git a/wally-pipelined/src/generic/flop/floprc.sv b/wally-pipelined/src/generic/flop/floprc.sv new file mode 100644 index 000000000..9d5f17c7a --- /dev/null +++ b/wally-pipelined/src/generic/flop/floprc.sv @@ -0,0 +1,41 @@ +/////////////////////////////////////////// +// floprc.sv +// +// Written: David_Harris@hmc.edu 9 January 2021 +// Modified: +// +// Purpose: various flavors of flip-flops +// +// A component of the Wally configurable RISC-V project. +// +// Copyright (C) 2021 Harvey Mudd College & Oklahoma State University +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, +// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software +// is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +// BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT +// OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +/////////////////////////////////////////// + +`include "wally-config.vh" + +// flop with asynchronous reset, synchronous clear +module floprc #(parameter WIDTH = 8) ( + input logic clk, + input logic reset, + input logic clear, + input logic [WIDTH-1:0] d, + output logic [WIDTH-1:0] q); + + always_ff @(posedge clk, posedge reset) + if (reset) q <= #1 0; + else + if (clear) q <= #1 0; + else q <= #1 d; +endmodule diff --git a/wally-pipelined/src/muldiv/div/README b/wally-pipelined/src/muldiv/div/README deleted file mode 100755 index 6898c5cec..000000000 --- a/wally-pipelined/src/muldiv/div/README +++ /dev/null @@ -1 +0,0 @@ -vsim -do iter64.do -c diff --git a/wally-pipelined/src/muldiv/div/README.md b/wally-pipelined/src/muldiv/div/README.md deleted file mode 100644 index ebb006c95..000000000 --- a/wally-pipelined/src/muldiv/div/README.md +++ /dev/null @@ -1,22 +0,0 @@ -This is a novel integer divider using r4 division by recurrence. The -reference is: - -J. E. Stine and K. Hill, "An Efficient Implementation of Radix-4 -Integer Division Using Scaling," 2020 IEEE 63rd International Midwest -Symposium on Circuits and Systems (MWSCAS), Springfield, MA, USA, -2020, pp. 1092-1095, doi: 10.1109/MWSCAS48704.2020.9184631. - -Although this version does not contain scaling, it could do this, if -needed. Moreover, a higher radix or overlapped radix can be done -easily to expand the the size. Also, the implementations here are -initially unsigned but hope to expand for signed, which should be -easy. - -There are two types of tests in this directory within each testbench. -One tests for 32-bits and the other 64-bits: - -int32div.do and int64div.do = test individual vector for debugging - -iter32.do and iter64.do = do not use any waveform generation and just -output lots of tests - diff --git a/wally-pipelined/src/muldiv/div/div b/wally-pipelined/src/muldiv/div/div deleted file mode 100755 index e0bbf726502af2947a56ee033ab0096d048a17d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16696 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 rnF<%zhu|} diff --git a/wally-pipelined/src/muldiv/div/div.c b/wally-pipelined/src/muldiv/div/div.c deleted file mode 100644 index 53bbc2a86..000000000 --- a/wally-pipelined/src/muldiv/div/div.c +++ /dev/null @@ -1,37 +0,0 @@ -#include -#include -#include - -int main() { - - uint64_t N; - uint64_t D; - uint64_t Q; - double val; - uint64_t val2; - - int exponent; - int base; - - base = 2; - exponent = 32; - val2 = 1; - while (exponent != 0) { - val2 *= base; - exponent --; - } - - val = pow(2.0, 64) - 1; - N = 0xdf7f3844121bcc23; - D = 0x10fd3dedadea5195; - - printf("N = %" PRIx64 "\n", N); - printf("D = %" PRIx64 "\n", D); - printf("Q = %" PRIx64 "\n", Q); - printf("R = %" PRIx64 "\n", N%D); - - printf("val = %" PRIx64 "\n", val2-1); - - - -} diff --git a/wally-pipelined/src/muldiv/div/div64.out b/wally-pipelined/src/muldiv/div/div64.out deleted file mode 100644 index 6bfa9dd9d..000000000 --- a/wally-pipelined/src/muldiv/div/div64.out +++ /dev/null @@ -1,107 +0,0 @@ -0000000000000000 0000000000000000 | ffffffffffffffff 0000000000000000 | 0000000000000000 0000000000000000 0 1 -0000000000000000 0000000000000000 | ffffffffffffffff 0000000000000000 | 0000000000000000 0000000000000000 0 1 -0000000000000000 0000000000000000 | ffffffffffffffff 0000000000000000 | 0000000000000000 0000000000000000 0 1 -0000000000000000 0000000000000000 | ffffffffffffffff 0000000000000000 | 0000000000000000 0000000000000000 0 1 -0000000000000000 0000000000000000 | ffffffffffffffff 0000000000000000 | 0000000000000000 0000000000000000 0 1 -0000000000000000 0000000000000000 | ffffffffffffffff 0000000000000000 | 0000000000000000 0000000000000000 0 1 -0000000000000000 0000000000000000 | ffffffffffffffff 0000000000000000 | 0000000000000000 0000000000000000 0 1 -0000000000000000 0000000000000000 | ffffffffffffffff 0000000000000000 | 0000000000000000 0000000000000000 0 1 -0000000000000000 0000000000000000 | ffffffffffffffff 0000000000000000 | 0000000000000000 0000000000000000 0 1 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 -ffffffffffffffff 0000000000000000 | ffffffffffffffff ffffffffffffffff | 0000000000000000 0000000000000000 0 0 diff --git a/wally-pipelined/src/muldiv/div/div64_sim/div.sv b/wally-pipelined/src/muldiv/div/div64_sim/div.sv deleted file mode 100755 index 568971e2d..000000000 --- a/wally-pipelined/src/muldiv/div/div64_sim/div.sv +++ /dev/null @@ -1,1535 +0,0 @@ -/////////////////////////////////////////// -// mul.sv -// -// Written: James.Stine@okstate.edu 1 February 2021 -// Modified: -// -// Purpose: Integer Divide instructions -// -// A component of the Wally configurable RISC-V project. -// -// Copyright (C) 2021 Harvey Mudd College & Oklahoma State University -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation -// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, -// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software -// is furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS -// BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT -// OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -/////////////////////////////////////////// - -module div (Q, done, divdone, rem0, div0, N, D, clk, reset, start); - - input logic [63:0] N, D; - input logic clk; - input logic reset; - input logic start; - - output logic [63:0] Q; - output logic [63:0] rem0; - output logic div0; - output logic divdone; - - output logic done; - logic enable; - logic state0; - logic V; - logic [7:0] Num; - logic [5:0] P, NumIter, RemShift; - logic [63:0] op1, op2, op1shift, Rem5; - logic [64:0] Qd, Rd, Qd2, Rd2; - logic [3:0] quotient; - logic otfzero; - logic shiftResult; - - // Divider goes the distance to 37 cycles - // (thanks the evil divisor for D = 0x1) - // but could theoretically be stopped when - // divdone is asserted. The enable signal - // turns off register storage thus invalidating - // any future cycles. - - // Shift D, if needed (for integer) - // needed to allow qst to be in range for integer - // division [1,2) and allow integer divide to work. - // - // The V or valid bit can be used to determine if D - // is 0 and thus a divide by 0 exception. This div0 - // exception is given to FSM to tell the operation to - // quit gracefully. - - // div0 produced output errors have untested results - // (it is assumed the OS would handle some output) - - lz64 p1 (P, V, D); - shifter_l64 p2 (op2, D, P); - assign op1 = N; - assign div0 = ~V; - - // #iter: N = m+v+s = m+(s+2) = m+2+s (mod k = 0) - // v = 2 since \rho < 1 (add 4 to make sure its a ceil) - adder #(8) cpa1 ({2'b0, P}, - {5'h0, shiftResult, ~shiftResult, 1'b0}, - Num); - - // Determine whether need to add just Q/Rem - assign shiftResult = P[0]; - // div by 2 (ceil) - assign NumIter = Num[6:1]; - assign RemShift = P; - - // FSM to control integer divider - // assume inputs are postive edge and - // datapath (divider) is negative edge - fsm64 fsm1 (enablev, state0v, donev, divdonev, otfzerov, - start, div0, NumIter, ~clk, reset); - - flopr #(1) rega (~clk, reset, donev, done); - flopr #(1) regb (~clk, reset, divdonev, divdone); - flopr #(1) regc (~clk, reset, otfzerov, otfzero); - flopr #(1) regd (~clk, reset, enablev, enable); - flopr #(1) rege (~clk, reset, state0v, state0); - - // To obtain a correct remainder the last bit of the - // quotient has to be aligned with a radix-r boundary. - // Since the quotient is in the range 1/2 < q < 2 (one - // integer bit and m fractional bits), this is achieved by - // shifting N right by v+s so that (m+v+s) mod k = 0. And, - // the quotient has to be aligned to the integer position. - - // Used a Brent-Kung for no reason (just wanted prefix -- might - // have gotten away with a RCA) - - // Actual divider unit FIXME: r16 (jes) - divide4x64 p3 (Qd, Rd, quotient, op1, op2, clk, reset, state0, - enable, otfzero, shiftResult); - - // Storage registers to hold contents stable - flopenr #(65) reg3 (clk, reset, enable, Rd, Rd2); - flopenr #(65) reg4 (clk, reset, enable, Qd, Qd2); - - // Probably not needed - just assigns results - assign Q = Qd2[63:0]; - assign Rem5 = Rd2[64:1]; - - // Adjust remainder by m (no need to adjust by - // n ln(r) - shifter_r64 p4 (rem0, Rem5, RemShift); - -endmodule // int32div - -module divide4x64 (Q, rem0, quotient, op1, op2, clk, reset, state0, - enable, otfzero, shiftResult); - - input logic [63:0] op1, op2; - input logic clk, state0; - input logic reset; - input logic enable; - input logic otfzero; - input logic shiftResult; - - output logic [64:0] rem0; - output logic [64:0] Q; - output logic [3:0] quotient; - - logic [67:0] Sum, Carry; - logic [64:0] Qstar; - logic [64:0] QMstar; - logic [7:0] qtotal; - logic [67:0] SumN, CarryN, SumN2, CarryN2; - logic [67:0] divi1, divi2, divi1c, divi2c, dive1; - logic [67:0] mdivi_temp, mdivi; - logic zero; - logic [1:0] qsel; - logic [1:0] Qin, QMin; - logic CshiftQ, CshiftQM; - logic [67:0] rem1, rem2, rem3; - logic [67:0] SumR, CarryR; - logic [64:0] Qt; - - // Create one's complement values of Divisor (for q*D) - assign divi1 = {3'h0, op2, 1'b0}; - assign divi2 = {2'h0, op2, 2'b0}; - assign divi1c = ~divi1; - assign divi2c = ~divi2; - // Shift x1 if not mod k - mux2 #(68) mx1 ({3'b000, op1, 1'b0}, {4'h0, op1}, shiftResult, dive1); - - // I I I . F F F F F ... (Robertson Criteria - \rho * qmax * D) - mux2 #(68) mx2 ({CarryN2[65:0], 2'h0}, 68'h0, state0, CarryN); - mux2 #(68) mx3 ({SumN2[65:0], 2'h0}, dive1, state0, SumN); - // Simplify QST - adder #(8) cpa1 (SumN[67:60], CarryN[67:60], qtotal); - // q = {+2, +1, -1, -2} else q = 0 - qst4 pd1 (qtotal[7:1], divi1[63:61], quotient); - assign ulp = quotient[2]|quotient[3]; - assign zero = ~(quotient[3]|quotient[2]|quotient[1]|quotient[0]); - // Map to binary encoding - assign qsel[1] = quotient[3]|quotient[2]; - assign qsel[0] = quotient[3]|quotient[1]; - mux4 #(68) mx4 (divi2, divi1, divi1c, divi2c, qsel, mdivi_temp); - mux2 #(68) mx5 (mdivi_temp, 68'h0, zero, mdivi); - csa #(68) csa1 (mdivi, SumN, {CarryN[67:1], ulp}, Sum, Carry); - // regs : save CSA - flopenr #(68) reg1 (clk, reset, enable, Sum, SumN2); - flopenr #(68) reg2 (clk, reset, enable, Carry, CarryN2); - // OTF - ls_control otf1 (quotient, Qin, QMin, CshiftQ, CshiftQM); - otf #(65) otf2 (Qin, QMin, CshiftQ, CshiftQM, clk, - otfzero, enable, Qstar, QMstar); - - // Correction and generation of Remainder - adder #(68) cpa2 (SumN2[67:0], CarryN2[67:0], rem1); - // Add back +D as correction - csa #(68) csa2 (CarryN2[67:0], SumN2[67:0], divi1, SumR, CarryR); - adder #(68) cpa3 (SumR, CarryR, rem2); - // Choose remainder (Rem or Rem+D) - mux2 #(68) mx6 (rem1, rem2, rem1[67], rem3); - // Choose correct Q or QM - mux2 #(65) mx7 (Qstar, QMstar, rem1[67], Qt); - // Final results - assign rem0 = rem3[64:0]; - assign Q = Qt; - -endmodule // divide4x64 - -module ls_control (quot, Qin, QMin, CshiftQ, CshiftQM); - - input logic [3:0] quot; - - output logic [1:0] Qin; - output logic [1:0] QMin; - output logic CshiftQ; - output logic CshiftQM; - - // Load/Store Control for OTF - assign Qin[1] = (quot[1]) | (quot[3]) | (quot[0]); - assign Qin[0] = (quot[1]) | (quot[2]); - assign QMin[1] = (quot[1]) | (!quot[3]&!quot[2]&!quot[1]&!quot[0]); - assign QMin[0] = (quot[3]) | (quot[0]) | - (!quot[3]&!quot[2]&!quot[1]&!quot[0]); - assign CshiftQ = (quot[1]) | (quot[0]); - assign CshiftQM = (quot[3]) | (quot[2]); - -endmodule - -// On-the-fly Conversion per Ercegovac/Lang - -module otf #(parameter WIDTH=8) - (Qin, QMin, CshiftQ, CshiftQM, clk, reset, enable, R2Q, R1Q); - - input logic [1:0] Qin, QMin; - input logic CshiftQ, CshiftQM; - input logic clk; - input logic reset; - input logic enable; - - output logic [WIDTH-1:0] R2Q; - output logic [WIDTH-1:0] R1Q; - - logic [WIDTH-1:0] Qstar, QMstar; - logic [WIDTH-1:0] M1Q, M2Q; - - // QM - mux2 #(WIDTH) m1 (QMstar, Qstar, CshiftQM, M1Q); - flopenr #(WIDTH) r1 (clk, reset, enable, {M1Q[WIDTH-3:0], QMin}, R1Q); - // Q - mux2 #(WIDTH) m2 (Qstar, QMstar, CshiftQ, M2Q); - flopenr #(WIDTH) r2 (clk, reset, enable, {M2Q[WIDTH-3:0], Qin}, R2Q); - - assign Qstar = R2Q; - assign QMstar = R1Q; - -endmodule // otf8 - -module adder #(parameter WIDTH=8) (input logic [WIDTH-1:0] a, b, - output logic [WIDTH-1:0] y); - - assign y = a + b; - -endmodule // adder - -module fa (input logic a, b, c, output logic sum, carry); - - assign sum = a^b^c; - assign carry = a&b|a&c|b&c; - -endmodule // fa - -module csa #(parameter WIDTH=8) (input logic [WIDTH-1:0] a, b, c, - output logic [WIDTH-1:0] sum, carry); - - logic [WIDTH:0] carry_temp; - genvar i; - generate - for (i=0;i B. LT and GT are both '0' if A = B. - -module magcompare2b (LT, GT, A, B); - - input logic [1:0] A; - input logic [1:0] B; - - output logic LT; - output logic GT; - - // Determine if A < B using a minimized sum-of-products expression - assign LT = ~A[1]&B[1] | ~A[1]&~A[0]&B[0] | ~A[0]&B[1]&B[0]; - // Determine if A > B using a minimized sum-of-products expression - assign GT = A[1]&~B[1] | A[1]&A[0]&~B[0] | A[0]&~B[1]&~B[0]; - -endmodule // magcompare2b - -// J. E. Stine and M. J. Schulte, "A combined two's complement and -// floating-point comparator," 2005 IEEE International Symposium on -// Circuits and Systems, Kobe, 2005, pp. 89-92 Vol. 1. -// doi: 10.1109/ISCAS.2005.1464531 - -module magcompare8 (LT, EQ, A, B); - - input logic [7:0] A; - input logic [7:0] B; - - logic [3:0] s; - logic [3:0] t; - logic [1:0] u; - logic [1:0] v; - logic GT; - //wire LT; - - output logic EQ; - output logic LT; - - magcompare2b mag1 (s[0], t[0], A[1:0], B[1:0]); - magcompare2b mag2 (s[1], t[1], A[3:2], B[3:2]); - magcompare2b mag3 (s[2], t[2], A[5:4], B[5:4]); - magcompare2b mag4 (s[3], t[3], A[7:6], B[7:6]); - - magcompare2b mag5 (u[0], v[0], t[1:0], s[1:0]); - magcompare2b mag6 (u[1], v[1], t[3:2], s[3:2]); - - magcompare2b mag7 (LT, GT, v[1:0], u[1:0]); - - assign EQ = ~(GT | LT); - -endmodule // magcompare8 - -module shifter_l64 (Z, A, Shift); - - input logic [63:0] A; - input logic [5:0] Shift; - - logic [63:0] stage1; - logic [63:0] stage2; - logic [63:0] stage3; - logic [63:0] stage4; - logic [63:0] stage5; - logic [31:0] thirtytwozeros = 32'h0; - logic [15:0] sixteenzeros = 16'h0; - logic [ 7:0] eightzeros = 8'h0; - logic [ 3:0] fourzeros = 4'h0; - logic [ 1:0] twozeros = 2'b00; - logic onezero = 1'b0; - - output logic [63:0] Z; - - mux2 #(64) mx01(A, {A[31:0], thirtytwozeros}, Shift[5], stage1); - mux2 #(64) mx02(stage1, {stage1[47:0], sixteenzeros}, Shift[4], stage2); - mux2 #(64) mx03(stage2, {stage2[55:0], eightzeros}, Shift[3], stage3); - mux2 #(64) mx04(stage3, {stage3[59:0], fourzeros}, Shift[2], stage4); - mux2 #(64) mx05(stage4, {stage4[61:0], twozeros}, Shift[1], stage5); - mux2 #(64) mx06(stage5, {stage5[62:0], onezero}, Shift[0], Z); - -endmodule // shifter_l64 - -module shifter_r64 (Z, A, Shift); - - input logic [63:0] A; - input logic [5:0] Shift; - - logic [63:0] stage1; - logic [63:0] stage2; - logic [63:0] stage3; - logic [63:0] stage4; - logic [63:0] stage5; - logic [31:0] thirtytwozeros = 32'h0; - logic [15:0] sixteenzeros = 16'h0; - logic [ 7:0] eightzeros = 8'h0; - logic [ 3:0] fourzeros = 4'h0; - logic [ 1:0] twozeros = 2'b00; - logic onezero = 1'b0; - - output logic [63:0] Z; - - mux2 #(64) mx01(A, {thirtytwozeros, A[63:32]}, Shift[5], stage1); - mux2 #(64) mx02(stage1, {sixteenzeros, stage1[63:16]}, Shift[4], stage2); - mux2 #(64) mx03(stage2, {eightzeros, stage2[63:8]}, Shift[3], stage3); - mux2 #(64) mx04(stage3, {fourzeros, stage3[63:4]}, Shift[2], stage4); - mux2 #(64) mx05(stage4, {twozeros, stage4[63:2]}, Shift[1], stage5); - mux2 #(64) mx06(stage5, {onezero, stage5[63:1]}, Shift[0], Z); - -endmodule // shifter_r64 - -module shifter_l32 (Z, A, Shift); - - input logic [31:0] A; - input logic [4:0] Shift; - - logic [31:0] stage1; - logic [31:0] stage2; - logic [31:0] stage3; - logic [31:0] stage4; - logic [15:0] sixteenzeros = 16'h0; - logic [ 7:0] eightzeros = 8'h0; - logic [ 3:0] fourzeros = 4'h0; - logic [ 1:0] twozeros = 2'b00; - logic onezero = 1'b0; - - output logic [31:0] Z; - - mux2 #(32) mx01(A, {A[15:0], sixteenzeros}, Shift[4], stage1); - mux2 #(32) mx02(stage1, {stage1[23:0], eightzeros}, Shift[3], stage2); - mux2 #(32) mx03(stage2, {stage2[27:0], fourzeros}, Shift[2], stage3); - mux2 #(32) mx04(stage3, {stage3[29:0], twozeros}, Shift[1], stage4); - mux2 #(32) mx05(stage4, {stage4[30:0], onezero}, Shift[0], Z); - -endmodule // shifter_l32 - -module shifter_r32 (Z, A, Shift); - - input logic [31:0] A; - input logic [4:0] Shift; - - logic [31:0] stage1; - logic [31:0] stage2; - logic [31:0] stage3; - logic [31:0] stage4; - logic [15:0] sixteenzeros = 16'h0; - logic [ 7:0] eightzeros = 8'h0; - logic [ 3:0] fourzeros = 4'h0; - logic [ 1:0] twozeros = 2'b00; - logic onezero = 1'b0; - - output logic [31:0] Z; - - mux2 #(32) mx01(A, {sixteenzeros, A[31:16]}, Shift[4], stage1); - mux2 #(32) mx02(stage1, {eightzeros, stage1[31:8]}, Shift[3], stage2); - mux2 #(32) mx03(stage2, {fourzeros, stage2[31:4]}, Shift[2], stage3); - mux2 #(32) mx04(stage3, {twozeros, stage3[31:2]}, Shift[1], stage4); - mux2 #(32) mx05(stage4, {onezero, stage4[31:1]}, Shift[0], Z); - -endmodule // shifter_r32 - diff --git a/wally-pipelined/src/muldiv/div/div64_sim/flop.sv b/wally-pipelined/src/muldiv/div/div64_sim/flop.sv deleted file mode 100644 index 7f20fb7fb..000000000 --- a/wally-pipelined/src/muldiv/div/div64_sim/flop.sv +++ /dev/null @@ -1,108 +0,0 @@ -/////////////////////////////////////////// -// flop.sv -// -// Written: David_Harris@hmc.edu 9 January 2021 -// Modified: -// -// Purpose: arious flavors of flip-flops -// -// A component of the Wally configurable RISC-V project. -// -// Copyright (C) 2021 Harvey Mudd College & Oklahoma State University -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation -// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, -// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software -// is furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS -// BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT -// OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -/////////////////////////////////////////// - -// ordinary flip-flop -module flop #(parameter WIDTH = 8) ( - input logic clk, - input logic [WIDTH-1:0] d, - output logic [WIDTH-1:0] q); - - always_ff @(posedge clk) - q <= #1 d; -endmodule - -// flop with asynchronous reset -module flopr #(parameter WIDTH = 8) ( - input logic clk, reset, - input logic [WIDTH-1:0] d, - output logic [WIDTH-1:0] q); - - always_ff @(posedge clk, posedge reset) - if (reset) q <= #1 0; - else q <= #1 d; -endmodule - -// flop with enable -module flopen #(parameter WIDTH = 8) ( - input logic clk, en, - input logic [WIDTH-1:0] d, - output logic [WIDTH-1:0] q); - - always_ff @(posedge clk) - if (en) q <= #1 d; -endmodule - -// flop with enable, asynchronous reset, synchronous clear -module flopenrc #(parameter WIDTH = 8) ( - input logic clk, reset, clear, en, - input logic [WIDTH-1:0] d, - output logic [WIDTH-1:0] q); - - always_ff @(posedge clk, posedge reset) - if (reset) q <= #1 0; - else if (en) - if (clear) q <= #1 0; - else q <= #1 d; -endmodule - -// flop with enable, asynchronous reset -module flopenr #(parameter WIDTH = 8) ( - input logic clk, reset, en, - input logic [WIDTH-1:0] d, - output logic [WIDTH-1:0] q); - - always_ff @(posedge clk, posedge reset) - if (reset) q <= #1 0; - else if (en) q <= #1 d; -endmodule -/* -// flop with enable, asynchronous load -module flopenl #(parameter WIDTH = 8, parameter type TYPE=logic [WIDTH-1:0]) ( - input logic clk, load, en, - input TYPE d, - input TYPE val, - output TYPE q); - - always_ff @(posedge clk, posedge load) - if (load) q <= #1 val; - else if (en) q <= #1 d; -endmodule -*/ -// flop with asynchronous reset, synchronous clear -module floprc #(parameter WIDTH = 8) ( - input logic clk, - input logic reset, - input logic clear, - input logic [WIDTH-1:0] d, - output logic [WIDTH-1:0] q); - - always_ff @(posedge clk, posedge reset) - if (reset) q <= #1 0; - else - if (clear) q <= #1 0; - else q <= #1 d; -endmodule - - diff --git a/wally-pipelined/src/muldiv/div/div64_sim/iter32.do b/wally-pipelined/src/muldiv/div/div64_sim/iter32.do deleted file mode 100755 index d6ae858ae..000000000 --- a/wally-pipelined/src/muldiv/div/div64_sim/iter32.do +++ /dev/null @@ -1,50 +0,0 @@ -# Copyright 1991-2007 Mentor Graphics Corporation -# -# Modification by Oklahoma State University -# Use with Testbench -# James Stine, 2008 -# Go Cowboys!!!!!! -# -# All Rights Reserved. -# -# THIS WORK CONTAINS TRADE SECRET AND PROPRIETARY INFORMATION -# WHICH IS THE PROPERTY OF MENTOR GRAPHICS CORPORATION -# OR ITS LICENSORS AND IS SUBJECT TO LICENSE TERMS. - -# Use this run.do file to run this example. -# Either bring up ModelSim and type the following at the "ModelSim>" prompt: -# do run.do -# or, to run from a shell, type the following at the shell prompt: -# vsim -do run.do -c -# (omit the "-c" to see the GUI while running from the shell) - -onbreak {resume} - -# create library -if [file exists work] { - vdel -all -} -vlib work - -# compile source files -vlog div.sv test_iter32.sv - -# start and run simulation -vsim -voptargs=+acc work.tb - - --- Set Wave Output Items -TreeUpdate [SetDefaultTree] -WaveRestoreZoom {0 ps} {75 ns} -configure wave -namecolwidth 150 -configure wave -valuecolwidth 100 -configure wave -justifyvalue left -configure wave -signalnamewidth 0 -configure wave -snapdistance 10 -configure wave -datasetprefix 0 -configure wave -rowmargin 4 -configure wave -childrowmargin 2 - --- Run the Simulation -run 9586700ns -quit diff --git a/wally-pipelined/src/muldiv/div/div64_sim/iter64.do b/wally-pipelined/src/muldiv/div/div64_sim/iter64.do deleted file mode 100755 index 435b80199..000000000 --- a/wally-pipelined/src/muldiv/div/div64_sim/iter64.do +++ /dev/null @@ -1,50 +0,0 @@ -# Copyright 1991-2007 Mentor Graphics Corporation -# -# Modification by Oklahoma State University -# Use with Testbench -# James Stine, 2008 -# Go Cowboys!!!!!! -# -# All Rights Reserved. -# -# THIS WORK CONTAINS TRADE SECRET AND PROPRIETARY INFORMATION -# WHICH IS THE PROPERTY OF MENTOR GRAPHICS CORPORATION -# OR ITS LICENSORS AND IS SUBJECT TO LICENSE TERMS. - -# Use this run.do file to run this example. -# Either bring up ModelSim and type the following at the "ModelSim>" prompt: -# do run.do -# or, to run from a shell, type the following at the shell prompt: -# vsim -do run.do -c -# (omit the "-c" to see the GUI while running from the shell) - -onbreak {resume} - -# create library -if [file exists work] { - vdel -all -} -vlib work - -# compile source files -vlog mux.sv flop.sv div.sv test_iter64.sv - -# start and run simulation -vsim -voptargs=+acc work.tb - - --- Set Wave Output Items -TreeUpdate [SetDefaultTree] -WaveRestoreZoom {0 ps} {75 ns} -configure wave -namecolwidth 150 -configure wave -valuecolwidth 100 -configure wave -justifyvalue left -configure wave -signalnamewidth 0 -configure wave -snapdistance 10 -configure wave -datasetprefix 0 -configure wave -rowmargin 4 -configure wave -childrowmargin 2 - --- Run the Simulation -run 9586700ns -quit diff --git a/wally-pipelined/src/muldiv/div/div64_sim/test_iter32.sv b/wally-pipelined/src/muldiv/div/div64_sim/test_iter32.sv deleted file mode 100755 index 94a42c211..000000000 --- a/wally-pipelined/src/muldiv/div/div64_sim/test_iter32.sv +++ /dev/null @@ -1,74 +0,0 @@ -module tb; - - logic [31:0] N, D; - logic clk; - logic reset; - logic start; - - logic [31:0] Q; - logic [31:0] rem0; - logic div0; - logic done; - logic divdone; - - integer handle3; - integer desc3; - integer i; - - bit [31:0] Ncomp; - bit [31:0] Dcomp; - bit [31:0] Qcomp; - bit [31:0] Rcomp; - - logic [7:0] count [0:15]; - - int32div dut (Q, done, divdone, rem0, div0, N, D, clk, reset, start); - - initial - begin - clk = 1'b0; - forever #5 clk = ~clk; - end - - initial - begin - handle3 = $fopen("iter32.out"); - #8000000 $finish; - end - - always @(posedge clk, posedge reset) - begin - desc3 = handle3; - #0 start = 1'b0; - #0 reset = 1'b1; - #30 reset = 1'b0; - for (i=0; i<2; i=i+1) - begin - N = $random; - D = $random; - start <= 1'b1; - // Wait 2 cycles (to be sure) - repeat (2) - @(posedge clk); - start <= 1'b0; - repeat (25) - @(posedge clk); - Ncomp = N; - Dcomp = D; - Qcomp = Ncomp/Dcomp; - Rcomp = Ncomp%Dcomp; - $fdisplay(desc3, "%h %h %h %h || %h %h || %b %b", - N, D, Q, rem0, Qcomp, Rcomp, - (Q==Qcomp), (rem0==Rcomp)); - end // for (i=0; i<2, i=i+1) - - - end - -endmodule // tb - - - - - - diff --git a/wally-pipelined/src/muldiv/div/div64_sim/test_iter64.sv b/wally-pipelined/src/muldiv/div/div64_sim/test_iter64.sv deleted file mode 100755 index a194c1311..000000000 --- a/wally-pipelined/src/muldiv/div/div64_sim/test_iter64.sv +++ /dev/null @@ -1,72 +0,0 @@ -module tb; - - logic [63:0] N, D; - logic clk; - logic reset; - logic start; - - logic [63:0] Q; - logic [63:0] rem0; - logic div0; - logic done; - logic divdone; - - integer handle3; - integer desc3; - integer i; - - bit [63:0] Ncomp; - bit [63:0] Dcomp; - bit [63:0] Qcomp; - bit [63:0] Rcomp; - - logic [7:0] count [0:15]; - - div dut (Q, done, divdone, rem0, div0, N, D, clk, reset, start); - - initial - begin - clk = 1'b0; - forever #5 clk = ~clk; - end - - initial - begin - handle3 = $fopen("iter64.out"); - #8000000 $finish; - end - - always @(posedge clk, posedge reset) - begin - desc3 = handle3; - #0 start = 1'b0; - #0 reset = 1'b1; - #30 reset = 1'b0; - for (i=0; i<2; i=i+1) - begin - N = $random; - D = $random; - start <= 1'b1; - // Wait 2 cycles (to be sure) - repeat (2) - @(posedge clk); - start <= 1'b0; - repeat (41) - @(posedge clk); - Ncomp = N; - Dcomp = D; - Qcomp = Ncomp/Dcomp; - Rcomp = Ncomp%Dcomp; - $fdisplay(desc3, "%h %h %h %h || %h %h || %b %b", - N, D, Q, rem0, Qcomp, Rcomp, - (Q==Qcomp), (rem0==Rcomp)); - end // for (i=0; i<2, i=i+1) - end - -endmodule // tb - - - - - - diff --git a/wally-pipelined/src/muldiv/div/divide4x32.sv b/wally-pipelined/src/muldiv/div/divide4x32.sv deleted file mode 100755 index c5c311701..000000000 --- a/wally-pipelined/src/muldiv/div/divide4x32.sv +++ /dev/null @@ -1,1006 +0,0 @@ -module int32div (Q, done, divdone, rem0, div0, N, D, clk, reset, start); - - input logic [31:0] N, D; - input logic clk; - input logic reset; - input logic start; - - output logic [31:0] Q; - output logic [31:0] rem0; - output logic div0; - output logic done; - output logic divdone; - - logic enable; - logic state0; - logic V; - logic [5:0] Num; - logic [4:0] P, NumIter, RemShift; - logic [31:0] op1, op2, op1shift, Rem5; - logic [32:0] Qd, Rd, Qd2, Rd2; - logic [3:0] quotient; - logic otfzero; - - // Divider goes the distance to 19 cycles - // (thanks the evil divisor for D = 0x1) - // but could theoretically be stopped when - // divdone is asserted. The enable signal - // turns off register storage thus invalidating - // any future cycles. - - // Shift D, if needed (for integer) - // needed to allow qst to be in range for integer - // division [1,2) and allow integer divide to work. - // - // The V or valid bit can be used to determine if D - // is 0 and thus a divide by 0 exception. This div0 - // exception is given to FSM to tell the operation to - // quit gracefully. - - // div0 produced output errors have untested results - // (it is assumed the OS would handle some output) - - lz32 p1 (P, V, D); - shifter_l32 p2 (op2, D, P); - assign op1 = N; - assign div0 = ~V; - - // Brent-Kung adder chosen for the heck of it and - // since so small (maybe could have used a RCA) - - // #iter: N = m+v+s = m+(s+2) = m+2+s (mod k = 0) - // v = 2 since \rho < 1 (add 4 to make sure its a ceil) - adder #(6) cpa1 ({1'b0, P}, - {3'h0, shiftResult, ~shiftResult,1'b0}, - Num); - - // Determine whether need to add just Q/Rem - assign shiftResult = P[0]; - // div by 2 (ceil) - assign NumIter = Num[5:1]; - assign RemShift = P; - - // FSM to control integer divider - // assume inputs are postive edge and - // datapath (divider) is negative edge - fsm32 fsm1 (enablev, state0v, donev, divdonev, otfzerov, - start, div0, NumIter, ~clk, reset); - - flopr #(1) rega (~clk, reset, donev, done); - flopr #(1) regb (~clk, reset, divdonev, divdone); - flopr #(1) regc (~clk, reset, otfzerov, otfzero); - flopr #(1) regd (~clk, reset, enablev, enable); - flopr #(1) rege (~clk, reset, state0v, state0); - - // To obtain a correct remainder the last bit of the - // quotient has to be aligned with a radix-r boundary. - // Since the quotient is in the range 1/2 < q < 2 (one - // integer bit and m fractional bits), this is achieved by - // shifting N right by v+s so that (m+v+s) mod k = 0. And, - // the quotient has to be aligned to the integer position. - - // Used a Brent-Kung for no reason (just wanted prefix -- might - // have gotten away with a RCA) - - // Actual divider unit FIXME: r16 (jes) - divide4x32 p3 (Qd, Rd, quotient, op1, op2, clk, reset, state0, - enable, otfzero, shiftResult); - - // Storage registers to hold contents stable - flopenr #(33) reg3 (clk, reset, enable, Rd, Rd2); - flopenr #(33) reg4 (clk, reset, enable, Qd, Qd2); - - // Probably not needed - just assigns results - assign Q = Qd2[31:0]; - assign Rem5 = Rd2[32:1]; - - // Adjust remainder by m (no need to adjust by - // n ln(r) - shifter_r32 p4 (rem0, Rem5, RemShift); - -endmodule // int32div - -module divide4x32 (Q, rem0, quotient, op1, op2, clk, reset, state0, - enable, otfzero, shiftResult); - - input logic [31:0] op1, op2; - input logic clk, state0; - input logic reset; - input logic enable; - input logic otfzero; - input logic shiftResult; - - output logic [32:0] rem0; - output logic [32:0] Q; - output logic [3:0] quotient; - - logic [35:0] Sum, Carry; - logic [32:0] Qstar; - logic [32:0] QMstar; - logic [7:0] qtotal; - logic [35:0] SumN, CarryN, SumN2, CarryN2; - logic [35:0] divi1, divi2, divi1c, divi2c, dive1; - logic [35:0] mdivi_temp, mdivi; - logic zero; - logic [1:0] qsel; - logic [1:0] Qin, QMin; - logic CshiftQ, CshiftQM; - logic [35:0] rem1, rem2, rem3; - logic [35:0] SumR, CarryR; - logic [32:0] Qt; - - // Create one's complement values of Divisor (for q*D) - assign divi1 = {3'h0, op2, 1'b0}; - assign divi2 = {2'h0, op2, 2'b0}; - assign divi1c = ~divi1; - assign divi2c = ~divi2; - // Shift x1 if not mod k - mux2 #(36) mx1 ({3'b000, op1, 1'b0}, {4'h0, op1}, shiftResult, dive1); - - // I I I . F F F F F ... (Robertson Criteria - \rho * qmax * D) - mux2 #(36) mx2 ({CarryN2[33:0], 2'h0}, 36'h0, state0, CarryN); - mux2 #(36) mx3 ({SumN2[33:0], 2'h0}, dive1, state0, SumN); - // Simplify QST - adder #(8) cpa1 (SumN[35:28], CarryN[35:28], qtotal); - // q = {+2, +1, -1, -2} else q = 0 - qst4 pd1 (qtotal[7:1], divi1[31:29], quotient); - assign ulp = quotient[2]|quotient[3]; - assign zero = ~(quotient[3]|quotient[2]|quotient[1]|quotient[0]); - // Map to binary encoding - assign qsel[1] = quotient[3]|quotient[2]; - assign qsel[0] = quotient[3]|quotient[1]; - mux4 #(36) mx4 (divi2, divi1, divi1c, divi2c, qsel, mdivi_temp); - mux2 #(36) mx5 (mdivi_temp, 36'h0, zero, mdivi); - csa #(36) csa1 (mdivi, SumN, {CarryN[35:1], ulp}, Sum, Carry); - // regs : save CSA - flopenr #(36) reg1 (clk, reset, enable, Sum, SumN2); - flopenr #(36) reg2 (clk, reset, enable, Carry, CarryN2); - // OTF - ls_control otf1 (quotient, Qin, QMin, CshiftQ, CshiftQM); - otf #(33) otf2 (Qin, QMin, CshiftQ, CshiftQM, clk, - otfzero, enable, Qstar, QMstar); - - // Correction and generation of Remainder - adder #(36) cpa2 (SumN2[35:0], CarryN2[35:0], rem1); - // Add back +D as correction - csa #(36) csa2 (CarryN2[35:0], SumN2[35:0], divi1, SumR, CarryR); - adder #(36) cpa3 (SumR, CarryR, rem2); - // Choose remainder (Rem or Rem+D) - mux2 #(36) mx6 (rem1, rem2, rem1[35], rem3); - // Choose correct Q or QM - mux2 #(33) mx7 (Qstar, QMstar, rem1[35], Qt); - // Final results - assign rem0 = rem3[32:0]; - assign Q = Qt; - -endmodule // divide4x32 - -module ls_control (quot, Qin, QMin, CshiftQ, CshiftQM); - - input logic [3:0] quot; - - output logic [1:0] Qin; - output logic [1:0] QMin; - output logic CshiftQ; - output logic CshiftQM; - - assign Qin[1] = (quot[1]) | (quot[3]) | (quot[0]); - assign Qin[0] = (quot[1]) | (quot[2]); - assign QMin[1] = (quot[1]) | (!quot[3]&!quot[2]&!quot[1]&!quot[0]); - assign QMin[0] = (quot[3]) | (quot[0]) | - (!quot[3]&!quot[2]&!quot[1]&!quot[0]); - assign CshiftQ = (quot[1]) | (quot[0]); - assign CshiftQM = (quot[3]) | (quot[2]); - - endmodule - -module otf #(parameter WIDTH=8) - (Qin, QMin, CshiftQ, CshiftQM, clk, reset, enable, R2Q, R1Q); - - input logic [1:0] Qin, QMin; - input logic CshiftQ, CshiftQM; - input logic clk; - input logic reset; - input logic enable; - - output logic [WIDTH-1:0] R2Q; - output logic [WIDTH-1:0] R1Q; - - logic [WIDTH-1:0] Qstar, QMstar; - logic [WIDTH-1:0] M1Q, M2Q; - - // QM - mux2 #(WIDTH) m1 (QMstar, Qstar, CshiftQM, M1Q); - flopenr #(WIDTH) r1 (clk, reset, enable, {M1Q[WIDTH-3:0], QMin}, R1Q); - // Q - mux2 #(WIDTH) m2 (Qstar, QMstar, CshiftQ, M2Q); - flopenr #(WIDTH) r2 (clk, reset, enable, {M2Q[WIDTH-3:0], Qin}, R2Q); - - assign Qstar = R2Q; - assign QMstar = R1Q; - - endmodule // otf8 - - module adder #(parameter WIDTH=8) (input logic [WIDTH-1:0] a, b, - output logic [WIDTH-1:0] y); - assign y = a + b; - - endmodule // adder - - module fa (input logic a, b, c, output logic sum, carry); - - assign sum = a^b^c; - assign carry = a&b|a&c|b&c; - - endmodule // fa - -// Modular Carry-Save Adder - module csa #(parameter WIDTH=8) (input logic [WIDTH-1:0] a, b, c, - output logic [WIDTH-1:0] sum, carry); - - logic [WIDTH:0] carry_temp; - genvar i; - generate - for (i=0;i B. LT and GT are both '0' if A = B. - -module magcompare2b (LT, GT, A, B); - - input logic [1:0] A; - input logic [1:0] B; - - output logic LT; - output logic GT; - - // Determine if A < B using a minimized sum-of-products expression - assign LT = ~A[1]&B[1] | ~A[1]&~A[0]&B[0] | ~A[0]&B[1]&B[0]; - // Determine if A > B using a minimized sum-of-products expression - assign GT = A[1]&~B[1] | A[1]&A[0]&~B[0] | A[0]&~B[1]&~B[0]; - -endmodule // magcompare2b - -// J. E. Stine and M. J. Schulte, "A combined two's complement and -// floating-point comparator," 2005 IEEE International Symposium on -// Circuits and Systems, Kobe, 2005, pp. 89-92 Vol. 1. -// doi: 10.1109/ISCAS.2005.1464531 - -module magcompare8 (LT, EQ, A, B); - - input logic [7:0] A; - input logic [7:0] B; - - logic [3:0] s; - logic [3:0] t; - logic [1:0] u; - logic [1:0] v; - logic GT; - //wire LT; - - output logic EQ; - output logic LT; - - magcompare2b mag1 (s[0], t[0], A[1:0], B[1:0]); - magcompare2b mag2 (s[1], t[1], A[3:2], B[3:2]); - magcompare2b mag3 (s[2], t[2], A[5:4], B[5:4]); - magcompare2b mag4 (s[3], t[3], A[7:6], B[7:6]); - - magcompare2b mag5 (u[0], v[0], t[1:0], s[1:0]); - magcompare2b mag6 (u[1], v[1], t[3:2], s[3:2]); - - magcompare2b mag7 (LT, GT, v[1:0], u[1:0]); - - assign EQ = ~(GT | LT); - -endmodule // magcompare8 diff --git a/wally-pipelined/src/muldiv/div/divide4x64.sv b/wally-pipelined/src/muldiv/div/divide4x64.sv deleted file mode 100755 index 4b474c654..000000000 --- a/wally-pipelined/src/muldiv/div/divide4x64.sv +++ /dev/null @@ -1,1453 +0,0 @@ -module int64div (Qf, done, divdone, remf, div0, N, D, clk, reset, start); - - input logic [63:0] N, D; - input logic clk; - input logic reset; - input logic start; - - output logic [63:0] Qf; - output logic [63:0] remf; - output logic div0; - output logic done; - output logic divdone; - - logic enable; - logic state0; - logic V; - logic [7:0] Num; - logic [5:0] P, NumIter, RemShift; - logic [63:0] op1, op2, op1shift, Rem5; - logic [64:0] Qd, Rd, Qd2, Rd2; - logic [63:0] Q, rem0; - logic [3:0] quotient; - logic otfzero; - logic shiftResult; - - // Divider goes the distance to 37 cycles - // (thanks the evil divisor for D = 0x1) - // but could theoretically be stopped when - // divdone is asserted. The enable signal - // turns off register storage thus invalidating - // any future cycles. - - // Shift D, if needed (for integer) - // needed to allow qst to be in range for integer - // division [1,2) and allow integer divide to work. - // - // The V or valid bit can be used to determine if D - // is 0 and thus a divide by 0 exception. This div0 - // exception is given to FSM to tell the operation to - // quit gracefully. - - // div0 produced output errors have untested results - // (it is assumed the OS would handle some output) - - lz64 p1 (P, V, D); - shifter_l64 p2 (op2, D, P); - assign op1 = N; - assign div0 = ~V; - - // Brent-Kung adder chosen for the heck of it and - // since so small (maybe could have used a RCA) - - // #iter: N = m+v+s = m+(s+2) = m+2+s (mod k = 0) - // v = 2 since \rho < 1 (add 4 to make sure its a ceil) - adder #(8) cpa1 ({2'b0, P}, - {5'h0, shiftResult, ~shiftResult, 1'b0}, - Num); - - // Determine whether need to add just Q/Rem - assign shiftResult = P[0]; - // div by 2 (ceil) - assign NumIter = Num[6:1]; - assign RemShift = P; - - // FSM to control integer divider - // assume inputs are postive edge and - // datapath (divider) is negative edge - fsm64 fsm1 (enablev, state0v, donev, divdonev, otfzerov, - start, div0, NumIter, ~clk, reset); - - flopr #(1) rega (~clk, reset, donev, done); - flopr #(1) regb (~clk, reset, divdonev, divdone); - flopr #(1) regc (~clk, reset, otfzerov, otfzero); - flopr #(1) regd (~clk, reset, enablev, enable); - flopr #(1) rege (~clk, reset, state0v, state0); - - // To obtain a correct remainder the last bit of the - // quotient has to be aligned with a radix-r boundary. - // Since the quotient is in the range 1/2 < q < 2 (one - // integer bit and m fractional bits), this is achieved by - // shifting N right by v+s so that (m+v+s) mod k = 0. And, - // the quotient has to be aligned to the integer position. - - // Actual divider unit FIXME: r16 (jes) - divide4x64 p3 (Qd, Rd, quotient, op1, op2, clk, reset, state0, - enable, otfzero, shiftResult); - - // Storage registers to hold contents stable - flopenr #(65) reg3 (clk, reset, enable, Rd, Rd2); - flopenr #(65) reg4 (clk, reset, enable, Qd, Qd2); - - // Probably not needed - just assigns results - assign Q = Qd2[63:0]; - assign Rem5 = Rd2[64:1]; - - // Adjust remainder by m (no need to adjust by - // n lg(r) - shifter_r64 p4 (rem0, Rem5, RemShift); - - // RISC-V has exceptions for divide by 0 (see Table 6.1 of spec) - mux2 #(64) exc1 (Q, {64{1'b1}}, div0, Qf); - mux2 #(64) exc2 (rem0, op1, div0, remf); - -endmodule // int32div - -module divide4x64 (Q, rem0, quotient, op1, op2, clk, reset, state0, - enable, otfzero, shiftResult); - - input logic [63:0] op1, op2; - input logic clk, state0; - input logic reset; - input logic enable; - input logic otfzero; - input logic shiftResult; - - output logic [64:0] rem0; - output logic [64:0] Q; - output logic [3:0] quotient; - - logic [67:0] Sum, Carry; - logic [64:0] Qstar; - logic [64:0] QMstar; - logic [7:0] qtotal; - logic [67:0] SumN, CarryN, SumN2, CarryN2; - logic [67:0] divi1, divi2, divi1c, divi2c, dive1; - logic [67:0] mdivi_temp, mdivi; - logic zero; - logic [1:0] qsel; - logic [1:0] Qin, QMin; - logic CshiftQ, CshiftQM; - logic [67:0] rem1, rem2, rem3; - logic [67:0] SumR, CarryR; - logic [64:0] Qt; - - // Create one's complement values of Divisor (for q*D) - assign divi1 = {3'h0, op2, 1'b0}; - assign divi2 = {2'h0, op2, 2'b0}; - assign divi1c = ~divi1; - assign divi2c = ~divi2; - // Shift x1 if not mod k - mux2 #(68) mx1 ({3'b000, op1, 1'b0}, {4'h0, op1}, shiftResult, dive1); - - // I I I . F F F F F ... (Robertson Criteria - \rho * qmax * D) - mux2 #(68) mx2 ({CarryN2[65:0], 2'h0}, 68'h0, state0, CarryN); - mux2 #(68) mx3 ({SumN2[65:0], 2'h0}, dive1, state0, SumN); - // Simplify QST - adder #(8) cpa1 (SumN[67:60], CarryN[67:60], qtotal); - // q = {+2, +1, -1, -2} else q = 0 - qst4 pd1 (qtotal[7:1], divi1[63:61], quotient); - assign ulp = quotient[2]|quotient[3]; - assign zero = ~(quotient[3]|quotient[2]|quotient[1]|quotient[0]); - // Map to binary encoding - assign qsel[1] = quotient[3]|quotient[2]; - assign qsel[0] = quotient[3]|quotient[1]; - mux4 #(68) mx4 (divi2, divi1, divi1c, divi2c, qsel, mdivi_temp); - mux2 #(68) mx5 (mdivi_temp, 68'h0, zero, mdivi); - csa #(68) csa1 (mdivi, SumN, {CarryN[67:1], ulp}, Sum, Carry); - // regs : save CSA - flopenr #(68) reg1 (clk, reset, enable, Sum, SumN2); - flopenr #(68) reg2 (clk, reset, enable, Carry, CarryN2); - // OTF - ls_control otf1 (quotient, Qin, QMin, CshiftQ, CshiftQM); - otf #(65) otf2 (Qin, QMin, CshiftQ, CshiftQM, clk, - otfzero, enable, Qstar, QMstar); - - // Correction and generation of Remainder - adder #(68) cpa2 (SumN2[67:0], CarryN2[67:0], rem1); - // Add back +D as correction - csa #(68) csa2 (CarryN2[67:0], SumN2[67:0], divi1, SumR, CarryR); - adder #(68) cpa3 (SumR, CarryR, rem2); - // Choose remainder (Rem or Rem+D) - mux2 #(68) mx6 (rem1, rem2, rem1[67], rem3); - // Choose correct Q or QM - mux2 #(65) mx7 (Qstar, QMstar, rem1[67], Qt); - // Final results - assign rem0 = rem3[64:0]; - assign Q = Qt; - -endmodule // divide4x64 - -module ls_control (quot, Qin, QMin, CshiftQ, CshiftQM); - - input logic [3:0] quot; - - output logic [1:0] Qin; - output logic [1:0] QMin; - output logic CshiftQ; - output logic CshiftQM; - - // Load/Store Control for OTF - assign Qin[1] = (quot[1]) | (quot[3]) | (quot[0]); - assign Qin[0] = (quot[1]) | (quot[2]); - assign QMin[1] = (quot[1]) | (!quot[3]&!quot[2]&!quot[1]&!quot[0]); - assign QMin[0] = (quot[3]) | (quot[0]) | - (!quot[3]&!quot[2]&!quot[1]&!quot[0]); - assign CshiftQ = (quot[1]) | (quot[0]); - assign CshiftQM = (quot[3]) | (quot[2]); - -endmodule - -// On-the-fly Conversion per Ercegovac/Lang - -module otf #(parameter WIDTH=8) - (Qin, QMin, CshiftQ, CshiftQM, clk, reset, enable, R2Q, R1Q); - - input logic [1:0] Qin, QMin; - input logic CshiftQ, CshiftQM; - input logic clk; - input logic reset; - input logic enable; - - output logic [WIDTH-1:0] R2Q; - output logic [WIDTH-1:0] R1Q; - - logic [WIDTH-1:0] Qstar, QMstar; - logic [WIDTH-1:0] M1Q, M2Q; - - // QM - mux2 #(WIDTH) m1 (QMstar, Qstar, CshiftQM, M1Q); - flopenr #(WIDTH) r1 (clk, reset, enable, {M1Q[WIDTH-3:0], QMin}, R1Q); - // Q - mux2 #(WIDTH) m2 (Qstar, QMstar, CshiftQ, M2Q); - flopenr #(WIDTH) r2 (clk, reset, enable, {M2Q[WIDTH-3:0], Qin}, R2Q); - - assign Qstar = R2Q; - assign QMstar = R1Q; - -endmodule // otf8 - -module adder #(parameter WIDTH=8) (input logic [WIDTH-1:0] a, b, - output logic [WIDTH-1:0] y); - - assign y = a + b; - -endmodule // adder - -module fa (input logic a, b, c, output logic sum, carry); - - assign sum = a^b^c; - assign carry = a&b|a&c|b&c; - -endmodule // fa - -module csa #(parameter WIDTH=8) (input logic [WIDTH-1:0] a, b, c, - output logic [WIDTH-1:0] sum, carry); - - logic [WIDTH:0] carry_temp; - genvar i; - generate - for (i=0;i B. LT and GT are both '0' if A = B. - -module magcompare2b (LT, GT, A, B); - - input logic [1:0] A; - input logic [1:0] B; - - output logic LT; - output logic GT; - - // Determine if A < B using a minimized sum-of-products expression - assign LT = ~A[1]&B[1] | ~A[1]&~A[0]&B[0] | ~A[0]&B[1]&B[0]; - // Determine if A > B using a minimized sum-of-products expression - assign GT = A[1]&~B[1] | A[1]&A[0]&~B[0] | A[0]&~B[1]&~B[0]; - -endmodule // magcompare2b - -// J. E. Stine and M. J. Schulte, "A combined two's complement and -// floating-point comparator," 2005 IEEE International Symposium on -// Circuits and Systems, Kobe, 2005, pp. 89-92 Vol. 1. -// doi: 10.1109/ISCAS.2005.1464531 - -module magcompare8 (LT, EQ, A, B); - - input logic [7:0] A; - input logic [7:0] B; - - logic [3:0] s; - logic [3:0] t; - logic [1:0] u; - logic [1:0] v; - logic GT; - //wire LT; - - output logic EQ; - output logic LT; - - magcompare2b mag1 (s[0], t[0], A[1:0], B[1:0]); - magcompare2b mag2 (s[1], t[1], A[3:2], B[3:2]); - magcompare2b mag3 (s[2], t[2], A[5:4], B[5:4]); - magcompare2b mag4 (s[3], t[3], A[7:6], B[7:6]); - - magcompare2b mag5 (u[0], v[0], t[1:0], s[1:0]); - magcompare2b mag6 (u[1], v[1], t[3:2], s[3:2]); - - magcompare2b mag7 (LT, GT, v[1:0], u[1:0]); - - assign EQ = ~(GT | LT); - -endmodule // magcompare8 diff --git a/wally-pipelined/src/muldiv/div/imperas-riscv-tests b/wally-pipelined/src/muldiv/div/imperas-riscv-tests deleted file mode 160000 index c171bf199..000000000 --- a/wally-pipelined/src/muldiv/div/imperas-riscv-tests +++ /dev/null @@ -1 +0,0 @@ -Subproject commit c171bf1999a3cf7e8cd26511dfcf794d1498e5a1 diff --git a/wally-pipelined/src/muldiv/div/int32div.do b/wally-pipelined/src/muldiv/div/int32div.do deleted file mode 100755 index e83f307ad..000000000 --- a/wally-pipelined/src/muldiv/div/int32div.do +++ /dev/null @@ -1,114 +0,0 @@ -# Copyright 1991-2007 Mentor Graphics Corporation -# -# Modification by Oklahoma State University -# Use with Testbench -# James Stine, 2008 -# Go Cowboys!!!!!! -# -# All Rights Reserved. -# -# THIS WORK CONTAINS TRADE SECRET AND PROPRIETARY INFORMATION -# WHICH IS THE PROPERTY OF MENTOR GRAPHICS CORPORATION -# OR ITS LICENSORS AND IS SUBJECT TO LICENSE TERMS. - -# Use this run.do file to run this example. -# Either bring up ModelSim and type the following at the "ModelSim>" prompt: -# do run.do -# or, to run from a shell, type the following at the shell prompt: -# vsim -do run.do -c -# (omit the "-c" to see the GUI while running from the shell) - -onbreak {resume} - -# create library -if [file exists work] { - vdel -all -} -vlib work - -# compile source files -vlog mux_div.sv shifters_div.sv divide4x32.sv test_int32div.sv - -# start and run simulation -vsim -voptargs=+acc work.tb - -view list -view wave - --- display input and output signals as hexidecimal values -# Diplays All Signals recursively -add wave -noupdate -divider -height 32 "Control Signals" -add wave -hex -color gold /tb/clk -add wave -hex -color #0080ff /tb/reset -add wave -hex -color #0080ff /tb/start -add wave -hex -color #0080ff /tb/done -add wave -hex -color #0080ff /tb/divdone -add wave -noupdate -divider -height 32 "Key Parts" -add wave -unsigned /tb/dut/NumIter -add wave -unsigned /tb/dut/RemShift -add wave -unsigned /tb/dut/Qd2 -add wave -unsigned /tb/dut/Rd2 -add wave -unsigned /tb/dut/rem0 -add wave -unsigned /tb/dut/Q -add wave -unsigned /tb/dut/P -add wave -unsigned /tb/dut/shiftResult -add wave -noupdate -divider -height 32 "FSM" -add wave -hex /tb/dut/fsm1/CURRENT_STATE -add wave -hex /tb/dut/fsm1/NEXT_STATE -add wave -hex -color #0080ff /tb/dut/fsm1/start -add wave -hex -color #0080ff /tb/dut/fsm1/state0 -add wave -hex -color #0080ff /tb/dut/fsm1/done -add wave -hex -color #0080ff /tb/dut/fsm1/en -add wave -hex -color #0080ff /tb/dut/fsm1/divdone -add wave -hex -color #0080ff /tb/dut/fsm1/reset -add wave -hex -color #0080ff /tb/dut/fsm1/otfzero -add wave -hex -color #0080ff /tb/dut/fsm1/LT -add wave -hex -color #0080ff /tb/dut/fsm1/EQ -add wave -hex -color gold /tb/dut/fsm1/clk -add wave -noupdate -divider -height 32 "Datapath" -add wave -hex /tb/dut/N -add wave -hex /tb/dut/D -add wave -hex /tb/dut/reset -add wave -hex /tb/dut/start -add wave -hex /tb/dut/Q -add wave -hex /tb/dut/rem0 -add wave -hex /tb/dut/div0 -add wave -hex /tb/dut/done -add wave -hex /tb/dut/divdone -add wave -hex /tb/dut/enable -add wave -hex /tb/dut/state0 -add wave -hex /tb/dut/V -add wave -hex /tb/dut/Num -add wave -hex /tb/dut/P -add wave -hex /tb/dut/NumIter -add wave -hex /tb/dut/RemShift -add wave -hex /tb/dut/op1 -add wave -hex /tb/dut/op2 -add wave -hex /tb/dut/op1shift -add wave -hex /tb/dut/Rem5 -add wave -hex /tb/dut/Qd -add wave -hex /tb/dut/Rd -add wave -hex /tb/dut/Qd2 -add wave -hex /tb/dut/Rd2 -add wave -hex /tb/dut/quotient -add wave -hex /tb/dut/otfzero -add wave -noupdate -divider -height 32 "Divider" -add wave -hex -r /tb/dut/p3/* - - --- Set Wave Output Items -TreeUpdate [SetDefaultTree] -WaveRestoreZoom {0 ps} {75 ns} -configure wave -namecolwidth 150 -configure wave -valuecolwidth 100 -configure wave -justifyvalue left -configure wave -signalnamewidth 0 -configure wave -snapdistance 10 -configure wave -datasetprefix 0 -configure wave -rowmargin 4 -configure wave -childrowmargin 2 - --- Run the Simulation -run 338ns - - diff --git a/wally-pipelined/src/muldiv/div/int64div.do b/wally-pipelined/src/muldiv/div/int64div.do deleted file mode 100755 index dc83d046f..000000000 --- a/wally-pipelined/src/muldiv/div/int64div.do +++ /dev/null @@ -1,116 +0,0 @@ -# Copyright 1991-2007 Mentor Graphics Corporation -# -# Modification by Oklahoma State University -# Use with Testbench -# James Stine, 2008 -# Go Cowboys!!!!!! -# -# All Rights Reserved. -# -# THIS WORK CONTAINS TRADE SECRET AND PROPRIETARY INFORMATION -# WHICH IS THE PROPERTY OF MENTOR GRAPHICS CORPORATION -# OR ITS LICENSORS AND IS SUBJECT TO LICENSE TERMS. - -# Use this run.do file to run this example. -# Either bring up ModelSim and type the following at the "ModelSim>" prompt: -# do run.do -# or, to run from a shell, type the following at the shell prompt: -# vsim -do run.do -c -# (omit the "-c" to see the GUI while running from the shell) - -onbreak {resume} - -# create library -if [file exists work] { - vdel -all -} -vlib work - -# compile source files -vlog mux_div.sv shifters_div.sv divide4x64.sv test_int64div.sv - -# start and run simulation -vsim -voptargs=+acc work.tb - -view list -view wave - --- display input and output signals as hexidecimal values -# Diplays All Signals recursively -add wave -noupdate -divider -height 32 "Control Signals" -add wave -hex -color gold /tb/clk -add wave -hex -color #0080ff /tb/reset -add wave -hex -color #0080ff /tb/start -add wave -hex -color #0080ff /tb/done -add wave -hex -color #0080ff /tb/divdone -add wave -noupdate -divider -height 32 "Key Parts" -add wave -unsigned /tb/dut/NumIter -add wave -unsigned /tb/dut/RemShift -add wave -unsigned /tb/dut/Qd2 -add wave -unsigned /tb/dut/Rd2 -add wave -unsigned /tb/dut/rem0 -add wave -unsigned /tb/dut/Q -add wave -unsigned /tb/dut/P -add wave -unsigned /tb/dut/shiftResult -add wave -noupdate -divider -height 32 "FSM" -add wave -hex /tb/dut/fsm1/CURRENT_STATE -add wave -hex /tb/dut/fsm1/NEXT_STATE -add wave -hex -color #0080ff /tb/dut/fsm1/start -add wave -hex -color #0080ff /tb/dut/fsm1/state0 -add wave -hex -color #0080ff /tb/dut/fsm1/done -add wave -hex -color #0080ff /tb/dut/fsm1/en -add wave -hex -color #0080ff /tb/dut/fsm1/divdone -add wave -hex -color #0080ff /tb/dut/fsm1/reset -add wave -hex -color #0080ff /tb/dut/fsm1/otfzero -add wave -hex -color #0080ff /tb/dut/fsm1/LT -add wave -hex -color #0080ff /tb/dut/fsm1/EQ -add wave -hex -color gold /tb/dut/fsm1/clk -add wave -noupdate -divider -height 32 "Datapath" -add wave -hex /tb/dut/N -add wave -hex /tb/dut/D -add wave -hex /tb/dut/reset -add wave -hex /tb/dut/start -add wave -hex /tb/dut/Qf -add wave -hex /tb/dut/remf -add wave -hex /tb/dut/Q -add wave -hex /tb/dut/rem0 -add wave -hex /tb/dut/div0 -add wave -hex /tb/dut/done -add wave -hex /tb/dut/divdone -add wave -hex /tb/dut/enable -add wave -hex /tb/dut/state0 -add wave -hex /tb/dut/V -add wave -hex /tb/dut/Num -add wave -hex /tb/dut/P -add wave -hex /tb/dut/NumIter -add wave -hex /tb/dut/RemShift -add wave -hex /tb/dut/op1 -add wave -hex /tb/dut/op2 -add wave -hex /tb/dut/op1shift -add wave -hex /tb/dut/Rem5 -add wave -hex /tb/dut/Qd -add wave -hex /tb/dut/Rd -add wave -hex /tb/dut/Qd2 -add wave -hex /tb/dut/Rd2 -add wave -hex /tb/dut/quotient -add wave -hex /tb/dut/otfzero -add wave -noupdate -divider -height 32 "Divider" -add wave -hex -r /tb/dut/p3/* - - --- Set Wave Output Items -TreeUpdate [SetDefaultTree] -WaveRestoreZoom {0 ps} {75 ns} -configure wave -namecolwidth 350 -configure wave -valuecolwidth 200 -configure wave -justifyvalue left -configure wave -signalnamewidth 0 -configure wave -snapdistance 10 -configure wave -datasetprefix 0 -configure wave -rowmargin 4 -configure wave -childrowmargin 2 - --- Run the Simulation -run 538ns - - diff --git a/wally-pipelined/src/muldiv/div/iter32.do b/wally-pipelined/src/muldiv/div/iter32.do deleted file mode 100755 index 7f0f964da..000000000 --- a/wally-pipelined/src/muldiv/div/iter32.do +++ /dev/null @@ -1,50 +0,0 @@ -# Copyright 1991-2007 Mentor Graphics Corporation -# -# Modification by Oklahoma State University -# Use with Testbench -# James Stine, 2008 -# Go Cowboys!!!!!! -# -# All Rights Reserved. -# -# THIS WORK CONTAINS TRADE SECRET AND PROPRIETARY INFORMATION -# WHICH IS THE PROPERTY OF MENTOR GRAPHICS CORPORATION -# OR ITS LICENSORS AND IS SUBJECT TO LICENSE TERMS. - -# Use this run.do file to run this example. -# Either bring up ModelSim and type the following at the "ModelSim>" prompt: -# do run.do -# or, to run from a shell, type the following at the shell prompt: -# vsim -do run.do -c -# (omit the "-c" to see the GUI while running from the shell) - -onbreak {resume} - -# create library -if [file exists work] { - vdel -all -} -vlib work - -# compile source files -vlog mux_div.sv shifters_div.sv divide4x32.sv test_iter32.sv - -# start and run simulation -vsim -voptargs=+acc work.tb - - --- Set Wave Output Items -TreeUpdate [SetDefaultTree] -WaveRestoreZoom {0 ps} {75 ns} -configure wave -namecolwidth 150 -configure wave -valuecolwidth 100 -configure wave -justifyvalue left -configure wave -signalnamewidth 0 -configure wave -snapdistance 10 -configure wave -datasetprefix 0 -configure wave -rowmargin 4 -configure wave -childrowmargin 2 - --- Run the Simulation -run 9586700ns -quit diff --git a/wally-pipelined/src/muldiv/div/iter64.do b/wally-pipelined/src/muldiv/div/iter64.do deleted file mode 100755 index c538291ea..000000000 --- a/wally-pipelined/src/muldiv/div/iter64.do +++ /dev/null @@ -1,50 +0,0 @@ -# Copyright 1991-2007 Mentor Graphics Corporation -# -# Modification by Oklahoma State University -# Use with Testbench -# James Stine, 2008 -# Go Cowboys!!!!!! -# -# All Rights Reserved. -# -# THIS WORK CONTAINS TRADE SECRET AND PROPRIETARY INFORMATION -# WHICH IS THE PROPERTY OF MENTOR GRAPHICS CORPORATION -# OR ITS LICENSORS AND IS SUBJECT TO LICENSE TERMS. - -# Use this run.do file to run this example. -# Either bring up ModelSim and type the following at the "ModelSim>" prompt: -# do run.do -# or, to run from a shell, type the following at the shell prompt: -# vsim -do run.do -c -# (omit the "-c" to see the GUI while running from the shell) - -onbreak {resume} - -# create library -if [file exists work] { - vdel -all -} -vlib work - -# compile source files -vlog mux_div.sv shifters_div.sv divide4x64.sv test_iter64.sv - -# start and run simulation -vsim -voptargs=+acc work.tb - - --- Set Wave Output Items -TreeUpdate [SetDefaultTree] -WaveRestoreZoom {0 ps} {75 ns} -configure wave -namecolwidth 150 -configure wave -valuecolwidth 100 -configure wave -justifyvalue left -configure wave -signalnamewidth 0 -configure wave -snapdistance 10 -configure wave -datasetprefix 0 -configure wave -rowmargin 4 -configure wave -childrowmargin 2 - --- Run the Simulation -run 9586700ns -quit diff --git a/wally-pipelined/src/muldiv/div/mux_div.sv b/wally-pipelined/src/muldiv/div/mux_div.sv deleted file mode 100644 index d13045e6d..000000000 --- a/wally-pipelined/src/muldiv/div/mux_div.sv +++ /dev/null @@ -1,51 +0,0 @@ -module mux2 #(parameter WIDTH = 8) - (input logic [WIDTH-1:0] d0, d1, - input logic s, - output logic [WIDTH-1:0] y); - - assign y = s ? d1 : d0; - -endmodule // mux2 - -module mux3 #(parameter WIDTH = 8) - (input logic [WIDTH-1:0] d0, d1, d2, - input logic [1:0] s, - output logic [WIDTH-1:0] y); - - assign y = s[1] ? d2 : (s[0] ? d1 : d0); - -endmodule // mux3 - -module mux4 #(parameter WIDTH = 8) - (input logic [WIDTH-1:0] d0, d1, d2, d3, - input logic [1:0] s, - output logic [WIDTH-1:0] y); - - assign y = s[1] ? (s[0] ? d3 : d2) : (s[0] ? d1 : d0); - -endmodule // mux4 - -module mux21x32 (Z, A, B, Sel); - - input logic [31:0] A; - input logic [31:0] B; - input logic Sel; - - output logic [31:0] Z; - - assign Z = Sel ? B : A; - -endmodule // mux21x32 - -module mux21x64 (Z, A, B, Sel); - - input logic [63:0] A; - input logic [63:0] B; - input logic Sel; - - output logic [63:0] Z; - - assign Z = Sel ? B : A; - -endmodule // mux21x64 - diff --git a/wally-pipelined/src/muldiv/div/shift.sv b/wally-pipelined/src/muldiv/div/shift.sv deleted file mode 100644 index 412cee32f..000000000 --- a/wally-pipelined/src/muldiv/div/shift.sv +++ /dev/null @@ -1,151 +0,0 @@ -module shifter_l64 (Z, A, Shift); - - input logic [63:0] A; - input logic [5:0] Shift; - - logic [63:0] stage1; - logic [63:0] stage2; - logic [63:0] stage3; - logic [63:0] stage4; - logic [63:0] stage5; - logic [31:0] thirtytwozeros = 32'h0; - logic [15:0] sixteenzeros = 16'h0; - logic [ 7:0] eightzeros = 8'h0; - logic [ 3:0] fourzeros = 4'h0; - logic [ 1:0] twozeros = 2'b00; - logic onezero = 1'b0; - - output logic [63:0] Z; - - mux2 #(64) mx01(A, {A[31:0], thirtytwozeros}, Shift[5], stage1); - mux2 #(64) mx02(stage1, {stage1[47:0], sixteenzeros}, Shift[4], stage2); - mux2 #(64) mx03(stage2, {stage2[55:0], eightzeros}, Shift[3], stage3); - mux2 #(64) mx04(stage3, {stage3[59:0], fourzeros}, Shift[2], stage4); - mux2 #(64) mx05(stage4, {stage4[61:0], twozeros}, Shift[1], stage5); - mux2 #(64) mx06(stage5, {stage5[62:0], onezero}, Shift[0], Z); - -endmodule // shifter_l64 - -module shifter_r64 (Z, A, Shift); - - input logic [63:0] A; - input logic [5:0] Shift; - - logic [63:0] stage1; - logic [63:0] stage2; - logic [63:0] stage3; - logic [63:0] stage4; - logic [63:0] stage5; - logic [31:0] thirtytwozeros = 32'h0; - logic [15:0] sixteenzeros = 16'h0; - logic [ 7:0] eightzeros = 8'h0; - logic [ 3:0] fourzeros = 4'h0; - logic [ 1:0] twozeros = 2'b00; - logic onezero = 1'b0; - - output logic [63:0] Z; - - mux2 #(64) mx01(A, {thirtytwozeros, A[63:32]}, Shift[5], stage1); - mux2 #(64) mx02(stage1, {sixteenzeros, stage1[63:16]}, Shift[4], stage2); - mux2 #(64) mx03(stage2, {eightzeros, stage2[63:8]}, Shift[3], stage3); - mux2 #(64) mx04(stage3, {fourzeros, stage3[63:4]}, Shift[2], stage4); - mux2 #(64) mx05(stage4, {twozeros, stage4[63:2]}, Shift[1], stage5); - mux2 #(64) mx06(stage5, {onezero, stage5[63:1]}, Shift[0], Z); - -endmodule // shifter_r64 - -module shifter_l32 (Z, A, Shift); - - input logic [31:0] A; - input logic [4:0] Shift; - - logic [31:0] stage1; - logic [31:0] stage2; - logic [31:0] stage3; - logic [31:0] stage4; - logic [15:0] sixteenzeros = 16'h0; - logic [ 7:0] eightzeros = 8'h0; - logic [ 3:0] fourzeros = 4'h0; - logic [ 1:0] twozeros = 2'b00; - logic onezero = 1'b0; - - output logic [31:0] Z; - - mux2 #(32) mx01(A, {A[15:0], sixteenzeros}, Shift[4], stage1); - mux2 #(32) mx02(stage1, {stage1[23:0], eightzeros}, Shift[3], stage2); - mux2 #(32) mx03(stage2, {stage2[27:0], fourzeros}, Shift[2], stage3); - mux2 #(32) mx04(stage3, {stage3[29:0], twozeros}, Shift[1], stage4); - mux2 #(32) mx05(stage4, {stage4[30:0], onezero}, Shift[0], Z); - -endmodule // shifter_l32 - -module shifter_r32 (Z, A, Shift); - - input logic [31:0] A; - input logic [4:0] Shift; - - logic [31:0] stage1; - logic [31:0] stage2; - logic [31:0] stage3; - logic [31:0] stage4; - logic [15:0] sixteenzeros = 16'h0; - logic [ 7:0] eightzeros = 8'h0; - logic [ 3:0] fourzeros = 4'h0; - logic [ 1:0] twozeros = 2'b00; - logic onezero = 1'b0; - - output logic [31:0] Z; - - mux2 #(32) mx01(A, {sixteenzeros, A[31:16]}, Shift[4], stage1); - mux2 #(32) mx02(stage1, {eightzeros, stage1[31:8]}, Shift[3], stage2); - mux2 #(32) mx03(stage2, {fourzeros, stage2[31:4]}, Shift[2], stage3); - mux2 #(32) mx04(stage3, {twozeros, stage3[31:2]}, Shift[1], stage4); - mux2 #(32) mx05(stage4, {onezero, stage4[31:1]}, Shift[0], Z); - -endmodule // shifter_r32 - -`define XLEN 32 -module shift_right #(parameter WIDTH=8) (input logic [`XLEN-1:0] A, - input logic [$clog2(`XLEN)-1:0] Shift, - output logic [`XLEN-1:0] Z); - - logic [`XLEN-1:0] stage [$clog2(`XLEN):0]; - genvar i; - - assign stage[0] = A; - generate - for (i=0;i<$clog2(`XLEN);i=i+1) - begin : genbit - mux2 #(`XLEN) mux_inst (stage[i], - {{(`XLEN/(2**(i+1))){1'b0}}, stage[i][`XLEN-1:`XLEN/(2**(i+1))]}, - Shift[$clog2(`XLEN)-i-1], - stage[i+1]); - end - endgenerate - assign Z = stage[$clog2(`XLEN)]; - -endmodule // shift_right - -module shift_left #(parameter WIDTH=8) (input logic [`XLEN-1:0] A, - input logic [$clog2(`XLEN)-1:0] Shift, - output logic [`XLEN-1:0] Z); - - logic [`XLEN-1:0] stage [$clog2(`XLEN):0]; - genvar i; - - assign stage[0] = A; - generate - for (i=0;i<$clog2(`XLEN);i=i+1) - begin : genbit - mux2 #(`XLEN) mux_inst (stage[i], - {stage[i][`XLEN-1-`XLEN/(2**(i+1)):0], {(`XLEN/(2**(i+1))){1'b0}}}, - Shift[$clog2(`XLEN)-i-1], - stage[i+1]); - end - endgenerate - assign Z = stage[$clog2(`XLEN)]; - -endmodule // shift_right - - - diff --git a/wally-pipelined/src/muldiv/div/shift_left.do b/wally-pipelined/src/muldiv/div/shift_left.do deleted file mode 100755 index 0b0ce9850..000000000 --- a/wally-pipelined/src/muldiv/div/shift_left.do +++ /dev/null @@ -1,55 +0,0 @@ -# Copyright 1991-2016 Mentor Graphics Corporation -# -# Modification by Oklahoma State University -# Use with Testbench -# James Stine, 2008 -# Go Cowboys!!!!!! -# -# All Rights Reserved. -# -# THIS WORK CONTAINS TRADE SECRET AND PROPRIETARY INFORMATION -# WHICH IS THE PROPERTY OF MENTOR GRAPHICS CORPORATION -# OR ITS LICENSORS AND IS SUBJECT TO LICENSE TERMS. - -# Use this run.do file to run this example. -# Either bring up ModelSim and type the following at the "ModelSim>" prompt: -# do run.do -# or, to run from a shell, type the following at the shell prompt: -# vsim -do run.do -c -# (omit the "-c" to see the GUI while running from the shell) - -onbreak {resume} - -# create library -if [file exists work] { - vdel -all -} -vlib work - -# compile source files -vlog mux_div.sv shift.sv shift_left_tb.sv - -# start and run simulation -vsim -voptargs=+acc work.stimulus - -view wave - --- display input and output signals as hexidecimal values -# Diplays All Signals recursively -add wave -hex -r /stimulus/* - --- Set Wave Output Items -TreeUpdate [SetDefaultTree] -WaveRestoreZoom {0 ps} {75 ns} -configure wave -namecolwidth 150 -configure wave -valuecolwidth 100 -configure wave -justifyvalue left -configure wave -signalnamewidth 0 -configure wave -snapdistance 10 -configure wave -datasetprefix 0 -configure wave -rowmargin 4 -configure wave -childrowmargin 2 - --- Run the Simulation -run 800ns -quit diff --git a/wally-pipelined/src/muldiv/div/shift_left.out b/wally-pipelined/src/muldiv/div/shift_left.out deleted file mode 100644 index 67fedc18f..000000000 --- a/wally-pipelined/src/muldiv/div/shift_left.out +++ /dev/null @@ -1,79 +0,0 @@ -12153524 01 || 242a6a48 242a6a48 | 1 -8484d609 03 || 2426b048 2426b048 | 1 -06b97b0d 0d || 2f61a000 2f61a000 | 1 -b2c28465 12 || 11940000 11940000 | 1 -00f3e301 0d || 7c602000 7c602000 | 1 -3b23f176 1d || c0000000 c0000000 | 1 -76d457ed 0c || 457ed000 457ed000 | 1 -7cfde9f9 06 || 3f7a7e40 3f7a7e40 | 1 -e2f784c5 0a || de131400 de131400 | 1 -72aff7e5 17 || f2800000 f2800000 | 1 -8932d612 0f || 6b090000 6b090000 | 1 -793069f2 0e || 1a7c8000 1a7c8000 | 1 -f4007ae8 05 || 800f5d00 800f5d00 | 1 -2e58495c 1d || 80000000 80000000 | 1 -96ab582d 05 || d56b05a0 d56b05a0 | 1 -b1ef6263 0a || bd898c00 bd898c00 | 1 -c03b2280 00 || c03b2280 c03b2280 | 1 -557845aa 1d || 40000000 40000000 | 1 -cb203e96 13 || f4b00000 f4b00000 | 1 -86bc380d 13 || c0680000 c0680000 | 1 -359fdd6b 15 || ad600000 ad600000 | 1 -81174a02 0e || d2808000 d2808000 | 1 -0effe91d 0f || f48e8000 f48e8000 | 1 -11844923 0a || 11248c00 11248c00 | 1 -e5730aca 1c || a0000000 a0000000 | 1 -7968bdf2 0a || a2f7c800 a2f7c800 | 1 -20c4b341 18 || 41000000 41000000 | 1 -3c20f378 09 || 41e6f000 41e6f000 | 1 -75c50deb 16 || 7ac00000 7ac00000 | 1 -634bf9c6 0e || fe718000 fe718000 | 1 -de7502bc 0a || d40af000 d40af000 | 1 -85d79a0b 11 || 34160000 34160000 | 1 -42f24185 0f || 20c28000 20c28000 | 1 -9dcc603b 1a || ec000000 ec000000 | 1 -bf23327e 15 || 4fc00000 4fc00000 | 1 -78d99bf1 19 || e2000000 e2000000 | 1 -31230762 0c || 30762000 30762000 | 1 -4fa1559f 0f || aacf8000 aacf8000 | 1 -7c6da9f8 17 || fc000000 fc000000 | 1 -cfc4569f 1c || f0000000 f0000000 | 1 -adcbc05b 09 || 9780b600 9780b600 | 1 -a4ae3249 10 || 32490000 32490000 | 1 -ebfec0d7 11 || 81ae0000 81ae0000 | 1 -4b212f96 0c || 12f96000 12f96000 | 1 -e12ccec2 08 || 2ccec200 2ccec200 | 1 -bb825a77 1d || e0000000 e0000000 | 1 -090cdb12 1e || 80000000 80000000 | 1 -36e5816d 19 || da000000 da000000 | 1 -0fd28f1f 13 || 78f80000 78f80000 | 1 -42d92f85 18 || 85000000 85000000 | 1 -2dda595b 09 || b4b2b600 b4b2b600 | 1 -9ff2ae3f 0a || cab8fc00 cab8fc00 | 1 -2c156358 06 || 0558d600 0558d600 | 1 -c71a0c8e 1c || e0000000 e0000000 | 1 -7d3599fa 06 || 4d667e80 4d667e80 | 1 -39961773 03 || ccb0bb98 ccb0bb98 | 1 -9799a82f 13 || 41780000 41780000 | 1 -afd8565f 04 || fd8565f0 fd8565f0 | 1 -7bf8fdf7 0b || c7efb800 c7efb800 | 1 -f3091ae6 1a || 98000000 98000000 | 1 -14cfc129 0d || f8252000 f8252000 | 1 -ed536cda 05 || aa6d9b40 aa6d9b40 | 1 -da8ae2b5 1f || 80000000 80000000 | 1 -3cf11979 04 || cf119790 cf119790 | 1 -e8740cd0 0a || d0334000 d0334000 | 1 -55f6adab 0e || ab6ac000 ab6ac000 | 1 -6e5daddc 1a || 70000000 70000000 | 1 -fedf72fd 03 || f6fb97e8 f6fb97e8 | 1 -2b0eed56 0e || bb558000 bb558000 | 1 -b3d97667 0a || 65d99c00 65d99c00 | 1 -5b6fb9b6 18 || b6000000 b6000000 | 1 -3cd18779 18 || 79000000 79000000 | 1 -4a74bf94 13 || fca00000 fca00000 | 1 -823f2c04 19 || 08000000 08000000 | 1 -6dcb69db 0d || 6d3b6000 6d3b6000 | 1 -6cb0b7d9 0d || 16fb2000 16fb2000 | 1 -bb45e276 0a || 1789d800 1789d800 | 1 -5b172db6 15 || b6c00000 b6c00000 | 1 -a3071a46 04 || 3071a460 3071a460 | 1 diff --git a/wally-pipelined/src/muldiv/div/shift_left_tb.sv b/wally-pipelined/src/muldiv/div/shift_left_tb.sv deleted file mode 100644 index 2d5d3dad8..000000000 --- a/wally-pipelined/src/muldiv/div/shift_left_tb.sv +++ /dev/null @@ -1,71 +0,0 @@ -// -// File name : tb -// Title : test -// project : HW3 -// Library : test -// Purpose : definition of modules for testbench -// notes : -// -// Copyright Oklahoma State University -// - -// Top level stimulus module - -`timescale 1ns/1ps - -`define XLEN 32 -module stimulus; - - logic [`XLEN-1:0] A; - logic [$clog2(`XLEN)-1:0] Shift; - logic [`XLEN-1:0] Z; - logic [`XLEN-1:0] Z_corr; - - //logic [63:0] A; - //logic [5:0] Shift; - //logic [63:0] Z; - //logic [63:0] Z_corr; - //logic [63:0] Z_orig; - - - logic clk; - - integer handle3; - integer desc3; - integer i; - - // instatiate part to test - shift_left dut1 (A, Shift, Z); - assign Z_corr = (A << Shift); - - initial - begin - clk = 1'b1; - forever #5 clk = ~clk; - end - - initial - begin - handle3 = $fopen("shift_left.out"); - desc3 = handle3; - end - - initial - begin - for (i=0; i < 256; i=i+1) - begin - // Put vectors before beginning of clk - @(posedge clk) - begin - A = $random; - Shift = $random; - end - @(negedge clk) - begin - $fdisplay(desc3, "%h %h || %h %h | %b", A, Shift, Z, Z_corr, (Z == Z_corr)); - end - end // for (i=0; i < 256; i=i+1) - $finish;// - end // initial begin - -endmodule // stimulus diff --git a/wally-pipelined/src/muldiv/div/shift_right.do b/wally-pipelined/src/muldiv/div/shift_right.do deleted file mode 100755 index a41b7bfa7..000000000 --- a/wally-pipelined/src/muldiv/div/shift_right.do +++ /dev/null @@ -1,55 +0,0 @@ -# Copyright 1991-2016 Mentor Graphics Corporation -# -# Modification by Oklahoma State University -# Use with Testbench -# James Stine, 2008 -# Go Cowboys!!!!!! -# -# All Rights Reserved. -# -# THIS WORK CONTAINS TRADE SECRET AND PROPRIETARY INFORMATION -# WHICH IS THE PROPERTY OF MENTOR GRAPHICS CORPORATION -# OR ITS LICENSORS AND IS SUBJECT TO LICENSE TERMS. - -# Use this run.do file to run this example. -# Either bring up ModelSim and type the following at the "ModelSim>" prompt: -# do run.do -# or, to run from a shell, type the following at the shell prompt: -# vsim -do run.do -c -# (omit the "-c" to see the GUI while running from the shell) - -onbreak {resume} - -# create library -if [file exists work] { - vdel -all -} -vlib work - -# compile source files -vlog mux_div.sv shift.sv shift_right_tb.sv - -# start and run simulation -vsim -voptargs=+acc work.stimulus - -view wave - --- display input and output signals as hexidecimal values -# Diplays All Signals recursively -add wave -hex -r /stimulus/* - --- Set Wave Output Items -TreeUpdate [SetDefaultTree] -WaveRestoreZoom {0 ps} {75 ns} -configure wave -namecolwidth 150 -configure wave -valuecolwidth 100 -configure wave -justifyvalue left -configure wave -signalnamewidth 0 -configure wave -snapdistance 10 -configure wave -datasetprefix 0 -configure wave -rowmargin 4 -configure wave -childrowmargin 2 - --- Run the Simulation -run 800ns -quit diff --git a/wally-pipelined/src/muldiv/div/shift_right.out b/wally-pipelined/src/muldiv/div/shift_right.out deleted file mode 100644 index 42202ab57..000000000 --- a/wally-pipelined/src/muldiv/div/shift_right.out +++ /dev/null @@ -1,24 +0,0 @@ -12153524 01 || 090a9a92 090a9a92 | 1 -8484d609 03 || 10909ac1 10909ac1 | 1 -06b97b0d 0d || 000035cb 000035cb | 1 -b2c28465 12 || 00002cb0 00002cb0 | 1 -00f3e301 0d || 0000079f 0000079f | 1 -3b23f176 1d || 00000001 00000001 | 1 -76d457ed 0c || 00076d45 00076d45 | 1 -7cfde9f9 06 || 01f3f7a7 01f3f7a7 | 1 -e2f784c5 0a || 0038bde1 0038bde1 | 1 -72aff7e5 17 || 000000e5 000000e5 | 1 -8932d612 0f || 00011265 00011265 | 1 -793069f2 0e || 0001e4c1 0001e4c1 | 1 -f4007ae8 05 || 07a003d7 07a003d7 | 1 -2e58495c 1d || 00000001 00000001 | 1 -96ab582d 05 || 04b55ac1 04b55ac1 | 1 -b1ef6263 0a || 002c7bd8 002c7bd8 | 1 -c03b2280 00 || c03b2280 c03b2280 | 1 -557845aa 1d || 00000002 00000002 | 1 -cb203e96 13 || 00001964 00001964 | 1 -86bc380d 13 || 000010d7 000010d7 | 1 -359fdd6b 15 || 000001ac 000001ac | 1 -81174a02 0e || 0002045d 0002045d | 1 -0effe91d 0f || 00001dff 00001dff | 1 -11844923 0a || 00046112 00046112 | 1 diff --git a/wally-pipelined/src/muldiv/div/shift_right_tb.sv b/wally-pipelined/src/muldiv/div/shift_right_tb.sv deleted file mode 100755 index b35277484..000000000 --- a/wally-pipelined/src/muldiv/div/shift_right_tb.sv +++ /dev/null @@ -1,64 +0,0 @@ -// -// File name : tb -// Title : test -// project : HW3 -// Library : test -// Purpose : definition of modules for testbench -// notes : -// -// Copyright Oklahoma State University -// - -// Top level stimulus module - -`timescale 1ns/1ps - -`define XLEN 32 -module stimulus; - - logic [`XLEN-1:0] A; - logic [$clog2(`XLEN)-1:0] Shift; - logic [`XLEN-1:0] Z; - logic [`XLEN-1:0] Z_corr; - - logic clk; - - integer handle3; - integer desc3; - integer i; - - // instatiate part to test - shift_right dut1 (A, Shift, Z); - assign Z_corr = (A >> Shift); - - initial - begin - clk = 1'b1; - forever #5 clk = ~clk; - end - - initial - begin - handle3 = $fopen("shift_right.out"); - desc3 = handle3; - #250 $finish; - end - - initial - begin - for (i=0; i < 128; i=i+1) - begin - // Put vectors before beginning of clk - @(posedge clk) - begin - A = $random; - Shift = $random; - end - @(negedge clk) - begin - $fdisplay(desc3, "%h %h || %h %h | %b", A, Shift, Z, Z_corr, (Z == Z_corr)); - end - end // @(negedge clk) - end // for (j=0; j < 32; j=j+1) - -endmodule // stimulus diff --git a/wally-pipelined/src/muldiv/div/shifter.sv b/wally-pipelined/src/muldiv/div/shifter.sv deleted file mode 100644 index acf0b49e9..000000000 --- a/wally-pipelined/src/muldiv/div/shifter.sv +++ /dev/null @@ -1,18 +0,0 @@ -module shifter_right(input logic signed [63:0] a, - input logic [ 5:0] shamt, - output logic signed [63:0] y); - - - assign y = a >> shamt; - -endmodule // shifter_right - -module shifter_left(input logic signed [63:0] a, - input logic [ 5:0] shamt, - output logic signed [63:0] y); - - - assign y = a << shamt; - -endmodule // shifter_right - diff --git a/wally-pipelined/src/muldiv/div/shifters_div.sv b/wally-pipelined/src/muldiv/div/shifters_div.sv deleted file mode 100644 index b69100dc4..000000000 --- a/wally-pipelined/src/muldiv/div/shifters_div.sv +++ /dev/null @@ -1,106 +0,0 @@ -module shifter_l64 (Z, A, Shift); - - input logic [63:0] A; - input logic [5:0] Shift; - - logic [63:0] stage1; - logic [63:0] stage2; - logic [63:0] stage3; - logic [63:0] stage4; - logic [63:0] stage5; - logic [31:0] thirtytwozeros = 32'h0; - logic [15:0] sixteenzeros = 16'h0; - logic [ 7:0] eightzeros = 8'h0; - logic [ 3:0] fourzeros = 4'h0; - logic [ 1:0] twozeros = 2'b00; - logic onezero = 1'b0; - - output logic [63:0] Z; - - mux2 #(64) mx01(A, {A[31:0], thirtytwozeros}, Shift[5], stage1); - mux2 #(64) mx02(stage1, {stage1[47:0], sixteenzeros}, Shift[4], stage2); - mux2 #(64) mx03(stage2, {stage2[55:0], eightzeros}, Shift[3], stage3); - mux2 #(64) mx04(stage3, {stage3[59:0], fourzeros}, Shift[2], stage4); - mux2 #(64) mx05(stage4, {stage4[61:0], twozeros}, Shift[1], stage5); - mux2 #(64) mx06(stage5, {stage5[62:0], onezero}, Shift[0], Z); - -endmodule // shifter_l64 - -module shifter_r64 (Z, A, Shift); - - input logic [63:0] A; - input logic [5:0] Shift; - - logic [63:0] stage1; - logic [63:0] stage2; - logic [63:0] stage3; - logic [63:0] stage4; - logic [63:0] stage5; - logic [31:0] thirtytwozeros = 32'h0; - logic [15:0] sixteenzeros = 16'h0; - logic [ 7:0] eightzeros = 8'h0; - logic [ 3:0] fourzeros = 4'h0; - logic [ 1:0] twozeros = 2'b00; - logic onezero = 1'b0; - - output logic [63:0] Z; - - mux2 #(64) mx01(A, {thirtytwozeros, A[63:32]}, Shift[5], stage1); - mux2 #(64) mx02(stage1, {sixteenzeros, stage1[63:16]}, Shift[4], stage2); - mux2 #(64) mx03(stage2, {eightzeros, stage2[63:8]}, Shift[3], stage3); - mux2 #(64) mx04(stage3, {fourzeros, stage3[63:4]}, Shift[2], stage4); - mux2 #(64) mx05(stage4, {twozeros, stage4[63:2]}, Shift[1], stage5); - mux2 #(64) mx06(stage5, {onezero, stage5[63:1]}, Shift[0], Z); - -endmodule // shifter_r64 - -module shifter_l32 (Z, A, Shift); - - input logic [31:0] A; - input logic [4:0] Shift; - - logic [31:0] stage1; - logic [31:0] stage2; - logic [31:0] stage3; - logic [31:0] stage4; - logic [15:0] sixteenzeros = 16'h0; - logic [ 7:0] eightzeros = 8'h0; - logic [ 3:0] fourzeros = 4'h0; - logic [ 1:0] twozeros = 2'b00; - logic onezero = 1'b0; - - output logic [31:0] Z; - - mux2 #(32) mx01(A, {A[15:0], sixteenzeros}, Shift[4], stage1); - mux2 #(32) mx02(stage1, {stage1[23:0], eightzeros}, Shift[3], stage2); - mux2 #(32) mx03(stage2, {stage2[27:0], fourzeros}, Shift[2], stage3); - mux2 #(32) mx04(stage3, {stage3[29:0], twozeros}, Shift[1], stage4); - mux2 #(32) mx05(stage4, {stage4[30:0], onezero}, Shift[0], Z); - -endmodule // shifter_l32 - -module shifter_r32 (Z, A, Shift); - - input logic [31:0] A; - input logic [4:0] Shift; - - logic [31:0] stage1; - logic [31:0] stage2; - logic [31:0] stage3; - logic [31:0] stage4; - logic [15:0] sixteenzeros = 16'h0; - logic [ 7:0] eightzeros = 8'h0; - logic [ 3:0] fourzeros = 4'h0; - logic [ 1:0] twozeros = 2'b00; - logic onezero = 1'b0; - - output logic [31:0] Z; - - mux2 #(32) mx01(A, {sixteenzeros, A[31:16]}, Shift[4], stage1); - mux2 #(32) mx02(stage1, {eightzeros, stage1[31:8]}, Shift[3], stage2); - mux2 #(32) mx03(stage2, {fourzeros, stage2[31:4]}, Shift[2], stage3); - mux2 #(32) mx04(stage3, {twozeros, stage3[31:2]}, Shift[1], stage4); - mux2 #(32) mx05(stage4, {onezero, stage4[31:1]}, Shift[0], Z); - -endmodule // shifter_r32 - diff --git a/wally-pipelined/src/muldiv/div/test_int32div.sv b/wally-pipelined/src/muldiv/div/test_int32div.sv deleted file mode 100755 index 79940b7fe..000000000 --- a/wally-pipelined/src/muldiv/div/test_int32div.sv +++ /dev/null @@ -1,50 +0,0 @@ -module tb; - - logic [31:0] N, D; - logic clk; - logic reset; - logic start; - - logic [31:0] Q; - logic [31:0] rem; - logic div0; - logic done; - logic divdone; - - integer handle3; - integer desc3; - integer i; - - logic [7:0] count [0:15]; - - int32div dut (Q, done, divdone, rem, div0, N, D, clk, reset, start); - - initial - begin - clk = 1'b0; - forever #5 clk = ~clk; - end - - initial - begin - #800 $finish; - end - - - initial - begin - #0 N = 32'h0; - #0 D = 32'h0; - #0 start = 1'b0; - #0 reset = 1'b1; - #22 reset = 1'b0; - #25 N = 32'h9830_07C0; - #0 D = 32'h0000_000C; - //#25 N = 32'h06b9_7b0d; - //#0 D = 32'h46df_998d; - #0 start = 1'b1; - #50 start = 1'b0; - - end - -endmodule // tb diff --git a/wally-pipelined/src/muldiv/div/test_int64div.sv b/wally-pipelined/src/muldiv/div/test_int64div.sv deleted file mode 100644 index 8e7f4cc2b..000000000 --- a/wally-pipelined/src/muldiv/div/test_int64div.sv +++ /dev/null @@ -1,71 +0,0 @@ -module tb; - - logic [63:0] N, D; - logic clk; - logic reset; - logic start; - - logic [63:0] Q; - logic [63:0] rem; - logic div0; - logic done; - logic divdone; - - integer handle3; - integer desc3; - integer i; - - logic [7:0] count [0:15]; - - bit [63:0] Ncomp; - bit [63:0] Dcomp; - bit [63:0] Qcomp; - bit [63:0] Rcomp; - - int64div dut (Q, done, divdone, rem, div0, N, D, clk, reset, start); - assign Ncomp = N; - assign Dcomp = D; - assign Qcomp = Ncomp/Dcomp; - assign Rcomp = Ncomp%Dcomp; - - initial - begin - clk = 1'b0; - forever #5 clk = ~clk; - end - - initial - begin - #800 $finish; - end - - initial - begin - handle3 = $fopen("div64.out"); - desc3 = handle3; - end - - always - begin - desc3 = handle3; - #5 $fdisplay(desc3, "%h %h | %h %h | %h %h %b %b", - N, D, Q, rem, Qcomp, Rcomp, - (Q==Qcomp), (rem==Rcomp)); - end - - initial - begin - #0 N = 64'h0; - #0 D = 64'h0; - #0 start = 1'b0; - #0 reset = 1'b1; - #22 reset = 1'b0; - #25 N = 64'hffff_ffff_ffff_ffff; - #0 D = 64'h0000_0000_0000_0000; - #0 start = 1'b1; - #50 start = 1'b0; - - - end - -endmodule // tb diff --git a/wally-pipelined/src/muldiv/div/test_iter32.sv b/wally-pipelined/src/muldiv/div/test_iter32.sv deleted file mode 100755 index 94a42c211..000000000 --- a/wally-pipelined/src/muldiv/div/test_iter32.sv +++ /dev/null @@ -1,74 +0,0 @@ -module tb; - - logic [31:0] N, D; - logic clk; - logic reset; - logic start; - - logic [31:0] Q; - logic [31:0] rem0; - logic div0; - logic done; - logic divdone; - - integer handle3; - integer desc3; - integer i; - - bit [31:0] Ncomp; - bit [31:0] Dcomp; - bit [31:0] Qcomp; - bit [31:0] Rcomp; - - logic [7:0] count [0:15]; - - int32div dut (Q, done, divdone, rem0, div0, N, D, clk, reset, start); - - initial - begin - clk = 1'b0; - forever #5 clk = ~clk; - end - - initial - begin - handle3 = $fopen("iter32.out"); - #8000000 $finish; - end - - always @(posedge clk, posedge reset) - begin - desc3 = handle3; - #0 start = 1'b0; - #0 reset = 1'b1; - #30 reset = 1'b0; - for (i=0; i<2; i=i+1) - begin - N = $random; - D = $random; - start <= 1'b1; - // Wait 2 cycles (to be sure) - repeat (2) - @(posedge clk); - start <= 1'b0; - repeat (25) - @(posedge clk); - Ncomp = N; - Dcomp = D; - Qcomp = Ncomp/Dcomp; - Rcomp = Ncomp%Dcomp; - $fdisplay(desc3, "%h %h %h %h || %h %h || %b %b", - N, D, Q, rem0, Qcomp, Rcomp, - (Q==Qcomp), (rem0==Rcomp)); - end // for (i=0; i<2, i=i+1) - - - end - -endmodule // tb - - - - - - diff --git a/wally-pipelined/src/muldiv/div/test_iter64.sv b/wally-pipelined/src/muldiv/div/test_iter64.sv deleted file mode 100755 index 0674d8665..000000000 --- a/wally-pipelined/src/muldiv/div/test_iter64.sv +++ /dev/null @@ -1,72 +0,0 @@ -module tb; - - logic [63:0] N, D; - logic clk; - logic reset; - logic start; - - logic [63:0] Q; - logic [63:0] rem0; - logic div0; - logic done; - logic divdone; - - integer handle3; - integer desc3; - integer i; - - bit [63:0] Ncomp; - bit [63:0] Dcomp; - bit [63:0] Qcomp; - bit [63:0] Rcomp; - - logic [7:0] count [0:15]; - - int64div dut (Q, done, divdone, rem0, div0, N, D, clk, reset, start); - - initial - begin - clk = 1'b0; - forever #5 clk = ~clk; - end - - initial - begin - handle3 = $fopen("iter64.out"); - #8000000 $finish; - end - - always @(posedge clk, posedge reset) - begin - desc3 = handle3; - #0 start = 1'b0; - #0 reset = 1'b1; - #30 reset = 1'b0; - for (i=0; i<2; i=i+1) - begin - N = $random; - D = $random; - start <= 1'b1; - // Wait 2 cycles (to be sure) - repeat (2) - @(posedge clk); - start <= 1'b0; - repeat (41) - @(posedge clk); - Ncomp = N; - Dcomp = D; - Qcomp = Ncomp/Dcomp; - Rcomp = Ncomp%Dcomp; - $fdisplay(desc3, "%h %h %h %h || %h %h || %b %b", - N, D, Q, rem0, Qcomp, Rcomp, - (Q==Qcomp), (rem0==Rcomp)); - end // for (i=0; i<2, i=i+1) - end - -endmodule // tb - - - - - - diff --git a/wally-pipelined/src/muldiv/div/udiv b/wally-pipelined/src/muldiv/div/udiv deleted file mode 100755 index 8b1ac689b125bcbebc7b536ebf471dadd896c360..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16696 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 diff --git a/wally-pipelined/src/muldiv/div/udiv.c b/wally-pipelined/src/muldiv/div/udiv.c deleted file mode 100644 index c27565698..000000000 --- a/wally-pipelined/src/muldiv/div/udiv.c +++ /dev/null @@ -1,24 +0,0 @@ -#include -#include -#include - -int main() { - - uint64_t N; - uint64_t D; - uint64_t Q; - - D = 0xdf7f3844121bcc23; - N = 0x10fd3dedadea5195; - N = 0xffffffffffffffff; - D = 0x0000000000000000; - Q = N/D; - - printf("N = %" PRIx64 "\n", N); - printf("D = %" PRIx64 "\n", D); - printf("Q = %" PRIx64 "\n", Q); - printf("R = %" PRIx64 "\n", N%D); - - - -} From bf3eb7b814769b1e07f5439b2d5705ebfb32e174 Mon Sep 17 00:00:00 2001 From: David Harris Date: Sat, 23 Oct 2021 08:54:29 -0700 Subject: [PATCH 010/132] update scripts for handling src/*/* subdirectories --- wally-pipelined/regression/lint-wally | 2 +- .../regression/wally-pipelined-batch.do | 2 +- wally-pipelined/regression/wally-pipelined.do | 2 +- .../src/cache/cachereplacementpolicy.sv | 2 +- wally-pipelined/src/generic/flop.sv | 123 ------------------ 5 files changed, 4 insertions(+), 127 deletions(-) delete mode 100644 wally-pipelined/src/generic/flop.sv diff --git a/wally-pipelined/regression/lint-wally b/wally-pipelined/regression/lint-wally index 631a172b4..71edc0d51 100755 --- a/wally-pipelined/regression/lint-wally +++ b/wally-pipelined/regression/lint-wally @@ -7,7 +7,7 @@ verilator=`which verilator` basepath=$(dirname $0)/.. for config in rv64g rv32g; do echo "$config linting..." - if !($verilator --lint-only --Wall "$@" --top-module wallypipelinedsoc "-I$basepath/config/shared" "-I$basepath/config/$config" $basepath/src/*/*.sv --relative-includes); then + if !($verilator --lint-only --Wall "$@" --top-module wallypipelinedsoc "-I$basepath/config/shared" "-I$basepath/config/$config" $basepath/src/*/*.sv $basepath/src/*/*/*.sv --relative-includes); then echo "Exiting after $config lint due to errors or warnings" exit 1 fi diff --git a/wally-pipelined/regression/wally-pipelined-batch.do b/wally-pipelined/regression/wally-pipelined-batch.do index 242b33dbe..30abbd7b4 100644 --- a/wally-pipelined/regression/wally-pipelined-batch.do +++ b/wally-pipelined/regression/wally-pipelined-batch.do @@ -32,7 +32,7 @@ vlib work_${1}_${2} # default to config/rv64ic, but allow this to be overridden at the command line. For example: # do wally-pipelined-batch.do ../config/rv32ic rv32ic -vlog -lint -work work_${1}_${2} +incdir+../config/$1 +incdir+../config/shared ../testbench/testbench.sv ../testbench/common/*.sv ../src/*/*.sv -suppress 2583 +vlog -lint -work work_${1}_${2} +incdir+../config/$1 +incdir+../config/shared ../testbench/testbench.sv ../testbench/common/*.sv ../src/*/*.sv ../src/*/*/*.sv -suppress 2583 # start and run simulation # remove +acc flag for faster sim during regressions if there is no need to access internal signals diff --git a/wally-pipelined/regression/wally-pipelined.do b/wally-pipelined/regression/wally-pipelined.do index 477e3a125..50177ae2f 100644 --- a/wally-pipelined/regression/wally-pipelined.do +++ b/wally-pipelined/regression/wally-pipelined.do @@ -37,7 +37,7 @@ vlib work #} # start and run simulation # remove +acc flag for faster sim during regressions if there is no need to access internal signals -vlog -lint +incdir+../config/$1 +incdir+../config/shared ../testbench/testbench.sv ../testbench/common/*.sv ../src/*/*.sv -suppress 2583 +vlog -lint +incdir+../config/$1 +incdir+../config/shared ../testbench/testbench.sv ../testbench/common/*.sv ../src/*/*.sv ../src/*/*/*.sv -suppress 2583 vopt +acc work.testbench -G TEST=$2 -o workopt vsim workopt diff --git a/wally-pipelined/src/cache/cachereplacementpolicy.sv b/wally-pipelined/src/cache/cachereplacementpolicy.sv index fa115586a..5a9521292 100644 --- a/wally-pipelined/src/cache/cachereplacementpolicy.sv +++ b/wally-pipelined/src/cache/cachereplacementpolicy.sv @@ -46,7 +46,7 @@ module cachereplacementpolicy always_ff @(posedge clk, posedge reset) begin if (reset) begin for(int index = 0; index < NUMLINES; index++) - ReplacementBits[index] <= '0; + ReplacementBits[index] = '0; end else begin BlockReplacementBits <= ReplacementBits[RAdr]; if (LRUWriteEn) begin diff --git a/wally-pipelined/src/generic/flop.sv b/wally-pipelined/src/generic/flop.sv deleted file mode 100644 index fc0bf430f..000000000 --- a/wally-pipelined/src/generic/flop.sv +++ /dev/null @@ -1,123 +0,0 @@ -/////////////////////////////////////////// -// flop.sv -// -// Written: David_Harris@hmc.edu 9 January 2021 -// Modified: -// -// Purpose: arious flavors of flip-flops -// -// A component of the Wally configurable RISC-V project. -// -// Copyright (C) 2021 Harvey Mudd College & Oklahoma State University -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation -// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, -// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software -// is furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS -// BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT -// OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -/////////////////////////////////////////// - -`include "wally-config.vh" -/* verilator lint_off DECLFILENAME */ - -// ordinary flip-flop -module flop #(parameter WIDTH = 8) ( - input logic clk, - input logic [WIDTH-1:0] d, - output logic [WIDTH-1:0] q); - - always_ff @(posedge clk) - q <= #1 d; -endmodule - -// flop with asynchronous reset -module flopr #(parameter WIDTH = 8) ( - input logic clk, reset, - input logic [WIDTH-1:0] d, - output logic [WIDTH-1:0] q); - - always_ff @(posedge clk, posedge reset) - if (reset) q <= #1 0; - else q <= #1 d; -endmodule - -// flop with enable -module flopen #(parameter WIDTH = 8) ( - input logic clk, en, - input logic [WIDTH-1:0] d, - output logic [WIDTH-1:0] q); - - always_ff @(posedge clk) - if (en) q <= #1 d; -endmodule - -// flop with enable, asynchronous reset, synchronous clear -module flopenrc #(parameter WIDTH = 8) ( - input logic clk, reset, clear, en, - input logic [WIDTH-1:0] d, - output logic [WIDTH-1:0] q); - - always_ff @(posedge clk, posedge reset) - if (reset) q <= #1 0; - else if (en) - if (clear) q <= #1 0; - else q <= #1 d; -endmodule - -// flop with enable, asynchronous reset -module flopenr #(parameter WIDTH = 8) ( - input logic clk, reset, en, - input logic [WIDTH-1:0] d, - output logic [WIDTH-1:0] q); - - always_ff @(posedge clk, posedge reset) - if (reset) q <= #1 0; - else if (en) q <= #1 d; -endmodule - -// flop with enable, asynchronous set -module flopens #(parameter WIDTH = 8) ( - input logic clk, set, en, - input logic [WIDTH-1:0] d, - output logic [WIDTH-1:0] q); - - always_ff @(posedge clk, posedge set) - if (set) q <= #1 1; - else if (en) q <= #1 d; -endmodule - - -// flop with enable, asynchronous load -module flopenl #(parameter WIDTH = 8, parameter type TYPE=logic [WIDTH-1:0]) ( - input logic clk, load, en, - input TYPE d, - input TYPE val, - output TYPE q); - - always_ff @(posedge clk, posedge load) - if (load) q <= #1 val; - else if (en) q <= #1 d; -endmodule - -// flop with asynchronous reset, synchronous clear -module floprc #(parameter WIDTH = 8) ( - input logic clk, - input logic reset, - input logic clear, - input logic [WIDTH-1:0] d, - output logic [WIDTH-1:0] q); - - always_ff @(posedge clk, posedge reset) - if (reset) q <= #1 0; - else - if (clear) q <= #1 0; - else q <= #1 d; -endmodule - -/* verilator lint_on DECLFILENAME */ From 5235e61d9e1670b3768d8f95420215584a93d2da Mon Sep 17 00:00:00 2001 From: David Harris Date: Sat, 23 Oct 2021 09:06:21 -0700 Subject: [PATCH 011/132] Lint cleanup --- wally-pipelined/src/cache/cachereplacementpolicy.sv | 4 +++- wally-pipelined/src/fpu/fma.sv | 2 -- wally-pipelined/src/mmu/tlbcontrol.sv | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/wally-pipelined/src/cache/cachereplacementpolicy.sv b/wally-pipelined/src/cache/cachereplacementpolicy.sv index 5a9521292..8ba0c185a 100644 --- a/wally-pipelined/src/cache/cachereplacementpolicy.sv +++ b/wally-pipelined/src/cache/cachereplacementpolicy.sv @@ -43,10 +43,11 @@ module cachereplacementpolicy logic [NUMWAYS-2:0] BlockReplacementBits; logic [NUMWAYS-2:0] NewReplacement; + /* verilator lint_off BLKLOOPINIT */ always_ff @(posedge clk, posedge reset) begin if (reset) begin for(int index = 0; index < NUMLINES; index++) - ReplacementBits[index] = '0; + ReplacementBits[index] <= '0; end else begin BlockReplacementBits <= ReplacementBits[RAdr]; if (LRUWriteEn) begin @@ -54,6 +55,7 @@ module cachereplacementpolicy end end end + /* verilator lint_on BLKLOOPINIT */ genvar index; diff --git a/wally-pipelined/src/fpu/fma.sv b/wally-pipelined/src/fpu/fma.sv index 1f196a315..d5be11207 100644 --- a/wally-pipelined/src/fpu/fma.sv +++ b/wally-pipelined/src/fpu/fma.sv @@ -804,7 +804,6 @@ module fmaflags( output logic Invalid, Overflow, Underflow, // flags used to select the result output logic [4:0] FMAFlgM // FMA flags ); - logic [`NE+1:0] MaxExp; // maximum value of the exponent logic SigNaN; // is an input a signaling NaN logic UnderflowFlag, Inexact; // flags @@ -819,7 +818,6 @@ module fmaflags( // 2) Inf - Inf (unless x or y is NaN) // 3) 0 * Inf - // assign MaxExp = FmtM ? {`NE{1'b1}} : {8{1'b1}}; assign SigNaN = XSNaNM | YSNaNM | ZSNaNM; assign Invalid = SigNaN | ((XInfM || YInfM) & ZInfM & (PSgnM ^ ZSgnEffM) & ~XNaNM & ~YNaNM) | (XZeroM & YInfM) | (YZeroM & XInfM); diff --git a/wally-pipelined/src/mmu/tlbcontrol.sv b/wally-pipelined/src/mmu/tlbcontrol.sv index 109a8c435..2f8c5afa8 100644 --- a/wally-pipelined/src/mmu/tlbcontrol.sv +++ b/wally-pipelined/src/mmu/tlbcontrol.sv @@ -89,7 +89,7 @@ module tlbcontrol #(parameter ITLB = 0) ( // Check whether the access is allowed, page faulting if not. generate - if (ITLB == 1) begin + if (ITLB == 1) begin // Instruction TLB fault checking logic ImproperPrivilege; // User mode may only execute user mode pages, and supervisor mode may @@ -99,7 +99,7 @@ module tlbcontrol #(parameter ITLB = 0) ( // fault for software handling if access bit is off assign DAPageFault = ~PTE_A; assign TLBPageFault = Translate && TLBHit && (ImproperPrivilege || ~PTE_X || DAPageFault || UpperBitsUnequalPageFault); - end else begin + end else begin // Data TLB fault checking logic ImproperPrivilege, InvalidRead, InvalidWrite; // User mode may only load/store from user mode pages, and supervisor mode From 0eabd0ecc2ea98c118b482e81691294f3f39a9da Mon Sep 17 00:00:00 2001 From: David Harris Date: Sat, 23 Oct 2021 09:20:24 -0700 Subject: [PATCH 012/132] FMA and CSRC lint cleanup --- wally-pipelined/src/fpu/fma.sv | 4 +- wally-pipelined/src/privileged/csrc.sv | 266 +------------------------ 2 files changed, 4 insertions(+), 266 deletions(-) diff --git a/wally-pipelined/src/fpu/fma.sv b/wally-pipelined/src/fpu/fma.sv index d5be11207..8849a2581 100644 --- a/wally-pipelined/src/fpu/fma.sv +++ b/wally-pipelined/src/fpu/fma.sv @@ -519,7 +519,7 @@ module fma2( /////////////////////////////////////////////////////////////////////////////// fmaflags fmaflags(.XSNaNM, .YSNaNM, .ZSNaNM, .XInfM, .YInfM, .ZInfM, .XZeroM, .YZeroM, - .XNaNM, .YNaNM, .ZNaNM, .FullResultExp, .SumExp, .ZSgnEffM, .PSgnM, .Round, .Guard, .UfRound, .UfLSBNormSum, .Sticky, .UfPlus1, + .XNaNM, .YNaNM, .ZNaNM, .FullResultExp, .SumExp, .ZSgnEffM, .PSgnM, .Round, .Guard, .UfLSBNormSum, .Sticky, .UfPlus1, .FmtM, .Invalid, .Overflow, .Underflow, .FMAFlgM); @@ -799,7 +799,7 @@ module fmaflags( input logic [`NE+1:0] FullResultExp, // ResultExp with bits to determine sign and overflow input logic [`NE+1:0] SumExp, // exponent of the normalized sum input logic ZSgnEffM, PSgnM, // the product and modified Z signs - input logic Round, Guard, UfRound, UfLSBNormSum, Sticky, UfPlus1, // bits used to determine rounding + input logic Round, Guard, UfLSBNormSum, Sticky, UfPlus1, // bits used to determine rounding input logic FmtM, // precision 1 = double 0 = single output logic Invalid, Overflow, Underflow, // flags used to select the result output logic [4:0] FMAFlgM // FMA flags diff --git a/wally-pipelined/src/privileged/csrc.sv b/wally-pipelined/src/privileged/csrc.sv index 3b1e544d7..56cc21e95 100644 --- a/wally-pipelined/src/privileged/csrc.sv +++ b/wally-pipelined/src/privileged/csrc.sv @@ -92,12 +92,10 @@ module csrc #(parameter generate if (`ZICOUNTERS_SUPPORTED) begin - // logic [63:0] TIME_REGW, TIMECMP_REGW; logic [63:0] CYCLE_REGW, INSTRET_REGW; logic [63:0] HPMCOUNTER3_REGW, HPMCOUNTER4_REGW; // add more performance counters here if desired logic [63:0] CYCLEPlusM, INSTRETPlusM; logic [63:0] HPMCOUNTER3PlusM, HPMCOUNTER4PlusM; - // logic [`XLEN-1:0] NextTIMEM; logic [`XLEN-1:0] NextCYCLEM, NextINSTRETM; logic [`XLEN-1:0] NextHPMCOUNTER3M, NextHPMCOUNTER4M; logic WriteCYCLEM, WriteINSTRETM; @@ -108,27 +106,15 @@ module csrc #(parameter assign InstrValidNotFlushedM = InstrValidM & ~StallW & ~FlushW; - //logic [`COUNTERS-1:3][`XLEN-1:0] HPMCOUNTERH_REGW; - // Write enables - // assign WriteTIMEM = CSRMWriteM && (CSRAdrM == MTIME); - // assign WriteTIMECMPM = CSRMWriteM && (CSRAdrM == MTIMECMP); assign WriteCYCLEM = CSRMWriteM && (CSRAdrM == MCYCLE); assign WriteINSTRETM = CSRMWriteM && (CSRAdrM == MINSTRET); - //assign WriteHPMCOUNTER3M = CSRMWriteM && (CSRAdrM == MHPMCOUNTER3); - //assign WriteHPMCOUNTER4M = CSRMWriteM && (CSRAdrM == MHPMCOUNTER4); - + // Counter adders with inhibits for power savings assign CYCLEPlusM = CYCLE_REGW + {63'b0, ~MCOUNTINHIBIT_REGW[0]}; - //assign TIMEPlusM = TIME_REGW + 1; // can't be inhibited assign INSTRETPlusM = INSTRET_REGW + {63'b0, InstrValidNotFlushedM & ~MCOUNTINHIBIT_REGW[2]}; - //assign HPMCOUNTER3PlusM = HPMCOUNTER3_REGW + {63'b0, LoadStallD & ~MCOUNTINHIBIT_REGW[3]}; // count load stalls - //assign HPMCOUNTER4PlusM = HPMCOUNTER4_REGW + {63'b0, 1'b0 & ~MCOUNTINHIBIT_REGW[4]}; // change to count signals assign NextCYCLEM = WriteCYCLEM ? CSRWriteValM : CYCLEPlusM[`XLEN-1:0]; - //assign NextTIMEM = WriteTIMEM ? CSRWriteValM : TIMEPlusM[`XLEN-1:0]; assign NextINSTRETM = WriteINSTRETM ? CSRWriteValM : INSTRETPlusM[`XLEN-1:0]; - //assign NextHPMCOUNTER3M = WriteHPMCOUNTER3M ? CSRWriteValM : HPMCOUNTER3PlusM[`XLEN-1:0]; - //assign NextHPMCOUNTER4M = WriteHPMCOUNTER4M ? CSRWriteValM : HPMCOUNTER4PlusM[`XLEN-1:0]; // parameterized number of additional counters if (`COUNTERS > 3) begin @@ -170,7 +156,6 @@ module csrc #(parameter always @(posedge clk, posedge reset) // ModelSim doesn't like syntax of passing array element to flop if (reset) HPMCOUNTER_REGW[i][`XLEN-1:0] <= #1 0; else if (~StallW) HPMCOUNTER_REGW[i][`XLEN-1:0] <= #1 NextHPMCOUNTERM[i]; - //flopr #(`XLEN) HPMCOUNTERreg[i](clk, reset, NextHPMCOUNTERM[i], HPMCOUNTER_REGW[i]); if (`XLEN==32) begin logic [`COUNTERS-1:3] WriteHPMCOUNTERHM; @@ -181,7 +166,6 @@ module csrc #(parameter always @(posedge clk, posedge reset) // ModelSim doesn't like syntax of passing array element to flop if (reset) HPMCOUNTERH_REGW[i][`XLEN-1:0] <= #1 0; else if (~StallW) HPMCOUNTERH_REGW[i][`XLEN-1:0] <= #1 NextHPMCOUNTERHM[i]; - //flopr #(`XLEN) HPMCOUNTERHreg[i](clk, reset, NextHPMCOUNTERHM[i], HPMCOUNTER_REGW[i][63:32]); end else begin assign HPMCOUNTERPlusM[i] = HPMCOUNTER_REGW[i] + {63'b0, CounterEvent[i] & ~MCOUNTINHIBIT_REGW[i]}; end @@ -191,44 +175,23 @@ module csrc #(parameter // Write / update counters // Only the Machine mode versions of the counter CSRs are writable if (`XLEN==64) begin// 64-bit counters - // flopr #(64) TIMEreg(clk, reset, WriteTIMEM ? CSRWriteValM : TIME_REGW + 1, TIME_REGW); // may count off a different clock*** - // flopenr #(64) TIMECMPreg(clk, reset, WriteTIMECMPM, CSRWriteValM, TIMECMP_REGW); flopr #(64) CYCLEreg(clk, reset, NextCYCLEM, CYCLE_REGW); flopr #(64) INSTRETreg(clk, reset, NextINSTRETM, INSTRET_REGW); - //flopr #(64) HPMCOUNTER3reg(clk, reset, NextHPMCOUNTER3M, HPMCOUNTER3_REGW); - //flopr #(64) HPMCOUNTER4reg(clk, reset, NextHPMCOUNTER4M, HPMCOUNTER4_REGW); - end else begin // 32-bit low and high counters + end else begin // 32-bit low and high counters logic WriteTIMEHM, WriteTIMECMPHM, WriteCYCLEHM, WriteINSTRETHM; - //logic WriteHPMCOUNTER3HM, WriteHPMCOUNTER4HM; logic [`XLEN-1:0] NextCYCLEHM, NextTIMEHM, NextINSTRETHM; - //logic [`XLEN-1:0] NextHPMCOUNTER3HM, NextHPMCOUNTER4HM; // Write Enables - // assign WriteTIMEHM = CSRMWriteM && (CSRAdrM == MTIMEH); - // assign WriteTIMECMPHM = CSRMWriteM && (CSRAdrM == MTIMECMPH); assign WriteCYCLEHM = CSRMWriteM && (CSRAdrM == MCYCLEH); assign WriteINSTRETHM = CSRMWriteM && (CSRAdrM == MINSTRETH); - //assign WriteHPMCOUNTER3HM = CSRMWriteM && (CSRAdrM == MHPMCOUNTER3H); - //assign WriteHPMCOUNTER4HM = CSRMWriteM && (CSRAdrM == MHPMCOUNTER4H); assign NextCYCLEHM = WriteCYCLEM ? CSRWriteValM : CYCLEPlusM[63:32]; - // assign NextTIMEHM = WriteTIMEHM ? CSRWriteValM : TIMEPlusM[63:32]; assign NextINSTRETHM = WriteINSTRETHM ? CSRWriteValM : INSTRETPlusM[63:32]; - //assign NextHPMCOUNTER3HM = WriteHPMCOUNTER3HM ? CSRWriteValM : HPMCOUNTER3PlusM[63:32]; - //assign NextHPMCOUNTER4HM = WriteHPMCOUNTER4HM ? CSRWriteValM : HPMCOUNTER4PlusM[63:32]; // Counter CSRs - // flopr #(32) TIMEreg(clk, reset, NextTIMEM, TIME_REGW); // may count off a different clock*** - // flopenr #(32) TIMECMPreg(clk, reset, WriteTIMECMPM, CSRWriteValM, TIMECMP_REGW[31:0]); flopr #(32) CYCLEreg(clk, reset, NextCYCLEM, CYCLE_REGW[31:0]); flopr #(32) INSTRETreg(clk, reset, NextINSTRETM, INSTRET_REGW[31:0]); - //flopr #(32) HPMCOUNTER3reg(clk, reset, NextHPMCOUNTER3M, HPMCOUNTER3_REGW[31:0]); - //flopr #(32) HPMCOUNTER4reg(clk, reset, NextHPMCOUNTER4M, HPMCOUNTER4_REGW[31:0]); - // flopr #(32) TIMEHreg(clk, reset, NextTIMEHM, TIME_REGW); // may count off a different clock*** - // flopenr #(32) TIMECMPHreg(clk, reset, WriteTIMECMPHM, CSRWriteValM, TIMECMP_REGW[63:32]); flopr #(32) CYCLEHreg(clk, reset, NextCYCLEHM, CYCLE_REGW[63:32]); flopr #(32) INSTRETHreg(clk, reset, NextINSTRETHM, INSTRET_REGW[63:32]); - //flopr #(32) HPMCOUNTER3Hreg(clk, reset, NextHPMCOUNTER3HM, HPMCOUNTER3_REGW[63:32]); - //flopr #(32) HPMCOUNTER4Hreg(clk, reset, NextHPMCOUNTER4HM, HPMCOUNTER4_REGW[63:32]); end // eventually move TIME and TIMECMP to the CLINT -- Ben 06/17/21: sure let's give that a shot! @@ -253,13 +216,9 @@ module csrc #(parameter MTIMECMP: CSRCReadValM = MTIMECMP_CLINT; MCYCLE: CSRCReadValM = CYCLE_REGW; MINSTRET: CSRCReadValM = INSTRET_REGW; - //MHPMCOUNTER3: CSRCReadValM = HPMCOUNTER3_REGW; - //MHPMCOUNTER4: CSRCReadValM = HPMCOUNTER4_REGW; TIME: CSRCReadValM = MTIME_CLINT; CYCLE: CSRCReadValM = CYCLE_REGW; INSTRET: CSRCReadValM = INSTRET_REGW; - //HPMCOUNTER3: CSRCReadValM = HPMCOUNTER3_REGW; - //HPMCOUNTER4: CSRCReadValM = HPMCOUNTER4_REGW; default: begin CSRCReadValM = 0; IllegalCSRCAccessM = 1; @@ -282,24 +241,16 @@ module csrc #(parameter MTIMECMP: CSRCReadValM = MTIMECMP_CLINT[31:0]; MCYCLE: CSRCReadValM = CYCLE_REGW[31:0]; MINSTRET: CSRCReadValM = INSTRET_REGW[31:0]; - //MHPMCOUNTER3: CSRCReadValM = HPMCOUNTER3_REGW[31:0]; - //MHPMCOUNTER4: CSRCReadValM = HPMCOUNTER4_REGW[31:0]; TIME: CSRCReadValM = MTIME_CLINT[31:0]; CYCLE: CSRCReadValM = CYCLE_REGW[31:0]; INSTRET: CSRCReadValM = INSTRET_REGW[31:0]; - //HPMCOUNTER3: CSRCReadValM = HPMCOUNTER3_REGW[31:0]; - //HPMCOUNTER4: CSRCReadValM = HPMCOUNTER4_REGW[31:0]; MTIMEH: CSRCReadValM = MTIME_CLINT[63:32]; MTIMECMPH: CSRCReadValM = MTIMECMP_CLINT[63:32]; MCYCLEH: CSRCReadValM = CYCLE_REGW[63:32]; MINSTRETH: CSRCReadValM = INSTRET_REGW[63:32]; - //MHPMCOUNTER3H: CSRCReadValM = HPMCOUNTER3_REGW[63:32]; - //MHPMCOUNTER4H: CSRCReadValM = HPMCOUNTER4_REGW[63:32]; TIMEH: CSRCReadValM = MTIME_CLINT[63:32]; CYCLEH: CSRCReadValM = CYCLE_REGW[63:32]; INSTRETH: CSRCReadValM = INSTRET_REGW[63:32]; - //HPMCOUNTER3H: CSRCReadValM = HPMCOUNTER3_REGW[63:32]; - //HPMCOUNTER4H: CSRCReadValM = HPMCOUNTER4_REGW[63:32]; default: begin CSRCReadValM = 0; IllegalCSRCAccessM = 1; @@ -316,216 +267,3 @@ module csrc #(parameter endgenerate endmodule -/* Bad code from class - -/////////////////////////////////////////// -// csrc.sv -// -// Written: David_Harris@hmc.edu 9 January 2021 -// Modified:ssanghai@hmc.edu 2nd March -// Added a configurable number of counters -// dottolia@hmc.edu 20 April 2021 -// Make counters synthesizable -// -// Purpose: Counter CSRs -// See RISC-V Privileged Mode Specification 20190608 3.1.10-11 -// -// A component of the Wally configurable RISC-V project. -// -// Copyright (C) 2021 Harvey Mudd College & Oklahoma State University -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation -// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, -// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software -// is furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS -// BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT -// OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -/////////////////////////////////////////// - -`include "wally-config.vh" - -module csrc #(parameter - // counters - MHPMCOUNTERBASE = 12'hB00, - MHPMCOUNTERHBASE = 12'hB80, - MPHMEVENTBASE = 12'h320, - HPMCOUNTERBASE = 12'hC00, - HPMCOUNTERHBASE = 12'hC80, - )(input logic clk, reset, - input logic StallD, StallE, StallM, StallW, - input logic InstrValidM, LoadStallD, CSRMWriteM, - input logic BPPredDirWrongM, - input logic BTBPredPCWrongM, - input logic RASPredPCWrongM, - input logic BPPredClassNonCFIWrongM, - input logic [4:0] InstrClassM, - input logic [11:0] CSRAdrM, - input logic [1:0] PrivilegeModeW, - input logic [`XLEN-1:0] CSRWriteValM, - input logic [31:0] MCOUNTINHIBIT_REGW, MCOUNTEREN_REGW, SCOUNTEREN_REGW, - output logic [`XLEN-1:0] CSRCReadValM, - output logic IllegalCSRCAccessM); - - // counters - - - // create Counter arrays to store address of each counter - integer MHPMCOUNTER [`COUNTERS:0]; - integer MHPMCOUNTERH [`COUNTERS:0]; - integer HPMCOUNTER [`COUNTERS:0]; - integer HPMCOUNTERH [`COUNTERS:0]; - integer MHPEVENT [`COUNTERS:0]; - - genvar i; - // *** this is totally incorrect. Fix parameterized counters dh 6/9/21 - generate - for (i = 0; i <= `COUNTERS; i = i + 1) begin - if (i != 1) begin - always @(posedge reset) begin - MHPMCOUNTER[i] = 12'hB00 + i; // not sure this addition is legit - MHPMCOUNTERH[i] = 12'hB80 + i; - HPMCOUNTER[i] = 12'hC00 + i; - HPMCOUNTERH[i] = 12'hC80 + i; - MHPEVENT[i] = 12'h320 + i; // MHPEVENT[0] = MCOUNTERINHIBIT - end - end - end //end for loop - endgenerate - - logic [`COUNTERS:0] MCOUNTEN; - assign MCOUNTEN[0] = 1'b1; - assign MCOUNTEN[1] = 1'b0; - assign MCOUNTEN[2] = InstrValidM & ~StallW; - assign MCOUNTEN[3] = LoadStallD & ~StallD; - assign MCOUNTEN[4] = BPPredDirWrongM & ~StallM; - assign MCOUNTEN[5] = InstrClassM[0] & ~StallM; - assign MCOUNTEN[6] = BTBPredPCWrongM & ~StallM; - assign MCOUNTEN[7] = (InstrClassM[4] | InstrClassM[2] | InstrClassM[1]) & ~StallM; - assign MCOUNTEN[8] = RASPredPCWrongM & ~StallM; - assign MCOUNTEN[9] = InstrClassM[3] & ~StallM; - assign MCOUNTEN[10] = BPPredClassNonCFIWrongM & ~StallM; - assign MCOUNTEN[`COUNTERS:11] = 0; - - genvar j; - generate - if (`ZICOUNTERS_SUPPORTED) begin - logic [`COUNTERS:0][63:0] HPMCOUNTER_REGW; - logic [`COUNTERS:0][63:0] HPMCOUNTERPlusM; - logic [`COUNTERS:0][`XLEN-1:0] NextHPMCOUNTERM; - logic [`COUNTERS:0] WriteHPMCOUNTERM; - logic [4:0] CounterNumM; - - assign CounterNumM = CSRAdrM[4:0]; // which counter to read? *** - - for (j=0; j<= `COUNTERS; j = j+1) begin - // Write enables - if (j != 1) begin - assign WriteHPMCOUNTERM[j] = CSRMWriteM && (CSRAdrM == MHPMCOUNTER[j]); - // Count Signals - assign HPMCOUNTERPlusM[j] = HPMCOUNTER_REGW[j] + {63'b0, MCOUNTEN[j] & ~MCOUNTINHIBIT_REGW[j]}; - - assign NextHPMCOUNTERM[j] = WriteHPMCOUNTERM[j] ? CSRWriteValM : HPMCOUNTERPlusM[j][`XLEN-1:0]; - end - - // Write / update counters - // Only the Machine mode versions of the counter CSRs are writable - if (`XLEN==64) begin // 64-bit counters - flopenr #(64) HPMCOUNTERreg_j(clk, reset, ~StallW, NextHPMCOUNTERM[j], HPMCOUNTER_REGW[j]); - end - else begin // 32-bit low and high counters - logic [`COUNTERS:0] WriteHPMCOUNTERHM; - logic [`COUNTERS:0] [`XLEN-1:0] NextHPMCOUNTERHM; - - // Write Enables - assign WriteHPMCOUNTERHM[j] = CSRMWriteM && (CSRAdrM == MHPMCOUNTERH[j]); - assign NextHPMCOUNTERHM[j] = WriteHPMCOUNTERHM[j] ? CSRWriteValM : HPMCOUNTERPlusM[j][63:32]; - - // Counter CSRs - flopenr #(32) HPMCOUNTERreg_j(clk, reset, ~StallW, NextHPMCOUNTERM[j], HPMCOUNTER_REGW[j][31:0]); - flopenr #(32) HPMCOUNTERHreg_j(clk, reset, ~StallW, NextHPMCOUNTERHM[j], HPMCOUNTER_REGW[j][63:32]); - end - end // end for - - // eventually move TIME and TIMECMP to the CLINT - // run TIME off asynchronous reference clock - // synchronize write enable to TIME - // four phase handshake to synchronize reads from TIME - - // interrupt on timer compare - // ability to disable optional CSRs - - // Read Counters, or cause excepiton if insufficient privilege in light of COUNTEREN flags - if (`XLEN==64) begin // 64-bit counter reads - always_comb - if (PrivilegeModeW == `M_MODE || - MCOUNTEREN_REGW[CounterNumM] && (PrivilegeModeW == `S_MODE || SCOUNTEREN_REGW[CounterNumM])) begin - - if (CSRAdrM[11:5] == MHPMCOUNTER[0][11:5] || CSRAdrM[11:5] == HPMCOUNTER[0][11:5]) begin - CSRCReadValM = HPMCOUNTER_REGW[CSRAdrM[4:0]]; - IllegalCSRCAccessM = 0; - end - // //case (CSRAdrM) - // MHPMCOUNTER[j]: CSRCReadValM = HPMCOUNTER_REGW[j]; - // HPMCOUNTER[j]: CSRCReadValM = HPMCOUNTER_REGW[j]; - // default: begin - // CSRCReadValM = 0; - // IllegalCSRCAccessM = 1; - // end - // endcase - // end - else begin - IllegalCSRCAccessM = 1; // no privileges for this csr - CSRCReadValM = 0; - end - end - else begin - IllegalCSRCAccessM = 1; // no privileges for this csr - CSRCReadValM = 0; - end - end - else begin // 32-bit counter reads - always_comb - if (PrivilegeModeW == `M_MODE || - MCOUNTEREN_REGW[CounterNumM] && (PrivilegeModeW == `S_MODE || SCOUNTEREN_REGW[CounterNumM])) begin - - if (CSRAdrM[11:5] == MHPMCOUNTER[0][11:5] || CSRAdrM[11:5] == HPMCOUNTER[0][11:5] || - CSRAdrM[11:5] == MHPMCOUNTERH[0][11:5] || CSRAdrM[11:5] == HPMCOUNTERH[0][11:5]) begin - CSRCReadValM = HPMCOUNTER_REGW[CSRAdrM[4:0]]; - IllegalCSRCAccessM = 0; - end - - else begin - IllegalCSRCAccessM = 1; // no privileges for this csr - CSRCReadValM = 0; - end - - // IllegalCSRCAccessM = 0; - // case (CSRAdrM) - // MHPMCOUNTER[j]: CSRCReadValM = HPMCOUNTER_REGW[j][31:0]; - // HPMCOUNTER[j]: CSRCReadValM = HPMCOUNTER_REGW[j][31:0]; - // MHPMCOUNTERH[j]: CSRCReadValM = HPMCOUNTER_REGW[j][63:32]; - // HPMCOUNTERH[j]: CSRCReadValM = HPMCOUNTER_REGW[j][63:32]; - // default: begin - // CSRCReadValM = 0; - // IllegalCSRCAccessM = 1; - // end - // endcase - end - else begin - IllegalCSRCAccessM = 1; // no privileges for this csr - CSRCReadValM = 0; - end - end // 32-bit counter end - end // end for big if - else begin - assign CSRCReadValM = 0; - assign IllegalCSRCAccessM = 1; - end // end for else - endgenerate -endmodule -*/ From 80d2b9bc0dc78ec0f5270ac31910be841b9eb811 Mon Sep 17 00:00:00 2001 From: David Harris Date: Sat, 23 Oct 2021 09:29:15 -0700 Subject: [PATCH 013/132] subword read and csrc lint cleanup --- wally-pipelined/src/lsu/subwordread.sv | 84 +------------------------- wally-pipelined/src/privileged/csrc.sv | 8 +-- 2 files changed, 3 insertions(+), 89 deletions(-) diff --git a/wally-pipelined/src/lsu/subwordread.sv b/wally-pipelined/src/lsu/subwordread.sv index 50a205bfb..1e9757259 100644 --- a/wally-pipelined/src/lsu/subwordread.sv +++ b/wally-pipelined/src/lsu/subwordread.sv @@ -32,9 +32,6 @@ module subwordread ( output logic [`XLEN-1:0] ReadDataM ); - logic [7:0] ByteM; - logic [15:0] HalfwordM; - logic [`XLEN-1:0] offset0, offset1, offset2, offset3; // Funct3M[2] is the unsigned bit. mask upper bits. @@ -42,8 +39,6 @@ module subwordread ( generate if (`XLEN == 64) begin - // more complex solution, but faster - // 5 mux + 1 AND gate in series. logic [`XLEN-1:0] offset4, offset5, offset6, offset7; always_comb @@ -95,56 +90,8 @@ module subwordread ( 7: ReadDataM = offset7; endcase - // easier to understand but slower - // 8 muxes in series -/* -----\/----- EXCLUDED -----\/----- - // ByteMe mux - always_comb - case(MemPAdrM[2:0]) - 3'b000: ByteM = ReadDataWordMuxM[7:0]; - 3'b001: ByteM = ReadDataWordMuxM[15:8]; - 3'b010: ByteM = ReadDataWordMuxM[23:16]; - 3'b011: ByteM = ReadDataWordMuxM[31:24]; - 3'b100: ByteM = ReadDataWordMuxM[39:32]; - 3'b101: ByteM = ReadDataWordMuxM[47:40]; - 3'b110: ByteM = ReadDataWordMuxM[55:48]; - 3'b111: ByteM = ReadDataWordMuxM[63:56]; - endcase - - // halfword mux - always_comb - case(MemPAdrM[2:1]) - 2'b00: HalfwordM = ReadDataWordMuxM[15:0]; - 2'b01: HalfwordM = ReadDataWordMuxM[31:16]; - 2'b10: HalfwordM = ReadDataWordMuxM[47:32]; - 2'b11: HalfwordM = ReadDataWordMuxM[63:48]; - endcase - - logic [31:0] WordM; - - always_comb - case(MemPAdrM[2]) - 1'b0: WordM = ReadDataWordMuxM[31:0]; - 1'b1: WordM = ReadDataWordMuxM[63:32]; - endcase - - // sign extension - always_comb - case({Funct3M[2], Funct3M[1:0]}) // Funct3M[2] indicates unsigned load - 3'b000: ReadDataM = {{56{ByteM[7]}}, ByteM}; // lb - 3'b001: ReadDataM = {{48{HalfwordM[15]}}, HalfwordM[15:0]}; // lh - 3'b010: ReadDataM = {{32{WordM[31]}}, WordM[31:0]}; // lw - 3'b011: ReadDataM = ReadDataWordMuxM; // ld - 3'b100: ReadDataM = {56'b0, ByteM[7:0]}; // lbu - 3'b101: ReadDataM = {48'b0, HalfwordM[15:0]}; // lhu - 3'b110: ReadDataM = {32'b0, WordM[31:0]}; // lwu - default: ReadDataM = ReadDataWordMuxM; // Shouldn't happen - endcase - -----/\----- EXCLUDED -----/\----- */ end else begin // 32-bit - // byte mux - - // fast but more complex + // byte mux always_comb case(Funct3M[1:0]) 3: offset0 = ReadDataWordMuxM; //ld illegal @@ -171,35 +118,6 @@ module subwordread ( 2: ReadDataM = offset2; 3: ReadDataM = offset3; endcase - - // slow but easier to understand -/* -----\/----- EXCLUDED -----\/----- - always_comb - case(MemPAdrM[1:0]) - 2'b00: ByteM = ReadDataWordMuxM[7:0]; - 2'b01: ByteM = ReadDataWordMuxM[15:8]; - 2'b10: ByteM = ReadDataWordMuxM[23:16]; - 2'b11: ByteM = ReadDataWordMuxM[31:24]; - endcase - - // halfword mux - always_comb - case(MemPAdrM[1]) - 1'b0: HalfwordM = ReadDataWordMuxM[15:0]; - 1'b1: HalfwordM = ReadDataWordMuxM[31:16]; - endcase - - // sign extension - always_comb - case({Funct3M[2], Funct3M[1:0]}) - 3'b000: ReadDataM = {{24{ByteM[7]}}, ByteM}; // lb - 3'b001: ReadDataM = {{16{HalfwordM[15]}}, HalfwordM[15:0]}; // lh - 3'b010: ReadDataM = ReadDataWordMuxM; // lw - 3'b100: ReadDataM = {24'b0, ByteM[7:0]}; // lbu - 3'b101: ReadDataM = {16'b0, HalfwordM[15:0]}; // lhu - default: ReadDataM = ReadDataWordMuxM; - endcase - -----/\----- EXCLUDED -----/\----- */ end endgenerate endmodule diff --git a/wally-pipelined/src/privileged/csrc.sv b/wally-pipelined/src/privileged/csrc.sv index 56cc21e95..35dc6f659 100644 --- a/wally-pipelined/src/privileged/csrc.sv +++ b/wally-pipelined/src/privileged/csrc.sv @@ -93,13 +93,9 @@ module csrc #(parameter generate if (`ZICOUNTERS_SUPPORTED) begin logic [63:0] CYCLE_REGW, INSTRET_REGW; - logic [63:0] HPMCOUNTER3_REGW, HPMCOUNTER4_REGW; // add more performance counters here if desired - logic [63:0] CYCLEPlusM, INSTRETPlusM; - logic [63:0] HPMCOUNTER3PlusM, HPMCOUNTER4PlusM; - logic [`XLEN-1:0] NextCYCLEM, NextINSTRETM; - logic [`XLEN-1:0] NextHPMCOUNTER3M, NextHPMCOUNTER4M; + logic [63:0] CYCLEPlusM, INSTRETPlusM; + logic [`XLEN-1:0] NextCYCLEM, NextINSTRETM; logic WriteCYCLEM, WriteINSTRETM; - logic WriteHPMCOUNTER3M, WriteHPMCOUNTER4M; logic [4:0] CounterNumM; logic [`COUNTERS-1:3][`XLEN-1:0] HPMCOUNTER_REGW, HPMCOUNTERH_REGW; logic InstrValidNotFlushedM; From 6ae9aa7d8008d741483f90b53b3a144e1d2e33a9 Mon Sep 17 00:00:00 2001 From: David Harris Date: Sat, 23 Oct 2021 09:41:24 -0700 Subject: [PATCH 014/132] lint cleanup: FPU and privileged --- wally-pipelined/src/fpu/fcmp.sv | 1 - wally-pipelined/src/fpu/fma.sv | 1 - wally-pipelined/src/privileged/csr.sv | 8 ++------ wally-pipelined/src/privileged/trap.sv | 5 ++--- 4 files changed, 4 insertions(+), 11 deletions(-) diff --git a/wally-pipelined/src/fpu/fcmp.sv b/wally-pipelined/src/fpu/fcmp.sv index 93c6b97a5..b47e6eab9 100755 --- a/wally-pipelined/src/fpu/fcmp.sv +++ b/wally-pipelined/src/fpu/fcmp.sv @@ -271,7 +271,6 @@ module exception_cmp_2 ( logic GT; logic LT; logic EQ; - logic [62:0] sixtythreezeros = 63'h0; assign dp = !FOpCtrlE[1]&!FOpCtrlE[0]; assign sp = !FOpCtrlE[1]&FOpCtrlE[0]; diff --git a/wally-pipelined/src/fpu/fma.sv b/wally-pipelined/src/fpu/fma.sv index 8849a2581..c4a115a0e 100644 --- a/wally-pipelined/src/fpu/fma.sv +++ b/wally-pipelined/src/fpu/fma.sv @@ -468,7 +468,6 @@ module fma2( logic Plus1, Minus1, CalcPlus1; // do you add or subtract one for rounding logic UfPlus1; // do you add one (for determining underflow flag) logic Invalid,Underflow,Overflow; // flags - logic ZeroSgn; // the result's sign if the sum is zero logic ResultSgnTmp; // the result's sign assuming the result is not zero logic Guard, Round; // bits needed to determine rounding logic UfRound, UfLSBNormSum; // bits needed to determine rounding for underflow flag diff --git a/wally-pipelined/src/privileged/csr.sv b/wally-pipelined/src/privileged/csr.sv index b995a3bbf..10572a0a1 100644 --- a/wally-pipelined/src/privileged/csr.sv +++ b/wally-pipelined/src/privileged/csr.sv @@ -35,9 +35,8 @@ module csr #(parameter input logic clk, reset, input logic FlushD, FlushE, FlushM, FlushW, input logic StallD, StallE, StallM, StallW, - input logic [31:0] InstrD,InstrE,InstrM, - input logic [`XLEN-1:0] PCF, PCD, PCE, PCM, SrcAM, - input logic InterruptM, + input logic [31:0] InstrM, + input logic [`XLEN-1:0] PCM, SrcAM, input logic CSRReadM, CSRWriteM, TrapM, MTrapM, STrapM, UTrapM, mretM, sretM, uretM, input logic TimerIntM, ExtIntM, SwIntM, input logic [63:0] MTIME_CLINT, MTIMECMP_CLINT, @@ -51,9 +50,6 @@ module csr #(parameter input logic DCacheAccess, input logic [1:0] NextPrivilegeModeM, PrivilegeModeW, input logic [`XLEN-1:0] CauseM, NextFaultMtvalM, - input logic BreakpointFaultM, EcallFaultM, - input logic InstrMisalignedFaultM, InstrAccessFaultM, IllegalInstrFaultM, - input logic LoadMisalignedFaultM, StoreMisalignedFaultM, LoadAccessFaultM, StoreAccessFaultM, output logic [1:0] STATUS_MPP, output logic STATUS_SPP, STATUS_TSR, output logic [`XLEN-1:0] MEPC_REGW, SEPC_REGW, UEPC_REGW, UTVEC_REGW, STVEC_REGW, MTVEC_REGW, diff --git a/wally-pipelined/src/privileged/trap.sv b/wally-pipelined/src/privileged/trap.sv index 5814f9152..39be90659 100644 --- a/wally-pipelined/src/privileged/trap.sv +++ b/wally-pipelined/src/privileged/trap.sv @@ -4,7 +4,7 @@ // Written: David_Harris@hmc.edu 9 January 2021 // Modified: dottolia@hmc.edu 14 April 2021: Add support for vectored interrupts // -// Purpose: Handle Traps: Exceptions and Interrupt +// Purpose: Handle Traps: Exceptions and Interrupts // See RISC-V Privileged Mode Specification 20190608 3.1.10-11 // // A component of the Wally configurable RISC-V project. @@ -27,7 +27,7 @@ `include "wally-config.vh" module trap ( - input logic clk, reset, + input logic reset, input logic InstrMisalignedFaultM, InstrAccessFaultM, IllegalInstrFaultM, input logic BreakpointFaultM, LoadMisalignedFaultM, StoreMisalignedFaultM, input logic LoadAccessFaultM, StoreAccessFaultM, EcallFaultM, InstrPageFaultM, @@ -40,7 +40,6 @@ module trap ( input logic [`XLEN-1:0] PCM, input logic [`XLEN-1:0] InstrMisalignedAdrM, MemAdrM, input logic [31:0] InstrM, - input logic StallW, input logic InstrValidM, CommittedM, output logic TrapM, MTrapM, STrapM, UTrapM, RetM, output logic InterruptM, From 2abec362218e50589617ce24b6a8f564d52f38f7 Mon Sep 17 00:00:00 2001 From: David Harris Date: Sat, 23 Oct 2021 09:58:52 -0700 Subject: [PATCH 015/132] Lint cleanup --- wally-pipelined/src/fpu/divconv_pipe.sv | 2 -- wally-pipelined/src/ieu/datapath.sv | 11 +---------- wally-pipelined/src/ieu/forward.sv | 2 -- wally-pipelined/src/muldiv/intdivrestoring.sv | 4 ++-- wally-pipelined/src/muldiv/mul.sv | 4 +--- wally-pipelined/src/muldiv/muldiv.sv | 2 +- wally-pipelined/src/uncore/dtim.sv | 4 +--- wally-pipelined/src/uncore/gpio.sv | 5 ++--- 8 files changed, 8 insertions(+), 26 deletions(-) diff --git a/wally-pipelined/src/fpu/divconv_pipe.sv b/wally-pipelined/src/fpu/divconv_pipe.sv index 3388acc3f..240000c28 100755 --- a/wally-pipelined/src/fpu/divconv_pipe.sv +++ b/wally-pipelined/src/fpu/divconv_pipe.sv @@ -66,8 +66,6 @@ module divconv_pipe (q1, qm1, qp1, q0, qm0, qp0, rega_out, regb_out, regc_out, r logic [59:0] d2, n2; logic [11:0] d3; - logic cout1, cout2, cout3, cout4, cout5, cout6, cout7; - // Check if exponent is odd for sqrt // If exp_odd=1 and sqrt, then M/2 and use ia_addr=0 as IA assign d2 = (exp_odd&op_type) ? {vss, d, 6'h0} : {d, 7'h0}; diff --git a/wally-pipelined/src/ieu/datapath.sv b/wally-pipelined/src/ieu/datapath.sv index 1e8c7cbf1..2ebd65d82 100644 --- a/wally-pipelined/src/ieu/datapath.sv +++ b/wally-pipelined/src/ieu/datapath.sv @@ -38,7 +38,6 @@ module datapath ( input logic TargetSrcE, input logic JumpE, input logic IllegalFPUInstrE, - input logic [1:0] MemRWE, input logic [`XLEN-1:0] FWriteDataE, input logic [`XLEN-1:0] PCE, input logic [`XLEN-1:0] PCLinkE, @@ -84,7 +83,6 @@ module datapath ( logic [`XLEN-1:0] ResultM; // Writeback stage signals logic [`XLEN-1:0] SCResultW; - logic [`XLEN-1:0] ALUResultW; logic [`XLEN-1:0] WriteDataW; logic [`XLEN-1:0] ResultW; @@ -143,12 +141,5 @@ module datapath ( .d(ReadDataM), .q(ReadDataW)); - mux5 #(`XLEN) resultmuxW(ResultW, ReadDataW, CSRReadValW, MulDivResultW, SCResultW, ResultSrcW, WriteDataW); -/* -----\/----- EXCLUDED -----\/----- - // This mux4:1 no longer needs to include PCLinkW. This is set correctly in the execution stage. - // *** need to look at how the decoder is coded to fix. - mux4 #(`XLEN) resultmux(ALUResultW, ReadDataW, PCLinkW, CSRReadValW, ResultSrcW, WriteDataW); ->>>>>>> bp - -----/\----- EXCLUDED -----/\----- */ - + mux5 #(`XLEN) resultmuxW(ResultW, ReadDataW, CSRReadValW, MulDivResultW, SCResultW, ResultSrcW, WriteDataW); endmodule diff --git a/wally-pipelined/src/ieu/forward.sv b/wally-pipelined/src/ieu/forward.sv index 3e25ca7cc..cab6c3ed2 100644 --- a/wally-pipelined/src/ieu/forward.sv +++ b/wally-pipelined/src/ieu/forward.sv @@ -30,10 +30,8 @@ module forward( input logic [4:0] Rs1D, Rs2D, Rs1E, Rs2E, RdE, RdM, RdW, input logic MemReadE, MulDivE, CSRReadE, input logic RegWriteM, RegWriteW, - input logic DivBusyE, input logic FWriteIntE, FWriteIntM, FWriteIntW, input logic SCE, - input logic StallD, // Forwarding controls output logic [1:0] ForwardAE, ForwardBE, output logic FPUStallD, LoadStallD, MulDivStallD, CSRRdStallD diff --git a/wally-pipelined/src/muldiv/intdivrestoring.sv b/wally-pipelined/src/muldiv/intdivrestoring.sv index dd92c9692..806015f1f 100644 --- a/wally-pipelined/src/muldiv/intdivrestoring.sv +++ b/wally-pipelined/src/muldiv/intdivrestoring.sv @@ -30,7 +30,7 @@ module intdivrestoring ( input logic clk, input logic reset, - input logic StallM, FlushM, + input logic StallM, input logic DivSignedE, W64E, input logic DivE, input logic [`XLEN-1:0] SrcAE, SrcBE, @@ -47,7 +47,7 @@ module intdivrestoring ( localparam STEPBITS = $clog2(`XLEN/`DIV_BITSPERCYCLE); logic [STEPBITS:0] step; logic Div0E, Div0M; - logic DivStartE, SignXE, SignXM, SignDE, NegQE, NegWM, NegQM; + logic DivStartE, SignXE, SignDE, NegQE, NegWM, NegQM; logic [`XLEN-1:0] WNextE, XQNextE; ////////////////////////////// diff --git a/wally-pipelined/src/muldiv/mul.sv b/wally-pipelined/src/muldiv/mul.sv index 5ab8b73ad..dee645d39 100644 --- a/wally-pipelined/src/muldiv/mul.sv +++ b/wally-pipelined/src/muldiv/mul.sv @@ -50,10 +50,9 @@ module mul ( logic [`XLEN*2-1:0] PP0E, PP1E, PP2E, PP3E, PP4E; logic [`XLEN*2-1:0] PP0M, PP1M, PP2M, PP3M, PP4M; - logic [`XLEN*2-1:0] Pprime; logic [`XLEN-2:0] PA, PB; logic PP; - logic MULH, MULHSU, MULHU; + logic MULH, MULHSU; logic [`XLEN-1:0] Aprime, Bprime; ////////////////////////////// @@ -70,7 +69,6 @@ module mul ( // flavor of multiplication assign MULH = (Funct3E == 3'b001); assign MULHSU = (Funct3E == 3'b010); - // assign MULHU = (Funct3E == 2'b11); // signal unused // Handle signs assign PP2E = {2'b00, (MULH | MULHSU) ? ~PA : PA, {(`XLEN-1){1'b0}}}; diff --git a/wally-pipelined/src/muldiv/muldiv.sv b/wally-pipelined/src/muldiv/muldiv.sv index 5ef88bb18..4bad2d301 100644 --- a/wally-pipelined/src/muldiv/muldiv.sv +++ b/wally-pipelined/src/muldiv/muldiv.sv @@ -59,7 +59,7 @@ module muldiv ( // Start a divide when a new division instruction is received and the divider isn't already busy or finishing assign DivE = MulDivE & Funct3E[2]; assign DivSignedE = ~Funct3E[0]; - intdivrestoring div(.clk, .reset, .StallM, .FlushM, + intdivrestoring div(.clk, .reset, .StallM, .DivSignedE, .W64E, .DivE, .SrcAE, .SrcBE, .DivBusyE, .QuotM, .RemM); // Result multiplexer diff --git a/wally-pipelined/src/uncore/dtim.sv b/wally-pipelined/src/uncore/dtim.sv index c195c5516..a331055cf 100644 --- a/wally-pipelined/src/uncore/dtim.sv +++ b/wally-pipelined/src/uncore/dtim.sv @@ -44,18 +44,16 @@ module dtim #(parameter BASE=0, RANGE = 65535) ( logic [31:0] HWADDR, A; logic [`XLEN-1:0] HREADTim0; -// logic [`XLEN-1:0] write; logic prevHREADYTim, risingHREADYTim; logic initTrans; logic [15:0] entry; - logic memread, memwrite; + logic memwrite; logic [3:0] busycount; assign initTrans = HREADY & HSELTim & (HTRANS != 2'b00); // *** this seems like a weird way to use reset - flopenr #(1) memreadreg(HCLK, 1'b0, initTrans | ~HRESETn, HSELTim & ~HWRITE, memread); flopenr #(1) memwritereg(HCLK, 1'b0, initTrans | ~HRESETn, HSELTim & HWRITE, memwrite); flopenr #(32) haddrreg(HCLK, 1'b0, initTrans | ~HRESETn, HADDR, A); diff --git a/wally-pipelined/src/uncore/gpio.sv b/wally-pipelined/src/uncore/gpio.sv index 0100c9c56..21810de9d 100644 --- a/wally-pipelined/src/uncore/gpio.sv +++ b/wally-pipelined/src/uncore/gpio.sv @@ -45,14 +45,13 @@ module gpio ( logic [31:0] input_val, input_en, output_en, output_val; logic [31:0] rise_ie, rise_ip, fall_ie, fall_ip, high_ie, high_ip, low_ie, low_ip; - logic initTrans, memread, memwrite; - logic [7:0] entry, entryd, HADDRd; + logic initTrans, memwrite; + logic [7:0] entry, entryd; logic [31:0] Din, Dout; // AHB I/O assign entry = {HADDR[7:2],2'b0}; assign initTrans = HREADY & HSELGPIO & (HTRANS != 2'b00); - assign memread = initTrans & ~HWRITE; // entryd and memwrite are delayed by a cycle because AHB controller waits a cycle before outputting write data flopr #(1) memwriteflop(HCLK, ~HRESETn, initTrans & HWRITE, memwrite); flopr #(8) entrydflop(HCLK, ~HRESETn, entry, entryd); From 817795f619f7d4decfe5057218baee36e692169c Mon Sep 17 00:00:00 2001 From: David Harris Date: Sat, 23 Oct 2021 10:12:33 -0700 Subject: [PATCH 016/132] Lint cleanup: ahblite, ifu, hart --- wally-pipelined/src/ebu/ahblite.sv | 7 +------ wally-pipelined/src/ifu/ifu.sv | 6 ++---- .../src/wally/wallypipelinedhart.sv | 20 ++++--------------- 3 files changed, 7 insertions(+), 26 deletions(-) diff --git a/wally-pipelined/src/ebu/ahblite.sv b/wally-pipelined/src/ebu/ahblite.sv index 5bad2e7b2..13a095c4d 100644 --- a/wally-pipelined/src/ebu/ahblite.sv +++ b/wally-pipelined/src/ebu/ahblite.sv @@ -36,11 +36,9 @@ endpackage module ahblite ( input logic clk, reset, - input logic StallW, // Load control input logic UnsignedLoadM, input logic [1:0] AtomicMaskedM, - input logic [6:0] Funct7M, // Signals from Instruction Cache input logic [`PA_BITS-1:0] InstrPAdrF, // *** rename these to match block diagram input logic InstrReadF, @@ -75,14 +73,11 @@ module ahblite ( logic GrantData; logic [31:0] AccessAddress; logic [2:0] ISize; - logic [`AHBW-1:0] HRDATAMasked, ReadDataM, HRDATANext, CapturedHRDATAMasked, WriteData; - logic IReady, DReady; - logic CaptureDataM,CapturedDataAvailable; assign HCLK = clk; assign HRESETn = ~reset; - // *** initially support AHBW = XLEN + // initially support AHBW = XLEN // track bus state // Data accesses have priority over instructions. However, if a data access comes diff --git a/wally-pipelined/src/ifu/ifu.sv b/wally-pipelined/src/ifu/ifu.sv index 69f61d8e3..c3eabf260 100644 --- a/wally-pipelined/src/ifu/ifu.sv +++ b/wally-pipelined/src/ifu/ifu.sv @@ -76,15 +76,13 @@ module ifu ( input logic ITLBWriteF, ITLBFlushF, input logic WalkerInstrPageFaultF, - output logic ITLBMissF, ITLBHitF, + output logic ITLBMissF, // pmp/pma (inside mmu) signals. *** temporarily from AHB bus but eventually replace with internal versions pre H input var logic [7:0] PMPCFG_ARRAY_REGW[`PMP_ENTRIES-1:0], input var logic [`XLEN-1:0] PMPADDR_ARRAY_REGW[`PMP_ENTRIES-1:0], - output logic InstrAccessFaultF, - - output logic ISquashBusAccessF + output logic InstrAccessFaultF ); logic [`XLEN-1:0] PCCorrectE, UnalignedPCNextF, PCNextF; diff --git a/wally-pipelined/src/wally/wallypipelinedhart.sv b/wally-pipelined/src/wally/wallypipelinedhart.sv index 8a298594f..985d8c5c0 100644 --- a/wally-pipelined/src/wally/wallypipelinedhart.sv +++ b/wally-pipelined/src/wally/wallypipelinedhart.sv @@ -94,8 +94,7 @@ module wallypipelinedhart logic SquashSCM, SquashSCW; // floating point unit signals logic [2:0] FRM_REGW; - logic [1:0] FMemRWM, FMemRWE; - logic [4:0] RdE, RdM, RdW; + logic [4:0] RdE, RdM, RdW; logic FStallD; logic FWriteIntE, FWriteIntM, FWriteIntW; logic [`XLEN-1:0] FWriteDataE; @@ -108,10 +107,10 @@ module wallypipelinedhart logic [`XLEN-1:0] FPUResultW; // memory management unit signals - logic ITLBWriteF, DTLBWriteM; + logic ITLBWriteF; logic ITLBFlushF, DTLBFlushM; - logic ITLBMissF, ITLBHitF; - logic DTLBMissM, DTLBHitM; + logic ITLBMissF; + logic DTLBHitM; logic [`XLEN-1:0] SATP_REGW; logic STATUS_MXR, STATUS_SUM, STATUS_MPRV; logic [1:0] STATUS_MPP; @@ -120,7 +119,6 @@ module wallypipelinedhart logic [1:0] PageType; // PMA checker signals - logic DSquashBusAccessM, ISquashBusAccessF; var logic [`XLEN-1:0] PMPADDR_ARRAY_REGW [`PMP_ENTRIES-1:0]; var logic [7:0] PMPCFG_ARRAY_REGW[`PMP_ENTRIES-1:0]; @@ -233,9 +231,6 @@ module wallypipelinedhart .WalkerInstrPageFaultF(WalkerInstrPageFaultF), .WalkerLoadPageFaultM(WalkerLoadPageFaultM), .WalkerStorePageFaultM(WalkerStorePageFaultM), - - .DTLBHitM(DTLBHitM), // not connected remove - .LSUStall(LSUStall)); // change to LSUStall @@ -256,9 +251,6 @@ module wallypipelinedhart // remove these .MemSizeM(DCtoAHBSizeM[1:0]), // *** depends on XLEN should be removed .UnsignedLoadM(1'b0), - .Funct7M(7'b0), -// .HRDATAW(), - .StallW(1'b0), .AtomicMaskedM(2'b00), .*); @@ -272,9 +264,5 @@ module wallypipelinedhart fpu fpu(.*); // floating point unit - // add FPU here, with SetFflagsM, FRM_REGW - // presently stub out SetFlagsM and FRegWriteM - //assign SetFflagsM = 0; - //assign FRegWriteM = 0; endmodule From 708b914a6523fb96a4533ec69b4f8f90028e0af0 Mon Sep 17 00:00:00 2001 From: David Harris Date: Sat, 23 Oct 2021 10:29:52 -0700 Subject: [PATCH 017/132] Lint cleanup from wallypipeliendhart --- wally-pipelined/src/ieu/ieu.sv | 4 ++-- wally-pipelined/src/ifu/ifu.sv | 1 + wally-pipelined/src/lsu/lsu.sv | 3 +-- wally-pipelined/src/muldiv/muldiv.sv | 4 +--- wally-pipelined/src/privileged/privileged.sv | 4 ++-- wally-pipelined/src/wally/wallypipelinedhart.sv | 10 ++-------- wally-pipelined/src/wally/wallypipelinedsoc.sv | 6 ++---- 7 files changed, 11 insertions(+), 21 deletions(-) diff --git a/wally-pipelined/src/ieu/ieu.sv b/wally-pipelined/src/ieu/ieu.sv index 234f767a3..b61466506 100644 --- a/wally-pipelined/src/ieu/ieu.sv +++ b/wally-pipelined/src/ieu/ieu.sv @@ -31,7 +31,6 @@ module ieu ( input logic [31:0] InstrD, input logic IllegalIEUInstrFaultD, output logic IllegalBaseInstrFaultD, - output logic RegWriteD, // Execute Stage interface input logic [`XLEN-1:0] PCE, input logic [`XLEN-1:0] PCLinkE, @@ -48,7 +47,6 @@ module ieu ( // Memory stage interface input logic DataMisalignedM, // from LSU input logic SquashSCW, // from LSU - output logic [1:0] MemRWE, // read/write control goes to LSU output logic [1:0] MemRWM, // read/write control goes to LSU output logic [1:0] AtomicE, // atomic control goes to LSU output logic [1:0] AtomicM, // atomic control goes to LSU @@ -87,6 +85,8 @@ module ieu ( logic TargetSrcE; logic SCE; logic InstrValidW; + logic [1:0] MemRWE; + logic RegWriteD; // forwarding signals logic [4:0] Rs1D, Rs2D, Rs1E, Rs2E; diff --git a/wally-pipelined/src/ifu/ifu.sv b/wally-pipelined/src/ifu/ifu.sv index c3eabf260..aa53e6acc 100644 --- a/wally-pipelined/src/ifu/ifu.sv +++ b/wally-pipelined/src/ifu/ifu.sv @@ -100,6 +100,7 @@ module ifu ( logic [`PA_BITS-1:0] PCPFmmu, PCNextFPhys; // used to either truncate or expand PCPF and PCNextF into `PA_BITS width. logic [`XLEN+1:0] PCFExt; + logic ITLBHitF, ISquashBusAccessF; generate if (`XLEN==32) begin diff --git a/wally-pipelined/src/lsu/lsu.sv b/wally-pipelined/src/lsu/lsu.sv index feb212e8a..304733e8e 100644 --- a/wally-pipelined/src/lsu/lsu.sv +++ b/wally-pipelined/src/lsu/lsu.sv @@ -89,14 +89,13 @@ module lsu output logic WalkerLoadPageFaultM, output logic WalkerStorePageFaultM, - output logic DTLBHitM, // not connected - input var logic [7:0] PMPCFG_ARRAY_REGW[`PMP_ENTRIES-1:0], input var logic [`XLEN-1:0] PMPADDR_ARRAY_REGW[`PMP_ENTRIES-1:0] // *** this one especially has a large note attached to it in pmpchecker. ); logic SquashSCM; logic DTLBPageFaultM; + logic DTLBHitM; logic [`PA_BITS-1:0] MemPAdrM; // from mmu to dcache diff --git a/wally-pipelined/src/muldiv/muldiv.sv b/wally-pipelined/src/muldiv/muldiv.sv index 4bad2d301..a98fb4f02 100644 --- a/wally-pipelined/src/muldiv/muldiv.sv +++ b/wally-pipelined/src/muldiv/muldiv.sv @@ -27,8 +27,6 @@ module muldiv ( input logic clk, reset, - // Decode Stage interface - input logic [31:0] InstrD, // Execute Stage interface input logic [`XLEN-1:0] SrcAE, SrcBE, input logic [2:0] Funct3E, Funct3M, @@ -38,7 +36,7 @@ module muldiv ( // Divide Done output logic DivBusyE, // hazards - input logic StallE, StallM, StallW, FlushM, FlushW + input logic StallM, StallW, FlushM, FlushW ); generate diff --git a/wally-pipelined/src/privileged/privileged.sv b/wally-pipelined/src/privileged/privileged.sv index 326ebcaaa..a6c3f2d8f 100644 --- a/wally-pipelined/src/privileged/privileged.sv +++ b/wally-pipelined/src/privileged/privileged.sv @@ -32,8 +32,8 @@ module privileged ( input logic FlushD, FlushE, FlushM, FlushW, StallD, StallE, StallM, StallW, input logic CSRReadM, CSRWriteM, input logic [`XLEN-1:0] SrcAM, - input logic [`XLEN-1:0] PCF,PCD,PCE,PCM, - input logic [31:0] InstrD, InstrE, InstrM, InstrW, + input logic [`XLEN-1:0] PCM, + input logic [31:0] InstrM, output logic [`XLEN-1:0] CSRReadValW, output logic [`XLEN-1:0] PrivilegedNextPCM, output logic RetM, TrapM, diff --git a/wally-pipelined/src/wally/wallypipelinedhart.sv b/wally-pipelined/src/wally/wallypipelinedhart.sv index 985d8c5c0..398b37db3 100644 --- a/wally-pipelined/src/wally/wallypipelinedhart.sv +++ b/wally-pipelined/src/wally/wallypipelinedhart.sv @@ -36,7 +36,6 @@ module wallypipelinedhart input logic DataAccessFaultM, input logic [63:0] MTIME_CLINT, MTIMECMP_CLINT, // Bus Interface - input logic [15:0] rd2, // bogus, delete when real multicycle fetch works input logic [`AHBW-1:0] HRDATA, input logic HREADY, HRESP, output logic HCLK, HRESETn, @@ -48,7 +47,6 @@ module wallypipelinedhart output logic [3:0] HPROT, output logic [1:0] HTRANS, output logic HMASTLOCK, - output logic [5:0] HSELRegions, // Delayed signals for subword write output logic [2:0] HADDRD, output logic [3:0] HSIZED, @@ -70,11 +68,10 @@ module wallypipelinedhart logic [2:0] Funct3E; // logic [31:0] InstrF; logic [31:0] InstrD, InstrE, InstrM, InstrW; - logic [`XLEN-1:0] PCD, PCE, PCM, PCLinkE, PCLinkW; + logic [`XLEN-1:0] PCD, PCE, PCM, PCLinkE; logic [`XLEN-1:0] PCTargetE; logic [`XLEN-1:0] CSRReadValW, MulDivResultW; logic [`XLEN-1:0] PrivilegedNextPCM; - logic [1:0] MemRWE; logic [1:0] MemRWM; logic InstrValidM; logic InstrMisalignedFaultM; @@ -89,9 +86,8 @@ module wallypipelinedhart logic PCSrcE; logic CSRWritePendingDEM; logic DivBusyE; - logic RegWriteD; logic LoadStallD, StoreStallD, MulDivStallD, CSRRdStallD; - logic SquashSCM, SquashSCW; + logic SquashSCW; // floating point unit signals logic [2:0] FRM_REGW; logic [4:0] RdE, RdM, RdW; @@ -104,13 +100,11 @@ module wallypipelinedhart logic FRegWriteM; logic FPUStallD; logic [4:0] SetFflagsM; - logic [`XLEN-1:0] FPUResultW; // memory management unit signals logic ITLBWriteF; logic ITLBFlushF, DTLBFlushM; logic ITLBMissF; - logic DTLBHitM; logic [`XLEN-1:0] SATP_REGW; logic STATUS_MXR, STATUS_SUM, STATUS_MPRV; logic [1:0] STATUS_MPP; diff --git a/wally-pipelined/src/wally/wallypipelinedsoc.sv b/wally-pipelined/src/wally/wallypipelinedsoc.sv index 9ac700bd6..fa93bdf05 100644 --- a/wally-pipelined/src/wally/wallypipelinedsoc.sv +++ b/wally-pipelined/src/wally/wallypipelinedsoc.sv @@ -60,7 +60,6 @@ module wallypipelinedsoc ( // Uncore signals logic [`AHBW-1:0] HRDATA; // from AHB mux in uncore logic HREADY, HRESP; - logic [5:0] HSELRegions; logic InstrAccessFaultF, DataAccessFaultM; logic TimerIntM, SwIntM; // from CLINT logic [63:0] MTIME_CLINT, MTIMECMP_CLINT; // from CLINT to CSRs @@ -68,16 +67,15 @@ module wallypipelinedsoc ( logic [2:0] HADDRD; logic [3:0] HSIZED; logic HWRITED; - logic [15:0] rd2; // bogus, delete when real multicycle fetch works logic [31:0] InstrF; // instantiate processor and memories wallypipelinedhart hart(.clk, .reset, .PCF, .TimerIntM, .ExtIntM, .SwIntM, .DataAccessFaultM, - .MTIME_CLINT, .MTIMECMP_CLINT, .rd2, + .MTIME_CLINT, .MTIMECMP_CLINT, .HRDATA, .HREADY, .HRESP, .HCLK, .HRESETn, .HADDR, .HWDATA, .HWRITE, .HSIZE, .HBURST, .HPROT, .HTRANS, .HMASTLOCK, - .HSELRegions, .HADDRD, .HSIZED, .HWRITED + .HADDRD, .HSIZED, .HWRITED ); // instructions now come from uncore memory. This line can be removed at any time. From 5e961973cbe928e567cc96cafe4a11a6921e6585 Mon Sep 17 00:00:00 2001 From: David Harris Date: Sat, 23 Oct 2021 10:51:53 -0700 Subject: [PATCH 018/132] IEU lint cleanup --- wally-pipelined/src/ieu/controller.sv | 14 ++++++-------- wally-pipelined/src/ieu/ieu.sv | 2 -- wally-pipelined/src/uncore/uncore.sv | 6 +----- wally-pipelined/src/wally/wallypipelinedsoc.sv | 9 +-------- 4 files changed, 8 insertions(+), 23 deletions(-) diff --git a/wally-pipelined/src/ieu/controller.sv b/wally-pipelined/src/ieu/controller.sv index ed5f02404..38f7869a4 100644 --- a/wally-pipelined/src/ieu/controller.sv +++ b/wally-pipelined/src/ieu/controller.sv @@ -34,9 +34,8 @@ module controller( output logic [2:0] ImmSrcD, input logic IllegalIEUInstrFaultD, output logic IllegalBaseInstrFaultD, - output logic RegWriteD, // Execute stage control signals - input logic StallE, FlushE, + input logic StallE, FlushE, input logic [2:0] FlagsE, output logic PCSrcE, // for datapath and Hazard Unit output logic [4:0] ALUControlE, @@ -46,7 +45,6 @@ module controller( output logic [2:0] Funct3E, output logic MulDivE, W64E, output logic JumpE, - output logic [1:0] MemRWE, // Memory stage control signals input logic StallM, FlushM, output logic [1:0] MemRWM, @@ -57,7 +55,7 @@ module controller( output logic [2:0] Funct3M, output logic RegWriteM, // for Hazard Unit output logic InvalidateICacheM, FlushDCacheM, - output logic InstrValidM, InstrValidW, + output logic InstrValidM, // Writeback stage control signals input logic StallW, FlushW, output logic RegWriteW, // for datapath and Hazard Unit @@ -75,9 +73,9 @@ module controller( `define CTRLW 24 // pipelined control signals - logic RegWriteE; + logic RegWriteD, RegWriteE; logic [2:0] ResultSrcD, ResultSrcE, ResultSrcM; - logic [1:0] MemRWD; + logic [1:0] MemRWD, MemRWE; logic JumpD; logic BranchD, BranchE; logic [1:0] ALUOpD; @@ -233,8 +231,8 @@ module controller( // Writeback stage pipeline control register flopenrc #(5) controlregW(clk, reset, FlushW, ~StallW, - {RegWriteM, ResultSrcM, InstrValidM}, - {RegWriteW, ResultSrcW, InstrValidW}); + {RegWriteM, ResultSrcM}, + {RegWriteW, ResultSrcW}); assign CSRWritePendingDEM = CSRWriteD | CSRWriteE | CSRWriteM; diff --git a/wally-pipelined/src/ieu/ieu.sv b/wally-pipelined/src/ieu/ieu.sv index b61466506..934a440d6 100644 --- a/wally-pipelined/src/ieu/ieu.sv +++ b/wally-pipelined/src/ieu/ieu.sv @@ -85,8 +85,6 @@ module ieu ( logic TargetSrcE; logic SCE; logic InstrValidW; - logic [1:0] MemRWE; - logic RegWriteD; // forwarding signals logic [4:0] Rs1D, Rs2D, Rs1E, Rs2E; diff --git a/wally-pipelined/src/uncore/uncore.sv b/wally-pipelined/src/uncore/uncore.sv index 78a89b02d..943572f14 100644 --- a/wally-pipelined/src/uncore/uncore.sv +++ b/wally-pipelined/src/uncore/uncore.sv @@ -47,9 +47,6 @@ module uncore ( input logic [2:0] HADDRD, input logic [3:0] HSIZED, input logic HWRITED, - // bus interface - // PMA checker now handles access faults. *** This can be deleted - // output logic DataAccessFaultM, // peripheral pins output logic TimerIntM, SwIntM, ExtIntM, input logic [31:0] GPIOPinsIn, @@ -63,14 +60,13 @@ module uncore ( logic [`XLEN-1:0] HREADTim, HREADCLINT, HREADPLIC, HREADGPIO, HREADUART; logic [6:0] HSELRegions; - logic HSELTim, HSELCLINT, HSELPLIC, HSELGPIO, PreHSELUART, HSELUART; + logic HSELTim, HSELCLINT, HSELPLIC, HSELGPIO, HSELUART; logic HSELTimD, HSELCLINTD, HSELPLICD, HSELGPIOD, HSELUARTD; logic HRESPTim, HRESPCLINT, HRESPPLIC, HRESPGPIO, HRESPUART; logic HREADYTim, HREADYCLINT, HREADYPLIC, HREADYGPIO, HREADYUART; logic [`XLEN-1:0] HREADBootTim; logic HSELBootTim, HSELBootTimD, HRESPBootTim, HREADYBootTim; logic HSELNoneD; - logic [1:0] MemRWboottim; logic UARTIntr,GPIOIntr; // Determine which region of physical memory (if any) is being accessed diff --git a/wally-pipelined/src/wally/wallypipelinedsoc.sv b/wally-pipelined/src/wally/wallypipelinedsoc.sv index fa93bdf05..945889584 100644 --- a/wally-pipelined/src/wally/wallypipelinedsoc.sv +++ b/wally-pipelined/src/wally/wallypipelinedsoc.sv @@ -54,32 +54,25 @@ module wallypipelinedsoc ( output logic UARTSout ); - // to instruction memory *** remove later - logic [`XLEN-1:0] PCF; - // Uncore signals logic [`AHBW-1:0] HRDATA; // from AHB mux in uncore logic HREADY, HRESP; - logic InstrAccessFaultF, DataAccessFaultM; logic TimerIntM, SwIntM; // from CLINT logic [63:0] MTIME_CLINT, MTIMECMP_CLINT; // from CLINT to CSRs logic ExtIntM; // from PLIC logic [2:0] HADDRD; logic [3:0] HSIZED; logic HWRITED; - logic [31:0] InstrF; // instantiate processor and memories wallypipelinedhart hart(.clk, .reset, - .PCF, .TimerIntM, .ExtIntM, .SwIntM, .DataAccessFaultM, + .TimerIntM, .ExtIntM, .SwIntM, .MTIME_CLINT, .MTIMECMP_CLINT, .HRDATA, .HREADY, .HRESP, .HCLK, .HRESETn, .HADDR, .HWDATA, .HWRITE, .HSIZE, .HBURST, .HPROT, .HTRANS, .HMASTLOCK, .HADDRD, .HSIZED, .HWRITED ); - // instructions now come from uncore memory. This line can be removed at any time. - // imem imem(.AdrF(PCF[`XLEN-1:1]), .*); // temporary until uncore memory is finished*** uncore uncore(.HCLK, .HRESETn, .HADDR, .HWDATAIN(HWDATA), .HWRITE, .HSIZE, .HBURST, .HPROT, .HTRANS, .HMASTLOCK, .HRDATAEXT, .HREADYEXT, .HRESPEXT, .HRDATA, .HREADY, .HRESP, .HADDRD, .HSIZED, .HWRITED, From b6bb33ecefabf77fb3133242dd3fe0834ba744ba Mon Sep 17 00:00:00 2001 From: David Harris Date: Sat, 23 Oct 2021 11:03:28 -0700 Subject: [PATCH 019/132] lint cleanup --- wally-pipelined/src/ieu/controller.sv | 2 +- wally-pipelined/src/ieu/ieu.sv | 2 -- wally-pipelined/src/wally/wallypipelinedhart.sv | 8 ++------ 3 files changed, 3 insertions(+), 9 deletions(-) diff --git a/wally-pipelined/src/ieu/controller.sv b/wally-pipelined/src/ieu/controller.sv index 38f7869a4..449066bf1 100644 --- a/wally-pipelined/src/ieu/controller.sv +++ b/wally-pipelined/src/ieu/controller.sv @@ -230,7 +230,7 @@ module controller( {RegWriteM, ResultSrcM, MemRWM, CSRReadM, CSRWriteM, PrivilegedM, Funct3M, AtomicM, InvalidateICacheM, FlushDCacheM, InstrValidM}); // Writeback stage pipeline control register - flopenrc #(5) controlregW(clk, reset, FlushW, ~StallW, + flopenrc #(4) controlregW(clk, reset, FlushW, ~StallW, {RegWriteM, ResultSrcM}, {RegWriteW, ResultSrcW}); diff --git a/wally-pipelined/src/ieu/ieu.sv b/wally-pipelined/src/ieu/ieu.sv index 934a440d6..4641f6c0b 100644 --- a/wally-pipelined/src/ieu/ieu.sv +++ b/wally-pipelined/src/ieu/ieu.sv @@ -55,7 +55,6 @@ module ieu ( output logic [2:0] Funct3M, // size and signedness to LSU output logic [`XLEN-1:0] SrcAM, // to privilege and fpu output logic [4:0] RdM, - input logic DataAccessFaultM, input logic [`XLEN-1:0] FIntResM, output logic InvalidateICacheM, FlushDCacheM, @@ -84,7 +83,6 @@ module ieu ( logic [2:0] ResultSrcW; logic TargetSrcE; logic SCE; - logic InstrValidW; // forwarding signals logic [4:0] Rs1D, Rs2D, Rs1E, Rs2E; diff --git a/wally-pipelined/src/wally/wallypipelinedhart.sv b/wally-pipelined/src/wally/wallypipelinedhart.sv index 398b37db3..1a4c826ea 100644 --- a/wally-pipelined/src/wally/wallypipelinedhart.sv +++ b/wally-pipelined/src/wally/wallypipelinedhart.sv @@ -26,14 +26,10 @@ `include "wally-config.vh" /* verilator lint_on UNUSED */ -module wallypipelinedhart - ( +module wallypipelinedhart ( input logic clk, reset, - output logic [`XLEN-1:0] PCF, - // input logic [31:0] InstrF, // Privileged input logic TimerIntM, ExtIntM, SwIntM, - input logic DataAccessFaultM, input logic [63:0] MTIME_CLINT, MTIMECMP_CLINT, // Bus Interface input logic [`AHBW-1:0] HRDATA, @@ -68,7 +64,7 @@ module wallypipelinedhart logic [2:0] Funct3E; // logic [31:0] InstrF; logic [31:0] InstrD, InstrE, InstrM, InstrW; - logic [`XLEN-1:0] PCD, PCE, PCM, PCLinkE; + logic [`XLEN-1:0] PCF, PCD, PCE, PCM, PCLinkE; logic [`XLEN-1:0] PCTargetE; logic [`XLEN-1:0] CSRReadValW, MulDivResultW; logic [`XLEN-1:0] PrivilegedNextPCM; From bb4ad264ce705a55b20a727e8313da2294c9913f Mon Sep 17 00:00:00 2001 From: David Harris Date: Sat, 23 Oct 2021 11:13:28 -0700 Subject: [PATCH 020/132] IEU cleanup --- wally-pipelined/src/fpu/fpu.sv | 38 +++++++++---------- wally-pipelined/src/hazard/hazard.sv | 2 - wally-pipelined/src/ieu/ieu.sv | 2 - wally-pipelined/src/mmu/priorityonehot.sv | 2 +- .../src/mmu/prioritythermometer.sv | 2 +- 5 files changed, 19 insertions(+), 27 deletions(-) diff --git a/wally-pipelined/src/fpu/fpu.sv b/wally-pipelined/src/fpu/fpu.sv index 810eac6f7..6ce894be4 100755 --- a/wally-pipelined/src/fpu/fpu.sv +++ b/wally-pipelined/src/fpu/fpu.sv @@ -31,10 +31,9 @@ module fpu ( input logic [31:0] InstrD, // instruction from IFU input logic [`XLEN-1:0] ReadDataW,// Read data from memory input logic [`XLEN-1:0] SrcAE, // Integer input being processed (from IEU) - input logic [`XLEN-1:0] SrcAM, // Integer input being written into fpreg (from IEU) input logic StallE, StallM, StallW, // stall signals from HZU input logic FlushE, FlushM, FlushW, // flush signals from HZU - input logic [4:0] RdE, RdM, RdW, // which FP register to write to (from IEU) + input logic [4:0] RdM, RdW, // which FP register to write to (from IEU) output logic FRegWriteM, // FP register write enable output logic FStallD, // Stall the decode stage output logic FWriteIntE, FWriteIntM, FWriteIntW, // integer register write enable @@ -68,8 +67,8 @@ module fpu ( logic [1:0] FForwardXE, FForwardYE, FForwardZE; // forwarding mux control signals logic [1:0] FResultSelD, FResultSelE; // Select the result written to FP register logic [1:0] FResultSelM, FResultSelW; // Select the result written to FP register - logic [2:0] FOpCtrlD, FOpCtrlE, FOpCtrlM; // Select which opperation to do in each component - logic [2:0] FResSelD, FResSelE, FResSelM; // Select one of the results that finish in the memory stage + logic [2:0] FOpCtrlD, FOpCtrlE; // Select which opperation to do in each component + logic [2:0] FResSelD, FResSelE; // Select one of the results that finish in the memory stage logic [1:0] FIntResSelD, FIntResSelE; // Select the result written to the integer resister logic [4:0] Adr1E, Adr2E, Adr3E; // adresses of each input @@ -103,24 +102,23 @@ module fpu ( logic XExpMaxE; // is the exponent all ones (max value) logic XNormE; // is normal logic FmtQ; - logic FDivStartQ; logic FOpCtrlQ; // result and flag signals logic [63:0] FDivResM, FDivResW; // divide/squareroot result - logic [4:0] FDivFlgM, FDivFlgW; // divide/squareroot flags + logic [4:0] FDivFlgM; // divide/squareroot flags logic [63:0] FMAResM, FMAResW; // FMA/multiply result - logic [4:0] FMAFlgM, FMAFlgW; // FMA/multiply result + logic [4:0] FMAFlgM; // FMA/multiply result logic [63:0] ReadResW; // read result (load instruction) - logic [63:0] CvtFpResE, CvtFpResM, CvtFpResW; // add/FP -> FP convert result - logic [4:0] CvtFpFlgE, CvtFpFlgM, CvtFpFlgW; // add/FP -> FP convert flags - logic [63:0] CvtResE, CvtResM; // FP <-> int convert result - logic [4:0] CvtFlgE, CvtFlgM; // FP <-> int convert flags //*** trim this - logic [63:0] ClassResE, ClassResM; // classify result - logic [63:0] CmpResE, CmpResM; // compare result - logic CmpNVE, CmpNVM; // compare invalid flag (Not Valid) - logic [63:0] SgnResE, SgnResM; // sign injection result - logic SgnNVE, SgnNVM; // sign injection invalid flag (Not Valid) + logic [63:0] CvtFpResE; // add/FP -> FP convert result + logic [4:0] CvtFpFlgE; // add/FP -> FP convert flags + logic [63:0] CvtResE; // FP <-> int convert result + logic [4:0] CvtFlgE; // FP <-> int convert flags //*** trim this + logic [63:0] ClassResE; // classify result + logic [63:0] CmpResE; // compare result + logic CmpNVE; // compare invalid flag (Not Valid) + logic [63:0] SgnResE; // sign injection result + logic SgnNVE; // sign injection invalid flag (Not Valid) logic [63:0] FResE, FResM, FResW; // selected result that is ready in the memory stage logic [4:0] FFlgE, FFlgM; // selected flag that is ready in the memory stage logic [`XLEN-1:0] FIntResE; @@ -128,7 +126,6 @@ module fpu ( // other signals logic FDivSqrtDoneE; // is divide done logic [63:0] DivInput1E, DivInput2E; // inputs to divide/squareroot unit - logic FDivClk; // clock for divide/squareroot unit logic load_preload; // enable for FF on fpdivsqrt logic [63:0] AlignedSrcAE; // align SrcA to the floating point format @@ -263,9 +260,9 @@ module fpu ( flopenrc #(64) EMRegCmpRes (clk, reset, FlushM, ~StallM, FResE, FResM); flopenrc #(5) EMRegCmpFlg (clk, reset, FlushM, ~StallM, FFlgE, FFlgM); flopenrc #(`XLEN) EMRegSgnRes (clk, reset, FlushM, ~StallM, FIntResE, FIntResM); - flopenrc #(11) EMCtrlReg (clk, reset, FlushM, ~StallM, - {FRegWriteE, FResultSelE, FrmE, FmtE, FOpCtrlE, FWriteIntE}, - {FRegWriteM, FResultSelM, FrmM, FmtM, FOpCtrlM, FWriteIntM}); + flopenrc #(8) EMCtrlReg (clk, reset, FlushM, ~StallM, + {FRegWriteE, FResultSelE, FrmE, FmtE, FWriteIntE}, + {FRegWriteM, FResultSelM, FrmM, FmtM, FWriteIntM}); // BEGIN MEMORY STAGE @@ -275,7 +272,6 @@ module fpu ( // M/W pipe registers flopenrc #(64) MWRegFma(clk, reset, FlushW, ~StallW, FMAResM, FMAResW); flopenrc #(64) MWRegDiv(clk, reset, FlushW, ~StallW, FDivResM, FDivResW); - flopenrc #(64) MWRegAdd(clk, reset, FlushW, ~StallW, CvtFpResM, CvtFpResW); flopenrc #(64) MWRegClass(clk, reset, FlushW, ~StallW, FResM, FResW); flopenrc #(5) MWCtrlReg(clk, reset, FlushW, ~StallW, {FRegWriteM, FResultSelM, FmtM, FWriteIntM}, diff --git a/wally-pipelined/src/hazard/hazard.sv b/wally-pipelined/src/hazard/hazard.sv index 0a16a8fd9..72deeac00 100644 --- a/wally-pipelined/src/hazard/hazard.sv +++ b/wally-pipelined/src/hazard/hazard.sv @@ -26,8 +26,6 @@ `include "wally-config.vh" module hazard( - input logic clk, - input logic reset, // Detect hazards input logic BPPredWrongE, CSRWritePendingDEM, RetM, TrapM, input logic LoadStallD, StoreStallD, MulDivStallD, CSRRdStallD, diff --git a/wally-pipelined/src/ieu/ieu.sv b/wally-pipelined/src/ieu/ieu.sv index 4641f6c0b..b469df637 100644 --- a/wally-pipelined/src/ieu/ieu.sv +++ b/wally-pipelined/src/ieu/ieu.sv @@ -45,7 +45,6 @@ module ieu ( input logic FWriteIntM, // Memory stage interface - input logic DataMisalignedM, // from LSU input logic SquashSCW, // from LSU output logic [1:0] MemRWM, // read/write control goes to LSU output logic [1:0] AtomicE, // atomic control goes to LSU @@ -70,7 +69,6 @@ module ieu ( input logic FlushD, FlushE, FlushM, FlushW, output logic FPUStallD, LoadStallD, MulDivStallD, CSRRdStallD, output logic PCSrcE, - input logic DivBusyE, output logic CSRReadM, CSRWriteM, PrivilegedM, output logic CSRWritePendingDEM, output logic StoreStallD diff --git a/wally-pipelined/src/mmu/priorityonehot.sv b/wally-pipelined/src/mmu/priorityonehot.sv index f02f8ccc5..849f178ee 100644 --- a/wally-pipelined/src/mmu/priorityonehot.sv +++ b/wally-pipelined/src/mmu/priorityonehot.sv @@ -40,7 +40,7 @@ module priorityonehot #(parameter ENTRIES = 8) ( logic [ENTRIES-1:0] nolower; // generate thermometer code mask - prioritythemometer #(ENTRIES) maskgen(.a({a[ENTRIES-2:0], 1'b1}), .y(nolower)); + prioritythermometer #(ENTRIES) maskgen(.a({a[ENTRIES-2:0], 1'b1}), .y(nolower)); // genvar i; // generate // assign nolower[0] = 1'b1; diff --git a/wally-pipelined/src/mmu/prioritythermometer.sv b/wally-pipelined/src/mmu/prioritythermometer.sv index a3eab7e43..8ff099a0d 100644 --- a/wally-pipelined/src/mmu/prioritythermometer.sv +++ b/wally-pipelined/src/mmu/prioritythermometer.sv @@ -32,7 +32,7 @@ /* verilator lint_off UNOPTFLAT */ -module prioritythemometer #(parameter N = 8) ( +module prioritythermometer #(parameter N = 8) ( input logic [N-1:0] a, output logic [N-1:0] y ); From d0aa6911fffa39c8019daa76969653474c7b1603 Mon Sep 17 00:00:00 2001 From: David Harris Date: Sat, 23 Oct 2021 11:24:36 -0700 Subject: [PATCH 021/132] random lint cleanup --- wally-pipelined/src/fpu/fma.sv | 8 ++++---- wally-pipelined/src/ieu/ieu.sv | 2 +- wally-pipelined/src/mmu/tlb.sv | 1 - wally-pipelined/src/privileged/csrc.sv | 4 ++-- wally-pipelined/src/uncore/clint.sv | 3 +-- wally-pipelined/src/uncore/dtim.sv | 1 - 6 files changed, 8 insertions(+), 11 deletions(-) diff --git a/wally-pipelined/src/fpu/fma.sv b/wally-pipelined/src/fpu/fma.sv index c4a115a0e..db55ee5ca 100644 --- a/wally-pipelined/src/fpu/fma.sv +++ b/wally-pipelined/src/fpu/fma.sv @@ -468,9 +468,8 @@ module fma2( logic Plus1, Minus1, CalcPlus1; // do you add or subtract one for rounding logic UfPlus1; // do you add one (for determining underflow flag) logic Invalid,Underflow,Overflow; // flags - logic ResultSgnTmp; // the result's sign assuming the result is not zero logic Guard, Round; // bits needed to determine rounding - logic UfRound, UfLSBNormSum; // bits needed to determine rounding for underflow flag + logic UfLSBNormSum; // bits needed to determine rounding for underflow flag @@ -497,7 +496,7 @@ module fma2( // round to nearest max magnitude fmaround fmaround(.FmtM, .FrmM, .Sticky, .UfSticky, .NormSum, .AddendStickyM, .NormSumSticky, .ZZeroM, .InvZM, .ResultSgn, .SumExp, - .CalcPlus1, .Plus1, .UfPlus1, .Minus1, .FullResultExp, .ResultFrac, .ResultExp, .Round, .Guard, .UfRound, .UfLSBNormSum); + .CalcPlus1, .Plus1, .UfPlus1, .Minus1, .FullResultExp, .ResultFrac, .ResultExp, .Round, .Guard, .UfLSBNormSum); @@ -688,7 +687,7 @@ module fmaround( output logic [`NF-1:0] ResultFrac, // Result fraction output logic [`NE-1:0] ResultExp, // Result exponent output logic Sticky, // sticky bit - output logic Round, Guard, UfRound, UfLSBNormSum // bits needed to calculate rounding + output logic Round, Guard, UfLSBNormSum // bits needed to calculate rounding ); logic LSBNormSum; // bit used for rounding - least significant bit of the normalized sum logic SubBySmallNum, UfSubBySmallNum; // was there supposed to be a subtraction by a small number @@ -696,6 +695,7 @@ module fmaround( logic UfCalcPlus1, CalcMinus1; // do you add or subtract on from the result logic [`FLEN:0] RoundAdd; // how much to add to the result logic [`NF-1:0] NormSumTruncated; // the normalized sum trimed to fit the mantissa + logic UfRound; /////////////////////////////////////////////////////////////////////////////// // Rounding diff --git a/wally-pipelined/src/ieu/ieu.sv b/wally-pipelined/src/ieu/ieu.sv index b469df637..d3babff3c 100644 --- a/wally-pipelined/src/ieu/ieu.sv +++ b/wally-pipelined/src/ieu/ieu.sv @@ -41,7 +41,6 @@ module ieu ( output logic MulDivE, W64E, output logic [2:0] Funct3E, output logic [`XLEN-1:0] SrcAE, SrcBE, - output logic [4:0] RdE, input logic FWriteIntM, // Memory stage interface @@ -81,6 +80,7 @@ module ieu ( logic [2:0] ResultSrcW; logic TargetSrcE; logic SCE; + logic [4:0] RdE; // forwarding signals logic [4:0] Rs1D, Rs2D, Rs1E, Rs2E; diff --git a/wally-pipelined/src/mmu/tlb.sv b/wally-pipelined/src/mmu/tlb.sv index f4902ed38..d3b8e6de4 100644 --- a/wally-pipelined/src/mmu/tlb.sv +++ b/wally-pipelined/src/mmu/tlb.sv @@ -98,7 +98,6 @@ module tlb #(parameter TLB_ENTRIES = 8, // Sections of the page table entry logic [7:0] PTEAccessBits; - logic [11:0] PageOffset; logic [1:0] HitPageType; logic CAMHit; diff --git a/wally-pipelined/src/privileged/csrc.sv b/wally-pipelined/src/privileged/csrc.sv index 35dc6f659..647f859b1 100644 --- a/wally-pipelined/src/privileged/csrc.sv +++ b/wally-pipelined/src/privileged/csrc.sv @@ -71,8 +71,8 @@ module csrc #(parameter //HPMCOUNTER31H = 12'hC9F ) ( input logic clk, reset, - input logic StallD, StallE, StallM, StallW, - input logic FlushD, FlushE, FlushM, FlushW, + input logic StallE, StallM, StallW, + input logic FlushE, FlushM, FlushW, input logic InstrValidM, LoadStallD, CSRMWriteM, input logic BPPredDirWrongM, input logic BTBPredPCWrongM, diff --git a/wally-pipelined/src/uncore/clint.sv b/wally-pipelined/src/uncore/clint.sv index 817096d30..362d11ae4 100644 --- a/wally-pipelined/src/uncore/clint.sv +++ b/wally-pipelined/src/uncore/clint.sv @@ -42,11 +42,10 @@ module clint ( logic MSIP; logic [15:0] entry, entryd; - logic memread, memwrite; + logic memwrite; logic initTrans; assign initTrans = HREADY & HSELCLINT & (HTRANS != 2'b00); - assign memread = initTrans & ~HWRITE; // entryd and memwrite are delayed by a cycle because AHB controller waits a cycle before outputting write data flopr #(1) memwriteflop(HCLK, ~HRESETn, initTrans & HWRITE, memwrite); flopr #(16) entrydflop(HCLK, ~HRESETn, entry, entryd); diff --git a/wally-pipelined/src/uncore/dtim.sv b/wally-pipelined/src/uncore/dtim.sv index a331055cf..3a0b16be6 100644 --- a/wally-pipelined/src/uncore/dtim.sv +++ b/wally-pipelined/src/uncore/dtim.sv @@ -46,7 +46,6 @@ module dtim #(parameter BASE=0, RANGE = 65535) ( logic prevHREADYTim, risingHREADYTim; logic initTrans; - logic [15:0] entry; logic memwrite; logic [3:0] busycount; From 88b2d9e687856fd71aad9476b364d33da30ee103 Mon Sep 17 00:00:00 2001 From: David Harris Date: Sat, 23 Oct 2021 11:41:20 -0700 Subject: [PATCH 022/132] lsu/ifu lint cleanup --- wally-pipelined/src/ifu/ifu.sv | 4 +--- wally-pipelined/src/lsu/lrsc.sv | 3 +-- wally-pipelined/src/lsu/lsu.sv | 7 +++---- wally-pipelined/src/mmu/mmu.sv | 10 +++------- wally-pipelined/src/privileged/csr.sv | 4 ++-- 5 files changed, 10 insertions(+), 18 deletions(-) diff --git a/wally-pipelined/src/ifu/ifu.sv b/wally-pipelined/src/ifu/ifu.sv index aa53e6acc..7a23800be 100644 --- a/wally-pipelined/src/ifu/ifu.sv +++ b/wally-pipelined/src/ifu/ifu.sv @@ -100,7 +100,7 @@ module ifu ( logic [`PA_BITS-1:0] PCPFmmu, PCNextFPhys; // used to either truncate or expand PCPF and PCNextF into `PA_BITS width. logic [`XLEN+1:0] PCFExt; - logic ITLBHitF, ISquashBusAccessF; + logic ITLBHitF; generate if (`XLEN==32) begin @@ -123,13 +123,11 @@ module ifu ( .TLBFlush(ITLBFlushF), .PhysicalAddress(PCPFmmu), .TLBMiss(ITLBMissF), - .TLBHit(ITLBHitF), .TLBPageFault(ITLBInstrPageFaultF), .ExecuteAccessF(1'b1), // ***dh -- this should eventually change to only true if an instruction fetch is occurring .AtomicAccessM(1'b0), .ReadAccessM(1'b0), .WriteAccessM(1'b0), - .SquashBusAccess(ISquashBusAccessF), .LoadAccessFaultM(), .StoreAccessFaultM(), .DisableTranslation(1'b0), diff --git a/wally-pipelined/src/lsu/lrsc.sv b/wally-pipelined/src/lsu/lrsc.sv index cadf58bbc..64bdbdd4d 100644 --- a/wally-pipelined/src/lsu/lrsc.sv +++ b/wally-pipelined/src/lsu/lrsc.sv @@ -35,7 +35,6 @@ module lrsc output logic [1:0] MemRWMtoDCache, input logic [1:0] AtomicMtoDCache, input logic [`PA_BITS-1:0] MemPAdrM, // from mmu to dcache - output logic SquashSCM, output logic SquashSCW ); // Handle atomic load reserved / store conditional @@ -44,6 +43,7 @@ module lrsc logic [`PA_BITS-1:2] ReservationPAdrW; logic ReservationValidM, ReservationValidW; logic lrM, scM, WriteAdrMatchM; + logic SquashSCM; assign lrM = MemReadM && AtomicMtoDCache[0]; assign scM = MemRWMtoLRSC[0] && AtomicMtoDCache[0]; @@ -59,7 +59,6 @@ module lrsc flopenrc #(1) resvldreg(clk, reset, FlushW, lrM, ReservationValidM, ReservationValidW); flopenrc #(1) squashreg(clk, reset, FlushW, ~StallWtoDCache, SquashSCM, SquashSCW); end else begin // Atomic operations not supported - assign SquashSCM = 0; assign SquashSCW = 0; assign MemRWMtoDCache = MemRWMtoLRSC; end diff --git a/wally-pipelined/src/lsu/lsu.sv b/wally-pipelined/src/lsu/lsu.sv index 304733e8e..09d76cb65 100644 --- a/wally-pipelined/src/lsu/lsu.sv +++ b/wally-pipelined/src/lsu/lsu.sv @@ -93,7 +93,6 @@ module lsu input var logic [`XLEN-1:0] PMPADDR_ARRAY_REGW[`PMP_ENTRIES-1:0] // *** this one especially has a large note attached to it in pmpchecker. ); - logic SquashSCM; logic DTLBPageFaultM; logic DTLBHitM; @@ -199,14 +198,14 @@ module lsu .TLBFlush(DTLBFlushM), .PhysicalAddress(MemPAdrM), .TLBMiss(DTLBMissM), - .TLBHit(DTLBHitM), + //.TLBHit(DTLBHitM), .TLBPageFault(DTLBPageFaultM), .ExecuteAccessF(1'b0), //.AtomicAccessM(AtomicMaskedM[1]), .AtomicAccessM(1'b0), .WriteAccessM(MemRWMtoLRSC[0]), .ReadAccessM(MemRWMtoLRSC[1]), - .SquashBusAccess(), + //.SquashBusAccess(), .DisableTranslation(DisableTranslation), .InstrAccessFaultF(), .Cacheable(CacheableM), @@ -217,7 +216,7 @@ module lsu assign MemReadM = MemRWMtoLRSC[1] & ~(ExceptionM | PendingInterruptMtoDCache) & ~DTLBMissM; // & ~NonBusTrapM & ~DTLBMissM & CurrState != STATE_STALLED; lrsc lrsc(.clk, .reset, .FlushW, .StallWtoDCache, .MemReadM, .MemRWMtoLRSC, .AtomicMtoDCache, .MemPAdrM, - .SquashSCM, .SquashSCW, .MemRWMtoDCache); + .SquashSCW, .MemRWMtoDCache); // *** BUG, this is most likely wrong assign CacheableMtoDCache = SelPTW ? 1'b1 : CacheableM; diff --git a/wally-pipelined/src/mmu/mmu.sv b/wally-pipelined/src/mmu/mmu.sv index 1995f09a0..d8839817b 100644 --- a/wally-pipelined/src/mmu/mmu.sv +++ b/wally-pipelined/src/mmu/mmu.sv @@ -67,7 +67,6 @@ module mmu #(parameter TLB_ENTRIES = 8, // number of TLB Entries // Physical address outputs output logic [`PA_BITS-1:0] PhysicalAddress, output logic TLBMiss, - output logic TLBHit, output logic Cacheable, Idempotent, AtomicAllowed, // Faults @@ -77,11 +76,7 @@ module mmu #(parameter TLB_ENTRIES = 8, // number of TLB Entries // PMA checker signals input logic AtomicAccessM, ExecuteAccessF, WriteAccessM, ReadAccessM, input var logic [7:0] PMPCFG_ARRAY_REGW[`PMP_ENTRIES-1:0], - input var logic [`XLEN-1:0] PMPADDR_ARRAY_REGW [`PMP_ENTRIES-1:0], - - output logic SquashBusAccess // *** send to privileged unit -// output logic [5:0] SelRegions - + input var logic [`XLEN-1:0] PMPADDR_ARRAY_REGW [`PMP_ENTRIES-1:0] ); logic [`PA_BITS-1:0] TLBPAdr; @@ -92,6 +87,7 @@ module mmu #(parameter TLB_ENTRIES = 8, // number of TLB Entries logic PMALoadAccessFaultM, PMPLoadAccessFaultM; logic PMAStoreAccessFaultM, PMPStoreAccessFaultM; logic Translate; + logic TLBHit; // only instantiate TLB if Virtual Memory is supported @@ -126,7 +122,7 @@ module mmu #(parameter TLB_ENTRIES = 8, // number of TLB Entries // If TLB miss and translating we want to not have faults from the PMA and PMP checkers. - assign SquashBusAccess = PMASquashBusAccess | PMPSquashBusAccess; +// assign SquashBusAccess = PMASquashBusAccess | PMPSquashBusAccess; assign InstrAccessFaultF = (PMAInstrAccessFaultF | PMPInstrAccessFaultF) & ~(Translate & ~TLBHit); assign LoadAccessFaultM = (PMALoadAccessFaultM | PMPLoadAccessFaultM) & ~(Translate & ~TLBHit); assign StoreAccessFaultM = (PMAStoreAccessFaultM | PMPStoreAccessFaultM) & ~(Translate & ~TLBHit); diff --git a/wally-pipelined/src/privileged/csr.sv b/wally-pipelined/src/privileged/csr.sv index 10572a0a1..b253f6da9 100644 --- a/wally-pipelined/src/privileged/csr.sv +++ b/wally-pipelined/src/privileged/csr.sv @@ -33,8 +33,8 @@ module csr #(parameter UIE_REGW = 12'b0 ) ( input logic clk, reset, - input logic FlushD, FlushE, FlushM, FlushW, - input logic StallD, StallE, StallM, StallW, + input logic FlushE, FlushM, FlushW, + input logic StallE, StallM, StallW, input logic [31:0] InstrM, input logic [`XLEN-1:0] PCM, SrcAM, input logic CSRReadM, CSRWriteM, TrapM, MTrapM, STrapM, UTrapM, mretM, sretM, uretM, From 8b1dc81d345b8130d3a9399f9cb0a0e6cc6939b1 Mon Sep 17 00:00:00 2001 From: David Harris Date: Sat, 23 Oct 2021 12:00:32 -0700 Subject: [PATCH 023/132] more lsu/ifu lint cleanup --- wally-pipelined/src/cache/dcache.sv | 10 ++-------- wally-pipelined/src/cache/icache.sv | 3 +-- wally-pipelined/src/ifu/ifu.sv | 19 +++++++------------ wally-pipelined/src/lsu/lsu.sv | 10 ++-------- .../src/wally/wallypipelinedhart.sv | 9 ++++----- wally-pipelined/testbench/testbench.sv | 2 +- 6 files changed, 17 insertions(+), 36 deletions(-) diff --git a/wally-pipelined/src/cache/dcache.sv b/wally-pipelined/src/cache/dcache.sv index 733f469f3..a61a5accc 100644 --- a/wally-pipelined/src/cache/dcache.sv +++ b/wally-pipelined/src/cache/dcache.sv @@ -28,10 +28,7 @@ module dcache (input logic clk, input logic reset, - input logic StallM, input logic StallWtoDCache, - input logic FlushM, - input logic FlushW, // cpu side input logic [1:0] MemRWM, @@ -113,13 +110,12 @@ module dcache logic SRAMWordWriteEnableM; logic SRAMBlockWriteEnableM; logic [NUMWAYS-1:0] SRAMBlockWayWriteEnableM; - logic SRAMWriteEnable; + //logic SRAMWriteEnable; logic [NUMWAYS-1:0] SRAMWayWriteEnable; logic [NUMWAYS-1:0] VictimWay; logic [NUMWAYS-1:0] VictimDirtyWay; - logic [BLOCKLEN-1:0] VictimReadDataBlockM; logic VictimDirty; logic SelUncached; logic [2**LOGWPL-1:0] MemPAdrDecodedW; @@ -144,9 +140,7 @@ module dcache logic SelFlush; logic VDWriteEnable; - logic AnyCPUReqM; logic FetchCountFlag; - logic PreCntEn; logic CntEn; logic CntReset; logic SelEvict; @@ -349,7 +343,7 @@ module dcache else assign DCtoAHBSizeM = CacheableM | SelFlush ? 3'b011 : Funct3M; endgenerate; - assign SRAMWriteEnable = SRAMBlockWriteEnableM | SRAMWordWriteEnableM; + //assign SRAMWriteEnable = SRAMBlockWriteEnableM | SRAMWordWriteEnableM; // controller diff --git a/wally-pipelined/src/cache/icache.sv b/wally-pipelined/src/cache/icache.sv index 1e55e0daf..0f6843585 100644 --- a/wally-pipelined/src/cache/icache.sv +++ b/wally-pipelined/src/cache/icache.sv @@ -29,8 +29,7 @@ module icache ( // Basic pipeline stuff input logic clk, reset, - input logic StallF, StallD, - input logic FlushD, + input logic StallF, input logic [`PA_BITS-1:0] PCNextF, input logic [`PA_BITS-1:0] PCPF, // Data read in from the ebu unit diff --git a/wally-pipelined/src/ifu/ifu.sv b/wally-pipelined/src/ifu/ifu.sv index 7a23800be..bdbf096da 100644 --- a/wally-pipelined/src/ifu/ifu.sv +++ b/wally-pipelined/src/ifu/ifu.sv @@ -37,8 +37,6 @@ module ifu ( output logic [`PA_BITS-1:0] InstrPAdrF, output logic InstrReadF, output logic ICacheStallF, - // Decode - output logic [`XLEN-1:0] PCD, // Execute output logic [`XLEN-1:0] PCLinkE, input logic PCSrcE, @@ -49,7 +47,7 @@ module ifu ( input logic RetM, TrapM, input logic [`XLEN-1:0] PrivilegedNextPCM, input logic InvalidateICacheM, - output logic [31:0] InstrD, InstrE, InstrM, InstrW, + output logic [31:0] InstrD, InstrM, output logic [`XLEN-1:0] PCM, output logic [4:0] InstrClassM, output logic BPPredDirWrongM, @@ -89,10 +87,13 @@ module ifu ( logic misaligned, BranchMisalignedFaultE, BranchMisalignedFaultM, TrapMisalignedFaultM; logic PrivilegedChangePCM; logic IllegalCompInstrD; - logic [`XLEN-1:0] PCPlus2or4F, PCW, PCLinkD, PCLinkM, PCPF; + logic [`XLEN-1:0] PCPlus2or4F, PCW, PCLinkD; logic [`XLEN-3:0] PCPlusUpperF; logic CompressedF; logic [31:0] InstrRawD, FinalInstrRawF; + logic [31:0] InstrE; + logic [`XLEN-1:0] PCD; + localparam [31:0] nop = 32'h00000013; // instruction for NOP logic reset_q; // *** look at this later. @@ -100,14 +101,13 @@ module ifu ( logic [`PA_BITS-1:0] PCPFmmu, PCNextFPhys; // used to either truncate or expand PCPF and PCNextF into `PA_BITS width. logic [`XLEN+1:0] PCFExt; - logic ITLBHitF; generate if (`XLEN==32) begin - assign PCPF = PCPFmmu[31:0]; + //assign PCPF = PCPFmmu[31:0]; assign PCNextFPhys = {{(`PA_BITS-`XLEN){1'b0}}, PCNextF}; end else begin - assign PCPF = {8'b0, PCPFmmu}; + //assign PCPF = {8'b0, PCPFmmu}; assign PCNextFPhys = PCNextF[`PA_BITS-1:0]; end endgenerate @@ -270,10 +270,8 @@ module ifu ( flopenr #(32) InstrEReg(clk, reset, ~StallE, FlushE ? nop : InstrD, InstrE); flopenr #(32) InstrMReg(clk, reset, ~StallM, FlushM ? nop : InstrE, InstrM); - // flopenr #(32) InstrWReg(clk, reset, ~StallW, FlushW ? nop : InstrM, InstrW); // just for testbench, delete later flopenr #(`XLEN) PCEReg(clk, reset, ~StallE, PCD, PCE); flopenr #(`XLEN) PCMReg(clk, reset, ~StallM, PCE, PCM); - // flopenr #(`XLEN) PCWReg(clk, reset, ~StallW, PCM, PCW); // *** probably not needed; delete later flopenrc #(5) InstrClassRegE(.clk(clk), .reset(reset), @@ -302,8 +300,5 @@ module ifu ( // *** redo this flopenr #(`XLEN) PCPDReg(clk, reset, ~StallD, PCPlus2or4F, PCLinkD); flopenr #(`XLEN) PCPEReg(clk, reset, ~StallE, PCLinkD, PCLinkE); - // flopenr #(`XLEN) PCPMReg(clk, reset, ~StallM, PCLinkE, PCLinkM); - // /flopenr #(`XLEN) PCPWReg(clk, reset, ~StallW, PCLinkM, PCLinkW); - endmodule diff --git a/wally-pipelined/src/lsu/lsu.sv b/wally-pipelined/src/lsu/lsu.sv index 09d76cb65..5c8f1261d 100644 --- a/wally-pipelined/src/lsu/lsu.sv +++ b/wally-pipelined/src/lsu/lsu.sv @@ -94,7 +94,6 @@ module lsu ); logic DTLBPageFaultM; - logic DTLBHitM; logic [`PA_BITS-1:0] MemPAdrM; // from mmu to dcache @@ -122,7 +121,7 @@ module lsu logic CommittedMfromDCache; logic PendingInterruptMtoDCache; - logic FlushWtoDCache; +// logic FlushWtoDCache; logic WalkerPageFaultM; logic AnyCPUReqM; @@ -198,20 +197,18 @@ module lsu .TLBFlush(DTLBFlushM), .PhysicalAddress(MemPAdrM), .TLBMiss(DTLBMissM), - //.TLBHit(DTLBHitM), .TLBPageFault(DTLBPageFaultM), .ExecuteAccessF(1'b0), //.AtomicAccessM(AtomicMaskedM[1]), .AtomicAccessM(1'b0), .WriteAccessM(MemRWMtoLRSC[0]), .ReadAccessM(MemRWMtoLRSC[1]), - //.SquashBusAccess(), .DisableTranslation(DisableTranslation), .InstrAccessFaultF(), .Cacheable(CacheableM), .Idempotent(), .AtomicAllowed(), - .*); // *** the pma/pmp instruction acess faults don't really matter here. is it possible to parameterize which outputs exist? + .*); // *** the pma/pmp instruction access faults don't really matter here. is it possible to parameterize which outputs exist? assign MemReadM = MemRWMtoLRSC[1] & ~(ExceptionM | PendingInterruptMtoDCache) & ~DTLBMissM; // & ~NonBusTrapM & ~DTLBMissM & CurrState != STATE_STALLED; @@ -241,10 +238,7 @@ module lsu dcache dcache(.clk(clk), .reset(reset), - .StallM(StallM), .StallWtoDCache(StallWtoDCache), - .FlushM(FlushM), - .FlushW(FlushWtoDCache), .MemRWM(MemRWMtoDCache), .Funct3M(Funct3MtoDCache), .Funct7M(Funct7M), diff --git a/wally-pipelined/src/wally/wallypipelinedhart.sv b/wally-pipelined/src/wally/wallypipelinedhart.sv index 1a4c826ea..980166d95 100644 --- a/wally-pipelined/src/wally/wallypipelinedhart.sv +++ b/wally-pipelined/src/wally/wallypipelinedhart.sv @@ -63,15 +63,14 @@ module wallypipelinedhart ( logic [`XLEN-1:0] SrcAM; logic [2:0] Funct3E; // logic [31:0] InstrF; - logic [31:0] InstrD, InstrE, InstrM, InstrW; - logic [`XLEN-1:0] PCF, PCD, PCE, PCM, PCLinkE; + logic [31:0] InstrD, InstrM; + logic [`XLEN-1:0] PCF, PCE, PCM, PCLinkE; logic [`XLEN-1:0] PCTargetE; logic [`XLEN-1:0] CSRReadValW, MulDivResultW; logic [`XLEN-1:0] PrivilegedNextPCM; logic [1:0] MemRWM; logic InstrValidM; logic InstrMisalignedFaultM; - logic DataMisalignedM; logic IllegalBaseInstrFaultD, IllegalIEUInstrFaultD; logic ITLBInstrPageFaultF, DTLBLoadPageFaultM, DTLBStorePageFaultM; logic WalkerInstrPageFaultF, WalkerLoadPageFaultM, WalkerStorePageFaultM; @@ -86,7 +85,7 @@ module wallypipelinedhart ( logic SquashSCW; // floating point unit signals logic [2:0] FRM_REGW; - logic [4:0] RdE, RdM, RdW; + logic [4:0] RdM, RdW; logic FStallD; logic FWriteIntE, FWriteIntM, FWriteIntW; logic [`XLEN-1:0] FWriteDataE; @@ -178,7 +177,7 @@ module wallypipelinedhart ( .DCacheMiss, .DCacheAccess, .SquashSCW(SquashSCW), - .DataMisalignedM(DataMisalignedM), + //.DataMisalignedM(DataMisalignedM), .MemAdrE(MemAdrE), .MemAdrM(MemAdrM), .WriteDataM(WriteDataM), diff --git a/wally-pipelined/testbench/testbench.sv b/wally-pipelined/testbench/testbench.sv index 5999f5d9c..79945d2f1 100644 --- a/wally-pipelined/testbench/testbench.sv +++ b/wally-pipelined/testbench/testbench.sv @@ -174,7 +174,7 @@ logic [3:0] dummy; instrTrackerTB it(clk, reset, dut.hart.ieu.dp.FlushE, dut.hart.ifu.icache.FinalInstrRawF, dut.hart.ifu.InstrD, dut.hart.ifu.InstrE, - dut.hart.ifu.InstrM, dut.hart.ifu.InstrW, + dut.hart.ifu.InstrM, InstrW, InstrFName, InstrDName, InstrEName, InstrMName, InstrWName); // initialize tests From 106982e493423766cc57124cf13436f39e89c9d2 Mon Sep 17 00:00:00 2001 From: David Harris Date: Sat, 23 Oct 2021 12:10:13 -0700 Subject: [PATCH 024/132] more lsu/ifu lint cleanup --- wally-pipelined/src/cache/icache.sv | 5 +---- wally-pipelined/src/cache/icachefsm.sv | 2 +- wally-pipelined/src/ifu/ifu.sv | 2 +- wally-pipelined/src/lsu/lsu.sv | 2 +- wally-pipelined/src/mmu/mmu.sv | 1 - wally-pipelined/src/mmu/pmachecker.sv | 5 ----- wally-pipelined/src/mmu/pmpchecker.sv | 6 +----- 7 files changed, 5 insertions(+), 18 deletions(-) diff --git a/wally-pipelined/src/cache/icache.sv b/wally-pipelined/src/cache/icache.sv index 0f6843585..f1c0b29ff 100644 --- a/wally-pipelined/src/cache/icache.sv +++ b/wally-pipelined/src/cache/icache.sv @@ -77,10 +77,9 @@ module icache logic FlushMem; logic ICacheMemWriteEnable; logic [BLOCKLEN-1:0] ICacheMemWriteData; - logic [`PA_BITS-1:0] PCTagF, PCNextIndexF; + logic [`PA_BITS-1:0] PCTagF; // Output signals from cache memory logic [31:0] ICacheMemReadData; - logic ICacheMemReadValid; logic ICacheReadEn; logic [BLOCKLEN-1:0] ReadLineF; @@ -101,7 +100,6 @@ module icache logic CntReset; logic [1:0] SelAdr; - logic SavePC; logic [INDEXLEN-1:0] RAdr; logic [NUMWAYS-1:0] VictimWay; logic LRUWriteEn; @@ -302,7 +300,6 @@ module icache .CntEn, .CntReset, .SelAdr, - .SavePC, .LRUWriteEn ); diff --git a/wally-pipelined/src/cache/icachefsm.sv b/wally-pipelined/src/cache/icachefsm.sv index 49cbcb434..1d5ad0cd3 100644 --- a/wally-pipelined/src/cache/icachefsm.sv +++ b/wally-pipelined/src/cache/icachefsm.sv @@ -61,7 +61,6 @@ module icachefsm #(parameter BLOCKLEN = 256) output logic CntEn, output logic CntReset, output logic [1:0] SelAdr, - output logic SavePC, output logic LRUWriteEn ); @@ -117,6 +116,7 @@ module icachefsm #(parameter BLOCKLEN = 256) statetype CurrState, NextState; logic PreCntEn; logic UnalignedSelect; + logic SavePC; // unused right now *** consider deleting // the FSM is always runing, do not stall. always_ff @(posedge clk, posedge reset) diff --git a/wally-pipelined/src/ifu/ifu.sv b/wally-pipelined/src/ifu/ifu.sv index bdbf096da..0582395b3 100644 --- a/wally-pipelined/src/ifu/ifu.sv +++ b/wally-pipelined/src/ifu/ifu.sv @@ -87,7 +87,7 @@ module ifu ( logic misaligned, BranchMisalignedFaultE, BranchMisalignedFaultM, TrapMisalignedFaultM; logic PrivilegedChangePCM; logic IllegalCompInstrD; - logic [`XLEN-1:0] PCPlus2or4F, PCW, PCLinkD; + logic [`XLEN-1:0] PCPlus2or4F, PCLinkD; logic [`XLEN-3:0] PCPlusUpperF; logic CompressedF; logic [31:0] InstrRawD, FinalInstrRawF; diff --git a/wally-pipelined/src/lsu/lsu.sv b/wally-pipelined/src/lsu/lsu.sv index 5c8f1261d..1b9604884 100644 --- a/wally-pipelined/src/lsu/lsu.sv +++ b/wally-pipelined/src/lsu/lsu.sv @@ -45,7 +45,6 @@ module lsu input logic FlushDCacheM, output logic CommittedM, output logic SquashSCW, - output logic DataMisalignedM, output logic DCacheMiss, output logic DCacheAccess, @@ -94,6 +93,7 @@ module lsu ); logic DTLBPageFaultM; + logic DataMisalignedM; logic [`PA_BITS-1:0] MemPAdrM; // from mmu to dcache diff --git a/wally-pipelined/src/mmu/mmu.sv b/wally-pipelined/src/mmu/mmu.sv index d8839817b..8c6614a16 100644 --- a/wally-pipelined/src/mmu/mmu.sv +++ b/wally-pipelined/src/mmu/mmu.sv @@ -80,7 +80,6 @@ module mmu #(parameter TLB_ENTRIES = 8, // number of TLB Entries ); logic [`PA_BITS-1:0] TLBPAdr; - logic PMPSquashBusAccess, PMASquashBusAccess; // Translation lookaside buffer logic PMAInstrAccessFaultF, PMPInstrAccessFaultF; diff --git a/wally-pipelined/src/mmu/pmachecker.sv b/wally-pipelined/src/mmu/pmachecker.sv index a95252f3b..904dd0ee8 100644 --- a/wally-pipelined/src/mmu/pmachecker.sv +++ b/wally-pipelined/src/mmu/pmachecker.sv @@ -32,12 +32,8 @@ module pmachecker ( input logic [`PA_BITS-1:0] PhysicalAddress, input logic [1:0] Size, - input logic AtomicAccessM, ExecuteAccessF, WriteAccessM, ReadAccessM, // *** atomicaccessM is unused but might want to stay in for future use. - output logic Cacheable, Idempotent, AtomicAllowed, - output logic PMASquashBusAccess, - output logic PMAInstrAccessFaultF, output logic PMALoadAccessFaultM, output logic PMAStoreAccessFaultM @@ -65,6 +61,5 @@ module pmachecker ( assign PMAInstrAccessFaultF = ExecuteAccessF && PMAAccessFault; assign PMALoadAccessFaultM = ReadAccessM && PMAAccessFault; assign PMAStoreAccessFaultM = WriteAccessM && PMAAccessFault; - assign PMASquashBusAccess = PMAAccessFault; endmodule diff --git a/wally-pipelined/src/mmu/pmpchecker.sv b/wally-pipelined/src/mmu/pmpchecker.sv index 11cb7ccbb..06cc9ea8b 100644 --- a/wally-pipelined/src/mmu/pmpchecker.sv +++ b/wally-pipelined/src/mmu/pmpchecker.sv @@ -41,11 +41,7 @@ module pmpchecker ( // which we might not intend. input var logic [7:0] PMPCFG_ARRAY_REGW[`PMP_ENTRIES-1:0], input var logic [`XLEN-1:0] PMPADDR_ARRAY_REGW [`PMP_ENTRIES-1:0], - input logic ExecuteAccessF, WriteAccessM, ReadAccessM, - - output logic PMPSquashBusAccess, - output logic PMPInstrAccessFaultF, output logic PMPLoadAccessFaultM, output logic PMPStoreAccessFaultM @@ -79,6 +75,6 @@ module pmpchecker ( assign PMPStoreAccessFaultM = EnforcePMP && WriteAccessM && ~|W; assign PMPLoadAccessFaultM = EnforcePMP && ReadAccessM && ~|R; - assign PMPSquashBusAccess = PMPInstrAccessFaultF | PMPLoadAccessFaultM | PMPStoreAccessFaultM; + //assign PMPSquashBusAccess = PMPInstrAccessFaultF | PMPLoadAccessFaultM | PMPStoreAccessFaultM; endmodule From 67f3fc99622601f8c26f7244f245c1a40ad262b2 Mon Sep 17 00:00:00 2001 From: David Harris Date: Sat, 23 Oct 2021 12:15:14 -0700 Subject: [PATCH 025/132] wrapping up lint cleanup; many unused signals removed --- wally-pipelined/regression/lint-wally | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wally-pipelined/regression/lint-wally b/wally-pipelined/regression/lint-wally index 71edc0d51..67cc7a640 100755 --- a/wally-pipelined/regression/lint-wally +++ b/wally-pipelined/regression/lint-wally @@ -7,7 +7,7 @@ verilator=`which verilator` basepath=$(dirname $0)/.. for config in rv64g rv32g; do echo "$config linting..." - if !($verilator --lint-only --Wall "$@" --top-module wallypipelinedsoc "-I$basepath/config/shared" "-I$basepath/config/$config" $basepath/src/*/*.sv $basepath/src/*/*/*.sv --relative-includes); then + if !($verilator --lint-only --Wall "$@" --top-module wallypipelinedsoc "-I$basepath/config/shared" "-I$basepath/config/$config" $basepath/src/*/*.sv $basepath/src/*/*/*.sv --relative-includes); then echo "Exiting after $config lint due to errors or warnings" exit 1 fi From d6fb441666ed7317e1d6d8e89d74ca9740060217 Mon Sep 17 00:00:00 2001 From: bbracker Date: Sat, 23 Oct 2021 13:17:30 -0700 Subject: [PATCH 026/132] add option for regression to do a partial execution of buildroot --- .../regression/regression-wally.py | 33 ++++++++++++------- .../regression/sim-buildroot-batch | 3 +- .../regression/wally-buildroot-batch.do | 2 +- wally-pipelined/testbench/testbench-linux.sv | 14 +++++--- 4 files changed, 33 insertions(+), 19 deletions(-) diff --git a/wally-pipelined/regression/regression-wally.py b/wally-pipelined/regression/regression-wally.py index a997c2a7b..bd703a017 100755 --- a/wally-pipelined/regression/regression-wally.py +++ b/wally-pipelined/regression/regression-wally.py @@ -10,6 +10,7 @@ # output. # ################################## +import sys from collections import namedtuple TestCase = namedtuple("TestCase", ['name', 'cmd', 'grepstr']) @@ -23,22 +24,22 @@ TestCase = namedtuple("TestCase", ['name', 'cmd', 'grepstr']) # edit this list to add more test cases configs = [ - #TestCase( - # name="busybear", - # cmd="vsim -do wally-busybear-batch.do -c > {}", - # grepstr="loaded 100000 instructions" - #), - TestCase( - name="buildroot", - cmd="vsim -do wally-buildroot-batch.do -c > {}", - grepstr="6300000 instructions" - ), TestCase( name="lints", cmd="./lint-wally &> {}", grepstr="All lints run with no errors or warnings" - ), + ) ] +def getBuildrootTC(short): + INSTR_LIMIT = 100000 # multiple of 100000 + MAX_EXPECTED = 6.3e6 + if short: + BRcmd="vsim > {} -c < {} -c < 10000) ? INSTR_LIMIT-10000 : 1; // # of instructions at which to turn on waves in graphical sim + string ProgramAddrMapFile, ProgramLabelMapFile; /////////////////////////////////////////////////////////////////////////////// @@ -343,10 +345,12 @@ module testbench(); // always check PC, instruction bits if (checkInstrW) begin InstrCountW += 1; - // turn on waves at certain point - if (InstrCountW == waveOnICount) $stop; // print progress message if (InstrCountW % 'd100000 == 0) $display("Reached %d instructions", InstrCountW); + // turn on waves + if (InstrCountW == INSTR_WAVEON) $stop; + // end sim + if ((InstrCountW == INSTR_LIMIT) && (INSTR_LIMIT!=0)) $stop; fault = 0; if (`DEBUG_TRACE >= 1) begin `checkEQ("PCW",PCW,ExpectedPCW) @@ -423,8 +427,8 @@ module testbench(); initial begin $readmemh({`LINUX_TEST_VECTORS,"bootmem.txt"}, dut.uncore.bootdtim.bootdtim.RAM, 'h1000 >> 3); $readmemh({`LINUX_TEST_VECTORS,"ram.txt"}, dut.uncore.dtim.RAM); - $readmemb(`TWO_BIT_PRELOAD, dut.hart.ifu.bpred.bpred.Predictor.DirPredictor.PHT.memory); - $readmemb(`BTB_PRELOAD, dut.hart.ifu.bpred.bpred.TargetPredictor.memory.memory); + $readmemb(`TWO_BIT_PRELOAD, dut.hart.ifu.bpred.bpred.Predictor.DirPredictor.PHT.mem); + $readmemb(`BTB_PRELOAD, dut.hart.ifu.bpred.bpred.TargetPredictor.memory.mem); ProgramAddrMapFile = {`LINUX_TEST_VECTORS,"vmlinux.objdump.addr"}; ProgramLabelMapFile = {`LINUX_TEST_VECTORS,"vmlinux.objdump.lab"}; end From f6911be93703bee1965e10a60ef004695f1e94d0 Mon Sep 17 00:00:00 2001 From: bbracker Date: Sat, 23 Oct 2021 14:00:53 -0700 Subject: [PATCH 027/132] add W stage signals to linux testbench --- wally-pipelined/testbench/testbench-linux.sv | 25 +++++++++++++------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/wally-pipelined/testbench/testbench-linux.sv b/wally-pipelined/testbench/testbench-linux.sv index 4a35c757b..aab272ac4 100644 --- a/wally-pipelined/testbench/testbench-linux.sv +++ b/wally-pipelined/testbench/testbench-linux.sv @@ -82,13 +82,15 @@ module testbench(); integer errorCount = 0; integer MIPexpected; // P, Instr Checking - logic [`XLEN-1:0] PCW; integer data_file_all; string name; // Write Back stage signals needed for trace compare, but don't actually // exist in CPU. logic [`XLEN-1:0] MemAdrW, WriteDataW; + logic [`XLEN-1:0] PCW; + logic [31:0] InstrW; + logic InstrValidW; // Write Back trace signals logic checkInstrW; @@ -170,13 +172,19 @@ module testbench(); assign checkInstrM = dut.hart.ieu.InstrValidM & ~dut.hart.priv.trap.InstrPageFaultM & ~dut.hart.priv.trap.InterruptM & ~dut.hart.StallM; - assign checkInstrW = dut.hart.ieu.InstrValidW & ~dut.hart.StallW; // trapW will already be invalid in there was an InstrPageFault in the previous instruction. + assign checkInstrW = InstrValidW & ~dut.hart.StallW; // trapW will already be invalid in there was an InstrPageFault in the previous instruction. // Additonal W stage registers - flopenrc #(`XLEN) MemAdrWReg(clk, reset, dut.hart.FlushW, ~dut.hart.StallW, dut.hart.ieu.dp.MemAdrM, MemAdrW); - flopenrc #(`XLEN) WriteDataWReg(clk, reset, dut.hart.FlushW, ~dut.hart.StallW, dut.hart.WriteDataM, WriteDataW); - flopenrc #(`XLEN) PCWReg(clk, reset, dut.hart.FlushW, ~dut.hart.ieu.dp.StallW, dut.hart.ifu.PCM, PCW); - flopenr #(1) TrapWReg(clk, reset, ~dut.hart.StallW, dut.hart.hzu.TrapM, TrapW); + `define FLUSHW dut.hart.FlushW + `define STALLW dut.hart.StallW + flopenr #(32) InstrWReg(clk, reset, ~`STALLW, `FLUSHW ? nop : dut.hart.ifu.InstrM, InstrW); + flopenrc #(`XLEN) MemAdrWReg(clk, reset, `FLUSHW, ~`STALLW, dut.hart.ieu.dp.MemAdrM, MemAdrW); + flopenrc #(`XLEN) WriteDataWReg(clk, reset, `FLUSHW, ~`STALLW, dut.hart.WriteDataM, WriteDataW); + flopenrc #(`XLEN) PCWReg(clk, reset, `FLUSHW, ~`STALLW, dut.hart.ifu.PCM, PCW); + flopenr #(1) TrapWReg(clk, reset, ~`STALLW, dut.hart.hzu.TrapM, TrapW); + flopenrc #(5) controlregW(clk, reset, `FLUSHW, ~`STALLW, + {dut.hart.ieu.c.RegWriteM, dut.hart.ieu.c.ResultSrcM, dut.hart.ieu.c.InstrValidM}, + {dut.hart.ieu.c.RegWriteW, dut.hart.ieu.c.ResultSrcW, InstrValidW}); // Because qemu does not match exactly to wally it is necessary to read the the // trace in the memory stage and detect if anything in wally must be overwritten. @@ -354,7 +362,7 @@ module testbench(); fault = 0; if (`DEBUG_TRACE >= 1) begin `checkEQ("PCW",PCW,ExpectedPCW) - `checkEQ("InstrW",dut.hart.ifu.InstrW,ExpectedInstrW) + `checkEQ("InstrW",InstrW,ExpectedInstrW) `checkEQ("Instr Count",dut.hart.priv.csr.genblk1.counters.genblk1.INSTRET_REGW,InstrCountW) #2; // delay 2 ns. if(`DEBUG_TRACE >= 5) begin @@ -448,11 +456,10 @@ module testbench(); // Instr Opcode Tracking // For waveview convenience string InstrFName, InstrDName, InstrEName, InstrMName, InstrWName; - logic [31:0] InstrW; instrTrackerTB it(clk, reset, dut.hart.ieu.dp.FlushE, dut.hart.ifu.icache.FinalInstrRawF, dut.hart.ifu.InstrD, dut.hart.ifu.InstrE, - dut.hart.ifu.InstrM, dut.hart.ifu.InstrW, + dut.hart.ifu.InstrM, InstrW, InstrFName, InstrDName, InstrEName, InstrMName, InstrWName); // ------------------ From 366cb12a1365938166a721312bb77546fa207ccf Mon Sep 17 00:00:00 2001 From: bbracker Date: Sat, 23 Oct 2021 23:14:59 -0700 Subject: [PATCH 028/132] buildroot do scripts now compile flops --- wally-pipelined/regression/wally-buildroot-batch.do | 2 +- wally-pipelined/regression/wally-buildroot.do | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/wally-pipelined/regression/wally-buildroot-batch.do b/wally-pipelined/regression/wally-buildroot-batch.do index 2fedcfa99..13a072bbf 100644 --- a/wally-pipelined/regression/wally-buildroot-batch.do +++ b/wally-pipelined/regression/wally-buildroot-batch.do @@ -25,7 +25,7 @@ vlib work-buildroot # suppress spurious warnngs about # "Extra checking for conflicts with always_comb done at vopt time" # because vsim will run vopt -vlog +incdir+../config/buildroot +incdir+../config/shared ../testbench/testbench-linux.sv ../testbench/common/*.sv ../src/*/*.sv -suppress 2583 +vlog -lint +incdir+../config/buildroot +incdir+../config/shared ../testbench/testbench-linux.sv ../testbench/common/*.sv ../src/*/*.sv ../src/*/*/*.sv -suppress 2583 # start and run simulation diff --git a/wally-pipelined/regression/wally-buildroot.do b/wally-pipelined/regression/wally-buildroot.do index e412c2398..daa1f6e68 100644 --- a/wally-pipelined/regression/wally-buildroot.do +++ b/wally-pipelined/regression/wally-buildroot.do @@ -25,7 +25,7 @@ vlib work-buildroot # suppress spurious warnngs about # "Extra checking for conflicts with always_comb done at vopt time" # because vsim will run vopt -vlog +incdir+../config/buildroot +incdir+../config/shared ../testbench/testbench-linux.sv ../testbench/common/*.sv ../src/*/*.sv -suppress 2583 +vlog -lint +incdir+../config/buildroot +incdir+../config/shared ../testbench/testbench-linux.sv ../testbench/common/*.sv ../src/*/*.sv ../src/*/*/*.sv -suppress 2583 # start and run simulation From 35ccab0e290b227ef241fe24952d98583488dabe Mon Sep 17 00:00:00 2001 From: bbracker Date: Sun, 24 Oct 2021 06:14:11 -0700 Subject: [PATCH 029/132] revamp linux testvector generation for refactoring checkpoint generation --- .../testvector-generation/CreateTrace.sh | 25 --------- .../GenerateCheckpoint.sh | 35 ------------ .../testvector-generation/checkpoint.gdb | 30 ++++++---- .../testvector-generation/gdbinit_debug | 12 +++- .../testvector-generation/gdbinit_qemulog | 11 ---- .../testvector-generation/genCheckpoint.gdb | 56 +++++++++++++++++++ .../testvector-generation/genCheckpoint.sh | 39 +++++++++++++ .../testvector-generation/genInitMem.gdb | 44 +++++++++++++++ .../testvector-generation/genInitMem.sh | 27 +++++++++ .../testvector-generation/genSettings.sh | 11 ++++ .../testvector-generation/genTrace.gdb | 24 ++++++++ .../testvector-generation/genTrace.sh | 24 ++++++++ .../testvector-generation/logBuildrootMem.sh | 28 ---------- .../{parseNew.py => parseGDBtoTrace.py} | 0 .../{parse_qemu.py => parseQemuToGDB.py} | 1 + .../testvector-generation/parseState.py | 4 +- 16 files changed, 256 insertions(+), 115 deletions(-) delete mode 100755 wally-pipelined/linux-testgen/testvector-generation/CreateTrace.sh delete mode 100755 wally-pipelined/linux-testgen/testvector-generation/GenerateCheckpoint.sh mode change 100755 => 100644 wally-pipelined/linux-testgen/testvector-generation/checkpoint.gdb delete mode 100755 wally-pipelined/linux-testgen/testvector-generation/gdbinit_qemulog create mode 100755 wally-pipelined/linux-testgen/testvector-generation/genCheckpoint.gdb create mode 100755 wally-pipelined/linux-testgen/testvector-generation/genCheckpoint.sh create mode 100755 wally-pipelined/linux-testgen/testvector-generation/genInitMem.gdb create mode 100755 wally-pipelined/linux-testgen/testvector-generation/genInitMem.sh create mode 100755 wally-pipelined/linux-testgen/testvector-generation/genSettings.sh create mode 100755 wally-pipelined/linux-testgen/testvector-generation/genTrace.gdb create mode 100755 wally-pipelined/linux-testgen/testvector-generation/genTrace.sh delete mode 100755 wally-pipelined/linux-testgen/testvector-generation/logBuildrootMem.sh rename wally-pipelined/linux-testgen/testvector-generation/{parseNew.py => parseGDBtoTrace.py} (100%) rename wally-pipelined/linux-testgen/testvector-generation/{parse_qemu.py => parseQemuToGDB.py} (99%) diff --git a/wally-pipelined/linux-testgen/testvector-generation/CreateTrace.sh b/wally-pipelined/linux-testgen/testvector-generation/CreateTrace.sh deleted file mode 100755 index c01fc4357..000000000 --- a/wally-pipelined/linux-testgen/testvector-generation/CreateTrace.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/bash -# Oftentimes this script runs so long you'll go to sleep. -# But you don't want the script to die when your computer goes to sleep. -# So consider invoking this with nohup (i.e. "nohup ./logAllBuildroot.sh") -# You can run "tail -f nohup.out" to see what would've -# outputted to the terminal if you didn't use nohup - -# use on tera. -customQemu="/courses/e190ax/qemu_sim/rv64_initrd/qemu_experimental/qemu/build/qemu-system-riscv64" -# use on other systems -#customQemu="qemu-system-riscv64" -imageDir="../buildroot-image-output" -intermedDir="../linux-testvectors/intermediate-outputs" -outDir="../linux-testvectors" - -# - Logs info needed by buildroot testbench - -read -p "Warning: running this script will overwrite the contents of $outDir/all.txt. -Would you like to proceed? (y/n) " -n 1 -r -echo -if [[ $REPLY =~ ^[Yy]$ ]] -then - ($customQemu -M virt -nographic -bios $imageDir/fw_jump.elf -kernel $imageDir/Image -append "root=/dev/vda ro" -initrd $imageDir/rootfs.cpio -rtc clock=vm -icount shift=1 -d nochain,cpu,in_asm -serial /dev/null -singlestep -gdb tcp::1236 -S 2>&1 >/dev/null | ./parse_qemu.py | ./parseNew.py | ./remove_dup.awk > $outDir/all.txt) & riscv64-unknown-elf-gdb -x gdbinit_qemulog -fi - diff --git a/wally-pipelined/linux-testgen/testvector-generation/GenerateCheckpoint.sh b/wally-pipelined/linux-testgen/testvector-generation/GenerateCheckpoint.sh deleted file mode 100755 index bd54523e1..000000000 --- a/wally-pipelined/linux-testgen/testvector-generation/GenerateCheckpoint.sh +++ /dev/null @@ -1,35 +0,0 @@ -#!/bin/bash -# Oftentimes this script runs so long you'll go to sleep. -# But you don't want the script to die when your computer goes to sleep. -# So consider invoking this with nohup (i.e. "nohup ./logAllBuildroot.sh") -# You can run "tail -f nohup.out" to see what would've -# outputted to the terminal if you didn't use nohup - -# use on tera. -customQemu="/courses/e190ax/qemu_sim/rv64_initrd/qemu_experimental/qemu/build/qemu-system-riscv64" -# use on other systems -#customQemu="qemu-system-riscv64" - -instrs=50000000 - -imageDir="../buildroot-image-output" -outDir="../linux-testvectors/checkpoint$instrs" -intermedDir="$outDir/intermediate-outputs" - - -read -p "This scripts is going to create a checkpoint at $instrs instrs. -Is that what you wanted? (y/n) " -n 1 -r -echo -if [[ $REPLY =~ ^[Yy]$ ]] -then - mkdir -p $outDir - mkdir -p $intermedDir - # Simulate QEMU, parse QEMU trace, run GDB script which logs a bunch of data at the checkpoint - ($customQemu -M virt -nographic -bios $imageDir/fw_jump.elf -kernel $imageDir/Image -append "root=/dev/vda ro" -initrd $imageDir/rootfs.cpio -rtc clock=vm -icount shift=1 -d nochain,cpu,in_asm -serial /dev/null -singlestep -gdb tcp::1240 -S 2>&1 1>&2 | ./parse_qemu.py | ./parseNew.py | ./remove_dup.awk > $intermedDir/rawTrace.txt) & riscv64-unknown-elf-gdb -x ./checkpoint.gdb -ex "createCheckpoint $instrs \"$intermedDir\"" - # Post-Process GDB outputs - ./parseState.py "$outDir" - ./fix_mem.py "$intermedDir/ramGDB.txt" "$outDir/ram.txt" -else - echo "You can change the number of instructions by editing the \"instrs\" variable in this script." - echo "Have a nice day!" -fi diff --git a/wally-pipelined/linux-testgen/testvector-generation/checkpoint.gdb b/wally-pipelined/linux-testgen/testvector-generation/checkpoint.gdb old mode 100755 new mode 100644 index 1b2c64f16..1d79bc8ab --- a/wally-pipelined/linux-testgen/testvector-generation/checkpoint.gdb +++ b/wally-pipelined/linux-testgen/testvector-generation/checkpoint.gdb @@ -1,4 +1,4 @@ -define createCheckpoint +define genCheckpoint # GDB config set pagination off set logging overwrite on @@ -11,24 +11,32 @@ define createCheckpoint # QEMU Config maintenance packet Qqemu.PhyMemMode:1 - # Argument Parsing - set $statePath=$arg1 - set $ramPath=$arg1 - eval "set $statePath = \"%s/stateGDB.txt\"", $statePath - eval "set $ramPath = \"%s/ramGDB.txt\"", $ramPath - # Symbol file file ../buildroot-image-output/vmlinux + # Argument Parsing + set $tcpPort=$arg0 + set $instrCount=$arg1 + set $statePath=$arg2 + set $ramPath=$arg3 + set $checkPC=$arg4 + set $checkPCoccurences=$arg5 + eval "set $statePath = \"%s/stateGDB.txt\"", $statePath + eval "set $ramPath = \"%s/ramGDB.txt\"", $ramPath + + # Step over reset vector into actual code - stepi 1000 + stepi 100 # Set breakpoint for where to stop b do_idle # Proceed to checkpoint - printf "GDB proceeding to checkpoint at %d instrs\n", $arg0 - stepi $arg0-1000 + printf "GDB proceeding to checkpoint at %d instrs\n", $instrCount + #stepi $instrCount-1000 + b *$checkPC + ignore 2 $checkPCoccurences + c - printf "Reached checkpoint at %d instrs\n", $arg0 + printf "Reached checkpoint at %d instrs\n", $instrCount # Log all registers to a file printf "GDB storing state to %s\n", $statePath diff --git a/wally-pipelined/linux-testgen/testvector-generation/gdbinit_debug b/wally-pipelined/linux-testgen/testvector-generation/gdbinit_debug index 1b25fbda6..621db22b9 100644 --- a/wally-pipelined/linux-testgen/testvector-generation/gdbinit_debug +++ b/wally-pipelined/linux-testgen/testvector-generation/gdbinit_debug @@ -1,12 +1,18 @@ set pagination off file ../buildroot-image-output/fw_jump.elf +file ../buildroot-image-output/vmlinux target extended-remote :1237 b *0x80200040 c -file ../buildroot-image-output/vmlinux +#del 1 +#stepi 500 #b irqchip_plic_warm_init #c #b plic_init #c -b do_idle -c +#b do_idle +#c +#b *0xffffffff80202e58 +#ignore 2 87 +#c +#del 2 diff --git a/wally-pipelined/linux-testgen/testvector-generation/gdbinit_qemulog b/wally-pipelined/linux-testgen/testvector-generation/gdbinit_qemulog deleted file mode 100755 index bb6e2115d..000000000 --- a/wally-pipelined/linux-testgen/testvector-generation/gdbinit_qemulog +++ /dev/null @@ -1,11 +0,0 @@ -set pagination off -target extended-remote :1236 -file ../buildroot-image-output/vmlinux -stepi 1000 -b do_idle -ignore 1 2 -c -# using 3 continues didn't work because the first breakpoint hit causes a pipe break error -set confirm off -kill -q diff --git a/wally-pipelined/linux-testgen/testvector-generation/genCheckpoint.gdb b/wally-pipelined/linux-testgen/testvector-generation/genCheckpoint.gdb new file mode 100755 index 000000000..8c2e316ef --- /dev/null +++ b/wally-pipelined/linux-testgen/testvector-generation/genCheckpoint.gdb @@ -0,0 +1,56 @@ +define genCheckpoint + # GDB config + set pagination off + set logging overwrite on + set logging redirect on + set confirm off + + # Argument Parsing + set $tcpPort=$arg0 + set $instrCount=$arg1 + set $statePath=$arg2 + set $ramPath=$arg3 + set $checkPC=$arg4 + set $checkPCoccurences=$arg5 + eval "set $statePath = \"%s/stateGDB.txt\"", $statePath + eval "set $ramPath = \"%s/ramGDB.txt\"", $ramPath + + # Connect to QEMU session + eval "target extended-remote :%d",$tcpPort + + # QEMU Config + maintenance packet Qqemu.PhyMemMode:1 + + # Symbol file + file ../buildroot-image-output/vmlinux + + # Step over reset vector into actual code + stepi 100 + # Set breakpoint for where to stop + b do_idle + # Proceed to checkpoint + printf "GDB proceeding to checkpoint at %d instrs\n", $instrCount + #stepi $instrCount-1000 + b *$checkPC + ignore 2 $checkPCoccurences + c + + printf "Reached checkpoint at %d instrs\n", $instrCount + + # Log all registers to a file + printf "GDB storing state to %s\n", $statePath + eval "set logging file %s", $statePath + set logging on + info all-registers + set logging off + + # Log main memory to a file + printf "GDB storing RAM to %s\n", $ramPath + eval "set logging file %s", $ramPath + set logging on + x/134217728xb 0x80000000 + set logging off + + kill + q +end diff --git a/wally-pipelined/linux-testgen/testvector-generation/genCheckpoint.sh b/wally-pipelined/linux-testgen/testvector-generation/genCheckpoint.sh new file mode 100755 index 000000000..cfdeffae2 --- /dev/null +++ b/wally-pipelined/linux-testgen/testvector-generation/genCheckpoint.sh @@ -0,0 +1,39 @@ +#!/bin/bash + +source genSettings.sh +tcpPort=1236 + +instrs=8500000 +checkOutDir="$outDir/checkpoint$instrs" +checkIntermedDir="$checkOutDir/intermediate-outputs" + + +read -p "This scripts is going to create a checkpoint at $instrs instrs. +Is that what you wanted? (y/n) " -n 1 -r +echo +if [[ $REPLY =~ ^[Yy]$ ]] +then + mkdir -p $checkOutDir + mkdir -p $checkIntermedDir + instr=$(sed "${instrs}q;d" "../linux-testvectors/all.txt") + echo "Found ${instrs}th instr: ${instr}." + pc=$(echo $instr | cut -d " " -f1) + asm=$(echo $instr | cut -d " " -f2) + occurences=$(($(head -$instrs "../linux-testvectors/all.txt" | grep -c "${pc} ${asm}")-1)) + echo "It occurs ${occurences} times before the ${instrs}th instr." + # Simulate QEMU, parse QEMU trace, run GDB script which logs a bunch of data at the checkpoint + ($customQemu \ + -M virt \ + -nographic \ + -bios $imageDir/fw_jump.elf -kernel $imageDir/Image -append "root=/dev/vda ro" -initrd $imageDir/rootfs.cpio \ + -singlestep -rtc clock=vm -icount shift=1,align=off,sleep=on,rr=replay,rrfile="$intermedDir/$recordFile" \ + -gdb tcp::$tcpPort -S) \ + & riscv64-unknown-elf-gdb -quiet -x genCheckpoint.gdb -ex "genCheckpoint $tcpPort $instrs \"$checkIntermedDir\" 0x$pc $occurences" + # Post-Process GDB outputs + ./parseState.py "$checkOutDir" + ./fix_mem.py "$intermedDir/ramGDB.txt" "$checkOutDir/ram.txt" + tail -n+$(($instrs-9)) "$outDir/$traceFile" > "$checkOutDir/$traceFile" +else + echo "You can change the number of instructions by editing the \"instrs\" variable in this script." + echo "Have a nice day!" +fi diff --git a/wally-pipelined/linux-testgen/testvector-generation/genInitMem.gdb b/wally-pipelined/linux-testgen/testvector-generation/genInitMem.gdb new file mode 100755 index 000000000..f4a776fde --- /dev/null +++ b/wally-pipelined/linux-testgen/testvector-generation/genInitMem.gdb @@ -0,0 +1,44 @@ +define genInitMem + # GDB config + set pagination off + set logging overwrite on + set logging redirect on + set confirm off + + # Argument Parsing + set $tcpPort=$arg0 + set $bootmemPath=$arg1 + set $untrimmedBootmemPath=$arg1 + set $ramPath=$arg1 + eval "set $bootmemPath = \"%s/bootmemGDB.txt\"", $bootmemPath + eval "set $untrimmedBootmemPath = \"%s/untrimmedBootmemGDB.txt\"", $untrimmedBootmemPath + eval "set $ramPath = \"%s/ramGDB.txt\"", $ramPath + + # Connect to QEMU session + eval "target extended-remote :%d",$tcpPort + + # QEMU Config + maintenance packet Qqemu.PhyMemMode:1 + + printf "Creating %s\n",$bootmemPath + eval "set logging file %s", $bootmemPath + set logging on + x/4096xb 0x1000 + set logging off + + printf "Creating %s\n",$untrimmedBootmemPath + printf "Warning - please verify that the second half of %s is all 0s\n",$untrimmedBootmemPath + eval "set logging file %s", $untrimmedBootmemPath + set logging on + x/8192xb 0x1000 + set logging off + + printf "Creating %s\n", $ramPath + eval "set logging file %s", $ramPath + set logging on + x/134217728xb 0x80000000 + set logging off + + kill + q +end diff --git a/wally-pipelined/linux-testgen/testvector-generation/genInitMem.sh b/wally-pipelined/linux-testgen/testvector-generation/genInitMem.sh new file mode 100755 index 000000000..56b30a45e --- /dev/null +++ b/wally-pipelined/linux-testgen/testvector-generation/genInitMem.sh @@ -0,0 +1,27 @@ +#!/bin/bash + +source genSettings.sh +tcpPort=1235 + +read -p "Warning: running this script will overwrite the contents of memory dumps needed for simulation. +Would you like to proceed? (y/n) " -n 1 -r +echo +if [[ $REPLY =~ ^[Yy]$ ]] +then + ($customQemu \ + -M virt \ + -nographic \ + -bios $imageDir/fw_jump.elf -kernel $imageDir/Image -append "root=/dev/vda ro" -initrd $imageDir/rootfs.cpio \ + -gdb tcp::$tcpPort -S 2>/dev/null >/dev/null) \ + & riscv64-unknown-elf-gdb -quiet -x genInitMem.gdb -ex "genInitMem $tcpPort \"$intermedDir\"" + + echo "Translating Mem from GDB to Questa format" + ./fix_mem.py "$intermedDir/bootmemGDB.txt" "$outDir/bootmem.txt" + ./fix_mem.py "$intermedDir/ramGDB.txt" "$outDir/ram.txt" + echo "Done" + + echo "Creating debugging objdump of linux image" + riscv64-unknown-elf-objdump -D $imageDir/vmlinux > $outDir/vmlinux.objdump + extractFunctionRadix.sh $outDir/vmlinux.objdump + echo "Done" +fi diff --git a/wally-pipelined/linux-testgen/testvector-generation/genSettings.sh b/wally-pipelined/linux-testgen/testvector-generation/genSettings.sh new file mode 100755 index 000000000..57bd77659 --- /dev/null +++ b/wally-pipelined/linux-testgen/testvector-generation/genSettings.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +# Warning! This is Tera-specific absolute path +# *** on the long term we'll want to include QEMU in the addins folder +export customQemu="/courses/e190ax/qemu_sim/rv64_initrd/qemu_experimental/qemu/build/qemu-system-riscv64" +export imageDir="../buildroot-image-output" +export outDir="../linux-testvectors-experimental" +export intermedDir="$outDir/intermediate-outputs" +export traceFile="all.txt" +export recordFile="all.qemu" +export tcpPort=1234 diff --git a/wally-pipelined/linux-testgen/testvector-generation/genTrace.gdb b/wally-pipelined/linux-testgen/testvector-generation/genTrace.gdb new file mode 100755 index 000000000..847469121 --- /dev/null +++ b/wally-pipelined/linux-testgen/testvector-generation/genTrace.gdb @@ -0,0 +1,24 @@ +define genTrace + # Arguments + set $tcpPort=$arg0 + + # GDB config + set pagination off + set logging overwrite on + set logging redirect on + set confirm off + + # Connect to QEMU session + eval "target extended-remote :%d",$tcpPort + + # Symbol Files + file ../buildroot-image-output/vmlinux + + # Run until Linux login prompt + b do_idle + ignore 1 2 + c + + kill + q +emd diff --git a/wally-pipelined/linux-testgen/testvector-generation/genTrace.sh b/wally-pipelined/linux-testgen/testvector-generation/genTrace.sh new file mode 100755 index 000000000..4f2bae4c4 --- /dev/null +++ b/wally-pipelined/linux-testgen/testvector-generation/genTrace.sh @@ -0,0 +1,24 @@ +#!/bin/bash +source genSettings.sh +tcpPort=1234 + +read -p "Warning: running this script will overwrite the contents of: + $outDir/$traceFile + $outDir/$recordFile +Would you like to proceed? (y/n) " -n 1 -r +echo +if [[ $REPLY =~ ^[Yy]$ ]] +then + mkdir -p $outDir + mkdir -p $intermedDir + ($customQemu \ + -M virt \ + -nographic -serial /dev/null \ + -bios $imageDir/fw_jump.elf -kernel $imageDir/Image -append "root=/dev/vda ro" -initrd $imageDir/rootfs.cpio \ + -singlestep -rtc clock=vm -icount shift=1,align=off,sleep=on,rr=record,rrfile="$intermedDir/$recordFile" \ + -d nochain,cpu,in_asm \ + -gdb tcp::$tcpPort -S \ + 2>&1 >/dev/null | ./parseQemuToGDB.py | ./parseGDBtoTrace.py | ./remove_dup.awk > "$outDir/$traceFile") \ + & riscv64-unknown-elf-gdb -quiet -x genTrace.gdb -ex "genTrace $tcpPort" +fi + diff --git a/wally-pipelined/linux-testgen/testvector-generation/logBuildrootMem.sh b/wally-pipelined/linux-testgen/testvector-generation/logBuildrootMem.sh deleted file mode 100755 index a1ff42544..000000000 --- a/wally-pipelined/linux-testgen/testvector-generation/logBuildrootMem.sh +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/bash - -# use on tera. -customQemu="/courses/e190ax/qemu_sim/rv64_initrd/qemu_experimental/qemu/build/qemu-system-riscv64" -# use on other systems -#customQemu="qemu-system-riscv64" - -imageDir="../buildroot-image-output" -testVecDir="../linux-testvectors" - -read -p "Warning: running this script will overwrite the contents of memory dumps needed for simulation. -Would you like to proceed? (y/n) " -n 1 -r -echo -if [[ $REPLY =~ ^[Yy]$ ]] -then - ($customQemu -M virt -nographic -bios $imageDir/fw_jump.elf -kernel $imageDir/Image -append "root=/dev/vda ro" -initrd $imageDir/rootfs.cpio -d nochain,cpu,in_asm -serial /dev/null -singlestep -gdb tcp::1235 -S 2>/dev/null >/dev/null) & - riscv64-unknown-elf-gdb -x gdbinit_mem - echo "Translating Mem from GDB to Questa format" - ./fix_mem.py "$testVecDir/intermediate-outputs/bootmemGDB.txt" "$testVecDir/bootmem.txt" - ./fix_mem.py "$testVecDir/intermediate-outputs/ramGDB.txt" "$testVecDir/ram.txt" - echo "Done" - - echo "Creating debugging objdump of linux image" - - riscv64-unknown-elf-objdump -D $imageDir/vmlinux > $testVecDir/vmlinux.objdump - extractFunctionRadix.sh $testVecDir/vmlinux.objdump - echo "Done" -fi diff --git a/wally-pipelined/linux-testgen/testvector-generation/parseNew.py b/wally-pipelined/linux-testgen/testvector-generation/parseGDBtoTrace.py similarity index 100% rename from wally-pipelined/linux-testgen/testvector-generation/parseNew.py rename to wally-pipelined/linux-testgen/testvector-generation/parseGDBtoTrace.py diff --git a/wally-pipelined/linux-testgen/testvector-generation/parse_qemu.py b/wally-pipelined/linux-testgen/testvector-generation/parseQemuToGDB.py similarity index 99% rename from wally-pipelined/linux-testgen/testvector-generation/parse_qemu.py rename to wally-pipelined/linux-testgen/testvector-generation/parseQemuToGDB.py index 023a0e14f..eb3393ac4 100755 --- a/wally-pipelined/linux-testgen/testvector-generation/parse_qemu.py +++ b/wally-pipelined/linux-testgen/testvector-generation/parseQemuToGDB.py @@ -110,6 +110,7 @@ def parseRegs(l): # Main Code # ############# for l in fileinput.input(): + #sys.stderr.write(l) if l.startswith('qemu-system-riscv64: QEMU: Terminated via GDBstub'): break elif l.startswith('IN:'): diff --git a/wally-pipelined/linux-testgen/testvector-generation/parseState.py b/wally-pipelined/linux-testgen/testvector-generation/parseState.py index 50b80782b..9a2173b04 100755 --- a/wally-pipelined/linux-testgen/testvector-generation/parseState.py +++ b/wally-pipelined/linux-testgen/testvector-generation/parseState.py @@ -34,7 +34,7 @@ stateGDBpath = outDir+'intermediate-outputs/stateGDB.txt' if not os.path.exists(stateGDBpath): sys.exit('Error input file '+stateGDBpath+'not found') -singleCSRs = ['mip','mie','mscratch','mcause','mepc','mtvec','medeleg','mideleg','sscratch','scause','sepc','stvec','sedeleg','sideleg','satp','mstatus'] +singleCSRs = ['pc','mip','mie','mscratch','mcause','mepc','mtvec','medeleg','mideleg','sscratch','scause','sepc','stvec','sedeleg','sideleg','satp','mstatus'] thirtyTwoBitCSRs = ['mcounteren','scounteren'] listCSRs = ['hpmcounter','pmpaddr'] pmpcfg = ['pmpcfg'] @@ -90,7 +90,7 @@ with open(stateGDBpath, 'r') as stateGDB: outFileName = 'checkpoint-'+name.upper().strip('0123456789') outFile = open(outDir+outFileName, 'a') fourPmp = int(val,16) - for i in range(4): + for i in range(3,-1,-1): byte = (fourPmp >> 4*i) & 0xf outFile.write(hex(byte)[2:]+'\n') outFile.close() From dcd4d9dd9fdcb0a3178c1ad83fe00dd8f913398f Mon Sep 17 00:00:00 2001 From: bbracker Date: Sun, 24 Oct 2021 06:47:35 -0700 Subject: [PATCH 030/132] add checkpointing to linux testbench --- wally-pipelined/src/privileged/csr.sv | 3 +- wally-pipelined/src/privileged/csrc.sv | 3 +- wally-pipelined/src/privileged/csrsr.sv | 4 +- wally-pipelined/testbench/testbench-linux.sv | 191 +++++++++++++++++-- 4 files changed, 178 insertions(+), 23 deletions(-) diff --git a/wally-pipelined/src/privileged/csr.sv b/wally-pipelined/src/privileged/csr.sv index b995a3bbf..a14c2c7a6 100644 --- a/wally-pipelined/src/privileged/csr.sv +++ b/wally-pipelined/src/privileged/csr.sv @@ -63,7 +63,8 @@ module csr #(parameter output logic STATUS_MIE, STATUS_SIE, output logic STATUS_MXR, STATUS_SUM, STATUS_MPRV, STATUS_TW, output var logic [7:0] PMPCFG_ARRAY_REGW[`PMP_ENTRIES-1:0], - output var logic [`XLEN-1:0] PMPADDR_ARRAY_REGW [`PMP_ENTRIES-1:0], + output var logic [`XLEN-1:0] PMPADDR_ARRAY_REGW[`PMP_ENTRIES-1:0], + input logic [4:0] SetFflagsM, output logic [2:0] FRM_REGW, // output logic [11:0] MIP_REGW, SIP_REGW, UIP_REGW, MIE_REGW, SIE_REGW, UIE_REGW, diff --git a/wally-pipelined/src/privileged/csrc.sv b/wally-pipelined/src/privileged/csrc.sv index 3b1e544d7..e0148f298 100644 --- a/wally-pipelined/src/privileged/csrc.sv +++ b/wally-pipelined/src/privileged/csrc.sv @@ -103,7 +103,8 @@ module csrc #(parameter logic WriteCYCLEM, WriteINSTRETM; logic WriteHPMCOUNTER3M, WriteHPMCOUNTER4M; logic [4:0] CounterNumM; - logic [`COUNTERS-1:3][`XLEN-1:0] HPMCOUNTER_REGW, HPMCOUNTERH_REGW; + logic [`XLEN-1:0] HPMCOUNTER_REGW [`COUNTERS-1:3]; + logic [`XLEN-1:0] HPMCOUNTERH_REGW [`COUNTERS-1:3]; logic InstrValidNotFlushedM; assign InstrValidNotFlushedM = InstrValidM & ~StallW & ~FlushW; diff --git a/wally-pipelined/src/privileged/csrsr.sv b/wally-pipelined/src/privileged/csrsr.sv index dfa2132d9..08bcea312 100644 --- a/wally-pipelined/src/privileged/csrsr.sv +++ b/wally-pipelined/src/privileged/csrsr.sv @@ -51,7 +51,7 @@ module csrsr ( // Lower privilege status registers are a subset of the full status register // *** consider adding MBE, SBE, UBE fields later from 20210108 draft spec generate - if (`XLEN==64) begin// RV64 + if (`XLEN==64) begin: csrsr64 // RV64 assign MSTATUS_REGW = {STATUS_SD, 27'b0, STATUS_SXL, STATUS_UXL, 9'b0, STATUS_TSR, STATUS_TW, STATUS_TVM, STATUS_MXR, STATUS_SUM, STATUS_MPRV, STATUS_XS, STATUS_FS, STATUS_MPP, 2'b0, @@ -67,7 +67,7 @@ module csrsr ( /* STATUS_XS, STATUS_FS, /*STATUS_MPP, 8'b0, */ /*STATUS_SPP, STATUS_MPIE, 1'b0 2'b0, STATUS_SPIE,*/ STATUS_UPIE, /*STATUS_MIE, 1'b0*/ 3'b0, /*STATUS_SIE, */STATUS_UIE}; - end else begin// RV32 + end else begin: csrsr32 // RV32 assign MSTATUS_REGW = {STATUS_SD, 8'b0, STATUS_TSR, STATUS_TW, STATUS_TVM, STATUS_MXR, STATUS_SUM, STATUS_MPRV, STATUS_XS, STATUS_FS, STATUS_MPP, 2'b0, diff --git a/wally-pipelined/testbench/testbench-linux.sv b/wally-pipelined/testbench/testbench-linux.sv index 76a1841b8..06ad07fb6 100644 --- a/wally-pipelined/testbench/testbench-linux.sv +++ b/wally-pipelined/testbench/testbench-linux.sv @@ -27,7 +27,7 @@ `include "wally-config.vh" -`define DEBUG_TRACE 0 +`define DEBUG_TRACE 2 // Debug Levels // 0: don't check against QEMU // 1: print disagreements with QEMU, but only halt on PCW disagreements @@ -35,10 +35,16 @@ // 3: halt on all disagreements with QEMU // 4: print memory accesses whenever they happen // 5: print everything +// +// uncomment the following line to activate checkpoint +`define CHECKPOINT 8500000 +`ifdef CHECKPOINT + `define CHECKPOINT_DIR {`LINUX_TEST_VECTORS, "checkpoint", `"`CHECKPOINT`", "/"} +`endif module testbench(); - - parameter waveOnICount = `BUSYBEAR*140000 + `BUILDROOT*8700000; // # of instructions at which to turn on waves in graphical sim + + parameter waveOnICount = `BUSYBEAR*140000 + `BUILDROOT*0; // # of instructions at which to turn on waves in graphical sim string ProgramAddrMapFile, ProgramLabelMapFile; /////////////////////////////////////////////////////////////////////////////// @@ -91,9 +97,8 @@ module testbench(); // Write Back trace signals logic checkInstrW; - //integer RegAdr; - integer fault; - logic TrapW; + integer fault; + logic TrapW; // Signals used to parse the trace file. logic checkInstrM; @@ -141,7 +146,6 @@ module testbench(); // ------ // Macros // ------ - `define CSRwarn(CSR) \ begin \ $display("CSR: %s = %016x, expected = %016x", ExpectedCSRArrayW[NumCSRPostWIndex], CSR, ExpectedCSRArrayValueW[NumCSRPostWIndex]); \ @@ -158,14 +162,21 @@ module testbench(); end initial begin - data_file_all = $fopen({`LINUX_TEST_VECTORS,"all.txt"}, "r"); - InstrCountW = '0; + `ifdef CHECKPOINT + data_file_all = $fopen({`CHECKPOINT_DIR,"all.txt"}, "r"); + `else + data_file_all = $fopen({`LINUX_TEST_VECTORS,"all.txt"}, "r"); + `endif + `ifdef CHECKPOINT + InstrCountW = `CHECKPOINT; + `else + InstrCountW = '0; + `endif force dut.hart.priv.SwIntM = 0; force dut.hart.priv.TimerIntM = 0; force dut.hart.priv.ExtIntM = 0; end - assign checkInstrM = dut.hart.ieu.InstrValidM & ~dut.hart.priv.trap.InstrPageFaultM & ~dut.hart.priv.trap.InterruptM & ~dut.hart.StallM; assign checkInstrW = dut.hart.ieu.InstrValidW & ~dut.hart.StallW; // trapW will already be invalid in there was an InstrPageFault in the previous instruction. @@ -345,7 +356,7 @@ module testbench(); end if (RegWriteW == "GPR") begin `checkEQ("Reg Write Address",dut.hart.ieu.dp.regf.a3,ExpectedRegAdrW) - $sprintf(name,"RF[%02d]",ExpectedRegAdrW); + $sformat(name,"RF[%02d]",ExpectedRegAdrW); `checkEQ(name, dut.hart.ieu.dp.regf.rf[ExpectedRegAdrW], ExpectedRegValueW) end if (MemOpW.substr(0,2) == "Mem") begin @@ -394,21 +405,163 @@ module testbench(); .ProgramLabelMapFile(ProgramLabelMapFile)); - /////////////////////////////////////////////////////////////////////////////// - //////////////////////////////// Testbench Core /////////////////////////////// - /////////////////////////////////////////////////////////////////////////////// - + /////////////////////////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////// Testbench Core ///////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////////////////////////// // -------------- // Initialization // -------------- - initial - begin - reset <= 1; # 22; reset <= 0; + /*`ifdef CHECKPOINT + var [`XLEN-1:0] initRF[31:1]; + var [`COUNTERS-1:3][`XLEN-1:0] initHPMCOUNTER; + var [7:0][`PMP_ENTRIES-1:0] initPMPCFG; + var [`XLEN-1:0][`PMP_ENTRIES-1:0] initPMPADDR; + var initMIDELEG, initMCAUSE, initMCOUNTEREN, initMEDELEG, initMEPC, initMTVEC, initMIE, + initMIP, initMSCRATCH, initMSTATUS, initSCAUSE, initSSCRATCH, initSATP, initSCOUNTEREN, + initSEPC, initSTVEC; + + `endif*/ + `ifdef CHECKPOINT + `define RF dut.hart.ieu.dp.regf.rf + `define PC dut.hart.ifu.pcreg.q + `define CSR_BASE dut.hart.priv.csr.genblk1 + `define HPMCOUNTER `CSR_BASE.counters.genblk1.HPMCOUNTER_REGW + `define PMP_BASE `CSR_BASE.csrm.genblk4 + `define PMPCFG genblk2.PMPCFGreg.q + `define PMPADDR PMPADDRreg.q + `define MEDELEG `CSR_BASE.csrm.genblk1.MEDELEGreg.q + `define MIDELEG `CSR_BASE.csrm.genblk1.MIDELEGreg.q + `define MIE `CSR_BASE.csri.MIE_REGW + `define MIP `CSR_BASE.csri.MIP_REGW + `define MCAUSE `CSR_BASE.csrm.MCAUSEreg.q + `define SCAUSE `CSR_BASE.csrs.genblk1.SCAUSEreg.q + `define MEPC `CSR_BASE.csrm.MEPCreg.q + `define SEPC `CSR_BASE.csrs.genblk1.SEPCreg.q + `define MCOUNTEREN `CSR_BASE.csrm.genblk3.MCOUNTERENreg.q + `define SCOUNTEREN `CSR_BASE.csrs.genblk1.genblk3.SCOUNTERENreg.q + `define MSCRATCH `CSR_BASE.csrm.MSCRATCHreg.q + `define SSCRATCH `CSR_BASE.csrs.genblk1.SSCRATCHreg.q + `define MTVEC `CSR_BASE.csrm.MTVECreg.q + `define STVEC `CSR_BASE.csrs.genblk1.STVECreg.q + `define SATP `CSR_BASE.csrs.genblk1.genblk2.SATPreg.q + `define MSTATUS `CSR_BASE.csrsr.MSTATUS_REGW + `define STATUS_TSR `CSR_BASE.csrsr.STATUS_TSR_INT + `define STATUS_TW `CSR_BASE.csrsr.STATUS_TW_INT + `define STATUS_TVM `CSR_BASE.csrsr.STATUS_TVM_INT + `define STATUS_MXR `CSR_BASE.csrsr.STATUS_MXR_INT + `define STATUS_SUM `CSR_BASE.csrsr.STATUS_SUM_INT + `define STATUS_MPRV `CSR_BASE.csrsr.STATUS_MPRV_INT + `define STATUS_FS `CSR_BASE.csrsr.STATUS_FS_INT + `define STATUS_MPP `CSR_BASE.csrsr.STATUS_MPP + `define STATUS_SPP `CSR_BASE.csrsr.STATUS_SPP + `define STATUS_MPIE `CSR_BASE.csrsr.STATUS_MPIE + `define STATUS_SPIE `CSR_BASE.csrsr.STATUS_SPIE + `define STATUS_UPIE `CSR_BASE.csrsr.STATUS_UPIE + `define STATUS_MIE `CSR_BASE.csrsr.STATUS_MIE + `define STATUS_SIE `CSR_BASE.csrsr.STATUS_SIE + `define STATUS_UIE `CSR_BASE.csrsr.STATUS_UIE + `define CURR_PRIV dut.hart.priv.privmodereg.q + `define INSTRET dut.hart.priv.csr.genblk1.counters.genblk1.genblk2.INSTRETreg.q + + `define INIT_CHECKPOINT_VAL(SIGNAL_BASE,SIGNAL,DIM,LARGE_INDEX,SMALL_INDEX) \ + logic DIM init``SIGNAL [LARGE_INDEX:SMALL_INDEX]; \ + initial $readmemh({`CHECKPOINT_DIR,"checkpoint-",`"SIGNAL`"}, init``SIGNAL); \ + for (i=SMALL_INDEX; i> 3); - $readmemh({`LINUX_TEST_VECTORS,"ram.txt"}, dut.uncore.dtim.RAM); + `ifdef CHECKPOINT + $readmemh({`CHECKPOINT_DIR,"ram.txt"}, dut.uncore.dtim.RAM); + `else + + $readmemh({`LINUX_TEST_VECTORS,"ram.txt"}, dut.uncore.dtim.RAM); + `endif $readmemb(`TWO_BIT_PRELOAD, dut.hart.ifu.bpred.bpred.Predictor.DirPredictor.PHT.memory); $readmemb(`BTB_PRELOAD, dut.hart.ifu.bpred.bpred.TargetPredictor.memory.memory); ProgramAddrMapFile = {`LINUX_TEST_VECTORS,"vmlinux.objdump.addr"}; From 23bff55c6eefb14be5ceb46bb2f3817bbba2f162 Mon Sep 17 00:00:00 2001 From: bbracker Date: Sun, 24 Oct 2021 06:50:22 -0700 Subject: [PATCH 031/132] increase regression's expectations of buildroot --- wally-pipelined/regression/regression-wally.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wally-pipelined/regression/regression-wally.py b/wally-pipelined/regression/regression-wally.py index bd703a017..ff119b3b2 100755 --- a/wally-pipelined/regression/regression-wally.py +++ b/wally-pipelined/regression/regression-wally.py @@ -32,7 +32,7 @@ configs = [ ] def getBuildrootTC(short): INSTR_LIMIT = 100000 # multiple of 100000 - MAX_EXPECTED = 6.3e6 + MAX_EXPECTED = 8700000 if short: BRcmd="vsim > {} -c < Date: Sun, 24 Oct 2021 06:59:34 -0700 Subject: [PATCH 032/132] or actually needed to reduce expectations of buildroot --- wally-pipelined/regression/regression-wally.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wally-pipelined/regression/regression-wally.py b/wally-pipelined/regression/regression-wally.py index ff119b3b2..c04941a0e 100755 --- a/wally-pipelined/regression/regression-wally.py +++ b/wally-pipelined/regression/regression-wally.py @@ -32,7 +32,7 @@ configs = [ ] def getBuildrootTC(short): INSTR_LIMIT = 100000 # multiple of 100000 - MAX_EXPECTED = 8700000 + MAX_EXPECTED = 3000000 if short: BRcmd="vsim > {} -c < Date: Sun, 24 Oct 2021 15:04:20 -0500 Subject: [PATCH 033/132] Partial cleanup of unused signals in caches and bpred. --- wally-pipelined/src/cache/cacheway.sv | 12 ++--- wally-pipelined/src/cache/dcache.sv | 7 +-- wally-pipelined/src/cache/icache.sv | 54 ++++++++----------- wally-pipelined/src/cache/icachefsm.sv | 20 +------ wally-pipelined/src/ifu/BTBPredictor.sv | 13 +---- wally-pipelined/src/ifu/bpred.sv | 10 +--- .../src/ifu/globalHistoryPredictor.sv | 2 +- wally-pipelined/src/ifu/gsharePredictor.sv | 2 +- .../src/ifu/localHistoryPredictor.sv | 2 +- wally-pipelined/src/lsu/lsu.sv | 3 +- wally-pipelined/src/lsu/lsuArb.sv | 4 +- 11 files changed, 40 insertions(+), 89 deletions(-) diff --git a/wally-pipelined/src/cache/cacheway.sv b/wally-pipelined/src/cache/cacheway.sv index ad6b980d3..242d596f8 100644 --- a/wally-pipelined/src/cache/cacheway.sv +++ b/wally-pipelined/src/cache/cacheway.sv @@ -34,7 +34,7 @@ module cacheway #(parameter NUMLINES=512, parameter BLOCKLEN = 256, TAGLEN = 26, input logic [$clog2(NUMLINES)-1:0] WAdr, input logic [`PA_BITS-1:0] PAdr, input logic WriteEnable, - input logic VDWriteEnable, + input logic VDWriteEnable, input logic [BLOCKLEN/`XLEN-1:0] WriteWordEnable, input logic TagWriteEnable, input logic [BLOCKLEN-1:0] WriteData, @@ -54,7 +54,8 @@ module cacheway #(parameter NUMLINES=512, parameter BLOCKLEN = 256, TAGLEN = 26, output logic [TAGLEN-1:0] VictimTagWay ); - logic [NUMLINES-1:0] ValidBits, DirtyBits; + logic [NUMLINES-1:0] ValidBits; + logic [NUMLINES-1:0] DirtyBits; logic [BLOCKLEN-1:0] ReadDataBlockWay; logic [TAGLEN-1:0] ReadTag; logic Valid; @@ -117,21 +118,18 @@ module cacheway #(parameter NUMLINES=512, parameter BLOCKLEN = 256, TAGLEN = 26, generate if(DIRTY_BITS) begin + always_ff @(posedge clk, posedge reset) begin if (reset) DirtyBits <= {NUMLINES{1'b0}}; else if (SetDirty & (WriteEnable | VDWriteEnable)) DirtyBits[WAdr] <= 1'b1; else if (ClearDirty & (WriteEnable | VDWriteEnable)) DirtyBits[WAdr] <= 1'b0; end - end - endgenerate - // Since this is always updated on a clock edge we cannot include reset. - generate - if(DIRTY_BITS) begin always_ff @(posedge clk) begin Dirty <= DirtyBits[RAdr]; end + end else begin assign Dirty = 1'b0; end diff --git a/wally-pipelined/src/cache/dcache.sv b/wally-pipelined/src/cache/dcache.sv index a61a5accc..bf943169c 100644 --- a/wally-pipelined/src/cache/dcache.sv +++ b/wally-pipelined/src/cache/dcache.sv @@ -70,14 +70,9 @@ module dcache output logic [2:0] DCtoAHBSizeM ); -/* localparam integer BLOCKLEN = 256; - localparam integer NUMLINES = 64; - localparam integer NUMWAYS = 4; - localparam integer NUMREPL_BITS = 3;*/ localparam integer BLOCKLEN = `DCACHE_BLOCKLENINBITS; localparam integer NUMLINES = `DCACHE_WAYSIZEINBYTES*8/BLOCKLEN; localparam integer NUMWAYS = `DCACHE_NUMWAYS; - localparam integer NUMREPL_BITS = `DCACHE_REPLBITS; // *** not used localparam integer BLOCKBYTELEN = BLOCKLEN/8; localparam integer OFFSETLEN = $clog2(BLOCKBYTELEN); @@ -170,7 +165,7 @@ module dcache .reset, .RAdr, .WAdr, - .PAdr(MemPAdrM[`PA_BITS-1:0]), + .PAdr(MemPAdrM), .WriteEnable(SRAMWayWriteEnable), .VDWriteEnable, .WriteWordEnable(SRAMWordEnable), diff --git a/wally-pipelined/src/cache/icache.sv b/wally-pipelined/src/cache/icache.sv index f1c0b29ff..d433f6ed3 100644 --- a/wally-pipelined/src/cache/icache.sv +++ b/wally-pipelined/src/cache/icache.sv @@ -65,16 +65,12 @@ module icache localparam LOGWPL = $clog2(WORDSPERLINE); localparam FetchCountThreshold = WORDSPERLINE - 1; - localparam BlockByteLength = BLOCKLEN / 8; - - localparam OFFSETWIDTH = $clog2(BlockByteLength); localparam integer PA_WIDTH = `PA_BITS - 2; localparam integer NUMWAYS = `ICACHE_NUMWAYS; // Input signals to cache memory - logic FlushMem; logic ICacheMemWriteEnable; logic [BLOCKLEN-1:0] ICacheMemWriteData; logic [`PA_BITS-1:0] PCTagF; @@ -91,7 +87,7 @@ module icache logic FetchCountFlag; logic CntEn; - logic [1:0] SelAdr_q; + logic [1:1] SelAdr_q; logic [LOGWPL-1:0] FetchCount, NextFetchCount; @@ -252,11 +248,11 @@ module icache // this mux needs to be delayed 1 cycle as it occurs 1 pipeline stage later. // *** read enable may not be necessary. - flopenr #(2) SelAdrReg(.clk(clk), + flopenr #(1) SelAdrReg(.clk(clk), .reset(reset), .en(ICacheReadEn), - .d(SelAdr), - .q(SelAdr_q)); + .d(SelAdr[1]), + .q(SelAdr_q[1])); assign PCTagF = SelAdr_q[1] ? PCPSpillF : PCPF; @@ -281,29 +277,25 @@ module icache assign SRAMWayWriteEnable = ICacheMemWriteEnable ? VictimWay : '0; - icachefsm #(.BLOCKLEN(BLOCKLEN)) - controller(.clk, - .reset, - .StallF, - .ICacheReadEn, - .ICacheMemWriteEnable, - .ICacheStallF, - .ITLBMissF, - .ITLBWriteF, - .WalkerInstrPageFaultF, - .InstrAckF, - .InstrReadF, - .hit, - .FetchCountFlag, - .spill, - .spillSave, - .CntEn, - .CntReset, - .SelAdr, - .LRUWriteEn - ); + icachefsm controller(.clk, + .reset, + .StallF, + .ICacheReadEn, + .ICacheMemWriteEnable, + .ICacheStallF, + .ITLBMissF, + .ITLBWriteF, + .WalkerInstrPageFaultF, + .InstrAckF, + .InstrReadF, + .hit, + .FetchCountFlag, + .spill, + .spillSave, + .CntEn, + .CntReset, + .SelAdr, + .LRUWriteEn); - // For now, assume no writes to executable memory - assign FlushMem = 1'b0; endmodule diff --git a/wally-pipelined/src/cache/icachefsm.sv b/wally-pipelined/src/cache/icachefsm.sv index 1d5ad0cd3..82590747d 100644 --- a/wally-pipelined/src/cache/icachefsm.sv +++ b/wally-pipelined/src/cache/icachefsm.sv @@ -25,9 +25,8 @@ `include "wally-config.vh" -module icachefsm #(parameter BLOCKLEN = 256) - ( - // Inputs from pipeline +module icachefsm + (// Inputs from pipeline input logic clk, reset, input logic StallF, @@ -115,8 +114,6 @@ module icachefsm #(parameter BLOCKLEN = 256) statetype CurrState, NextState; logic PreCntEn; - logic UnalignedSelect; - logic SavePC; // unused right now *** consider deleting // the FSM is always runing, do not stall. always_ff @(posedge clk, posedge reset) @@ -125,7 +122,6 @@ module icachefsm #(parameter BLOCKLEN = 256) // Next state logic always_comb begin - UnalignedSelect = 1'b0; CntReset = 1'b0; PreCntEn = 1'b0; //InstrReadF = 1'b0; @@ -133,7 +129,6 @@ module icachefsm #(parameter BLOCKLEN = 256) spillSave = 1'b0; SelAdr = 2'b00; ICacheReadEn = 1'b0; - SavePC = 1'b0; ICacheStallF = 1'b1; LRUWriteEn = 1'b0; case (CurrState) @@ -143,7 +138,6 @@ module icachefsm #(parameter BLOCKLEN = 256) if (ITLBMissF) begin NextState = STATE_TLB_MISS; end else if (hit & ~spill) begin - SavePC = 1'b1; ICacheStallF = 1'b0; LRUWriteEn = 1'b1; if(StallF) begin @@ -176,7 +170,6 @@ module icachefsm #(parameter BLOCKLEN = 256) // branch 1, hit spill and 2, miss spill hit STATE_HIT_SPILL: begin SelAdr = 2'b10; - UnalignedSelect = 1'b1; ICacheReadEn = 1'b1; if (hit) begin NextState = STATE_HIT_SPILL_FINAL; @@ -202,15 +195,12 @@ module icachefsm #(parameter BLOCKLEN = 256) end STATE_HIT_SPILL_MERGE: begin SelAdr = 2'b10; - UnalignedSelect = 1'b1; ICacheReadEn = 1'b1; NextState = STATE_HIT_SPILL_FINAL; end STATE_HIT_SPILL_FINAL: begin ICacheReadEn = 1'b1; SelAdr = 2'b00; - UnalignedSelect = 1'b1; - SavePC = 1'b1; ICacheStallF = 1'b0; LRUWriteEn = 1'b1; @@ -280,7 +270,6 @@ module icachefsm #(parameter BLOCKLEN = 256) end STATE_MISS_SPILL_2: begin SelAdr = 2'b10; - UnalignedSelect = 1'b1; spillSave = 1'b1; /// *** Could pipeline these to make it clearer in the fsm. ICacheReadEn = 1'b1; NextState = STATE_MISS_SPILL_2_START; @@ -292,8 +281,6 @@ module icachefsm #(parameter BLOCKLEN = 256) end else begin ICacheReadEn = 1'b1; SelAdr = 2'b00; - UnalignedSelect = 1'b1; - SavePC = 1'b1; ICacheStallF = 1'b0; LRUWriteEn = 1'b1; if(StallF) begin @@ -321,15 +308,12 @@ module icachefsm #(parameter BLOCKLEN = 256) end STATE_MISS_SPILL_MERGE: begin SelAdr = 2'b10; - UnalignedSelect = 1'b1; ICacheReadEn = 1'b1; NextState = STATE_MISS_SPILL_FINAL; end STATE_MISS_SPILL_FINAL: begin ICacheReadEn = 1'b1; SelAdr = 2'b00; - UnalignedSelect = 1'b1; - SavePC = 1'b1; ICacheStallF = 1'b0; LRUWriteEn = 1'b1; if(StallF) begin diff --git a/wally-pipelined/src/ifu/BTBPredictor.sv b/wally-pipelined/src/ifu/BTBPredictor.sv index 4b54c0bb7..07a39c162 100644 --- a/wally-pipelined/src/ifu/BTBPredictor.sv +++ b/wally-pipelined/src/ifu/BTBPredictor.sv @@ -33,7 +33,7 @@ module BTBPredictor ) (input logic clk, input logic reset, - input logic StallF, StallD, StallE, FlushF, FlushD, FlushE, + input logic StallF, StallE, input logic [`XLEN-1:0] LookUpPC, output logic [`XLEN-1:0] TargetPC, output logic [4:0] InstrClass, @@ -77,18 +77,7 @@ module BTBPredictor end assign Valid = ValidBits[LookUpPCIndexQ]; -/* -----\/----- EXCLUDED -----\/----- - regfile2p1r1w #(10, 1) validMem(.clk(clk), - .reset(reset), - .RA1(LookUpPCIndexQ), - .RD1(Valid), - .REN1(1'b1), - .WA1(UpdatePCIndexQ), - .WD1(1'b1), - .WEN1(UpdateEN)); - -----/\----- EXCLUDED -----/\----- */ - flopenr #(1) UpdateENReg(.clk(clk), .reset(reset), .en(~StallF), diff --git a/wally-pipelined/src/ifu/bpred.sv b/wally-pipelined/src/ifu/bpred.sv index 688c8377f..c0fd17fc8 100644 --- a/wally-pipelined/src/ifu/bpred.sv +++ b/wally-pipelined/src/ifu/bpred.sv @@ -30,8 +30,8 @@ module bpred (input logic clk, reset, - input logic StallF, StallD, StallE, StallM, StallW, - input logic FlushF, FlushD, FlushE, FlushM, FlushW, + input logic StallF, StallD, StallE, + input logic FlushF, FlushD, FlushE, // Fetch stage // the prediction input logic [`XLEN-1:0] PCNextF, // *** forgot to include this one on the I/O list @@ -67,8 +67,6 @@ module bpred logic PredictionPCWrongE; logic PredictionInstrClassWrongE; - logic [`XLEN-1:0] CorrectPCE; - // Part 1 branch direction prediction @@ -171,10 +169,6 @@ module bpred .UpdateInvalid(PredictionInstrClassWrongE), .UpdateInstrClass(InstrClassE)); - // need to forward when updating to the same address as reading. - //assign CorrectPCE = PCSrcE ? PCTargetE : PCLinkE; - //assign TargetPC = (PCE == PCNextF) ? CorrectPCE : BTBPredPCF; - // Part 3 RAS // *** need to add the logic to restore RAS on flushes. We will use incr for this. RASPredictor RASPredictor(.clk(clk), diff --git a/wally-pipelined/src/ifu/globalHistoryPredictor.sv b/wally-pipelined/src/ifu/globalHistoryPredictor.sv index 16964bd87..9f0680ad0 100644 --- a/wally-pipelined/src/ifu/globalHistoryPredictor.sv +++ b/wally-pipelined/src/ifu/globalHistoryPredictor.sv @@ -32,7 +32,7 @@ module globalHistoryPredictor ) (input logic clk, input logic reset, - input logic StallF, StallD, StallE, FlushF, FlushD, FlushE, + input logic StallF, StallE, input logic [`XLEN-1:0] PCNextF, output logic [1:0] BPPredF, // update diff --git a/wally-pipelined/src/ifu/gsharePredictor.sv b/wally-pipelined/src/ifu/gsharePredictor.sv index 36e54d4bb..6da754176 100644 --- a/wally-pipelined/src/ifu/gsharePredictor.sv +++ b/wally-pipelined/src/ifu/gsharePredictor.sv @@ -32,7 +32,7 @@ module gsharePredictor ) (input logic clk, input logic reset, - input logic StallF, StallD, StallE, FlushF, FlushD, FlushE, + input logic StallF, StallE, input logic [`XLEN-1:0] PCNextF, output logic [1:0] BPPredF, // update diff --git a/wally-pipelined/src/ifu/localHistoryPredictor.sv b/wally-pipelined/src/ifu/localHistoryPredictor.sv index 6c5c94783..b951704a0 100644 --- a/wally-pipelined/src/ifu/localHistoryPredictor.sv +++ b/wally-pipelined/src/ifu/localHistoryPredictor.sv @@ -33,7 +33,7 @@ module localHistoryPredictor ) (input logic clk, input logic reset, - input logic StallF, StallD, StallE, FlushF, FlushD, FlushE, + input logic StallF, StallE, FlushF, input logic [`XLEN-1:0] LookUpPC, output logic [1:0] Prediction, // update diff --git a/wally-pipelined/src/lsu/lsu.sv b/wally-pipelined/src/lsu/lsu.sv index 1b9604884..1a97d6b33 100644 --- a/wally-pipelined/src/lsu/lsu.sv +++ b/wally-pipelined/src/lsu/lsu.sv @@ -157,7 +157,6 @@ module lsu // arbiter between IEU and hptw lsuArb arbiter(.clk(clk), - .reset(reset), // HPTW connection .SelPTW(SelPTW), .HPTWRead(HPTWRead), @@ -168,7 +167,7 @@ module lsu .Funct3M(Funct3M), .AtomicM(AtomicM), .MemAdrM(MemAdrM), - .MemAdrE(MemAdrE), + .MemAdrE(MemAdrE[11:0]), .CommittedM(CommittedM), .PendingInterruptM(PendingInterruptM), .StallW(StallW), diff --git a/wally-pipelined/src/lsu/lsuArb.sv b/wally-pipelined/src/lsu/lsuArb.sv index 0ed4cc304..c0647c2b6 100644 --- a/wally-pipelined/src/lsu/lsuArb.sv +++ b/wally-pipelined/src/lsu/lsuArb.sv @@ -27,7 +27,7 @@ `include "wally-config.vh" module lsuArb - (input logic clk, reset, + (input logic clk, // from page table walker input logic SelPTW, @@ -40,7 +40,7 @@ module lsuArb input logic [2:0] Funct3M, input logic [1:0] AtomicM, input logic [`XLEN-1:0] MemAdrM, - input logic [`XLEN-1:0] MemAdrE, + input logic [11:0] MemAdrE, input logic StallW, input logic PendingInterruptM, // to CPU From 0a32d7937001063202cd03f08b5195bf178cf529 Mon Sep 17 00:00:00 2001 From: bbracker Date: Sun, 24 Oct 2021 14:46:56 -0700 Subject: [PATCH 034/132] checkpoint generator bugfix --- .../linux-testgen/testvector-generation/genCheckpoint.gdb | 8 ++++---- .../linux-testgen/testvector-generation/genCheckpoint.sh | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/wally-pipelined/linux-testgen/testvector-generation/genCheckpoint.gdb b/wally-pipelined/linux-testgen/testvector-generation/genCheckpoint.gdb index 8c2e316ef..65ce15598 100755 --- a/wally-pipelined/linux-testgen/testvector-generation/genCheckpoint.gdb +++ b/wally-pipelined/linux-testgen/testvector-generation/genCheckpoint.gdb @@ -8,10 +8,10 @@ define genCheckpoint # Argument Parsing set $tcpPort=$arg0 set $instrCount=$arg1 - set $statePath=$arg2 - set $ramPath=$arg3 - set $checkPC=$arg4 - set $checkPCoccurences=$arg5 + set $statePath=$arg1 + set $ramPath=$arg2 + set $checkPC=$arg3 + set $checkPCoccurences=$arg4 eval "set $statePath = \"%s/stateGDB.txt\"", $statePath eval "set $ramPath = \"%s/ramGDB.txt\"", $ramPath diff --git a/wally-pipelined/linux-testgen/testvector-generation/genCheckpoint.sh b/wally-pipelined/linux-testgen/testvector-generation/genCheckpoint.sh index cfdeffae2..2666d69e2 100755 --- a/wally-pipelined/linux-testgen/testvector-generation/genCheckpoint.sh +++ b/wally-pipelined/linux-testgen/testvector-generation/genCheckpoint.sh @@ -3,7 +3,7 @@ source genSettings.sh tcpPort=1236 -instrs=8500000 +instrs=50000000 checkOutDir="$outDir/checkpoint$instrs" checkIntermedDir="$checkOutDir/intermediate-outputs" @@ -31,7 +31,7 @@ then & riscv64-unknown-elf-gdb -quiet -x genCheckpoint.gdb -ex "genCheckpoint $tcpPort $instrs \"$checkIntermedDir\" 0x$pc $occurences" # Post-Process GDB outputs ./parseState.py "$checkOutDir" - ./fix_mem.py "$intermedDir/ramGDB.txt" "$checkOutDir/ram.txt" + ./fix_mem.py "$checkIntermedDir/ramGDB.txt" "$checkOutDir/ram.txt" tail -n+$(($instrs-9)) "$outDir/$traceFile" > "$checkOutDir/$traceFile" else echo "You can change the number of instructions by editing the \"instrs\" variable in this script." From 3c118437de2624f91b751a959ccda0c22d0f98ba Mon Sep 17 00:00:00 2001 From: bbracker Date: Sun, 24 Oct 2021 15:05:00 -0700 Subject: [PATCH 035/132] fix typo --- .../linux-testgen/testvector-generation/genTrace.gdb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wally-pipelined/linux-testgen/testvector-generation/genTrace.gdb b/wally-pipelined/linux-testgen/testvector-generation/genTrace.gdb index 847469121..23624607d 100755 --- a/wally-pipelined/linux-testgen/testvector-generation/genTrace.gdb +++ b/wally-pipelined/linux-testgen/testvector-generation/genTrace.gdb @@ -21,4 +21,4 @@ define genTrace kill q -emd +end From 4100ed9a7a76a7d279142efbfd4b5b45bf9f9392 Mon Sep 17 00:00:00 2001 From: bbracker Date: Sun, 24 Oct 2021 15:18:44 -0700 Subject: [PATCH 036/132] update debugger script to new style --- .../testvector-generation/debug.gdb | 24 +++++++++++ .../testvector-generation/debug.sh | 20 ++++++++++ .../testvector-generation/debugBuildroot.sh | 40 ------------------- .../testvector-generation/gdbinit_debug | 18 --------- 4 files changed, 44 insertions(+), 58 deletions(-) create mode 100755 wally-pipelined/linux-testgen/testvector-generation/debug.gdb create mode 100755 wally-pipelined/linux-testgen/testvector-generation/debug.sh delete mode 100755 wally-pipelined/linux-testgen/testvector-generation/debugBuildroot.sh delete mode 100644 wally-pipelined/linux-testgen/testvector-generation/gdbinit_debug diff --git a/wally-pipelined/linux-testgen/testvector-generation/debug.gdb b/wally-pipelined/linux-testgen/testvector-generation/debug.gdb new file mode 100755 index 000000000..dbdf274a4 --- /dev/null +++ b/wally-pipelined/linux-testgen/testvector-generation/debug.gdb @@ -0,0 +1,24 @@ +define debug + # Arguments + set $tcpPort=$arg0 + + # GDB config + set pagination off + set logging overwrite on + set logging redirect on + set confirm off + + # Connect to QEMU session + eval "target extended-remote :%d",$tcpPort + + # Symbol Files + file ../buildroot-image-output/vmlinux + + # Run until Linux login prompt + b do_idle + ignore 1 2 + c + + kill + q +end diff --git a/wally-pipelined/linux-testgen/testvector-generation/debug.sh b/wally-pipelined/linux-testgen/testvector-generation/debug.sh new file mode 100755 index 000000000..fc5549a20 --- /dev/null +++ b/wally-pipelined/linux-testgen/testvector-generation/debug.sh @@ -0,0 +1,20 @@ +#!/bin/bash +source genSettings.sh +tcpPort=1237 + +# Run without GDB +($customQemu \ +-M virt \ +-nographic \ +-bios $imageDir/fw_jump.elf -kernel $imageDir/Image -append "root=/dev/vda ro" -initrd $imageDir/rootfs.cpio \ +-singlestep -rtc clock=vm -icount shift=1,align=off,sleep=on) + +# Run with GDB +#($customQemu \ +#-M virt \ +#-nographic -serial /dev/null \ +#-bios $imageDir/fw_jump.elf -kernel $imageDir/Image -append "root=/dev/vda ro" -initrd $imageDir/rootfs.cpio \ +#-singlestep -rtc clock=vm -icount shift=1,align=off,sleep=on \ +#-gdb tcp::$tcpPort -S) \ +#& riscv64-unknown-elf-gdb -x debug.gdb -ex "debug $tcpPort" + diff --git a/wally-pipelined/linux-testgen/testvector-generation/debugBuildroot.sh b/wally-pipelined/linux-testgen/testvector-generation/debugBuildroot.sh deleted file mode 100755 index a51b975cc..000000000 --- a/wally-pipelined/linux-testgen/testvector-generation/debugBuildroot.sh +++ /dev/null @@ -1,40 +0,0 @@ -# Oftentimes this script runs so long you'll go to sleep. -# But you don't want the script to die when your computer goes to sleep. -# So consider invoking this with nohup (i.e. "nohup ./logAllBuildroot.sh") -# You can run "tail -f nohup.out" to see what would've -# outputted to the terminal if you didn't use nohup - -customQemu="/courses/e190ax/qemu_sim/rv64_initrd/qemu_experimental/qemu/build/qemu-system-riscv64" -#customQemu="qemu-system-riscv64" -imageDir="../buildroot-image-output" -intermedDir="../linux-testvectors/intermediate-outputs" -outDir="../linux-testvectors" - -# =========== Debug the Process ========== -# Uncomment this version for QEMU debugging of kernel -# - good for poking around VM if it boots up -# - good for running QEMU commands (press "Ctrl-A" then "c" to open QEMU command prompt) -#$customQemu -M virt -nographic -bios $imageDir/fw_jump.elf -kernel $imageDir/Image -append "root=/dev/vda ro" -initrd $imageDir/rootfs.cpio -rtc clock=vm -icount shift=1 -# Uncomment this version for GDB debugging of kernel -# - attempts to load in symbols from "vmlinux" -# - good for looking at backtraces when Linux gets stuck for some reason -$customQemu -M virt -nographic -bios $imageDir/fw_jump.elf -kernel $imageDir/Image -append "root=/dev/vda ro" -initrd $imageDir/rootfs.cpio -rtc clock=vm -icount shift=1 -gdb tcp::1237 -S & riscv64-unknown-elf-gdb -x gdbinit_debug - -# Uncomment this version to generate qemu_output.txt -# - Uses GDB script -# - Logs raw QEMU output to qemu_output.txt -#($customQemu -M virt -nographic -bios $imageDir/fw_jump.elf -kernel $imageDir/Image -append "root=/dev/vda ro" -initrd $imageDir/rootfs.cpio -rtc clock=vm -icount shift=1 -d nochain,cpu,in_asm -serial /dev/null -singlestep -gdb tcp::1237 -S 2> $intermedDir/qemu_output.txt) & riscv64-unknown-elf-gdb -x gdbinit_debug - -# Uncomment this version for parse_qemu.py debugging -# - Uses qemu_output.txt -# - Makes qemu_in_gdb_format.txt -# - Splits qemu_in_gdb_format.txt into chunks of 100,000 instrs -#cat $intermedDir/qemu_output.txt | ./parse_qemu.py >$intermedDir/qemu_in_gdb_format.txt -#cd $intermedDir -#split -d -l 5000000 ./qemu_in_gdb_format.txt --verbose -#cd ../../testvector-generation - -# Uncomment this version for parse_gdb_output.py debugging -# - Uses qemu_in_gdb_format.txt -# - Makes testvectors -#cat $intermedDir/qemu_in_gdb_format.txt | ./parse_gdb_output.py "$outDir" diff --git a/wally-pipelined/linux-testgen/testvector-generation/gdbinit_debug b/wally-pipelined/linux-testgen/testvector-generation/gdbinit_debug deleted file mode 100644 index 621db22b9..000000000 --- a/wally-pipelined/linux-testgen/testvector-generation/gdbinit_debug +++ /dev/null @@ -1,18 +0,0 @@ -set pagination off -file ../buildroot-image-output/fw_jump.elf -file ../buildroot-image-output/vmlinux -target extended-remote :1237 -b *0x80200040 -c -#del 1 -#stepi 500 -#b irqchip_plic_warm_init -#c -#b plic_init -#c -#b do_idle -#c -#b *0xffffffff80202e58 -#ignore 2 87 -#c -#del 2 From 9cdbd9a0bf4894b71937c5b12960346e2b825c6e Mon Sep 17 00:00:00 2001 From: bbracker Date: Sun, 24 Oct 2021 15:19:03 -0700 Subject: [PATCH 037/132] remove unused scripts --- .../deprecated-scripts/find_csr.sh | 2 - .../deprecated-scripts/fix_csrs.py | 28 --- .../deprecated-scripts/logAllBuildroot.sh | 15 -- .../deprecated-scripts/parseAllBusybear.sh | 1 - .../deprecated-scripts/parse_gdb_output.py | 173 ------------------ .../deprecated-scripts/setup_OVP.sh | 7 - .../deprecated-scripts/start_OVP.sh | 2 - .../testvector-generation/gdbinit | 15 -- .../testvector-generation/gdbinit_mem | 23 --- 9 files changed, 266 deletions(-) delete mode 100755 wally-pipelined/linux-testgen/testvector-generation/deprecated-scripts/find_csr.sh delete mode 100755 wally-pipelined/linux-testgen/testvector-generation/deprecated-scripts/fix_csrs.py delete mode 100755 wally-pipelined/linux-testgen/testvector-generation/deprecated-scripts/logAllBuildroot.sh delete mode 100755 wally-pipelined/linux-testgen/testvector-generation/deprecated-scripts/parseAllBusybear.sh delete mode 100755 wally-pipelined/linux-testgen/testvector-generation/deprecated-scripts/parse_gdb_output.py delete mode 100755 wally-pipelined/linux-testgen/testvector-generation/deprecated-scripts/setup_OVP.sh delete mode 100755 wally-pipelined/linux-testgen/testvector-generation/deprecated-scripts/start_OVP.sh delete mode 100755 wally-pipelined/linux-testgen/testvector-generation/gdbinit delete mode 100755 wally-pipelined/linux-testgen/testvector-generation/gdbinit_mem diff --git a/wally-pipelined/linux-testgen/testvector-generation/deprecated-scripts/find_csr.sh b/wally-pipelined/linux-testgen/testvector-generation/deprecated-scripts/find_csr.sh deleted file mode 100755 index 89d0f098f..000000000 --- a/wally-pipelined/linux-testgen/testvector-generation/deprecated-scripts/find_csr.sh +++ /dev/null @@ -1,2 +0,0 @@ -#grep '=>.*csr' $1 | rev | cut -d' ' -f1 | rev | tee >(cut -d',' -f1) | cut -d',' -f2 | grep -Ev 'a[0-7]|t[0-6]|zero|[0-8]' | sort | uniq | paste -s -d, - -grep 'csr' /mnt/scratch/riscv_decodepc_threads/riscv_decodepc.txt.disassembly | rev | cut -d' ' -f1 | rev | tee >(cut -d',' -f1 | sort -u) >(cut -d',' -f2 | sort -u) | (cut -d',' -f3 | sort -u) | sort -u | paste -s -d, - diff --git a/wally-pipelined/linux-testgen/testvector-generation/deprecated-scripts/fix_csrs.py b/wally-pipelined/linux-testgen/testvector-generation/deprecated-scripts/fix_csrs.py deleted file mode 100755 index ded24c9f1..000000000 --- a/wally-pipelined/linux-testgen/testvector-generation/deprecated-scripts/fix_csrs.py +++ /dev/null @@ -1,28 +0,0 @@ -#! /usr/bin/python3 -import sys, fileinput - -sys.stderr.write("reminder: fix_csrs.py is nothing but hardcoded hackery to combat QEMU's faulty printing") - -csrs = ['fcsr','mcause','mcounteren','medeleg','mepc','mhartid','mideleg','mie','mip','misa','mscratch','mstatus','mtval','mtvec','pmpaddr0','pmpcfg0','satp','scause','scounteren','sepc','sie','sscratch','sstatus','stval','stvec'] - -# just for now, since these CSRs aren't yet ready to be checked in testbench-linux -list(map(csrs.remove, ['fcsr','mhartid','pmpcfg0','pmpaddr0','mip'])) -output_path = sys.argv[1]+'/' -print(f'output dir: {output_path}') -count = 0 -csr = '' -with open('{}parsedCSRs.txt'.format(output_path), 'w') as fixedCSRs: - with open('{}/intermediate-outputs/unfixedParsedCSRs.txt'.format(output_path), 'r') as rawCSRs: - for l in rawCSRs: - fixedCSRs.write(l) - count += 1 - if '---' in l: - count = 0 - if (count%2 == 1): # every other line is CSR name - csr = l - else: - if ('stval' in csr) and ('8020007e' in l): - print('Adding stvec vector') - fixedCSRs.write('stvec\n') - fixedCSRs.write('ffffffff800000b0\n') - diff --git a/wally-pipelined/linux-testgen/testvector-generation/deprecated-scripts/logAllBuildroot.sh b/wally-pipelined/linux-testgen/testvector-generation/deprecated-scripts/logAllBuildroot.sh deleted file mode 100755 index 44d7410f4..000000000 --- a/wally-pipelined/linux-testgen/testvector-generation/deprecated-scripts/logAllBuildroot.sh +++ /dev/null @@ -1,15 +0,0 @@ -# Oftentimes this script runs so long you'll go to sleep. -# But you don't want the script to die when your computer goes to sleep. -# So consider invoking this with nohup (i.e. "nohup ./logAllBuildroot.sh") -# You can run "tail -f nohup.out" to see what would've -# outputted to the terminal if you didn't use nohup - -customQemu="/courses/e190ax/qemu_sim/rv64_initrd/qemu_experimental/qemu/build/qemu-system-riscv64" -#customQemu="qemu-system-riscv64" -imageDir="../buildroot-image-output" -intermedDir="../linux-testvectors/intermediate-outputs" -outDir="../linux-testvectors" - -# - Logs info needed by buildroot testbench -($customQemu -M virt -nographic -bios $imageDir/fw_jump.elf -kernel $imageDir/Image -append "root=/dev/vda ro" -initrd $imageDir/rootfs.cpio -d nochain,cpu,in_asm -serial /dev/null -singlestep -gdb tcp::1236 -S 2>&1 >/dev/null | ./parse_qemu.py | ./parse_gdb_output.py "$outDir") & riscv64-unknown-elf-gdb -x gdbinit_qemulog -./fix_csrs.py "$outDir" diff --git a/wally-pipelined/linux-testgen/testvector-generation/deprecated-scripts/parseAllBusybear.sh b/wally-pipelined/linux-testgen/testvector-generation/deprecated-scripts/parseAllBusybear.sh deleted file mode 100755 index bee05019b..000000000 --- a/wally-pipelined/linux-testgen/testvector-generation/deprecated-scripts/parseAllBusybear.sh +++ /dev/null @@ -1 +0,0 @@ -./combineGDBs.py && cat gdbcombined.txt | ./parse_gdb_output.py "/courses/e190ax/busybear_boot_new/" diff --git a/wally-pipelined/linux-testgen/testvector-generation/deprecated-scripts/parse_gdb_output.py b/wally-pipelined/linux-testgen/testvector-generation/deprecated-scripts/parse_gdb_output.py deleted file mode 100755 index 6887d5f96..000000000 --- a/wally-pipelined/linux-testgen/testvector-generation/deprecated-scripts/parse_gdb_output.py +++ /dev/null @@ -1,173 +0,0 @@ -#! /usr/bin/python3 -import sys, fileinput - -sys.stderr.write("reminder: parse_gdb_output.py takes input from stdin\n") - -csrs = ['fcsr','mcause','mcounteren','medeleg','mepc','mhartid','mideleg','mie','mip','misa','mscratch','mstatus','mtval','mtvec','pmpaddr0','pmpcfg0','satp','scause','scounteren','sepc','sie','sscratch','sstatus','stval','stvec'] - -# just for now, since these CSRs aren't yet ready to be checked in testbench-linux -list(map(csrs.remove, ['fcsr','mhartid','pmpcfg0','pmpaddr0','mip'])) -#output_path = '/courses/e190ax/busybear_boot_new/' -#output_path = '/courses/e190ax/buildroot_boot/' -output_path = sys.argv[1]+'/' -print(f'output dir: {output_path}') -instrs = -1 -try: - with open('{}parsedPC.txt'.format(output_path), 'w') as wPC: - with open('{}parsedRegs.txt'.format(output_path), 'w') as wReg: - with open('{}parsedMemRead.txt'.format(output_path), 'w') as wMem: - with open('{}parsedMemWrite.txt'.format(output_path), 'w') as wMemW: - with open('{}/intermediate-outputs/unfixedParsedCSRs.txt'.format(output_path), 'w') as wCSRs: - firstCSR = True - curCSRs = {} - lastRead = '' - currentRead = '' - readOffset = '' - lastReadLoc = '' - readType = '' - lastReadType = '' - readLoc = '' - lineOffset = -1 - lastRegs = '' - curRegs = '' - storeReg = '' - storeOffset = '' - storeLoc = '' - storeAMO = '' - lastAMO = '' - lastStoreReg = '' - lastStoreLoc = '' - for l in fileinput.input('-'): - l = l.split("#")[0].rstrip() - if l.startswith('=>'): - # Begin new instruction - instrs += 1 - storeAMO = '' - if instrs % 10000 == 0: - print(instrs,flush=True) - # Instr in human assembly - wPC.write('{} ***\n'.format(' '.join(l.split(':')[1].split()[0:2]))) - if '\tld' in l or '\tlw' in l or '\tlh' in l or '\tlb' in l: - currentRead = l.split()[-1].split(',')[0] - if len(l.split()[-1].split(',')) < 2: - print(l) - readOffset = l.split()[-1].split(',')[1].split('(')[0] - readLoc = l.split()[-1].split(',')[1].split('(')[1][:-1] - readType = l.split()[-2] - if 'amo' in l: - currentRead = l.split()[-1].split(',')[0] - readOffset = "0" - readLoc = l.split()[-1].split('(')[1][:-1] - readType = l.split()[-2] - storeOffset = "0" - storeLoc = readLoc - storeReg = l.split()[-1].split(',')[1] - storeAMO = l.split()[-2] - if '\tlr' in l: - currentRead = l.split()[-1].split(',')[0] - readOffset = "0" - readLoc = l.split()[-1].split('(')[1][:-1] - readType = "0" # *** I don't see that readType or lastReadType are ever used; we can probably get rid of them - if '\tsc' in l: - storeOffset = "0" - storeLoc = l.split()[-1].split('(')[1][:-1] - storeReg = l.split()[-1].split(',')[1] - if '\tsd' in l or '\tsw' in l or '\tsh' in l or '\tsb' in l: - s = l.split('#')[0].split()[-1] - storeReg = s.split(',')[0] - if len(s.split(',')) < 2: - print(s) - print(l) - if len(s.split(',')[1].split('(')) < 1: - print(s) - print(l) - storeOffset = s.split(',')[1].split('(')[0] - storeLoc = s.split(',')[1].split('(')[1][:-1] - lineOffset = 0 - elif lineOffset != -1: - lineOffset += 1 - if lineOffset == 1: - # Instr in hex comes one line after the instruction - wPC.write('{}\n'.format(l.split()[-1][2:])) - # As well as instr address - wPC.write('{}\n'.format(l.split()[0][2:].strip(":"))) - elif lineOffset <= (1+32): - # Next 32 lines are the Register File - if lastRead == l.split()[0]: - readData = int(l.split()[1][2:], 16) - #readData <<= (8 * (lastReadLoc % 8)) <-- this was used to make byte and half-word instructions match what the bus unit sees in RV64. However, it is no longer needed because the testvectors are now compared against what the hart sees (not what the bus unit sees). - wMem.write('{:x}\n'.format(readData)) - if readLoc == l.split()[0]: - readLoc = l.split()[1][2:] - if storeReg == l.split()[0]: - storeReg = l.split()[1] - if storeLoc == l.split()[0]: - storeLoc = l.split()[1][2:] - if lineOffset > (1+1): - # Start logging x1 onwards (we don't care about x0) - curRegs += '{}\n'.format(l.split()[1][2:]) - #elif "pc" in l: - # wPC.write('{}\n'.format(l.split()[1][2:])) - if any([csr == l.split()[0] for csr in csrs]): - if l.split()[0] in curCSRs: - if curCSRs[l.split()[0]] != l.split()[1]: - if firstCSR: - wCSRs.write('---\n') - firstCSR = False - wCSRs.write('{}\n{}\n'.format(l.split()[0], l.split()[1][2:])) - else: - wCSRs.write('{}\n{}\n'.format(l.split()[0], l.split()[1][2:])) - curCSRs[l.split()[0]] = l.split()[1] - if '-----' in l: # end of each cycle - if curRegs != lastRegs: - if lastRegs == '': - wReg.write(curRegs) - else: - for i in range(32): - if curRegs.split('\n')[i] != lastRegs.split('\n')[i]: - wReg.write('{}\n'.format(i+1)) - wReg.write('{}\n'.format(curRegs.split('\n')[i])) - break - lastRegs = curRegs - if lastAMO != '': - if 'amoadd' in lastAMO: - lastStoreReg = hex(int(lastStoreReg[2:], 16) + readData)[2:] - elif 'amoand' in lastAMO: - lastStoreReg = hex(int(lastStoreReg[2:], 16) & readData)[2:] - elif 'amoor' in lastAMO: - lastStoreReg = hex(int(lastStoreReg[2:], 16) | readData)[2:] - elif 'amoswap' in lastAMO: - lastStoreReg = hex(int(lastStoreReg[2:], 16))[2:] - else: - print(lastAMO) - exit() - #print('lastStoreReg {}\n'.format(lastStoreReg)) - #print('lastStoreLoc '+str(lastStoreLoc)) - wMemW.write('{}\n'.format(lastStoreReg)) - wMemW.write('{:x}\n'.format(int(lastStoreLoc, 16))) - if storeReg != '' and storeOffset != '' and storeLoc != '' and storeAMO == '': - storeLocOffset = int(storeOffset,10) + int(storeLoc, 16) - #wMemW.write('{:x}\n'.format(int(storeReg, 16) << (8 * (storeLocOffset % 8)))) - wMemW.write('{}\n'.format(storeReg[2:])) - wMemW.write('{:x}\n'.format(storeLocOffset)) - if readOffset != '' and readLoc != '': - wMem.write('{:x}\n'.format(int(readOffset,10) + int(readLoc, 16))) - lastReadLoc = int(readOffset,10) + int(readLoc, 16) - lastReadType = readType - readOffset = '' - readLoc = '' - curRegs = '' - lineOffset = -1 - lastRead = currentRead - currentRead = '' - lastStoreReg = storeReg - lastStoreLoc = storeLoc - storeReg = '' - storeOffset = '' - storeLoc = '' - lastAMO = storeAMO - - -except (FileNotFoundError): - print('please give gdb output file as argument') - diff --git a/wally-pipelined/linux-testgen/testvector-generation/deprecated-scripts/setup_OVP.sh b/wally-pipelined/linux-testgen/testvector-generation/deprecated-scripts/setup_OVP.sh deleted file mode 100755 index 66cd899d8..000000000 --- a/wally-pipelined/linux-testgen/testvector-generation/deprecated-scripts/setup_OVP.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash -source /cad/riscv/OVP/Imperas.20200630/bin/setup.sh -setupImperas /cad/riscv/OVP/Imperas.20200630 -m32 -source /cad/riscv/OVP/Imperas.20200630/bin/switchRuntime.sh 2>/dev/null -echo 1 | switchRuntimeImperas -source /cad/riscv/OVP/Imperas.20200630/bin/switchISS.sh 2>/dev/null -echo 1 | switchISSImperas diff --git a/wally-pipelined/linux-testgen/testvector-generation/deprecated-scripts/start_OVP.sh b/wally-pipelined/linux-testgen/testvector-generation/deprecated-scripts/start_OVP.sh deleted file mode 100755 index 7d2815c13..000000000 --- a/wally-pipelined/linux-testgen/testvector-generation/deprecated-scripts/start_OVP.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/bash -sh /cad/riscv/OVP/Imperas.20200630/Demo/Platforms/riscv_RV64GC_Virtio_Linux/harness/RUN_Virtio_Linux.sh --gdbconsole --gdbinit /mnt/scratch/riscv_testbench/gdbinit diff --git a/wally-pipelined/linux-testgen/testvector-generation/gdbinit b/wally-pipelined/linux-testgen/testvector-generation/gdbinit deleted file mode 100755 index f41e2398b..000000000 --- a/wally-pipelined/linux-testgen/testvector-generation/gdbinit +++ /dev/null @@ -1,15 +0,0 @@ -set pagination off -set logging overwrite on -set logging redirect on -set logging file /mnt/scratch/riscv_testbench/riscv_boot_regs.txt -set logging on -x/i $pc -x/x $pc -info all-registers -while ($pc != 0xffffffe000018fa4) - si - x/i $pc - x/x $pc - info all-registers -end -set logging off diff --git a/wally-pipelined/linux-testgen/testvector-generation/gdbinit_mem b/wally-pipelined/linux-testgen/testvector-generation/gdbinit_mem deleted file mode 100755 index f8c20fa11..000000000 --- a/wally-pipelined/linux-testgen/testvector-generation/gdbinit_mem +++ /dev/null @@ -1,23 +0,0 @@ -set pagination off -target extended-remote :1235 -set logging overwrite on -set logging redirect on -printf "Creating bootmemGDB.txt\n" -set logging file ../linux-testvectors/intermediate-outputs/bootmemGDB.txt -set logging on -x/4096xb 0x1000 -set logging off -printf "Creating bootmem_untrimmed_GDB.txt\n" -printf "Warning - please verify that the second half of bootmem_untrimmed_GDB.txt is all 0s\n" -set logging file ../linux-testvectors/intermediate-outputs/bootmem_untrimmed_GDB.txt -set logging on -x/8192xb 0x1000 -set logging off -printf "Creating ramGDB.txt\n" -set logging file ../linux-testvectors/intermediate-outputs/ramGDB.txt -set logging on -x/134217728xb 0x80000000 -set logging off -set confirm off -kill -q From 9423b9078009bcee5677054d2b20f834a0ba1e7d Mon Sep 17 00:00:00 2001 From: bbracker Date: Sun, 24 Oct 2021 18:39:23 -0700 Subject: [PATCH 038/132] switch linux graphical sim over to Ross's waves --- wally-pipelined/regression/linux-wave.do | 548 +++++++++--------- wally-pipelined/regression/wally-buildroot.do | 3 +- 2 files changed, 273 insertions(+), 278 deletions(-) diff --git a/wally-pipelined/regression/linux-wave.do b/wally-pipelined/regression/linux-wave.do index 7c7a300bd..d9a631d09 100644 --- a/wally-pipelined/regression/linux-wave.do +++ b/wally-pipelined/regression/linux-wave.do @@ -4,53 +4,75 @@ add wave -noupdate /testbench/clk add wave -noupdate /testbench/reset add wave -noupdate -radix unsigned /testbench/InstrCountW add wave -noupdate /testbench/dut/hart/SATP_REGW -add wave -noupdate -expand -group {Execution Stage} /testbench/dut/hart/ifu/PCE -add wave -noupdate -expand -group {Execution Stage} /testbench/InstrEName -add wave -noupdate -expand -group {Execution Stage} /testbench/dut/hart/ifu/InstrE -add wave -noupdate -expand -group {Execution Stage} -color {Cornflower Blue} /testbench/FunctionName/FunctionName -add wave -noupdate -expand -group {Memory Stage} /testbench/dut/hart/priv/trap/InstrValidM -add wave -noupdate -expand -group {Memory Stage} /testbench/dut/hart/PCM -add wave -noupdate -expand -group {Memory Stage} /testbench/InstrMName -add wave -noupdate -expand -group {Memory Stage} /testbench/dut/hart/InstrM -add wave -noupdate -expand -group {Memory Stage} /testbench/dut/hart/lsu/MemAdrM -add wave -noupdate -expand -group {WriteBack stage} /testbench/dut/hart/ieu/InstrValidW -add wave -noupdate -expand -group {WriteBack stage} /testbench/PCW -add wave -noupdate -expand -group HDU -group traps /testbench/dut/hart/priv/trap/InstrMisalignedFaultM -add wave -noupdate -expand -group HDU -group traps /testbench/dut/hart/priv/trap/InstrAccessFaultM -add wave -noupdate -expand -group HDU -group traps /testbench/dut/hart/priv/trap/IllegalInstrFaultM -add wave -noupdate -expand -group HDU -group traps /testbench/dut/hart/priv/trap/BreakpointFaultM -add wave -noupdate -expand -group HDU -group traps /testbench/dut/hart/priv/trap/LoadMisalignedFaultM -add wave -noupdate -expand -group HDU -group traps /testbench/dut/hart/priv/trap/StoreMisalignedFaultM -add wave -noupdate -expand -group HDU -group traps /testbench/dut/hart/priv/trap/LoadAccessFaultM -add wave -noupdate -expand -group HDU -group traps /testbench/dut/hart/priv/trap/StoreAccessFaultM -add wave -noupdate -expand -group HDU -group traps /testbench/dut/hart/priv/trap/EcallFaultM -add wave -noupdate -expand -group HDU -group traps /testbench/dut/hart/priv/trap/InstrPageFaultM -add wave -noupdate -expand -group HDU -group traps /testbench/dut/hart/priv/trap/LoadPageFaultM -add wave -noupdate -expand -group HDU -group traps /testbench/dut/hart/priv/trap/StorePageFaultM -add wave -noupdate -expand -group HDU -group traps /testbench/dut/hart/priv/trap/InterruptM -add wave -noupdate -expand -group HDU -group interrupts /testbench/dut/hart/priv/trap/PendingIntsM -add wave -noupdate -expand -group HDU -group interrupts /testbench/dut/hart/priv/trap/CommittedM -add wave -noupdate -expand -group HDU -group interrupts /testbench/dut/hart/priv/trap/InstrValidM -add wave -noupdate -expand -group HDU -expand -group hazards /testbench/dut/hart/hzu/BPPredWrongE -add wave -noupdate -expand -group HDU -expand -group hazards /testbench/dut/hart/hzu/CSRWritePendingDEM -add wave -noupdate -expand -group HDU -expand -group hazards /testbench/dut/hart/hzu/RetM -add wave -noupdate -expand -group HDU -expand -group hazards -color Pink /testbench/dut/hart/hzu/TrapM -add wave -noupdate -expand -group HDU -expand -group hazards /testbench/dut/hart/hzu/LoadStallD -add wave -noupdate -expand -group HDU -expand -group hazards /testbench/dut/hart/hzu/StoreStallD -add wave -noupdate -expand -group HDU -expand -group hazards /testbench/dut/hart/hzu/ICacheStallF -add wave -noupdate -expand -group HDU -expand -group hazards /testbench/dut/hart/hzu/LSUStall -add wave -noupdate -expand -group HDU -expand -group hazards /testbench/dut/hart/MulDivStallD -add wave -noupdate -expand -group HDU -expand -group hazards /testbench/dut/hart/hzu/DivBusyE -add wave -noupdate -expand -group HDU -group Flush -color Yellow /testbench/dut/hart/hzu/FlushF -add wave -noupdate -expand -group HDU -group Flush -color Yellow /testbench/dut/hart/FlushD -add wave -noupdate -expand -group HDU -group Flush -color Yellow /testbench/dut/hart/FlushE -add wave -noupdate -expand -group HDU -group Flush -color Yellow /testbench/dut/hart/FlushM -add wave -noupdate -expand -group HDU -group Flush -color Yellow /testbench/dut/hart/FlushW -add wave -noupdate -expand -group HDU -expand -group Stall -color Orange /testbench/dut/hart/StallF -add wave -noupdate -expand -group HDU -expand -group Stall -color Orange /testbench/dut/hart/StallD -add wave -noupdate -expand -group HDU -expand -group Stall -color Orange /testbench/dut/hart/StallE -add wave -noupdate -expand -group HDU -expand -group Stall -color Orange /testbench/dut/hart/StallM -add wave -noupdate -expand -group HDU -expand -group Stall -color Orange /testbench/dut/hart/StallW +add wave -noupdate -group HDU -expand -group traps /testbench/dut/hart/priv/trap/InstrMisalignedFaultM +add wave -noupdate -group HDU -expand -group traps /testbench/dut/hart/priv/trap/InstrAccessFaultM +add wave -noupdate -group HDU -expand -group traps /testbench/dut/hart/priv/trap/IllegalInstrFaultM +add wave -noupdate -group HDU -expand -group traps /testbench/dut/hart/priv/trap/BreakpointFaultM +add wave -noupdate -group HDU -expand -group traps /testbench/dut/hart/priv/trap/LoadMisalignedFaultM +add wave -noupdate -group HDU -expand -group traps /testbench/dut/hart/priv/trap/StoreMisalignedFaultM +add wave -noupdate -group HDU -expand -group traps /testbench/dut/hart/priv/trap/LoadAccessFaultM +add wave -noupdate -group HDU -expand -group traps /testbench/dut/hart/priv/trap/StoreAccessFaultM +add wave -noupdate -group HDU -expand -group traps /testbench/dut/hart/priv/trap/EcallFaultM +add wave -noupdate -group HDU -expand -group traps /testbench/dut/hart/priv/trap/InstrPageFaultM +add wave -noupdate -group HDU -expand -group traps /testbench/dut/hart/priv/trap/LoadPageFaultM +add wave -noupdate -group HDU -expand -group traps /testbench/dut/hart/priv/trap/StorePageFaultM +add wave -noupdate -group HDU -expand -group traps /testbench/dut/hart/priv/trap/InterruptM +add wave -noupdate -group HDU -group interrupts /testbench/dut/hart/priv/trap/PendingIntsM +add wave -noupdate -group HDU -group interrupts /testbench/dut/hart/priv/trap/CommittedM +add wave -noupdate -group HDU -group interrupts /testbench/dut/hart/priv/trap/InstrValidM +add wave -noupdate -group HDU -group hazards /testbench/dut/hart/hzu/BPPredWrongE +add wave -noupdate -group HDU -group hazards /testbench/dut/hart/hzu/CSRWritePendingDEM +add wave -noupdate -group HDU -group hazards /testbench/dut/hart/hzu/RetM +add wave -noupdate -group HDU -group hazards -color Pink /testbench/dut/hart/hzu/TrapM +add wave -noupdate -group HDU -group hazards /testbench/dut/hart/hzu/LoadStallD +add wave -noupdate -group HDU -group hazards /testbench/dut/hart/hzu/StoreStallD +add wave -noupdate -group HDU -group hazards /testbench/dut/hart/hzu/ICacheStallF +add wave -noupdate -group HDU -group hazards /testbench/dut/hart/hzu/LSUStall +add wave -noupdate -group HDU -group hazards /testbench/dut/hart/MulDivStallD +add wave -noupdate -group HDU -group hazards /testbench/dut/hart/hzu/DivBusyE +add wave -noupdate -group HDU -expand -group Flush -color Yellow /testbench/dut/hart/hzu/FlushF +add wave -noupdate -group HDU -expand -group Flush -color Yellow /testbench/dut/hart/FlushD +add wave -noupdate -group HDU -expand -group Flush -color Yellow /testbench/dut/hart/FlushE +add wave -noupdate -group HDU -expand -group Flush -color Yellow /testbench/dut/hart/FlushM +add wave -noupdate -group HDU -expand -group Flush -color Yellow /testbench/dut/hart/FlushW +add wave -noupdate -group HDU -group Stall -color Orange /testbench/dut/hart/StallF +add wave -noupdate -group HDU -group Stall -color Orange /testbench/dut/hart/StallD +add wave -noupdate -group HDU -group Stall -color Orange /testbench/dut/hart/StallE +add wave -noupdate -group HDU -group Stall -color Orange /testbench/dut/hart/StallM +add wave -noupdate -group HDU -group Stall -color Orange /testbench/dut/hart/StallW +add wave -noupdate -group PCS /testbench/dut/hart/ifu/PCNextF +add wave -noupdate -group PCS /testbench/dut/hart/PCF +add wave -noupdate -group PCS /testbench/dut/hart/ifu/PCD +add wave -noupdate -group PCS /testbench/dut/hart/PCE +add wave -noupdate -group PCS /testbench/dut/hart/PCM +add wave -noupdate -group PCS /testbench/PCW +add wave -noupdate -group {instruction pipeline} /testbench/InstrFName +add wave -noupdate -group {instruction pipeline} /testbench/dut/hart/ifu/icache/FinalInstrRawF +add wave -noupdate -group {instruction pipeline} /testbench/dut/hart/ifu/InstrD +add wave -noupdate -group {instruction pipeline} /testbench/dut/hart/ifu/InstrE +add wave -noupdate -group {instruction pipeline} /testbench/dut/hart/ifu/InstrM +add wave -noupdate -group {Decode Stage} /testbench/dut/hart/ifu/PCD +add wave -noupdate -group {Decode Stage} /testbench/dut/hart/ifu/InstrD +add wave -noupdate -group {Decode Stage} /testbench/InstrDName +add wave -noupdate -group {Decode Stage} /testbench/dut/hart/ieu/c/InstrValidD +add wave -noupdate -group {Decode Stage} /testbench/dut/hart/ieu/c/RegWriteD +add wave -noupdate -group {Decode Stage} /testbench/dut/hart/ieu/dp/RdD +add wave -noupdate -group {Decode Stage} /testbench/dut/hart/ieu/dp/Rs1D +add wave -noupdate -group {Decode Stage} /testbench/dut/hart/ieu/dp/Rs2D +add wave -noupdate -group {Execution Stage} /testbench/dut/hart/ifu/PCE +add wave -noupdate -group {Execution Stage} /testbench/InstrEName +add wave -noupdate -group {Execution Stage} /testbench/dut/hart/ifu/InstrE +add wave -noupdate -group {Execution Stage} -color {Cornflower Blue} /testbench/FunctionName/FunctionName +add wave -noupdate -group {Memory Stage} /testbench/dut/hart/priv/trap/InstrValidM +add wave -noupdate -group {Memory Stage} /testbench/dut/hart/PCM +add wave -noupdate -group {Memory Stage} /testbench/InstrMName +add wave -noupdate -group {Memory Stage} /testbench/dut/hart/InstrM +add wave -noupdate -group {Memory Stage} /testbench/dut/hart/lsu/MemAdrM +add wave -noupdate -group {WriteBack stage} /testbench/PCW +add wave -noupdate -group {WriteBack stage} /testbench/InstrW +add wave -noupdate -group {WriteBack stage} /testbench/InstrWName +add wave -noupdate -group {WriteBack stage} /testbench/InstrValidW +add wave -noupdate -group {WriteBack stage} /testbench/checkInstrW add wave -noupdate -group Bpred -color Orange /testbench/dut/hart/ifu/bpred/bpred/Predictor/DirPredictor/GHR add wave -noupdate -group Bpred -expand -group {branch update selection inputs} /testbench/dut/hart/ifu/bpred/bpred/Predictor/DirPredictor/BPPredF add wave -noupdate -group Bpred -expand -group {branch update selection inputs} {/testbench/dut/hart/ifu/bpred/bpred/Predictor/DirPredictor/InstrClassE[0]} @@ -98,11 +120,6 @@ add wave -noupdate -group Bpred -expand -group {bp wrong} /testbench/dut/hart/if add wave -noupdate -group Bpred -expand -group {bp wrong} /testbench/dut/hart/ifu/bpred/bpred/BPPredClassNonCFIWrongE add wave -noupdate -group Bpred -expand -group {bp wrong} /testbench/dut/hart/ifu/bpred/bpred/BPPredWrongE add wave -noupdate -group Bpred /testbench/dut/hart/ifu/bpred/bpred/BPPredWrongE -add wave -noupdate -expand -group {instruction pipeline} /testbench/InstrFName -add wave -noupdate -expand -group {instruction pipeline} /testbench/dut/hart/ifu/icache/FinalInstrRawF -add wave -noupdate -expand -group {instruction pipeline} /testbench/dut/hart/ifu/InstrD -add wave -noupdate -expand -group {instruction pipeline} /testbench/dut/hart/ifu/InstrE -add wave -noupdate -expand -group {instruction pipeline} /testbench/dut/hart/ifu/InstrM add wave -noupdate -group {PCNext Generation} /testbench/dut/hart/ifu/PCNextF add wave -noupdate -group {PCNext Generation} /testbench/dut/hart/ifu/PCF add wave -noupdate -group {PCNext Generation} /testbench/dut/hart/ifu/PCPlus2or4F @@ -112,12 +129,6 @@ add wave -noupdate -group {PCNext Generation} /testbench/dut/hart/ifu/PCNext1F add wave -noupdate -group {PCNext Generation} /testbench/dut/hart/ifu/SelBPPredF add wave -noupdate -group {PCNext Generation} /testbench/dut/hart/ifu/BPPredWrongE add wave -noupdate -group {PCNext Generation} /testbench/dut/hart/ifu/PrivilegedChangePCM -add wave -noupdate -group {Decode Stage} /testbench/dut/hart/ifu/InstrD -add wave -noupdate -group {Decode Stage} /testbench/InstrDName -add wave -noupdate -group {Decode Stage} /testbench/dut/hart/ieu/c/RegWriteD -add wave -noupdate -group {Decode Stage} /testbench/dut/hart/ieu/dp/RdD -add wave -noupdate -group {Decode Stage} /testbench/dut/hart/ieu/dp/Rs1D -add wave -noupdate -group {Decode Stage} /testbench/dut/hart/ieu/dp/Rs2D add wave -noupdate -group RegFile -expand /testbench/dut/hart/ieu/dp/regf/rf add wave -noupdate -group RegFile /testbench/dut/hart/ieu/dp/regf/a1 add wave -noupdate -group RegFile /testbench/dut/hart/ieu/dp/regf/a2 @@ -126,23 +137,22 @@ add wave -noupdate -group RegFile /testbench/dut/hart/ieu/dp/regf/rd1 add wave -noupdate -group RegFile /testbench/dut/hart/ieu/dp/regf/rd2 add wave -noupdate -group RegFile /testbench/dut/hart/ieu/dp/regf/we3 add wave -noupdate -group RegFile /testbench/dut/hart/ieu/dp/regf/wd3 -add wave -noupdate -group RegFile -group {write regfile mux} /testbench/dut/hart/ieu/dp/ALUResultW add wave -noupdate -group RegFile -group {write regfile mux} /testbench/dut/hart/ieu/dp/ReadDataW add wave -noupdate -group RegFile -group {write regfile mux} /testbench/dut/hart/ieu/dp/CSRReadValW add wave -noupdate -group RegFile -group {write regfile mux} /testbench/dut/hart/ieu/dp/ResultSrcW add wave -noupdate -group RegFile -group {write regfile mux} /testbench/dut/hart/ieu/dp/ResultW -add wave -noupdate -expand -group alu /testbench/dut/hart/ieu/dp/alu/a -add wave -noupdate -expand -group alu /testbench/dut/hart/ieu/dp/alu/b -add wave -noupdate -expand -group alu /testbench/dut/hart/ieu/dp/alu/alucontrol -add wave -noupdate -expand -group alu /testbench/dut/hart/ieu/dp/alu/result -add wave -noupdate -expand -group alu /testbench/dut/hart/ieu/dp/alu/flags -add wave -noupdate -expand -group alu -divider internals -add wave -noupdate -expand -group alu /testbench/dut/hart/ieu/dp/alu/overflow -add wave -noupdate -expand -group alu /testbench/dut/hart/ieu/dp/alu/carry -add wave -noupdate -expand -group alu /testbench/dut/hart/ieu/dp/alu/zero -add wave -noupdate -expand -group alu /testbench/dut/hart/ieu/dp/alu/neg -add wave -noupdate -expand -group alu /testbench/dut/hart/ieu/dp/alu/lt -add wave -noupdate -expand -group alu /testbench/dut/hart/ieu/dp/alu/ltu +add wave -noupdate -group alu /testbench/dut/hart/ieu/dp/alu/a +add wave -noupdate -group alu /testbench/dut/hart/ieu/dp/alu/b +add wave -noupdate -group alu /testbench/dut/hart/ieu/dp/alu/alucontrol +add wave -noupdate -group alu /testbench/dut/hart/ieu/dp/alu/result +add wave -noupdate -group alu /testbench/dut/hart/ieu/dp/alu/flags +add wave -noupdate -group alu -divider internals +add wave -noupdate -group alu /testbench/dut/hart/ieu/dp/alu/overflow +add wave -noupdate -group alu /testbench/dut/hart/ieu/dp/alu/carry +add wave -noupdate -group alu /testbench/dut/hart/ieu/dp/alu/zero +add wave -noupdate -group alu /testbench/dut/hart/ieu/dp/alu/neg +add wave -noupdate -group alu /testbench/dut/hart/ieu/dp/alu/lt +add wave -noupdate -group alu /testbench/dut/hart/ieu/dp/alu/ltu add wave -noupdate -group Forward /testbench/dut/hart/ieu/fw/Rs1D add wave -noupdate -group Forward /testbench/dut/hart/ieu/fw/Rs2D add wave -noupdate -group Forward /testbench/dut/hart/ieu/fw/Rs1E @@ -160,13 +170,6 @@ add wave -noupdate -group {alu execution stage} /testbench/dut/hart/ieu/dp/Write add wave -noupdate -group {alu execution stage} /testbench/dut/hart/ieu/dp/ALUResultE add wave -noupdate -group {alu execution stage} /testbench/dut/hart/ieu/dp/SrcAE add wave -noupdate -group {alu execution stage} /testbench/dut/hart/ieu/dp/SrcBE -add wave -noupdate -expand -group PCS /testbench/dut/hart/ifu/PCNextF -add wave -noupdate -expand -group PCS /testbench/dut/hart/PCF -add wave -noupdate -expand -group PCS /testbench/dut/hart/ifu/PCD -add wave -noupdate -expand -group PCS /testbench/dut/hart/PCE -add wave -noupdate -expand -group PCS /testbench/dut/hart/PCM -add wave -noupdate -expand -group PCS /testbench/PCW -add wave -noupdate -group muldiv /testbench/dut/hart/mdu/InstrD add wave -noupdate -group muldiv /testbench/dut/hart/mdu/SrcAE add wave -noupdate -group muldiv /testbench/dut/hart/mdu/SrcBE add wave -noupdate -group muldiv /testbench/dut/hart/mdu/Funct3E @@ -178,37 +181,30 @@ add wave -noupdate -group muldiv /testbench/dut/hart/mdu/FlushM add wave -noupdate -group muldiv /testbench/dut/hart/mdu/FlushW add wave -noupdate -group muldiv /testbench/dut/hart/mdu/MulDivResultW add wave -noupdate -group muldiv /testbench/dut/hart/mdu/DivBusyE -add wave -noupdate /testbench/dut/hart/mdu/genblk1/div/StartDivideE -add wave -noupdate /testbench/dut/hart/mdu/genblk1/div/BusyE -add wave -noupdate /testbench/dut/hart/mdu/genblk1/div/DivDoneM -add wave -noupdate /testbench/dut/hart/mdu/genblk1/div/DivInitE -add wave -noupdate -expand -group icache -color Gold /testbench/dut/hart/ifu/icache/controller/CurrState -add wave -noupdate -expand -group icache /testbench/dut/hart/ifu/icache/controller/NextState -add wave -noupdate -expand -group icache /testbench/dut/hart/ifu/ITLBMissF -add wave -noupdate -expand -group icache /testbench/dut/hart/ifu/icache/ITLBWriteF -add wave -noupdate -expand -group icache /testbench/dut/hart/ifu/icache/ReadLineF -add wave -noupdate -expand -group icache /testbench/dut/hart/ifu/icache/PCNextIndexF -add wave -noupdate -expand -group icache /testbench/dut/hart/ifu/icache/ReadLineF -add wave -noupdate -expand -group icache {/testbench/dut/hart/ifu/icache/MemWay[0]/ValidBits} -add wave -noupdate -expand -group icache {/testbench/dut/hart/ifu/icache/MemWay[1]/ValidBits} -add wave -noupdate -expand -group icache {/testbench/dut/hart/ifu/icache/MemWay[2]/ValidBits} -add wave -noupdate -expand -group icache {/testbench/dut/hart/ifu/icache/MemWay[3]/ValidBits} -add wave -noupdate -expand -group icache -expand -group {fsm out and control} /testbench/dut/hart/ifu/icache/controller/hit -add wave -noupdate -expand -group icache -expand -group {fsm out and control} /testbench/dut/hart/ifu/icache/controller/spill -add wave -noupdate -expand -group icache -expand -group {fsm out and control} /testbench/dut/hart/ifu/icache/controller/ICacheStallF -add wave -noupdate -expand -group icache -expand -group {fsm out and control} /testbench/dut/hart/ifu/icache/controller/SavePC -add wave -noupdate -expand -group icache -expand -group {fsm out and control} /testbench/dut/hart/ifu/icache/controller/spillSave -add wave -noupdate -expand -group icache -expand -group {fsm out and control} /testbench/dut/hart/ifu/icache/controller/UnalignedSelect -add wave -noupdate -expand -group icache -expand -group {fsm out and control} /testbench/dut/hart/ifu/icache/controller/spillSave -add wave -noupdate -expand -group icache -expand -group {fsm out and control} /testbench/dut/hart/ifu/icache/controller/CntReset -add wave -noupdate -expand -group icache -expand -group {fsm out and control} /testbench/dut/hart/ifu/icache/controller/PreCntEn -add wave -noupdate -expand -group icache -expand -group {fsm out and control} /testbench/dut/hart/ifu/icache/controller/CntEn -add wave -noupdate -expand -group icache -expand -group memory /testbench/dut/hart/ifu/icache/controller/FetchCountFlag -add wave -noupdate -expand -group icache -expand -group memory /testbench/dut/hart/ifu/icache/FetchCount -add wave -noupdate -expand -group icache -expand -group memory /testbench/dut/hart/ifu/icache/controller/InstrReadF -add wave -noupdate -expand -group icache -expand -group memory /testbench/dut/hart/ifu/icache/controller/InstrAckF -add wave -noupdate -expand -group icache -expand -group memory /testbench/dut/hart/ifu/icache/controller/ICacheMemWriteEnable -add wave -noupdate -expand -group icache -expand -group memory /testbench/dut/hart/ifu/icache/ICacheMemWriteData +add wave -noupdate -group icache -color Gold /testbench/dut/hart/ifu/icache/controller/CurrState +add wave -noupdate -group icache /testbench/dut/hart/ifu/icache/controller/NextState +add wave -noupdate -group icache /testbench/dut/hart/ifu/ITLBMissF +add wave -noupdate -group icache /testbench/dut/hart/ifu/icache/ITLBWriteF +add wave -noupdate -group icache /testbench/dut/hart/ifu/icache/ReadLineF +add wave -noupdate -group icache /testbench/dut/hart/ifu/icache/ReadLineF +add wave -noupdate -group icache {/testbench/dut/hart/ifu/icache/MemWay[0]/ValidBits} +add wave -noupdate -group icache {/testbench/dut/hart/ifu/icache/MemWay[1]/ValidBits} +add wave -noupdate -group icache {/testbench/dut/hart/ifu/icache/MemWay[2]/ValidBits} +add wave -noupdate -group icache {/testbench/dut/hart/ifu/icache/MemWay[3]/ValidBits} +add wave -noupdate -group icache -expand -group {fsm out and control} /testbench/dut/hart/ifu/icache/controller/hit +add wave -noupdate -group icache -expand -group {fsm out and control} /testbench/dut/hart/ifu/icache/controller/spill +add wave -noupdate -group icache -expand -group {fsm out and control} /testbench/dut/hart/ifu/icache/controller/ICacheStallF +add wave -noupdate -group icache -expand -group {fsm out and control} /testbench/dut/hart/ifu/icache/controller/spillSave +add wave -noupdate -group icache -expand -group {fsm out and control} /testbench/dut/hart/ifu/icache/controller/spillSave +add wave -noupdate -group icache -expand -group {fsm out and control} /testbench/dut/hart/ifu/icache/controller/CntReset +add wave -noupdate -group icache -expand -group {fsm out and control} /testbench/dut/hart/ifu/icache/controller/PreCntEn +add wave -noupdate -group icache -expand -group {fsm out and control} /testbench/dut/hart/ifu/icache/controller/CntEn +add wave -noupdate -group icache -expand -group memory /testbench/dut/hart/ifu/icache/controller/FetchCountFlag +add wave -noupdate -group icache -expand -group memory /testbench/dut/hart/ifu/icache/FetchCount +add wave -noupdate -group icache -expand -group memory /testbench/dut/hart/ifu/icache/controller/InstrReadF +add wave -noupdate -group icache -expand -group memory /testbench/dut/hart/ifu/icache/controller/InstrAckF +add wave -noupdate -group icache -expand -group memory /testbench/dut/hart/ifu/icache/controller/ICacheMemWriteEnable +add wave -noupdate -group icache -expand -group memory /testbench/dut/hart/ifu/icache/ICacheMemWriteData add wave -noupdate -group AHB -color Gold /testbench/dut/hart/ebu/BusState add wave -noupdate -group AHB /testbench/dut/hart/ebu/NextBusState add wave -noupdate -group AHB -expand -group {input requests} /testbench/dut/hart/ebu/AtomicMaskedM @@ -230,171 +226,170 @@ add wave -noupdate -group AHB /testbench/dut/hart/ebu/HMASTLOCK add wave -noupdate -group AHB /testbench/dut/hart/ebu/HADDRD add wave -noupdate -group AHB /testbench/dut/hart/ebu/HSIZED add wave -noupdate -group AHB /testbench/dut/hart/ebu/HWRITED -add wave -noupdate -group AHB /testbench/dut/hart/ebu/StallW -add wave -noupdate -expand -group lsu -group {LSU ARB} /testbench/dut/hart/lsu/arbiter/SelPTW -add wave -noupdate -expand -group lsu -group dcache -color Gold /testbench/dut/hart/lsu/dcache/dcachefsm/CurrState -add wave -noupdate -expand -group lsu -group dcache /testbench/dut/hart/lsu/dcache/WalkerPageFaultM -add wave -noupdate -expand -group lsu -group dcache /testbench/dut/hart/lsu/dcache/WriteDataM -add wave -noupdate -expand -group lsu -group dcache /testbench/dut/hart/lsu/dcache/SRAMBlockWriteEnableM -add wave -noupdate -expand -group lsu -group dcache /testbench/dut/hart/lsu/dcache/SRAMWordWriteEnableM -add wave -noupdate -expand -group lsu -group dcache /testbench/dut/hart/lsu/dcache/SRAMWayWriteEnable -add wave -noupdate -expand -group lsu -group dcache /testbench/dut/hart/lsu/dcache/SRAMWordEnable -add wave -noupdate -expand -group lsu -group dcache /testbench/dut/hart/lsu/dcache/SRAMBlockWayWriteEnableM -add wave -noupdate -expand -group lsu -group dcache /testbench/dut/hart/lsu/dcache/SelAdrM -add wave -noupdate -expand -group lsu -group dcache /testbench/dut/hart/lsu/dcache/ReadDataBlockM -add wave -noupdate -expand -group lsu -group dcache -group flush -radix unsigned /testbench/dut/hart/lsu/dcache/FlushAdr -add wave -noupdate -expand -group lsu -group dcache -group flush /testbench/dut/hart/lsu/dcache/FlushWay -add wave -noupdate -expand -group lsu -group dcache -group flush /testbench/dut/hart/lsu/dcache/VictimDirtyWay -add wave -noupdate -expand -group lsu -group dcache -group flush /testbench/dut/hart/lsu/dcache/VictimTag -add wave -noupdate -expand -group lsu -group dcache -group flush /testbench/dut/hart/lsu/dcache/BasePAdrM -add wave -noupdate -expand -group lsu -group dcache -group flush /testbench/dut/hart/lsu/dcache/FetchCount -add wave -noupdate -expand -group lsu -group dcache -group flush /testbench/dut/hart/lsu/dcache/CacheableM -add wave -noupdate -expand -group lsu -group dcache /testbench/dut/hart/lsu/dcache/DCacheMemWriteData -add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way0 {/testbench/dut/hart/lsu/dcache/MemWay[0]/WriteEnable} -add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way0 {/testbench/dut/hart/lsu/dcache/MemWay[0]/SetValid} -add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way0 {/testbench/dut/hart/lsu/dcache/MemWay[0]/SetDirty} -add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way0 -label TAG {/testbench/dut/hart/lsu/dcache/MemWay[0]/CacheTagMem/StoredData} -add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way0 {/testbench/dut/hart/lsu/dcache/MemWay[0]/DirtyBits} -add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way0 {/testbench/dut/hart/lsu/dcache/MemWay[0]/ValidBits} -add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way0 -expand -group Way0Word0 {/testbench/dut/hart/lsu/dcache/MemWay[0]/word[0]/CacheDataMem/StoredData} -add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way0 -expand -group Way0Word0 {/testbench/dut/hart/lsu/dcache/MemWay[0]/word[0]/CacheDataMem/WriteEnable} -add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way0 -expand -group Way0Word1 {/testbench/dut/hart/lsu/dcache/MemWay[0]/word[1]/CacheDataMem/StoredData} -add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way0 -expand -group Way0Word1 {/testbench/dut/hart/lsu/dcache/MemWay[0]/word[1]/CacheDataMem/WriteEnable} -add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way0 -expand -group Way0Word2 {/testbench/dut/hart/lsu/dcache/MemWay[0]/word[2]/CacheDataMem/WriteEnable} -add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way0 -expand -group Way0Word2 {/testbench/dut/hart/lsu/dcache/MemWay[0]/word[2]/CacheDataMem/StoredData} -add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way0 -expand -group Way0Word3 {/testbench/dut/hart/lsu/dcache/MemWay[0]/word[3]/CacheDataMem/WriteEnable} -add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way0 -expand -group Way0Word3 {/testbench/dut/hart/lsu/dcache/MemWay[0]/word[3]/CacheDataMem/StoredData} -add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way1 {/testbench/dut/hart/lsu/dcache/MemWay[1]/DirtyBits} -add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way1 {/testbench/dut/hart/lsu/dcache/MemWay[1]/ValidBits} -add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way1 {/testbench/dut/hart/lsu/dcache/MemWay[1]/SetDirty} -add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way1 {/testbench/dut/hart/lsu/dcache/MemWay[1]/WriteEnable} -add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way1 {/testbench/dut/hart/lsu/dcache/MemWay[1]/WriteWordEnable} -add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way1 -label TAG {/testbench/dut/hart/lsu/dcache/MemWay[1]/CacheTagMem/StoredData} -add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way1 -expand -group Way1Word0 {/testbench/dut/hart/lsu/dcache/MemWay[1]/word[0]/CacheDataMem/WriteEnable} -add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way1 -expand -group Way1Word0 {/testbench/dut/hart/lsu/dcache/MemWay[1]/word[0]/CacheDataMem/StoredData} -add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way1 -expand -group Way1Word1 {/testbench/dut/hart/lsu/dcache/MemWay[1]/word[1]/CacheDataMem/WriteEnable} -add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way1 -expand -group Way1Word1 {/testbench/dut/hart/lsu/dcache/MemWay[1]/word[1]/CacheDataMem/StoredData} -add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way1 -expand -group Way1Word2 {/testbench/dut/hart/lsu/dcache/MemWay[1]/word[2]/CacheDataMem/WriteEnable} -add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way1 -expand -group Way1Word2 {/testbench/dut/hart/lsu/dcache/MemWay[1]/word[2]/CacheDataMem/StoredData} -add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way1 -expand -group Way1Word3 {/testbench/dut/hart/lsu/dcache/MemWay[1]/word[3]/CacheDataMem/WriteEnable} -add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way1 -expand -group Way1Word3 {/testbench/dut/hart/lsu/dcache/MemWay[1]/word[3]/CacheDataMem/StoredData} -add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way2 {/testbench/dut/hart/lsu/dcache/MemWay[2]/WriteEnable} -add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way2 {/testbench/dut/hart/lsu/dcache/MemWay[2]/SetValid} -add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way2 {/testbench/dut/hart/lsu/dcache/MemWay[2]/SetDirty} -add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way2 -label TAG {/testbench/dut/hart/lsu/dcache/MemWay[2]/CacheTagMem/StoredData} -add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way2 {/testbench/dut/hart/lsu/dcache/MemWay[2]/DirtyBits} -add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way2 {/testbench/dut/hart/lsu/dcache/MemWay[2]/ValidBits} -add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way2 -expand -group Way2Word0 {/testbench/dut/hart/lsu/dcache/MemWay[2]/word[0]/CacheDataMem/StoredData} -add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way2 -expand -group Way2Word0 {/testbench/dut/hart/lsu/dcache/MemWay[2]/word[0]/CacheDataMem/WriteEnable} -add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way2 -expand -group Way2Word1 {/testbench/dut/hart/lsu/dcache/MemWay[2]/word[1]/CacheDataMem/StoredData} -add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way2 -expand -group Way2Word1 {/testbench/dut/hart/lsu/dcache/MemWay[2]/word[1]/CacheDataMem/WriteEnable} -add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way2 -expand -group Way2Word2 {/testbench/dut/hart/lsu/dcache/MemWay[2]/word[2]/CacheDataMem/WriteEnable} -add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way2 -expand -group Way2Word2 {/testbench/dut/hart/lsu/dcache/MemWay[2]/word[2]/CacheDataMem/StoredData} -add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way2 -expand -group Way2Word3 {/testbench/dut/hart/lsu/dcache/MemWay[2]/word[3]/CacheDataMem/WriteEnable} -add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way2 -expand -group Way2Word3 {/testbench/dut/hart/lsu/dcache/MemWay[2]/word[3]/CacheDataMem/StoredData} -add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way3 {/testbench/dut/hart/lsu/dcache/MemWay[3]/WriteEnable} -add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way3 {/testbench/dut/hart/lsu/dcache/MemWay[3]/SetValid} -add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way3 {/testbench/dut/hart/lsu/dcache/MemWay[3]/SetDirty} -add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way3 {/testbench/dut/hart/lsu/dcache/MemWay[3]/ClearDirty} -add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way3 {/testbench/dut/hart/lsu/dcache/MemWay[3]/VDWriteEnable} -add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way3 -label TAG {/testbench/dut/hart/lsu/dcache/MemWay[3]/CacheTagMem/StoredData} -add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way3 {/testbench/dut/hart/lsu/dcache/MemWay[3]/DirtyBits} -add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way3 {/testbench/dut/hart/lsu/dcache/MemWay[3]/ValidBits} -add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way3 -expand -group Way3Word0 {/testbench/dut/hart/lsu/dcache/MemWay[3]/word[0]/CacheDataMem/StoredData} -add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way3 -expand -group Way3Word0 {/testbench/dut/hart/lsu/dcache/MemWay[3]/word[0]/CacheDataMem/WriteEnable} -add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way3 -expand -group Way3Word1 {/testbench/dut/hart/lsu/dcache/MemWay[3]/word[1]/CacheDataMem/StoredData} -add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way3 -expand -group Way3Word1 {/testbench/dut/hart/lsu/dcache/MemWay[3]/word[1]/CacheDataMem/WriteEnable} -add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way3 -expand -group Way3Word2 {/testbench/dut/hart/lsu/dcache/MemWay[3]/word[2]/CacheDataMem/WriteEnable} -add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way3 -expand -group Way3Word2 {/testbench/dut/hart/lsu/dcache/MemWay[3]/word[2]/CacheDataMem/StoredData} -add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way3 -expand -group Way3Word3 {/testbench/dut/hart/lsu/dcache/MemWay[3]/word[3]/CacheDataMem/WriteEnable} -add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group way3 -expand -group Way3Word3 {/testbench/dut/hart/lsu/dcache/MemWay[3]/word[3]/CacheDataMem/StoredData} -add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group valid/dirty /testbench/dut/hart/lsu/dcache/SetValid -add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group valid/dirty /testbench/dut/hart/lsu/dcache/ClearValid -add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group valid/dirty /testbench/dut/hart/lsu/dcache/SetDirty -add wave -noupdate -expand -group lsu -group dcache -expand -group {Cache SRAM writes} -group valid/dirty /testbench/dut/hart/lsu/dcache/ClearDirty -add wave -noupdate -expand -group lsu -group dcache -group {Cache SRAM read} /testbench/dut/hart/lsu/dcache/RAdr -add wave -noupdate -expand -group lsu -group dcache -group {Cache SRAM read} -expand -group way0 {/testbench/dut/hart/lsu/dcache/MemWay[0]/WayHit} -add wave -noupdate -expand -group lsu -group dcache -group {Cache SRAM read} -expand -group way0 {/testbench/dut/hart/lsu/dcache/MemWay[0]/Valid} -add wave -noupdate -expand -group lsu -group dcache -group {Cache SRAM read} -expand -group way0 {/testbench/dut/hart/lsu/dcache/MemWay[0]/Dirty} -add wave -noupdate -expand -group lsu -group dcache -group {Cache SRAM read} -expand -group way0 {/testbench/dut/hart/lsu/dcache/MemWay[0]/ReadTag} -add wave -noupdate -expand -group lsu -group dcache -group {Cache SRAM read} -expand -group way1 {/testbench/dut/hart/lsu/dcache/MemWay[1]/WayHit} -add wave -noupdate -expand -group lsu -group dcache -group {Cache SRAM read} -expand -group way1 {/testbench/dut/hart/lsu/dcache/MemWay[1]/Valid} -add wave -noupdate -expand -group lsu -group dcache -group {Cache SRAM read} -expand -group way1 {/testbench/dut/hart/lsu/dcache/MemWay[1]/Dirty} -add wave -noupdate -expand -group lsu -group dcache -group {Cache SRAM read} -expand -group way1 {/testbench/dut/hart/lsu/dcache/MemWay[1]/ReadTag} -add wave -noupdate -expand -group lsu -group dcache -group {Cache SRAM read} -expand -group way2 {/testbench/dut/hart/lsu/dcache/MemWay[2]/WayHit} -add wave -noupdate -expand -group lsu -group dcache -group {Cache SRAM read} -expand -group way2 {/testbench/dut/hart/lsu/dcache/MemWay[2]/Valid} -add wave -noupdate -expand -group lsu -group dcache -group {Cache SRAM read} -expand -group way2 {/testbench/dut/hart/lsu/dcache/MemWay[2]/Dirty} -add wave -noupdate -expand -group lsu -group dcache -group {Cache SRAM read} -expand -group way2 {/testbench/dut/hart/lsu/dcache/MemWay[2]/ReadTag} -add wave -noupdate -expand -group lsu -group dcache -group {Cache SRAM read} -expand -group way3 {/testbench/dut/hart/lsu/dcache/MemWay[3]/WayHit} -add wave -noupdate -expand -group lsu -group dcache -group {Cache SRAM read} -expand -group way3 {/testbench/dut/hart/lsu/dcache/MemWay[3]/Valid} -add wave -noupdate -expand -group lsu -group dcache -group {Cache SRAM read} -expand -group way3 {/testbench/dut/hart/lsu/dcache/MemWay[3]/Dirty} -add wave -noupdate -expand -group lsu -group dcache -group {Cache SRAM read} -expand -group way3 {/testbench/dut/hart/lsu/dcache/MemWay[3]/ReadTag} -add wave -noupdate -expand -group lsu -group dcache -group {Cache SRAM read} /testbench/dut/hart/lsu/dcache/WayHit -add wave -noupdate -expand -group lsu -group dcache -group {Cache SRAM read} /testbench/dut/hart/lsu/dcache/ReadDataBlockWayMaskedM -add wave -noupdate -expand -group lsu -group dcache -group {Cache SRAM read} /testbench/dut/hart/lsu/dcache/ReadDataWordM -add wave -noupdate -expand -group lsu -group dcache -group {Cache SRAM read} /testbench/dut/hart/lsu/dcache/ReadDataWordMuxM -add wave -noupdate -expand -group lsu -group dcache -group Victim /testbench/dut/hart/lsu/dcache/VictimTag -add wave -noupdate -expand -group lsu -group dcache -group Victim /testbench/dut/hart/lsu/dcache/VictimWay -add wave -noupdate -expand -group lsu -group dcache -group Victim /testbench/dut/hart/lsu/dcache/VictimDirtyWay -add wave -noupdate -expand -group lsu -group dcache -group Victim /testbench/dut/hart/lsu/dcache/VictimDirty -add wave -noupdate -expand -group lsu -group dcache -group {CPU side} /testbench/dut/hart/lsu/dcache/MemRWM -add wave -noupdate -expand -group lsu -group dcache -group {CPU side} /testbench/dut/hart/lsu/dcache/MemAdrE -add wave -noupdate -expand -group lsu -group dcache -group {CPU side} /testbench/dut/hart/lsu/dcache/MemPAdrM -add wave -noupdate -expand -group lsu -group dcache -group {CPU side} /testbench/dut/hart/lsu/dcache/Funct3M -add wave -noupdate -expand -group lsu -group dcache -group {CPU side} /testbench/dut/hart/lsu/dcache/Funct7M -add wave -noupdate -expand -group lsu -group dcache -group {CPU side} /testbench/dut/hart/lsu/dcache/AtomicM -add wave -noupdate -expand -group lsu -group dcache -group {CPU side} /testbench/dut/hart/lsu/dcache/CacheableM -add wave -noupdate -expand -group lsu -group dcache -group {CPU side} /testbench/dut/hart/lsu/dcache/FlushDCacheM -add wave -noupdate -expand -group lsu -group dcache -group {CPU side} /testbench/dut/hart/lsu/dcache/WriteDataM -add wave -noupdate -expand -group lsu -group dcache -group {CPU side} /testbench/dut/hart/lsu/dcache/ReadDataM -add wave -noupdate -expand -group lsu -group dcache -group {CPU side} /testbench/dut/hart/lsu/dcache/DCacheStall -add wave -noupdate -expand -group lsu -group dcache -group status /testbench/dut/hart/lsu/dcache/WayHit -add wave -noupdate -expand -group lsu -group dcache -group status -color {Medium Orchid} /testbench/dut/hart/lsu/dcache/CacheHit -add wave -noupdate -expand -group lsu -group dcache -group status /testbench/dut/hart/lsu/dcache/FetchCount -add wave -noupdate -expand -group lsu -group dcache -group {Memory Side} /testbench/dut/hart/lsu/dcache/AHBPAdr -add wave -noupdate -expand -group lsu -group dcache -group {Memory Side} /testbench/dut/hart/lsu/dcache/AHBRead -add wave -noupdate -expand -group lsu -group dcache -group {Memory Side} /testbench/dut/hart/lsu/dcache/AHBWrite -add wave -noupdate -expand -group lsu -group dcache -group {Memory Side} /testbench/dut/hart/lsu/dcache/AHBAck -add wave -noupdate -expand -group lsu -group dcache -group {Memory Side} /testbench/dut/hart/lsu/dcache/HRDATA -add wave -noupdate -expand -group lsu -group dcache -group {Memory Side} /testbench/dut/hart/lsu/dcache/HWDATA -add wave -noupdate -expand -group lsu -group dcache /testbench/dut/hart/lsu/dcache/FlushWay -add wave -noupdate -expand -group lsu -group dtlb /testbench/dut/hart/lsu/dmmu/genblk1/tlb/tlbcontrol/EffectivePrivilegeMode -add wave -noupdate -expand -group lsu -group dtlb /testbench/dut/hart/lsu/dmmu/genblk1/tlb/tlbcontrol/Translate -add wave -noupdate -expand -group lsu -group dtlb /testbench/dut/hart/lsu/dmmu/genblk1/tlb/tlbcontrol/DisableTranslation -add wave -noupdate -expand -group lsu -group dtlb /testbench/dut/hart/lsu/dmmu/TLBMiss -add wave -noupdate -expand -group lsu -group dtlb /testbench/dut/hart/lsu/dmmu/TLBHit -add wave -noupdate -expand -group lsu -group dtlb /testbench/dut/hart/lsu/dmmu/PhysicalAddress -add wave -noupdate -expand -group lsu -group dtlb -expand -group faults /testbench/dut/hart/lsu/dmmu/TLBPageFault -add wave -noupdate -expand -group lsu -group dtlb -expand -group faults /testbench/dut/hart/lsu/dmmu/LoadAccessFaultM -add wave -noupdate -expand -group lsu -group dtlb -expand -group faults /testbench/dut/hart/lsu/dmmu/StoreAccessFaultM -add wave -noupdate -expand -group lsu -group dtlb /testbench/dut/hart/lsu/dmmu/genblk1/tlb/TLBPAdr -add wave -noupdate -expand -group lsu -group dtlb -expand -group write /testbench/dut/hart/lsu/dmmu/genblk1/tlb/PTE -add wave -noupdate -expand -group lsu -group dtlb -expand -group write /testbench/dut/hart/lsu/dmmu/genblk1/tlb/TLBWrite -add wave -noupdate -expand -group lsu -group pma /testbench/dut/hart/lsu/dmmu/pmachecker/PhysicalAddress -add wave -noupdate -expand -group lsu -group pma /testbench/dut/hart/lsu/dmmu/pmachecker/SelRegions -add wave -noupdate -expand -group lsu -group pma /testbench/dut/hart/lsu/dmmu/Cacheable -add wave -noupdate -expand -group lsu -group pma /testbench/dut/hart/lsu/dmmu/Idempotent -add wave -noupdate -expand -group lsu -group pma /testbench/dut/hart/lsu/dmmu/AtomicAllowed -add wave -noupdate -expand -group lsu -group pma /testbench/dut/hart/lsu/dmmu/pmachecker/PMAAccessFault -add wave -noupdate -expand -group lsu -group pma /testbench/dut/hart/lsu/dmmu/PMAInstrAccessFaultF -add wave -noupdate -expand -group lsu -group pma /testbench/dut/hart/lsu/dmmu/PMALoadAccessFaultM -add wave -noupdate -expand -group lsu -group pma /testbench/dut/hart/lsu/dmmu/PMAStoreAccessFaultM -add wave -noupdate -expand -group lsu -group pmp /testbench/dut/hart/lsu/dmmu/PMPInstrAccessFaultF -add wave -noupdate -expand -group lsu -group pmp /testbench/dut/hart/lsu/dmmu/PMPLoadAccessFaultM -add wave -noupdate -expand -group lsu -group pmp /testbench/dut/hart/lsu/dmmu/PMPStoreAccessFaultM -add wave -noupdate -expand -group lsu -expand -group ptwalker -color Gold /testbench/dut/hart/lsu/hptw/genblk1/WalkerState -add wave -noupdate -expand -group lsu -expand -group ptwalker /testbench/dut/hart/lsu/hptw/PCF -add wave -noupdate -expand -group lsu -expand -group ptwalker /testbench/dut/hart/lsu/hptw/genblk1/TranslationVAdr -add wave -noupdate -expand -group lsu -expand -group ptwalker /testbench/dut/hart/lsu/hptw/TranslationPAdr -add wave -noupdate -expand -group lsu -expand -group ptwalker /testbench/dut/hart/lsu/hptw/HPTWReadPTE -add wave -noupdate -expand -group lsu -expand -group ptwalker /testbench/dut/hart/lsu/hptw/PTE -add wave -noupdate -expand -group lsu -expand -group ptwalker -expand -group types /testbench/dut/hart/lsu/hptw/ITLBMissF -add wave -noupdate -expand -group lsu -expand -group ptwalker -expand -group types /testbench/dut/hart/lsu/hptw/DTLBMissM -add wave -noupdate -expand -group lsu -expand -group ptwalker -expand -group types /testbench/dut/hart/lsu/hptw/ITLBWriteF -add wave -noupdate -expand -group lsu -expand -group ptwalker -expand -group types /testbench/dut/hart/lsu/hptw/DTLBWriteM -add wave -noupdate -expand -group lsu -expand -group ptwalker -expand -group types /testbench/dut/hart/lsu/hptw/WalkerInstrPageFaultF -add wave -noupdate -expand -group lsu -expand -group ptwalker -expand -group types /testbench/dut/hart/lsu/hptw/WalkerLoadPageFaultM -add wave -noupdate -expand -group lsu -expand -group ptwalker -expand -group types /testbench/dut/hart/lsu/hptw/WalkerStorePageFaultM +add wave -noupdate -group lsu -group {LSU ARB} /testbench/dut/hart/lsu/arbiter/SelPTW +add wave -noupdate -group lsu -group dcache -color Gold /testbench/dut/hart/lsu/dcache/dcachefsm/CurrState +add wave -noupdate -group lsu -group dcache /testbench/dut/hart/lsu/dcache/WalkerPageFaultM +add wave -noupdate -group lsu -group dcache /testbench/dut/hart/lsu/dcache/WriteDataM +add wave -noupdate -group lsu -group dcache /testbench/dut/hart/lsu/dcache/SRAMBlockWriteEnableM +add wave -noupdate -group lsu -group dcache /testbench/dut/hart/lsu/dcache/SRAMWordWriteEnableM +add wave -noupdate -group lsu -group dcache /testbench/dut/hart/lsu/dcache/SRAMWayWriteEnable +add wave -noupdate -group lsu -group dcache /testbench/dut/hart/lsu/dcache/SRAMWordEnable +add wave -noupdate -group lsu -group dcache /testbench/dut/hart/lsu/dcache/SRAMBlockWayWriteEnableM +add wave -noupdate -group lsu -group dcache /testbench/dut/hart/lsu/dcache/SelAdrM +add wave -noupdate -group lsu -group dcache /testbench/dut/hart/lsu/dcache/ReadDataBlockM +add wave -noupdate -group lsu -group dcache -group flush -radix unsigned /testbench/dut/hart/lsu/dcache/FlushAdr +add wave -noupdate -group lsu -group dcache -group flush /testbench/dut/hart/lsu/dcache/FlushWay +add wave -noupdate -group lsu -group dcache -group flush /testbench/dut/hart/lsu/dcache/VictimDirtyWay +add wave -noupdate -group lsu -group dcache -group flush /testbench/dut/hart/lsu/dcache/VictimTag +add wave -noupdate -group lsu -group dcache -group flush /testbench/dut/hart/lsu/dcache/BasePAdrM +add wave -noupdate -group lsu -group dcache -group flush /testbench/dut/hart/lsu/dcache/FetchCount +add wave -noupdate -group lsu -group dcache -group flush /testbench/dut/hart/lsu/dcache/CacheableM +add wave -noupdate -group lsu -group dcache /testbench/dut/hart/lsu/dcache/DCacheMemWriteData +add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -group way0 {/testbench/dut/hart/lsu/dcache/MemWay[0]/WriteEnable} +add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -group way0 {/testbench/dut/hart/lsu/dcache/MemWay[0]/SetValid} +add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -group way0 {/testbench/dut/hart/lsu/dcache/MemWay[0]/SetDirty} +add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -group way0 -label TAG {/testbench/dut/hart/lsu/dcache/MemWay[0]/CacheTagMem/StoredData} +add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -group way0 {/testbench/dut/hart/lsu/dcache/MemWay[0]/DirtyBits} +add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -group way0 {/testbench/dut/hart/lsu/dcache/MemWay[0]/ValidBits} +add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -group way0 -expand -group Way0Word0 {/testbench/dut/hart/lsu/dcache/MemWay[0]/word[0]/CacheDataMem/StoredData} +add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -group way0 -expand -group Way0Word0 {/testbench/dut/hart/lsu/dcache/MemWay[0]/word[0]/CacheDataMem/WriteEnable} +add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -group way0 -expand -group Way0Word1 {/testbench/dut/hart/lsu/dcache/MemWay[0]/word[1]/CacheDataMem/StoredData} +add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -group way0 -expand -group Way0Word1 {/testbench/dut/hart/lsu/dcache/MemWay[0]/word[1]/CacheDataMem/WriteEnable} +add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -group way0 -expand -group Way0Word2 {/testbench/dut/hart/lsu/dcache/MemWay[0]/word[2]/CacheDataMem/WriteEnable} +add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -group way0 -expand -group Way0Word2 {/testbench/dut/hart/lsu/dcache/MemWay[0]/word[2]/CacheDataMem/StoredData} +add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -group way0 -expand -group Way0Word3 {/testbench/dut/hart/lsu/dcache/MemWay[0]/word[3]/CacheDataMem/WriteEnable} +add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -group way0 -expand -group Way0Word3 {/testbench/dut/hart/lsu/dcache/MemWay[0]/word[3]/CacheDataMem/StoredData} +add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -group way1 {/testbench/dut/hart/lsu/dcache/MemWay[1]/DirtyBits} +add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -group way1 {/testbench/dut/hart/lsu/dcache/MemWay[1]/ValidBits} +add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -group way1 {/testbench/dut/hart/lsu/dcache/MemWay[1]/SetDirty} +add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -group way1 {/testbench/dut/hart/lsu/dcache/MemWay[1]/WriteEnable} +add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -group way1 {/testbench/dut/hart/lsu/dcache/MemWay[1]/WriteWordEnable} +add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -group way1 -label TAG {/testbench/dut/hart/lsu/dcache/MemWay[1]/CacheTagMem/StoredData} +add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -group way1 -expand -group Way1Word0 {/testbench/dut/hart/lsu/dcache/MemWay[1]/word[0]/CacheDataMem/WriteEnable} +add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -group way1 -expand -group Way1Word0 {/testbench/dut/hart/lsu/dcache/MemWay[1]/word[0]/CacheDataMem/StoredData} +add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -group way1 -expand -group Way1Word1 {/testbench/dut/hart/lsu/dcache/MemWay[1]/word[1]/CacheDataMem/WriteEnable} +add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -group way1 -expand -group Way1Word1 {/testbench/dut/hart/lsu/dcache/MemWay[1]/word[1]/CacheDataMem/StoredData} +add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -group way1 -expand -group Way1Word2 {/testbench/dut/hart/lsu/dcache/MemWay[1]/word[2]/CacheDataMem/WriteEnable} +add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -group way1 -expand -group Way1Word2 {/testbench/dut/hart/lsu/dcache/MemWay[1]/word[2]/CacheDataMem/StoredData} +add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -group way1 -expand -group Way1Word3 {/testbench/dut/hart/lsu/dcache/MemWay[1]/word[3]/CacheDataMem/WriteEnable} +add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -group way1 -expand -group Way1Word3 {/testbench/dut/hart/lsu/dcache/MemWay[1]/word[3]/CacheDataMem/StoredData} +add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -group way2 {/testbench/dut/hart/lsu/dcache/MemWay[2]/WriteEnable} +add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -group way2 {/testbench/dut/hart/lsu/dcache/MemWay[2]/SetValid} +add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -group way2 {/testbench/dut/hart/lsu/dcache/MemWay[2]/SetDirty} +add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -group way2 -label TAG {/testbench/dut/hart/lsu/dcache/MemWay[2]/CacheTagMem/StoredData} +add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -group way2 {/testbench/dut/hart/lsu/dcache/MemWay[2]/DirtyBits} +add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -group way2 {/testbench/dut/hart/lsu/dcache/MemWay[2]/ValidBits} +add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -group way2 -expand -group Way2Word0 {/testbench/dut/hart/lsu/dcache/MemWay[2]/word[0]/CacheDataMem/StoredData} +add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -group way2 -expand -group Way2Word0 {/testbench/dut/hart/lsu/dcache/MemWay[2]/word[0]/CacheDataMem/WriteEnable} +add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -group way2 -expand -group Way2Word1 {/testbench/dut/hart/lsu/dcache/MemWay[2]/word[1]/CacheDataMem/StoredData} +add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -group way2 -expand -group Way2Word1 {/testbench/dut/hart/lsu/dcache/MemWay[2]/word[1]/CacheDataMem/WriteEnable} +add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -group way2 -expand -group Way2Word2 {/testbench/dut/hart/lsu/dcache/MemWay[2]/word[2]/CacheDataMem/WriteEnable} +add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -group way2 -expand -group Way2Word2 {/testbench/dut/hart/lsu/dcache/MemWay[2]/word[2]/CacheDataMem/StoredData} +add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -group way2 -expand -group Way2Word3 {/testbench/dut/hart/lsu/dcache/MemWay[2]/word[3]/CacheDataMem/WriteEnable} +add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -group way2 -expand -group Way2Word3 {/testbench/dut/hart/lsu/dcache/MemWay[2]/word[3]/CacheDataMem/StoredData} +add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -group way3 {/testbench/dut/hart/lsu/dcache/MemWay[3]/WriteEnable} +add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -group way3 {/testbench/dut/hart/lsu/dcache/MemWay[3]/SetValid} +add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -group way3 {/testbench/dut/hart/lsu/dcache/MemWay[3]/SetDirty} +add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -group way3 {/testbench/dut/hart/lsu/dcache/MemWay[3]/ClearDirty} +add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -group way3 {/testbench/dut/hart/lsu/dcache/MemWay[3]/VDWriteEnable} +add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -group way3 -label TAG {/testbench/dut/hart/lsu/dcache/MemWay[3]/CacheTagMem/StoredData} +add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -group way3 {/testbench/dut/hart/lsu/dcache/MemWay[3]/DirtyBits} +add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -group way3 {/testbench/dut/hart/lsu/dcache/MemWay[3]/ValidBits} +add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -group way3 -expand -group Way3Word0 {/testbench/dut/hart/lsu/dcache/MemWay[3]/word[0]/CacheDataMem/StoredData} +add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -group way3 -expand -group Way3Word0 {/testbench/dut/hart/lsu/dcache/MemWay[3]/word[0]/CacheDataMem/WriteEnable} +add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -group way3 -expand -group Way3Word1 {/testbench/dut/hart/lsu/dcache/MemWay[3]/word[1]/CacheDataMem/StoredData} +add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -group way3 -expand -group Way3Word1 {/testbench/dut/hart/lsu/dcache/MemWay[3]/word[1]/CacheDataMem/WriteEnable} +add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -group way3 -expand -group Way3Word2 {/testbench/dut/hart/lsu/dcache/MemWay[3]/word[2]/CacheDataMem/WriteEnable} +add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -group way3 -expand -group Way3Word2 {/testbench/dut/hart/lsu/dcache/MemWay[3]/word[2]/CacheDataMem/StoredData} +add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -group way3 -expand -group Way3Word3 {/testbench/dut/hart/lsu/dcache/MemWay[3]/word[3]/CacheDataMem/WriteEnable} +add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -group way3 -expand -group Way3Word3 {/testbench/dut/hart/lsu/dcache/MemWay[3]/word[3]/CacheDataMem/StoredData} +add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -group valid/dirty /testbench/dut/hart/lsu/dcache/SetValid +add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -group valid/dirty /testbench/dut/hart/lsu/dcache/ClearValid +add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -group valid/dirty /testbench/dut/hart/lsu/dcache/SetDirty +add wave -noupdate -group lsu -group dcache -expand -group {Cache SRAM writes} -group valid/dirty /testbench/dut/hart/lsu/dcache/ClearDirty +add wave -noupdate -group lsu -group dcache -group {Cache SRAM read} /testbench/dut/hart/lsu/dcache/RAdr +add wave -noupdate -group lsu -group dcache -group {Cache SRAM read} -expand -group way0 {/testbench/dut/hart/lsu/dcache/MemWay[0]/WayHit} +add wave -noupdate -group lsu -group dcache -group {Cache SRAM read} -expand -group way0 {/testbench/dut/hart/lsu/dcache/MemWay[0]/Valid} +add wave -noupdate -group lsu -group dcache -group {Cache SRAM read} -expand -group way0 {/testbench/dut/hart/lsu/dcache/MemWay[0]/Dirty} +add wave -noupdate -group lsu -group dcache -group {Cache SRAM read} -expand -group way0 {/testbench/dut/hart/lsu/dcache/MemWay[0]/ReadTag} +add wave -noupdate -group lsu -group dcache -group {Cache SRAM read} -expand -group way1 {/testbench/dut/hart/lsu/dcache/MemWay[1]/WayHit} +add wave -noupdate -group lsu -group dcache -group {Cache SRAM read} -expand -group way1 {/testbench/dut/hart/lsu/dcache/MemWay[1]/Valid} +add wave -noupdate -group lsu -group dcache -group {Cache SRAM read} -expand -group way1 {/testbench/dut/hart/lsu/dcache/MemWay[1]/Dirty} +add wave -noupdate -group lsu -group dcache -group {Cache SRAM read} -expand -group way1 {/testbench/dut/hart/lsu/dcache/MemWay[1]/ReadTag} +add wave -noupdate -group lsu -group dcache -group {Cache SRAM read} -expand -group way2 {/testbench/dut/hart/lsu/dcache/MemWay[2]/WayHit} +add wave -noupdate -group lsu -group dcache -group {Cache SRAM read} -expand -group way2 {/testbench/dut/hart/lsu/dcache/MemWay[2]/Valid} +add wave -noupdate -group lsu -group dcache -group {Cache SRAM read} -expand -group way2 {/testbench/dut/hart/lsu/dcache/MemWay[2]/Dirty} +add wave -noupdate -group lsu -group dcache -group {Cache SRAM read} -expand -group way2 {/testbench/dut/hart/lsu/dcache/MemWay[2]/ReadTag} +add wave -noupdate -group lsu -group dcache -group {Cache SRAM read} -expand -group way3 {/testbench/dut/hart/lsu/dcache/MemWay[3]/WayHit} +add wave -noupdate -group lsu -group dcache -group {Cache SRAM read} -expand -group way3 {/testbench/dut/hart/lsu/dcache/MemWay[3]/Valid} +add wave -noupdate -group lsu -group dcache -group {Cache SRAM read} -expand -group way3 {/testbench/dut/hart/lsu/dcache/MemWay[3]/Dirty} +add wave -noupdate -group lsu -group dcache -group {Cache SRAM read} -expand -group way3 {/testbench/dut/hart/lsu/dcache/MemWay[3]/ReadTag} +add wave -noupdate -group lsu -group dcache -group {Cache SRAM read} /testbench/dut/hart/lsu/dcache/WayHit +add wave -noupdate -group lsu -group dcache -group {Cache SRAM read} /testbench/dut/hart/lsu/dcache/ReadDataBlockWayMaskedM +add wave -noupdate -group lsu -group dcache -group {Cache SRAM read} /testbench/dut/hart/lsu/dcache/ReadDataWordM +add wave -noupdate -group lsu -group dcache -group {Cache SRAM read} /testbench/dut/hart/lsu/dcache/ReadDataWordMuxM +add wave -noupdate -group lsu -group dcache -group Victim /testbench/dut/hart/lsu/dcache/VictimTag +add wave -noupdate -group lsu -group dcache -group Victim /testbench/dut/hart/lsu/dcache/VictimWay +add wave -noupdate -group lsu -group dcache -group Victim /testbench/dut/hart/lsu/dcache/VictimDirtyWay +add wave -noupdate -group lsu -group dcache -group Victim /testbench/dut/hart/lsu/dcache/VictimDirty +add wave -noupdate -group lsu -group dcache -group {CPU side} /testbench/dut/hart/lsu/dcache/MemRWM +add wave -noupdate -group lsu -group dcache -group {CPU side} /testbench/dut/hart/lsu/dcache/MemAdrE +add wave -noupdate -group lsu -group dcache -group {CPU side} /testbench/dut/hart/lsu/dcache/MemPAdrM +add wave -noupdate -group lsu -group dcache -group {CPU side} /testbench/dut/hart/lsu/dcache/Funct3M +add wave -noupdate -group lsu -group dcache -group {CPU side} /testbench/dut/hart/lsu/dcache/Funct7M +add wave -noupdate -group lsu -group dcache -group {CPU side} /testbench/dut/hart/lsu/dcache/AtomicM +add wave -noupdate -group lsu -group dcache -group {CPU side} /testbench/dut/hart/lsu/dcache/CacheableM +add wave -noupdate -group lsu -group dcache -group {CPU side} /testbench/dut/hart/lsu/dcache/FlushDCacheM +add wave -noupdate -group lsu -group dcache -group {CPU side} /testbench/dut/hart/lsu/dcache/WriteDataM +add wave -noupdate -group lsu -group dcache -group {CPU side} /testbench/dut/hart/lsu/dcache/ReadDataM +add wave -noupdate -group lsu -group dcache -group {CPU side} /testbench/dut/hart/lsu/dcache/DCacheStall +add wave -noupdate -group lsu -group dcache -group status /testbench/dut/hart/lsu/dcache/WayHit +add wave -noupdate -group lsu -group dcache -group status -color {Medium Orchid} /testbench/dut/hart/lsu/dcache/CacheHit +add wave -noupdate -group lsu -group dcache -group status /testbench/dut/hart/lsu/dcache/FetchCount +add wave -noupdate -group lsu -group dcache -group {Memory Side} /testbench/dut/hart/lsu/dcache/AHBPAdr +add wave -noupdate -group lsu -group dcache -group {Memory Side} /testbench/dut/hart/lsu/dcache/AHBRead +add wave -noupdate -group lsu -group dcache -group {Memory Side} /testbench/dut/hart/lsu/dcache/AHBWrite +add wave -noupdate -group lsu -group dcache -group {Memory Side} /testbench/dut/hart/lsu/dcache/AHBAck +add wave -noupdate -group lsu -group dcache -group {Memory Side} /testbench/dut/hart/lsu/dcache/HRDATA +add wave -noupdate -group lsu -group dcache -group {Memory Side} /testbench/dut/hart/lsu/dcache/HWDATA +add wave -noupdate -group lsu -group dcache /testbench/dut/hart/lsu/dcache/FlushWay +add wave -noupdate -group lsu -group dtlb /testbench/dut/hart/lsu/dmmu/genblk1/tlb/tlbcontrol/EffectivePrivilegeMode +add wave -noupdate -group lsu -group dtlb /testbench/dut/hart/lsu/dmmu/genblk1/tlb/tlbcontrol/Translate +add wave -noupdate -group lsu -group dtlb /testbench/dut/hart/lsu/dmmu/genblk1/tlb/tlbcontrol/DisableTranslation +add wave -noupdate -group lsu -group dtlb /testbench/dut/hart/lsu/dmmu/TLBMiss +add wave -noupdate -group lsu -group dtlb /testbench/dut/hart/lsu/dmmu/TLBHit +add wave -noupdate -group lsu -group dtlb /testbench/dut/hart/lsu/dmmu/PhysicalAddress +add wave -noupdate -group lsu -group dtlb -expand -group faults /testbench/dut/hart/lsu/dmmu/TLBPageFault +add wave -noupdate -group lsu -group dtlb -expand -group faults /testbench/dut/hart/lsu/dmmu/LoadAccessFaultM +add wave -noupdate -group lsu -group dtlb -expand -group faults /testbench/dut/hart/lsu/dmmu/StoreAccessFaultM +add wave -noupdate -group lsu -group dtlb /testbench/dut/hart/lsu/dmmu/genblk1/tlb/TLBPAdr +add wave -noupdate -group lsu -group dtlb -expand -group write /testbench/dut/hart/lsu/dmmu/genblk1/tlb/PTE +add wave -noupdate -group lsu -group dtlb -expand -group write /testbench/dut/hart/lsu/dmmu/genblk1/tlb/TLBWrite +add wave -noupdate -group lsu -group pma /testbench/dut/hart/lsu/dmmu/pmachecker/PhysicalAddress +add wave -noupdate -group lsu -group pma /testbench/dut/hart/lsu/dmmu/pmachecker/SelRegions +add wave -noupdate -group lsu -group pma /testbench/dut/hart/lsu/dmmu/Cacheable +add wave -noupdate -group lsu -group pma /testbench/dut/hart/lsu/dmmu/Idempotent +add wave -noupdate -group lsu -group pma /testbench/dut/hart/lsu/dmmu/AtomicAllowed +add wave -noupdate -group lsu -group pma /testbench/dut/hart/lsu/dmmu/pmachecker/PMAAccessFault +add wave -noupdate -group lsu -group pma /testbench/dut/hart/lsu/dmmu/PMAInstrAccessFaultF +add wave -noupdate -group lsu -group pma /testbench/dut/hart/lsu/dmmu/PMALoadAccessFaultM +add wave -noupdate -group lsu -group pma /testbench/dut/hart/lsu/dmmu/PMAStoreAccessFaultM +add wave -noupdate -group lsu -group pmp /testbench/dut/hart/lsu/dmmu/PMPInstrAccessFaultF +add wave -noupdate -group lsu -group pmp /testbench/dut/hart/lsu/dmmu/PMPLoadAccessFaultM +add wave -noupdate -group lsu -group pmp /testbench/dut/hart/lsu/dmmu/PMPStoreAccessFaultM +add wave -noupdate -group lsu -expand -group ptwalker -color Gold /testbench/dut/hart/lsu/hptw/genblk1/WalkerState +add wave -noupdate -group lsu -expand -group ptwalker /testbench/dut/hart/lsu/hptw/PCF +add wave -noupdate -group lsu -expand -group ptwalker /testbench/dut/hart/lsu/hptw/genblk1/TranslationVAdr +add wave -noupdate -group lsu -expand -group ptwalker /testbench/dut/hart/lsu/hptw/TranslationPAdr +add wave -noupdate -group lsu -expand -group ptwalker /testbench/dut/hart/lsu/hptw/HPTWReadPTE +add wave -noupdate -group lsu -expand -group ptwalker /testbench/dut/hart/lsu/hptw/PTE +add wave -noupdate -group lsu -expand -group ptwalker -expand -group types /testbench/dut/hart/lsu/hptw/ITLBMissF +add wave -noupdate -group lsu -expand -group ptwalker -expand -group types /testbench/dut/hart/lsu/hptw/DTLBMissM +add wave -noupdate -group lsu -expand -group ptwalker -expand -group types /testbench/dut/hart/lsu/hptw/ITLBWriteF +add wave -noupdate -group lsu -expand -group ptwalker -expand -group types /testbench/dut/hart/lsu/hptw/DTLBWriteM +add wave -noupdate -group lsu -expand -group ptwalker -expand -group types /testbench/dut/hart/lsu/hptw/WalkerInstrPageFaultF +add wave -noupdate -group lsu -expand -group ptwalker -expand -group types /testbench/dut/hart/lsu/hptw/WalkerLoadPageFaultM +add wave -noupdate -group lsu -expand -group ptwalker -expand -group types /testbench/dut/hart/lsu/hptw/WalkerStorePageFaultM add wave -noupdate -group csr -color Gray90 -radix unsigned /testbench/dut/hart/priv/csr/genblk1/counters/genblk1/INSTRET_REGW add wave -noupdate -group csr /testbench/dut/hart/priv/csr/genblk1/counters/genblk1/HPMCOUNTER_REGW add wave -noupdate -group csr -expand -group machine /testbench/dut/hart/priv/csr/genblk1/csrm/MIE_REGW @@ -491,7 +486,6 @@ add wave -noupdate -group {debug trace} -expand -group mem /testbench/ExpectedPC add wave -noupdate -group {debug trace} -expand -group mem /testbench/line add wave -noupdate -group {debug trace} -expand -group mem /testbench/textM add wave -noupdate -group {debug trace} -expand -group mem -color Brown /testbench/dut/hart/hzu/TrapM -add wave -noupdate -group {debug trace} -expand -group wb /testbench/dut/hart/ieu/c/InstrValidW add wave -noupdate -group {debug trace} -expand -group wb /testbench/checkInstrW add wave -noupdate -group {debug trace} -expand -group wb /testbench/PCW add wave -noupdate -group {debug trace} -expand -group wb /testbench/ExpectedPCW @@ -515,7 +509,7 @@ add wave -noupdate /testbench/dut/uncore/dtim/memwrite add wave -noupdate /testbench/dut/uncore/dtim/HWDATA add wave -noupdate /testbench/dut/uncore/dtim/risingHREADYTim TreeUpdate [SetDefaultTree] -WaveRestoreCursors {{Cursor 23} {209183247 ns} 0} {{Cursor 5} {37454355 ns} 0} +WaveRestoreCursors {{Cursor 23} {209183247 ns} 0} {{Cursor 5} {197 ns} 0} quietly wave cursor active 2 configure wave -namecolwidth 250 configure wave -valuecolwidth 314 @@ -531,4 +525,4 @@ configure wave -griddelta 40 configure wave -timeline 0 configure wave -timelineunits ns update -WaveRestoreZoom {37454022 ns} {37455158 ns} +WaveRestoreZoom {182 ns} {330 ns} diff --git a/wally-pipelined/regression/wally-buildroot.do b/wally-pipelined/regression/wally-buildroot.do index daa1f6e68..51c28ef48 100644 --- a/wally-pipelined/regression/wally-buildroot.do +++ b/wally-pipelined/regression/wally-buildroot.do @@ -36,7 +36,8 @@ vsim workopt -suppress 8852,12070 #-- Run the Simulation run -all -do ./wave-dos/linux-waves.do +do linux-wave.do +add log -r /* run -all exec ./slack-notifier/slack-notifier.py From d348ebffdaaa04e9290eec0c39ce18145f8afba4 Mon Sep 17 00:00:00 2001 From: bbracker Date: Sun, 24 Oct 2021 18:39:51 -0700 Subject: [PATCH 039/132] checkpoint initialization bugfix --- .../linux-testgen/testvector-generation/genCheckpoint.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wally-pipelined/linux-testgen/testvector-generation/genCheckpoint.sh b/wally-pipelined/linux-testgen/testvector-generation/genCheckpoint.sh index 2666d69e2..249094ea3 100755 --- a/wally-pipelined/linux-testgen/testvector-generation/genCheckpoint.sh +++ b/wally-pipelined/linux-testgen/testvector-generation/genCheckpoint.sh @@ -32,7 +32,7 @@ then # Post-Process GDB outputs ./parseState.py "$checkOutDir" ./fix_mem.py "$checkIntermedDir/ramGDB.txt" "$checkOutDir/ram.txt" - tail -n+$(($instrs-9)) "$outDir/$traceFile" > "$checkOutDir/$traceFile" + tail -n+$instrs "$outDir/$traceFile" > "$checkOutDir/$traceFile" else echo "You can change the number of instructions by editing the \"instrs\" variable in this script." echo "Have a nice day!" From ebef47b1c92498913a47b0e0a01d3abc114829a1 Mon Sep 17 00:00:00 2001 From: Ross Thompson Date: Sun, 24 Oct 2021 21:21:49 -0500 Subject: [PATCH 040/132] Modified the cache's sram model so if it used to synthesize flip flops it terminates the read critical path at the address's input rather than the output read data. --- wally-pipelined/src/cache/sram1rw.sv | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/wally-pipelined/src/cache/sram1rw.sv b/wally-pipelined/src/cache/sram1rw.sv index d2b4b8470..835e7061f 100644 --- a/wally-pipelined/src/cache/sram1rw.sv +++ b/wally-pipelined/src/cache/sram1rw.sv @@ -14,13 +14,19 @@ module sram1rw #(parameter DEPTH=128, WIDTH=256) ( ); logic [WIDTH-1:0][DEPTH-1:0] StoredData; + logic [$clog2(WIDTH)-1:0] AddrD; + always_ff @(posedge clk) begin - ReadData <= StoredData[Addr]; + AddrD <= Addr; if (WriteEnable) begin StoredData[Addr] <= #1 WriteData; end end + + + assign ReadData = StoredData[AddrD]; + endmodule /* verilator lint_on ASSIGNDLY */ From b3a14452fa3bbc914bbe72b977147f802935cd80 Mon Sep 17 00:00:00 2001 From: Ross Thompson Date: Mon, 25 Oct 2021 09:43:07 -0500 Subject: [PATCH 041/132] Fixed synthesize script to find the flops after moving. From b51e4d504be6977c04f4151af1afcc1988d29709 Mon Sep 17 00:00:00 2001 From: bbracker Date: Mon, 25 Oct 2021 10:04:30 -0700 Subject: [PATCH 042/132] some linux testbench cleanup --- wally-pipelined/testbench/testbench-linux.sv | 280 ++++++++----------- 1 file changed, 121 insertions(+), 159 deletions(-) diff --git a/wally-pipelined/testbench/testbench-linux.sv b/wally-pipelined/testbench/testbench-linux.sv index cfac5c1b6..91c536257 100644 --- a/wally-pipelined/testbench/testbench-linux.sv +++ b/wally-pipelined/testbench/testbench-linux.sv @@ -43,17 +43,23 @@ `endif module testbench(); - + /////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////// CONFIG //////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////// parameter INSTR_LIMIT = 0; // # of instructions at which to stop - parameter INSTR_WAVEON = (INSTR_LIMIT > 10000) ? INSTR_LIMIT-10000 : 1; // # of instructions at which to turn on waves in graphical sim - - string ProgramAddrMapFile, ProgramLabelMapFile; + parameter INSTR_WAVEON = 8.7e6;//(INSTR_LIMIT > 10000) ? INSTR_LIMIT-10000 : 1; // # of instructions at which to turn on waves in graphical sim + //parameter CHECKPOINT = 0; /////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////// DUT ///////////////////////////////////// + ////////////////////////////////// HARDWARE /////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// - logic clk, reset; - logic [`AHBW-1:0] readDataExpected; + logic clk, reset; + initial begin reset <= 1; # 22; reset <= 0; end + always begin clk <= 1; # 5; clk <= 0; # 5; end + + logic [`AHBW-1:0] HRDATAEXT; + logic HREADYEXT, HRESPEXT; + logic HCLK, HRESETn; logic [31:0] HADDR; logic [`AHBW-1:0] HWDATA; logic HWRITE; @@ -62,50 +68,44 @@ module testbench(); logic [3:0] HPROT; logic [1:0] HTRANS; logic HMASTLOCK; - logic HCLK, HRESETn; - logic [`AHBW-1:0] HRDATAEXT; - logic HREADYEXT, HRESPEXT; logic [31:0] GPIOPinsIn; logic [31:0] GPIOPinsOut, GPIOPinsEn; - logic UARTSin, UARTSout; + logic UARTSin; + logic UARTSout; assign GPIOPinsIn = 0; assign UARTSin = 1; + wallypipelinedsoc dut(.clk, .reset, + .HRDATAEXT, .HREADYEXT, .HRESPEXT, .HCLK, .HRESETn, .HADDR, + .HWDATA, .HWRITE, .HSIZE, .HBURST, .HPROT, .HTRANS, .HMASTLOCK, + .GPIOPinsIn, .GPIOPinsOut, .GPIOPinsEn, + .UARTSin, .UARTSout); - wallypipelinedsoc dut(.*); + // Write Back stage signals not needed by Wally itself + logic [`XLEN-1:0] PCW; + logic [31:0] InstrW; + logic InstrValidW; + logic [`XLEN-1:0] MemAdrW, WriteDataW; + logic TrapW; + `define FLUSHW dut.hart.FlushW + `define STALLW dut.hart.StallW + flopenrc #(`XLEN) PCWReg(clk, reset, `FLUSHW, ~`STALLW, dut.hart.ifu.PCM, PCW); + flopenr #(32) InstrWReg(clk, reset, ~`STALLW, `FLUSHW ? nop : dut.hart.ifu.InstrM, InstrW); + flopenrc #(1) controlregW(clk, reset, `FLUSHW, ~`STALLW, dut.hart.ieu.c.InstrValidM, InstrValidW); + flopenrc #(`XLEN) MemAdrWReg(clk, reset, `FLUSHW, ~`STALLW, dut.hart.ieu.dp.MemAdrM, MemAdrW); + flopenrc #(`XLEN) WriteDataWReg(clk, reset, `FLUSHW, ~`STALLW, dut.hart.WriteDataM, WriteDataW); + flopenr #(1) TrapWReg(clk, reset, ~`STALLW, dut.hart.hzu.TrapM, TrapW); /////////////////////////////////////////////////////////////////////////////// - //////////////////////// Signals & Shared Macros /////////////////////////// - //////////////////////// AKA stuff that comes first /////////////////////////// + //////////////////////// Signals & Macro DECLARATIONS ///////////////////////// /////////////////////////////////////////////////////////////////////////////// - // Sorry if these have gotten decontextualized. - // Verilog expects them to be defined before they are used. - - // ------------------- - // Signal Declarations - // ------------------- // Testbench Core integer warningCount = 0; integer errorCount = 0; - integer MIPexpected; - // P, Instr Checking - integer data_file_all; - string name; - - // Write Back stage signals needed for trace compare, but don't actually - // exist in CPU. - logic [`XLEN-1:0] MemAdrW, WriteDataW; - logic [`XLEN-1:0] PCW; - logic [31:0] InstrW; - logic InstrValidW; - - // Write Back trace signals - logic checkInstrW; - - integer fault; - logic TrapW; - - // Signals used to parse the trace file. - logic checkInstrM; + integer fault; + string ProgramAddrMapFile, ProgramLabelMapFile; + // Signals used to parse the trace file + integer data_file_all; + string name; integer matchCount; string line; logic [`XLEN-1:0] ExpectedPCM; @@ -118,8 +118,9 @@ module testbench(); integer TokenIndex; integer MarkerIndex; integer NumCSRM; - // Memory stage expected values from trace + logic checkInstrM; + integer MIPexpected; string RegWriteM; integer ExpectedRegAdrM; logic [`XLEN-1:0] ExpectedRegValueM; @@ -127,8 +128,9 @@ module testbench(); logic [`XLEN-1:0] ExpectedMemAdrM, ExpectedMemReadDataM, ExpectedMemWriteDataM; string ExpectedCSRArrayM[10:0]; logic [`XLEN-1:0] ExpectedCSRArrayValueM[10:0]; - + logic [`AHBW-1:0] readDataExpected; // Write back stage expected values from trace + logic checkInstrW; logic [`XLEN-1:0] ExpectedPCW; logic [31:0] ExpectedInstrW; string textW; @@ -147,26 +149,75 @@ module testbench(); integer NumCSRPostWIndex; logic [`XLEN-1:0] InstrCountW; integer RequestDelayedMIP; - - // ------ - // Macros - // ------ - `define CSRwarn(CSR) \ + // Useful Aliases + `define RF dut.hart.ieu.dp.regf.rf + `define PC dut.hart.ifu.pcreg.q + `define CSR_BASE dut.hart.priv.csr.genblk1 + `define HPMCOUNTER `CSR_BASE.counters.genblk1.HPMCOUNTER_REGW + `define PMP_BASE `CSR_BASE.csrm.genblk4 + `define PMPCFG genblk2.PMPCFGreg.q + `define PMPADDR PMPADDRreg.q + `define MEDELEG `CSR_BASE.csrm.genblk1.MEDELEGreg.q + `define MIDELEG `CSR_BASE.csrm.genblk1.MIDELEGreg.q + `define MIE `CSR_BASE.csri.MIE_REGW + `define MIP `CSR_BASE.csri.MIP_REGW + `define MCAUSE `CSR_BASE.csrm.MCAUSEreg.q + `define SCAUSE `CSR_BASE.csrs.genblk1.SCAUSEreg.q + `define MEPC `CSR_BASE.csrm.MEPCreg.q + `define SEPC `CSR_BASE.csrs.genblk1.SEPCreg.q + `define MCOUNTEREN `CSR_BASE.csrm.genblk3.MCOUNTERENreg.q + `define SCOUNTEREN `CSR_BASE.csrs.genblk1.genblk3.SCOUNTERENreg.q + `define MSCRATCH `CSR_BASE.csrm.MSCRATCHreg.q + `define SSCRATCH `CSR_BASE.csrs.genblk1.SSCRATCHreg.q + `define MTVEC `CSR_BASE.csrm.MTVECreg.q + `define STVEC `CSR_BASE.csrs.genblk1.STVECreg.q + `define SATP `CSR_BASE.csrs.genblk1.genblk2.SATPreg.q + `define MSTATUS `CSR_BASE.csrsr.MSTATUS_REGW + `define STATUS_TSR `CSR_BASE.csrsr.STATUS_TSR_INT + `define STATUS_TW `CSR_BASE.csrsr.STATUS_TW_INT + `define STATUS_TVM `CSR_BASE.csrsr.STATUS_TVM_INT + `define STATUS_MXR `CSR_BASE.csrsr.STATUS_MXR_INT + `define STATUS_SUM `CSR_BASE.csrsr.STATUS_SUM_INT + `define STATUS_MPRV `CSR_BASE.csrsr.STATUS_MPRV_INT + `define STATUS_FS `CSR_BASE.csrsr.STATUS_FS_INT + `define STATUS_MPP `CSR_BASE.csrsr.STATUS_MPP + `define STATUS_SPP `CSR_BASE.csrsr.STATUS_SPP + `define STATUS_MPIE `CSR_BASE.csrsr.STATUS_MPIE + `define STATUS_SPIE `CSR_BASE.csrsr.STATUS_SPIE + `define STATUS_UPIE `CSR_BASE.csrsr.STATUS_UPIE + `define STATUS_MIE `CSR_BASE.csrsr.STATUS_MIE + `define STATUS_SIE `CSR_BASE.csrsr.STATUS_SIE + `define STATUS_UIE `CSR_BASE.csrsr.STATUS_UIE + `define CURR_PRIV dut.hart.priv.privmodereg.q + `define INSTRET dut.hart.priv.csr.genblk1.counters.genblk1.genblk2.INSTRETreg.q + // Common Macros + `define checkCSR(CSR) \ begin \ - $display("CSR: %s = %016x, expected = %016x", ExpectedCSRArrayW[NumCSRPostWIndex], CSR, ExpectedCSRArrayValueW[NumCSRPostWIndex]); \ if (CSR != ExpectedCSRArrayValueW[NumCSRPostWIndex]) begin \ $display("%tns, %d instrs: CSR %s = %016x, does not equal expected value %016x", $time, InstrCountW, ExpectedCSRArrayW[NumCSRPostWIndex], CSR, ExpectedCSRArrayValueW[NumCSRPostWIndex]); \ if(`DEBUG_TRACE >= 3) fault = 1; \ end \ end - `define checkEQ(NAME, VAL, EXPECTED) \ if(VAL != EXPECTED) begin \ $display("%tns, %d instrs: %s %x differs from expected %x", $time, InstrCountW, NAME, VAL, EXPECTED); \ if ((NAME == "PCW") || (`DEBUG_TRACE >= 2)) fault = 1; \ end + /////////////////////////////////////////////////////////////////////////////// + /////////////////////////////// INITIALIZATION //////////////////////////////// + /////////////////////////////////////////////////////////////////////////////// initial begin + $readmemh({`LINUX_TEST_VECTORS,"bootmem.txt"}, dut.uncore.bootdtim.bootdtim.RAM, 'h1000 >> 3); + `ifdef CHECKPOINT + $readmemh({`CHECKPOINT_DIR,"ram.txt"}, dut.uncore.dtim.RAM); + `else + $readmemh({`LINUX_TEST_VECTORS,"ram.txt"}, dut.uncore.dtim.RAM); + `endif + $readmemb(`TWO_BIT_PRELOAD, dut.hart.ifu.bpred.bpred.Predictor.DirPredictor.PHT.mem); + $readmemb(`BTB_PRELOAD, dut.hart.ifu.bpred.bpred.TargetPredictor.memory.mem); + ProgramAddrMapFile = {`LINUX_TEST_VECTORS,"vmlinux.objdump.addr"}; + ProgramLabelMapFile = {`LINUX_TEST_VECTORS,"vmlinux.objdump.lab"}; `ifdef CHECKPOINT data_file_all = $fopen({`CHECKPOINT_DIR,"all.txt"}, "r"); `else @@ -182,19 +233,9 @@ module testbench(); force dut.hart.priv.ExtIntM = 0; end - assign checkInstrM = dut.hart.ieu.InstrValidM & ~dut.hart.priv.trap.InstrPageFaultM & ~dut.hart.priv.trap.InterruptM & ~dut.hart.StallM; - assign checkInstrW = InstrValidW & ~dut.hart.StallW; // trapW will already be invalid in there was an InstrPageFault in the previous instruction. - - // Additonal W stage registers - `define FLUSHW dut.hart.FlushW - `define STALLW dut.hart.StallW - flopenr #(32) InstrWReg(clk, reset, ~`STALLW, `FLUSHW ? nop : dut.hart.ifu.InstrM, InstrW); - flopenrc #(`XLEN) MemAdrWReg(clk, reset, `FLUSHW, ~`STALLW, dut.hart.ieu.dp.MemAdrM, MemAdrW); - flopenrc #(`XLEN) WriteDataWReg(clk, reset, `FLUSHW, ~`STALLW, dut.hart.WriteDataM, WriteDataW); - flopenrc #(`XLEN) PCWReg(clk, reset, `FLUSHW, ~`STALLW, dut.hart.ifu.PCM, PCW); - flopenr #(1) TrapWReg(clk, reset, ~`STALLW, dut.hart.hzu.TrapM, TrapW); - flopenrc #(5) controlregW(clk, reset, `FLUSHW, ~`STALLW, dut.hart.ieu.c.InstrValidM, InstrValidW); - + /////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////// CORE ///////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////// // Because qemu does not match exactly to wally it is necessary to read the the // trace in the memory stage and detect if anything in wally must be overwritten. // This includes mtimer, interrupts, and various bits in mstatus and xtval. @@ -203,6 +244,7 @@ module testbench(); // on the next falling edge the expected state is compared to the wally state. // step 0: read the expected state + assign checkInstrM = dut.hart.ieu.InstrValidM & ~dut.hart.priv.trap.InstrPageFaultM & ~dut.hart.priv.trap.InterruptM & ~dut.hart.StallM; always @(negedge clk) begin // always check PC, instruction bits if (checkInstrM) begin @@ -352,6 +394,7 @@ module testbench(); end // step2: make all checks in the write back stage. + assign checkInstrW = InstrValidW & ~dut.hart.StallW; // trapW will already be invalid in there was an InstrPageFault in the previous instruction. always @(negedge clk) begin if(RequestDelayedMIP) begin $display("%tns: Updating MIP to %x",$time,ExpectedCSRArrayValueW[NumCSRM]); @@ -371,7 +414,8 @@ module testbench(); fault = 0; if (`DEBUG_TRACE >= 1) begin `checkEQ("PCW",PCW,ExpectedPCW) - `checkEQ("InstrW",InstrW,ExpectedInstrW) + //`checkEQ("InstrW",InstrW,ExpectedInstrW) <-- not viable because of + // compressed to uncompressed conversion `checkEQ("Instr Count",dut.hart.priv.csr.genblk1.counters.genblk1.INSTRET_REGW,InstrCountW) #2; // delay 2 ns. if(`DEBUG_TRACE >= 5) begin @@ -397,19 +441,19 @@ module testbench(); // check csr for(NumCSRPostWIndex = 0; NumCSRPostWIndex < NumCSRW; NumCSRPostWIndex++) begin case(ExpectedCSRArrayW[NumCSRPostWIndex]) - "mhartid": `CSRwarn(dut.hart.priv.csr.genblk1.csrm.MHARTID_REGW) - "mstatus": `CSRwarn(dut.hart.priv.csr.genblk1.csrm.MSTATUS_REGW) - "mtvec": `CSRwarn(dut.hart.priv.csr.genblk1.csrm.MTVEC_REGW) - "mip": `CSRwarn(dut.hart.priv.csr.genblk1.csrm.MIP_REGW) - "mie": `CSRwarn(dut.hart.priv.csr.genblk1.csrm.MIE_REGW) - "mideleg":`CSRwarn(dut.hart.priv.csr.genblk1.csrm.MIDELEG_REGW) - "medeleg": `CSRwarn(dut.hart.priv.csr.genblk1.csrm.MEDELEG_REGW) - "mepc": `CSRwarn(dut.hart.priv.csr.genblk1.csrm.MEPC_REGW) - "mtval": `CSRwarn(dut.hart.priv.csr.genblk1.csrm.MTVAL_REGW) - "sepc": `CSRwarn(dut.hart.priv.csr.genblk1.csrs.SEPC_REGW) - "scause": `CSRwarn(dut.hart.priv.csr.genblk1.csrs.genblk1.SCAUSE_REGW) - "stvec": `CSRwarn(dut.hart.priv.csr.genblk1.csrs.STVEC_REGW) - "stval": `CSRwarn(dut.hart.priv.csr.genblk1.csrs.genblk1.STVAL_REGW) + "mhartid": `checkCSR(dut.hart.priv.csr.genblk1.csrm.MHARTID_REGW) + "mstatus": `checkCSR(dut.hart.priv.csr.genblk1.csrm.MSTATUS_REGW) + "mtvec": `checkCSR(dut.hart.priv.csr.genblk1.csrm.MTVEC_REGW) + "mip": `checkCSR(dut.hart.priv.csr.genblk1.csrm.MIP_REGW) + "mie": `checkCSR(dut.hart.priv.csr.genblk1.csrm.MIE_REGW) + "mideleg": `checkCSR(dut.hart.priv.csr.genblk1.csrm.MIDELEG_REGW) + "medeleg": `checkCSR(dut.hart.priv.csr.genblk1.csrm.MEDELEG_REGW) + "mepc": `checkCSR(dut.hart.priv.csr.genblk1.csrm.MEPC_REGW) + "mtval": `checkCSR(dut.hart.priv.csr.genblk1.csrm.MTVAL_REGW) + "sepc": `checkCSR(dut.hart.priv.csr.genblk1.csrs.SEPC_REGW) + "scause": `checkCSR(dut.hart.priv.csr.genblk1.csrs.genblk1.SCAUSE_REGW) + "stvec": `checkCSR(dut.hart.priv.csr.genblk1.csrs.STVEC_REGW) + "stval": `checkCSR(dut.hart.priv.csr.genblk1.csrs.genblk1.STVAL_REGW) endcase end if (fault == 1) begin @@ -429,63 +473,7 @@ module testbench(); .ProgramLabelMapFile(ProgramLabelMapFile)); - /////////////////////////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////// Testbench Core ///////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////////////////////////// - // -------------- - // Initialization - // -------------- - /*`ifdef CHECKPOINT - var [`XLEN-1:0] initRF[31:1]; - var [`COUNTERS-1:3][`XLEN-1:0] initHPMCOUNTER; - var [7:0][`PMP_ENTRIES-1:0] initPMPCFG; - var [`XLEN-1:0][`PMP_ENTRIES-1:0] initPMPADDR; - var initMIDELEG, initMCAUSE, initMCOUNTEREN, initMEDELEG, initMEPC, initMTVEC, initMIE, - initMIP, initMSCRATCH, initMSTATUS, initSCAUSE, initSSCRATCH, initSATP, initSCOUNTEREN, - initSEPC, initSTVEC; - - `endif*/ `ifdef CHECKPOINT - `define RF dut.hart.ieu.dp.regf.rf - `define PC dut.hart.ifu.pcreg.q - `define CSR_BASE dut.hart.priv.csr.genblk1 - `define HPMCOUNTER `CSR_BASE.counters.genblk1.HPMCOUNTER_REGW - `define PMP_BASE `CSR_BASE.csrm.genblk4 - `define PMPCFG genblk2.PMPCFGreg.q - `define PMPADDR PMPADDRreg.q - `define MEDELEG `CSR_BASE.csrm.genblk1.MEDELEGreg.q - `define MIDELEG `CSR_BASE.csrm.genblk1.MIDELEGreg.q - `define MIE `CSR_BASE.csri.MIE_REGW - `define MIP `CSR_BASE.csri.MIP_REGW - `define MCAUSE `CSR_BASE.csrm.MCAUSEreg.q - `define SCAUSE `CSR_BASE.csrs.genblk1.SCAUSEreg.q - `define MEPC `CSR_BASE.csrm.MEPCreg.q - `define SEPC `CSR_BASE.csrs.genblk1.SEPCreg.q - `define MCOUNTEREN `CSR_BASE.csrm.genblk3.MCOUNTERENreg.q - `define SCOUNTEREN `CSR_BASE.csrs.genblk1.genblk3.SCOUNTERENreg.q - `define MSCRATCH `CSR_BASE.csrm.MSCRATCHreg.q - `define SSCRATCH `CSR_BASE.csrs.genblk1.SSCRATCHreg.q - `define MTVEC `CSR_BASE.csrm.MTVECreg.q - `define STVEC `CSR_BASE.csrs.genblk1.STVECreg.q - `define SATP `CSR_BASE.csrs.genblk1.genblk2.SATPreg.q - `define MSTATUS `CSR_BASE.csrsr.MSTATUS_REGW - `define STATUS_TSR `CSR_BASE.csrsr.STATUS_TSR_INT - `define STATUS_TW `CSR_BASE.csrsr.STATUS_TW_INT - `define STATUS_TVM `CSR_BASE.csrsr.STATUS_TVM_INT - `define STATUS_MXR `CSR_BASE.csrsr.STATUS_MXR_INT - `define STATUS_SUM `CSR_BASE.csrsr.STATUS_SUM_INT - `define STATUS_MPRV `CSR_BASE.csrsr.STATUS_MPRV_INT - `define STATUS_FS `CSR_BASE.csrsr.STATUS_FS_INT - `define STATUS_MPP `CSR_BASE.csrsr.STATUS_MPP - `define STATUS_SPP `CSR_BASE.csrsr.STATUS_SPP - `define STATUS_MPIE `CSR_BASE.csrsr.STATUS_MPIE - `define STATUS_SPIE `CSR_BASE.csrsr.STATUS_SPIE - `define STATUS_UPIE `CSR_BASE.csrsr.STATUS_UPIE - `define STATUS_MIE `CSR_BASE.csrsr.STATUS_MIE - `define STATUS_SIE `CSR_BASE.csrsr.STATUS_SIE - `define STATUS_UIE `CSR_BASE.csrsr.STATUS_UIE - `define CURR_PRIV dut.hart.priv.privmodereg.q - `define INSTRET dut.hart.priv.csr.genblk1.counters.genblk1.genblk2.INSTRETreg.q `define INIT_CHECKPOINT_VAL(SIGNAL_BASE,SIGNAL,DIM,LARGE_INDEX,SMALL_INDEX) \ logic DIM init``SIGNAL [LARGE_INDEX:SMALL_INDEX]; \ @@ -573,36 +561,10 @@ module testbench(); `endif - initial begin - reset <= 1; # 22; reset <= 0; - $stop; - end - // initial loading of memories - initial begin - $readmemh({`LINUX_TEST_VECTORS,"bootmem.txt"}, dut.uncore.bootdtim.bootdtim.RAM, 'h1000 >> 3); - `ifdef CHECKPOINT - $readmemh({`CHECKPOINT_DIR,"ram.txt"}, dut.uncore.dtim.RAM); - `else - - $readmemh({`LINUX_TEST_VECTORS,"ram.txt"}, dut.uncore.dtim.RAM); - `endif - $readmemb(`TWO_BIT_PRELOAD, dut.hart.ifu.bpred.bpred.Predictor.DirPredictor.PHT.mem); - $readmemb(`BTB_PRELOAD, dut.hart.ifu.bpred.bpred.TargetPredictor.memory.mem); - ProgramAddrMapFile = {`LINUX_TEST_VECTORS,"vmlinux.objdump.addr"}; - ProgramLabelMapFile = {`LINUX_TEST_VECTORS,"vmlinux.objdump.lab"}; - end - - // ------- - // Running - // ------- - always - begin - clk <= 1; # 5; clk <= 0; # 5; - end /////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////// Miscellaneous /////////////////////////////// + //////////////////////////////// Extra Features /////////////////////////////// /////////////////////////////////////////////////////////////////////////////// // Instr Opcode Tracking // For waveview convenience From 47124f36c85c8af87d7f043f11c224adcfeed9d9 Mon Sep 17 00:00:00 2001 From: David Harris Date: Mon, 25 Oct 2021 10:05:41 -0700 Subject: [PATCH 043/132] Added synchronizer to reset --- wally-pipelined/regression/lint-wally | 5 ++--- wally-pipelined/src/wally/wallypipelinedsoc.sv | 6 +++++- wally-pipelined/testbench/testbench.sv | 6 +++--- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/wally-pipelined/regression/lint-wally b/wally-pipelined/regression/lint-wally index 67cc7a640..a61624aaa 100755 --- a/wally-pipelined/regression/lint-wally +++ b/wally-pipelined/regression/lint-wally @@ -7,7 +7,7 @@ verilator=`which verilator` basepath=$(dirname $0)/.. for config in rv64g rv32g; do echo "$config linting..." - if !($verilator --lint-only --Wall "$@" --top-module wallypipelinedsoc "-I$basepath/config/shared" "-I$basepath/config/$config" $basepath/src/*/*.sv $basepath/src/*/*/*.sv --relative-includes); then + if !($verilator --lint-only "$@" --top-module wallypipelinedsoc "-I$basepath/config/shared" "-I$basepath/config/$config" $basepath/src/*/*.sv $basepath/src/*/*/*.sv --relative-includes); then echo "Exiting after $config lint due to errors or warnings" exit 1 fi @@ -17,6 +17,5 @@ echo "All lints run with no errors or warnings" # --lint-only just runs lint rather than trying to compile and simulate # -I points to the include directory where files such as `include wally-config.vh are found -# For more exhaustive (and sometimes spurious) warnings, run: -# verilator --lint-only -Wall -Iconfig/rv64ic src/* +# For more exhaustive (and sometimes spurious) warnings, add --Wall to the Verilator command # Unfortunately, this produces a bunch of UNUSED and UNDRIVEN signal warnings in blocks that are configured to not exist. diff --git a/wally-pipelined/src/wally/wallypipelinedsoc.sv b/wally-pipelined/src/wally/wallypipelinedsoc.sv index 945889584..bd6bf3728 100644 --- a/wally-pipelined/src/wally/wallypipelinedsoc.sv +++ b/wally-pipelined/src/wally/wallypipelinedsoc.sv @@ -32,7 +32,8 @@ `include "wally-config.vh" module wallypipelinedsoc ( - input logic clk, reset, + input logic clk, reset_ext, + output logic reset, // AHB Lite Interface // inputs from external memory input logic [`AHBW-1:0] HRDATAEXT, @@ -63,6 +64,9 @@ module wallypipelinedsoc ( logic [2:0] HADDRD; logic [3:0] HSIZED; logic HWRITED; + + // synchronize reset to SOC clock domain + synchronizer resetsync(.clk, .d(reset_ext), .q(reset)); // instantiate processor and memories wallypipelinedhart hart(.clk, .reset, diff --git a/wally-pipelined/testbench/testbench.sv b/wally-pipelined/testbench/testbench.sv index 79945d2f1..d2c83a4c7 100644 --- a/wally-pipelined/testbench/testbench.sv +++ b/wally-pipelined/testbench/testbench.sv @@ -34,7 +34,7 @@ module testbench; parameter TEST="none"; logic clk; - logic reset; + logic reset_ext, reset; parameter SIGNATURESIZE = 5000000; @@ -209,7 +209,7 @@ logic [3:0] dummy; ProgramAddrMapFile = {pathname, tests[test], ".elf.objdump.addr"}; ProgramLabelMapFile = {pathname, tests[test], ".elf.objdump.lab"}; $display("Read memfile %s", memfilename); - reset = 1; # 42; reset = 0; + reset_ext = 1; # 42; reset_ext = 0; end // generate clock to sequence tests @@ -290,7 +290,7 @@ logic [3:0] dummy; ProgramAddrMapFile = {pathname, tests[test], ".elf.objdump.addr"}; ProgramLabelMapFile = {pathname, tests[test], ".elf.objdump.lab"}; $display("Read memfile %s", memfilename); - reset = 1; # 17; reset = 0; + reset_ext = 1; # 47; reset_ext = 0; end end end // always @ (negedge clk) From 14e6d2c5766e5cd59dc7f4c3fa19e0fca7bb43c8 Mon Sep 17 00:00:00 2001 From: David Harris Date: Mon, 25 Oct 2021 11:49:20 -0700 Subject: [PATCH 044/132] Converted flops to synchronous reset now that reset signal is synchronized --- wally-pipelined/src/generic/flop/flopenl.sv | 4 +- wally-pipelined/src/generic/flop/flopenr.sv | 4 +- wally-pipelined/src/generic/flop/flopenrc.sv | 4 +- wally-pipelined/src/generic/flop/flopens.sv | 4 +- wally-pipelined/src/generic/flop/flopr.sv | 4 +- wally-pipelined/src/generic/flop/floprc.sv | 10 ++--- .../src/generic/flop/synchronizer.sv | 41 +++++++++++++++++++ 7 files changed, 55 insertions(+), 16 deletions(-) create mode 100644 wally-pipelined/src/generic/flop/synchronizer.sv diff --git a/wally-pipelined/src/generic/flop/flopenl.sv b/wally-pipelined/src/generic/flop/flopenl.sv index acf3f2a0d..4361dc4c4 100644 --- a/wally-pipelined/src/generic/flop/flopenl.sv +++ b/wally-pipelined/src/generic/flop/flopenl.sv @@ -25,14 +25,14 @@ `include "wally-config.vh" -// flop with enable, asynchronous load +// flop with enable, synchronous load module flopenl #(parameter WIDTH = 8, parameter type TYPE=logic [WIDTH-1:0]) ( input logic clk, load, en, input TYPE d, input TYPE val, output TYPE q); - always_ff @(posedge clk, posedge load) + always_ff @(posedge clk) if (load) q <= #1 val; else if (en) q <= #1 d; endmodule diff --git a/wally-pipelined/src/generic/flop/flopenr.sv b/wally-pipelined/src/generic/flop/flopenr.sv index 9db912eae..a30535d86 100644 --- a/wally-pipelined/src/generic/flop/flopenr.sv +++ b/wally-pipelined/src/generic/flop/flopenr.sv @@ -25,13 +25,13 @@ `include "wally-config.vh" -// flop with enable, asynchronous reset +// flop with enable, synchronous reset module flopenr #(parameter WIDTH = 8) ( input logic clk, reset, en, input logic [WIDTH-1:0] d, output logic [WIDTH-1:0] q); - always_ff @(posedge clk, posedge reset) + always_ff @(posedge clk) if (reset) q <= #1 0; else if (en) q <= #1 d; endmodule diff --git a/wally-pipelined/src/generic/flop/flopenrc.sv b/wally-pipelined/src/generic/flop/flopenrc.sv index d8806196c..010a5210b 100644 --- a/wally-pipelined/src/generic/flop/flopenrc.sv +++ b/wally-pipelined/src/generic/flop/flopenrc.sv @@ -25,13 +25,13 @@ `include "wally-config.vh" -// flop with enable, asynchronous reset, synchronous clear +// flop with enable, synchronous reset, enabled clear module flopenrc #(parameter WIDTH = 8) ( input logic clk, reset, clear, en, input logic [WIDTH-1:0] d, output logic [WIDTH-1:0] q); - always_ff @(posedge clk, posedge reset) + always_ff @(posedge clk) if (reset) q <= #1 0; else if (en) if (clear) q <= #1 0; diff --git a/wally-pipelined/src/generic/flop/flopens.sv b/wally-pipelined/src/generic/flop/flopens.sv index d51659b8b..22c6061c1 100644 --- a/wally-pipelined/src/generic/flop/flopens.sv +++ b/wally-pipelined/src/generic/flop/flopens.sv @@ -25,13 +25,13 @@ `include "wally-config.vh" -// flop with enable, asynchronous set +// flop with enable, synchronous set module flopens #(parameter WIDTH = 8) ( input logic clk, set, en, input logic [WIDTH-1:0] d, output logic [WIDTH-1:0] q); - always_ff @(posedge clk, posedge set) + always_ff @(posedge clk) if (set) q <= #1 1; else if (en) q <= #1 d; endmodule diff --git a/wally-pipelined/src/generic/flop/flopr.sv b/wally-pipelined/src/generic/flop/flopr.sv index 5ff6a5a91..e89f28e54 100644 --- a/wally-pipelined/src/generic/flop/flopr.sv +++ b/wally-pipelined/src/generic/flop/flopr.sv @@ -25,13 +25,13 @@ `include "wally-config.vh" -// flop with asynchronous reset +// flop with synchronous reset module flopr #(parameter WIDTH = 8) ( input logic clk, reset, input logic [WIDTH-1:0] d, output logic [WIDTH-1:0] q); - always_ff @(posedge clk, posedge reset) + always_ff @(posedge clk) if (reset) q <= #1 0; else q <= #1 d; endmodule diff --git a/wally-pipelined/src/generic/flop/floprc.sv b/wally-pipelined/src/generic/flop/floprc.sv index 9d5f17c7a..27d0076f3 100644 --- a/wally-pipelined/src/generic/flop/floprc.sv +++ b/wally-pipelined/src/generic/flop/floprc.sv @@ -25,7 +25,7 @@ `include "wally-config.vh" -// flop with asynchronous reset, synchronous clear +// flop with synchronous reset, synchronous clear module floprc #(parameter WIDTH = 8) ( input logic clk, input logic reset, @@ -33,9 +33,7 @@ module floprc #(parameter WIDTH = 8) ( input logic [WIDTH-1:0] d, output logic [WIDTH-1:0] q); - always_ff @(posedge clk, posedge reset) - if (reset) q <= #1 0; - else - if (clear) q <= #1 0; - else q <= #1 d; + always_ff @(posedge clk) + if (reset | clear ) q <= #1 0; + else q <= #1 d; endmodule diff --git a/wally-pipelined/src/generic/flop/synchronizer.sv b/wally-pipelined/src/generic/flop/synchronizer.sv new file mode 100644 index 000000000..ab4255c10 --- /dev/null +++ b/wally-pipelined/src/generic/flop/synchronizer.sv @@ -0,0 +1,41 @@ +/////////////////////////////////////////// +// synchronizer.sv +// +// Written: David_Harris@hmc.edu 25 October 2021 +// Modified: +// +// Purpose: Two-stage flip-flop synchronizer +// +// A component of the Wally configurable RISC-V project. +// +// Copyright (C) 2021 Harvey Mudd College & Oklahoma State University +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, +// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software +// is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +// BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT +// OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +/////////////////////////////////////////// + +`include "wally-config.vh" + +// ordinary flip-flop +module synchronizer ( + input logic clk, + input logic d, + output logic q); + + logic mid; + + always_ff @(posedge clk) begin + mid <= #1 d; + q <= #1 d; + end +endmodule + From c61cbf9618f1f229000d6153b4136fdd28d559c8 Mon Sep 17 00:00:00 2001 From: bbracker Date: Mon, 25 Oct 2021 12:25:32 -0700 Subject: [PATCH 045/132] change CHECKPOINT to be a parameter (not a macro) so that do scripts can control it; clean up checkpoint initialization macros --- .../regression/regression-wally.py | 4 +- wally-pipelined/regression/sim-buildroot | 34 ++- .../regression/sim-buildroot-batch | 35 ++- .../regression/wally-buildroot-batch.do | 3 +- wally-pipelined/regression/wally-buildroot.do | 2 +- wally-pipelined/testbench/testbench-linux.sv | 221 +++++++++--------- 6 files changed, 176 insertions(+), 123 deletions(-) diff --git a/wally-pipelined/regression/regression-wally.py b/wally-pipelined/regression/regression-wally.py index c04941a0e..ec06956b3 100755 --- a/wally-pipelined/regression/regression-wally.py +++ b/wally-pipelined/regression/regression-wally.py @@ -34,10 +34,10 @@ def getBuildrootTC(short): INSTR_LIMIT = 100000 # multiple of 100000 MAX_EXPECTED = 3000000 if short: - BRcmd="vsim > {} -c < {} -c < {} -c < {} -c < 10000) ? INSTR_LIMIT-10000 : 1; // # of instructions at which to turn on waves in graphical sim - //parameter CHECKPOINT = 0; + // Recommend setting all of these in do script using -G option + parameter INSTR_LIMIT = 0; // # of instructions at which to stop + parameter INSTR_WAVEON = 0; // # of instructions at which to turn on waves in graphical sim + parameter CHECKPOINT = 0; /////////////////////////////////////////////////////////////////////////////// ////////////////////////////////// HARDWARE /////////////////////////////////// @@ -80,7 +75,8 @@ module testbench(); .GPIOPinsIn, .GPIOPinsOut, .GPIOPinsEn, .UARTSin, .UARTSout); - // Write Back stage signals not needed by Wally itself + // Write Back stage signals not needed by Wally itself + parameter nop = 'h13; logic [`XLEN-1:0] PCW; logic [31:0] InstrW; logic InstrValidW; @@ -103,6 +99,9 @@ module testbench(); integer errorCount = 0; integer fault; string ProgramAddrMapFile, ProgramLabelMapFile; + // Checkpointing + string checkpointDir; + logic [1:0] initPriv; // Signals used to parse the trace file integer data_file_all; string name; @@ -207,30 +206,111 @@ module testbench(); /////////////////////////////////////////////////////////////////////////////// /////////////////////////////// INITIALIZATION //////////////////////////////// /////////////////////////////////////////////////////////////////////////////// + // Checkpoint initializations + `define MAKE_CHECKPOINT_INIT_SIGNAL(SIGNAL,DIM,ARRAY_MAX,ARRAY_MIN) \ + logic DIM init``SIGNAL[ARRAY_MAX:ARRAY_MIN]; \ + initial begin \ + #1; \ + if (CHECKPOINT!=0) $readmemh({checkpointDir,"checkpoint-",`"SIGNAL`"}, init``SIGNAL); \ + end + + `define INIT_CHECKPOINT_SIMPLE_ARRAY(SIGNAL,DIM,ARRAY_MAX,ARRAY_MIN) \ + `MAKE_CHECKPOINT_INIT_SIGNAL(SIGNAL,DIM,ARRAY_MAX,ARRAY_MIN) \ + initial begin \ + if (CHECKPOINT!=0) begin \ + force `SIGNAL = init``SIGNAL[ARRAY_MAX:ARRAY_MIN]; \ + #23; \ + release `SIGNAL; \ + end \ + end + + // For the annoying case where the pathname to the array elements includes + // a "genblk" in the signal name + `define INIT_CHECKPOINT_GENBLK_ARRAY(SIGNAL_BASE,SIGNAL,DIM,ARRAY_MAX,ARRAY_MIN) \ + `MAKE_CHECKPOINT_INIT_SIGNAL(SIGNAL,DIM,ARRAY_MAX,ARRAY_MIN) \ + for (i=ARRAY_MIN; i> 3); - `ifdef CHECKPOINT - $readmemh({`CHECKPOINT_DIR,"ram.txt"}, dut.uncore.dtim.RAM); - `else - $readmemh({`LINUX_TEST_VECTORS,"ram.txt"}, dut.uncore.dtim.RAM); - `endif $readmemb(`TWO_BIT_PRELOAD, dut.hart.ifu.bpred.bpred.Predictor.DirPredictor.PHT.mem); $readmemb(`BTB_PRELOAD, dut.hart.ifu.bpred.bpred.TargetPredictor.memory.mem); ProgramAddrMapFile = {`LINUX_TEST_VECTORS,"vmlinux.objdump.addr"}; ProgramLabelMapFile = {`LINUX_TEST_VECTORS,"vmlinux.objdump.lab"}; - `ifdef CHECKPOINT - data_file_all = $fopen({`CHECKPOINT_DIR,"all.txt"}, "r"); - `else + if (CHECKPOINT==0) begin // normal + $readmemh({`LINUX_TEST_VECTORS,"ram.txt"}, dut.uncore.dtim.RAM); data_file_all = $fopen({`LINUX_TEST_VECTORS,"all.txt"}, "r"); - `endif - `ifdef CHECKPOINT - InstrCountW = `CHECKPOINT; - `else InstrCountW = '0; - `endif - force dut.hart.priv.SwIntM = 0; - force dut.hart.priv.TimerIntM = 0; - force dut.hart.priv.ExtIntM = 0; + end else begin // checkpoint + $sformat(checkpointDir,"checkpoint%0d/",CHECKPOINT); + checkpointDir = {`LINUX_TEST_VECTORS,checkpointDir}; + $readmemh({checkpointDir,"ram.txt"}, dut.uncore.dtim.RAM); + data_file_all = $fopen({checkpointDir,"all.txt"}, "r"); + InstrCountW = CHECKPOINT; + // manual checkpoint initializations that don't neatly fit into MACRO + force {`STATUS_TSR,`STATUS_TW,`STATUS_TVM,`STATUS_MXR,`STATUS_SUM,`STATUS_MPRV} = initMSTATUS[0][22:17]; + force {`STATUS_FS,`STATUS_MPP} = initMSTATUS[0][14:11]; + force {`STATUS_SPP,`STATUS_MPIE} = initMSTATUS[0][8:7]; + force {`STATUS_SPIE,`STATUS_UPIE,`STATUS_MIE} = initMSTATUS[0][5:3]; + force {`STATUS_SIE,`STATUS_UIE} = initMSTATUS[0][1:0]; + force `INSTRET = CHECKPOINT; + force `CURR_PRIV = initPriv; + #23; + release {`STATUS_TSR,`STATUS_TW,`STATUS_TVM,`STATUS_MXR,`STATUS_SUM,`STATUS_MPRV}; + release {`STATUS_FS,`STATUS_MPP}; + release {`STATUS_SPP,`STATUS_MPIE}; + release {`STATUS_SPIE,`STATUS_UPIE,`STATUS_MIE}; + release {`STATUS_SIE,`STATUS_UIE}; + release `INSTRET; + release `CURR_PRIV; + end end /////////////////////////////////////////////////////////////////////////////// @@ -473,94 +553,6 @@ module testbench(); .ProgramLabelMapFile(ProgramLabelMapFile)); - `ifdef CHECKPOINT - - `define INIT_CHECKPOINT_VAL(SIGNAL_BASE,SIGNAL,DIM,LARGE_INDEX,SMALL_INDEX) \ - logic DIM init``SIGNAL [LARGE_INDEX:SMALL_INDEX]; \ - initial $readmemh({`CHECKPOINT_DIR,"checkpoint-",`"SIGNAL`"}, init``SIGNAL); \ - for (i=SMALL_INDEX; i Date: Mon, 25 Oct 2021 13:24:02 -0700 Subject: [PATCH 046/132] copy / link to checkpoint 8500000 dir --- wally-pipelined/linux-testgen/linux-testvectors/tvCopier.py | 2 +- wally-pipelined/linux-testgen/linux-testvectors/tvLinker.sh | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/wally-pipelined/linux-testgen/linux-testvectors/tvCopier.py b/wally-pipelined/linux-testgen/linux-testvectors/tvCopier.py index 262b24b79..9f703ff74 100755 --- a/wally-pipelined/linux-testgen/linux-testvectors/tvCopier.py +++ b/wally-pipelined/linux-testgen/linux-testvectors/tvCopier.py @@ -57,6 +57,6 @@ pyTee('_____________________________________________________________________') for tvFile in copyList: pyTee('Copying '+tvFile+' from Tera') - os.system('scp '+tera+':/courses/e190ax/buildroot_boot/'+tvFile+' ./') + os.system('scp -r'+tera+':/courses/e190ax/buildroot_boot/'+tvFile+' ./') pyTee('Done!') logFile.close() diff --git a/wally-pipelined/linux-testgen/linux-testvectors/tvLinker.sh b/wally-pipelined/linux-testgen/linux-testvectors/tvLinker.sh index 70ef47109..f1004919c 100755 --- a/wally-pipelined/linux-testgen/linux-testvectors/tvLinker.sh +++ b/wally-pipelined/linux-testgen/linux-testvectors/tvLinker.sh @@ -5,4 +5,5 @@ ln -s /courses/e190ax/buildroot_boot/ram.txt ram.txt ln -s /courses/e190ax/buildroot_boot/vmlinux.objdump vmlinux.objdump ln -s /courses/e190ax/buildroot_boot/vmlinux.objdump.addr vmlinux.objdump.addr ln -s /courses/e190ax/buildroot_boot/vmlinux.objdump.lab vmlinux.objdump.lab +ln -s /courses/e190ax/buildroot_boot/checkpoint8500000 ./checkpoint8500000 echo "Done!" From f39a509b5b812b03c55a28457001dd946934a470 Mon Sep 17 00:00:00 2001 From: bbracker Date: Mon, 25 Oct 2021 13:26:44 -0700 Subject: [PATCH 047/132] adapt testbench linux to use reset_ext --- wally-pipelined/regression/linux-wave.do | 3 ++- wally-pipelined/testbench/testbench-linux.sv | 22 +++++++++++++------- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/wally-pipelined/regression/linux-wave.do b/wally-pipelined/regression/linux-wave.do index d9a631d09..30c2b0365 100644 --- a/wally-pipelined/regression/linux-wave.do +++ b/wally-pipelined/regression/linux-wave.do @@ -2,6 +2,7 @@ onerror {resume} quietly WaveActivateNextPane {} 0 add wave -noupdate /testbench/clk add wave -noupdate /testbench/reset +add wave -noupdate /testbench/reset_ext add wave -noupdate -radix unsigned /testbench/InstrCountW add wave -noupdate /testbench/dut/hart/SATP_REGW add wave -noupdate -group HDU -expand -group traps /testbench/dut/hart/priv/trap/InstrMisalignedFaultM @@ -509,7 +510,7 @@ add wave -noupdate /testbench/dut/uncore/dtim/memwrite add wave -noupdate /testbench/dut/uncore/dtim/HWDATA add wave -noupdate /testbench/dut/uncore/dtim/risingHREADYTim TreeUpdate [SetDefaultTree] -WaveRestoreCursors {{Cursor 23} {209183247 ns} 0} {{Cursor 5} {197 ns} 0} +WaveRestoreCursors {{Cursor 23} {209183247 ns} 0} {{Cursor 5} {229 ns} 0} quietly wave cursor active 2 configure wave -namecolwidth 250 configure wave -valuecolwidth 314 diff --git a/wally-pipelined/testbench/testbench-linux.sv b/wally-pipelined/testbench/testbench-linux.sv index e5fc8574f..72adf589b 100644 --- a/wally-pipelined/testbench/testbench-linux.sv +++ b/wally-pipelined/testbench/testbench-linux.sv @@ -48,8 +48,8 @@ module testbench(); /////////////////////////////////////////////////////////////////////////////// ////////////////////////////////// HARDWARE /////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// - logic clk, reset; - initial begin reset <= 1; # 22; reset <= 0; end + logic clk, reset, reset_ext; + initial begin reset_ext <= 1; # 22; reset_ext <= 0; end always begin clk <= 1; # 5; clk <= 0; # 5; end logic [`AHBW-1:0] HRDATAEXT; @@ -69,7 +69,7 @@ module testbench(); logic UARTSout; assign GPIOPinsIn = 0; assign UARTSin = 1; - wallypipelinedsoc dut(.clk, .reset, + wallypipelinedsoc dut(.clk, .reset_ext, .reset, .HRDATAEXT, .HREADYEXT, .HRESPEXT, .HCLK, .HRESETn, .HADDR, .HWDATA, .HWRITE, .HSIZE, .HBURST, .HPROT, .HTRANS, .HMASTLOCK, .GPIOPinsIn, .GPIOPinsOut, .GPIOPinsEn, @@ -219,7 +219,9 @@ module testbench(); initial begin \ if (CHECKPOINT!=0) begin \ force `SIGNAL = init``SIGNAL[ARRAY_MAX:ARRAY_MIN]; \ - #23; \ + while (reset!==1) #1; \ + while (reset!==0) #1; \ + #1; \ release `SIGNAL; \ end \ end @@ -232,7 +234,9 @@ module testbench(); initial begin \ if (CHECKPOINT!=0) begin \ force `SIGNAL_BASE[i].`SIGNAL = init``SIGNAL[i]; \ - #23; \ + while (reset!==1) #1; \ + while (reset!==0) #1; \ + #1; \ release `SIGNAL_BASE[i].`SIGNAL; \ end \ end \ @@ -245,7 +249,9 @@ module testbench(); initial begin \ if (CHECKPOINT!=0) begin \ force `SIGNAL = init``SIGNAL[0]; \ - #23; \ + while (reset!==1) #1; \ + while (reset!==0) #1; \ + #1; \ release `SIGNAL; \ end \ end @@ -302,7 +308,9 @@ module testbench(); force {`STATUS_SIE,`STATUS_UIE} = initMSTATUS[0][1:0]; force `INSTRET = CHECKPOINT; force `CURR_PRIV = initPriv; - #23; + while (reset!==1) #1; + while (reset!==0) #1; + #1; release {`STATUS_TSR,`STATUS_TW,`STATUS_TVM,`STATUS_MXR,`STATUS_SUM,`STATUS_MPRV}; release {`STATUS_FS,`STATUS_MPP}; release {`STATUS_SPP,`STATUS_MPIE}; From 694b3fbb6fcfd706ffdb55528168dc891e0d5243 Mon Sep 17 00:00:00 2001 From: Ross Thompson Date: Mon, 25 Oct 2021 15:33:33 -0500 Subject: [PATCH 048/132] Possible fix for critical path timing in caches. --- wally-pipelined/src/cache/sram1rw.sv | 42 +++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/wally-pipelined/src/cache/sram1rw.sv b/wally-pipelined/src/cache/sram1rw.sv index 835e7061f..e98b18f31 100644 --- a/wally-pipelined/src/cache/sram1rw.sv +++ b/wally-pipelined/src/cache/sram1rw.sv @@ -1,6 +1,7 @@ +/* -----\/----- EXCLUDED -----\/----- // Depth is number of bits in one "word" of the memory, width is number of such words -/* verilator lint_off ASSIGNDLY */ +/-* verilator lint_off ASSIGNDLY *-/ module sram1rw #(parameter DEPTH=128, WIDTH=256) ( input logic clk, @@ -29,5 +30,44 @@ module sram1rw #(parameter DEPTH=128, WIDTH=256) ( endmodule +/-* verilator lint_on ASSIGNDLY *-/ + -----/\----- EXCLUDED -----/\----- */ + + +// Depth is number of bits in one "word" of the memory, width is number of such words + +/* verilator lint_off ASSIGNDLY */ + +module sram1rw #(parameter DEPTH=128, WIDTH=256) ( + input logic clk, + // port 1 is read only + input logic [$clog2(WIDTH)-1:0] Addr, + output logic [DEPTH-1:0] ReadData, + + // port 2 is write only + input logic [DEPTH-1:0] WriteData, + input logic WriteEnable +); + + logic [WIDTH-1:0][DEPTH-1:0] StoredData; + logic [$clog2(WIDTH)-1:0] AddrD; + logic [WIDTH-1:0] WriteDataD; + logic WriteEnableD; + + + always_ff @(posedge clk) begin + AddrD <= Addr; + WriteDataD <= WriteData; + WriteEnableD <= WriteEnable; + if (WriteEnableD) begin + StoredData[AddrD] <= #1 WriteDataD; + end + end + + + assign ReadData = StoredData[AddrD]; + +endmodule + /* verilator lint_on ASSIGNDLY */ From 6c92d3267f76014dc3b3e51e58f90df9175149da Mon Sep 17 00:00:00 2001 From: Ross Thompson Date: Mon, 25 Oct 2021 16:11:41 -0500 Subject: [PATCH 049/132] Fixed bug with the changes to sram1rw. --- wally-pipelined/src/cache/sram1rw.sv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wally-pipelined/src/cache/sram1rw.sv b/wally-pipelined/src/cache/sram1rw.sv index e98b18f31..4c7671d1b 100644 --- a/wally-pipelined/src/cache/sram1rw.sv +++ b/wally-pipelined/src/cache/sram1rw.sv @@ -51,7 +51,7 @@ module sram1rw #(parameter DEPTH=128, WIDTH=256) ( logic [WIDTH-1:0][DEPTH-1:0] StoredData; logic [$clog2(WIDTH)-1:0] AddrD; - logic [WIDTH-1:0] WriteDataD; + logic [DEPTH-1:0] WriteDataD; logic WriteEnableD; From cb7015a690d9e0ced404c89a8b44a8117d7fd167 Mon Sep 17 00:00:00 2001 From: Ross Thompson Date: Mon, 25 Oct 2021 18:00:23 -0500 Subject: [PATCH 050/132] Fixed the timing issue in the cache replacement polcy. --- .../src/cache/cachereplacementpolicy.sv | 21 +++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/wally-pipelined/src/cache/cachereplacementpolicy.sv b/wally-pipelined/src/cache/cachereplacementpolicy.sv index 8ba0c185a..d2739a7c3 100644 --- a/wally-pipelined/src/cache/cachereplacementpolicy.sv +++ b/wally-pipelined/src/cache/cachereplacementpolicy.sv @@ -42,21 +42,34 @@ module cachereplacementpolicy logic [NUMWAYS-2:0] ReplacementBits [NUMLINES-1:0]; logic [NUMWAYS-2:0] BlockReplacementBits; logic [NUMWAYS-2:0] NewReplacement; + logic [NUMWAYS-2:0] NewReplacementD; + logic [INDEXLEN+OFFSETLEN-1:OFFSETLEN] MemPAdrMD; + logic [INDEXLEN-1:0] RAdrD; + logic LRUWriteEnD; + /* verilator lint_off BLKLOOPINIT */ always_ff @(posedge clk, posedge reset) begin if (reset) begin + RAdrD <= '0; + MemPAdrMD <= '0; + LRUWriteEnD <= 0; + NewReplacementD <= '0; for(int index = 0; index < NUMLINES; index++) - ReplacementBits[index] <= '0; + ReplacementBits[index] <= '0; end else begin - BlockReplacementBits <= ReplacementBits[RAdr]; - if (LRUWriteEn) begin - ReplacementBits[MemPAdrM[INDEXLEN+OFFSETLEN-1:OFFSETLEN]] <= NewReplacement; + RAdrD <= RAdr; + MemPAdrMD <= MemPAdrMD; + LRUWriteEnD <= LRUWriteEn; + NewReplacementD <= NewReplacement; + if (LRUWriteEnD) begin + ReplacementBits[MemPAdrMD[INDEXLEN+OFFSETLEN-1:OFFSETLEN]] <= NewReplacementD; end end end /* verilator lint_on BLKLOOPINIT */ + assign BlockReplacementBits = ReplacementBits[RAdrD]; genvar index; generate From 09b3549efd023517130988f38111ee1ff26b2684 Mon Sep 17 00:00:00 2001 From: Ross Thompson Date: Mon, 25 Oct 2021 22:05:11 -0500 Subject: [PATCH 051/132] Fixed another critical path in the caches. --- wally-pipelined/src/cache/cacheway.sv | 33 +++++++++++++++++++++------ 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/wally-pipelined/src/cache/cacheway.sv b/wally-pipelined/src/cache/cacheway.sv index 242d596f8..9599ce460 100644 --- a/wally-pipelined/src/cache/cacheway.sv +++ b/wally-pipelined/src/cache/cacheway.sv @@ -64,6 +64,14 @@ module cacheway #(parameter NUMLINES=512, parameter BLOCKLEN = 256, TAGLEN = 26, logic [TAGLEN-1:0] VicDirtyWay; logic [TAGLEN-1:0] FlushThisWay; + logic [$clog2(NUMLINES)-1:0] RAdrD, WAdrD; + logic SetValidD, ClearValidD; + logic SetDirtyD, ClearDirtyD; + logic WriteEnableD, VDWriteEnableD; + + + + genvar words; generate @@ -108,28 +116,39 @@ module cacheway #(parameter NUMLINES=512, parameter BLOCKLEN = 256, TAGLEN = 26, ValidBits <= {NUMLINES{1'b0}}; else if (InvalidateAll) ValidBits <= {NUMLINES{1'b0}}; - else if (SetValid & (WriteEnable | VDWriteEnable)) ValidBits[WAdr] <= 1'b1; - else if (ClearValid & (WriteEnable | VDWriteEnable)) ValidBits[WAdr] <= 1'b0; + else if (SetValidD & (WriteEnableD | VDWriteEnableD)) ValidBits[WAdrD] <= 1'b1; + else if (ClearValidD & (WriteEnableD | VDWriteEnableD)) ValidBits[WAdrD] <= 1'b0; end always_ff @(posedge clk) begin - Valid <= ValidBits[RAdr]; + RAdrD <= RAdr; + WAdrD <= WAdr; + SetValidD <= SetValid; + ClearValidD <= ClearValid; + WriteEnableD <= WriteEnable; + VDWriteEnableD <= VDWriteEnable; end + + assign Valid = ValidBits[RAdrD]; + generate if(DIRTY_BITS) begin always_ff @(posedge clk, posedge reset) begin if (reset) DirtyBits <= {NUMLINES{1'b0}}; - else if (SetDirty & (WriteEnable | VDWriteEnable)) DirtyBits[WAdr] <= 1'b1; - else if (ClearDirty & (WriteEnable | VDWriteEnable)) DirtyBits[WAdr] <= 1'b0; + else if (SetDirtyD & (WriteEnableD | VDWriteEnableD)) DirtyBits[WAdrD] <= 1'b1; + else if (ClearDirtyD & (WriteEnableD | VDWriteEnableD)) DirtyBits[WAdrD] <= 1'b0; end - always_ff @(posedge clk) begin - Dirty <= DirtyBits[RAdr]; + always_ff @(posedge clk, posedge reset) begin + SetDirtyD <= SetDirty; + ClearDirtyD <= ClearDirty; end + assign Dirty = DirtyBits[RAdrD]; + end else begin assign Dirty = 1'b0; end From 44de52a05afb22983c0ad25761e706e20adc5ed6 Mon Sep 17 00:00:00 2001 From: David Harris Date: Tue, 26 Oct 2021 08:30:35 -0700 Subject: [PATCH 052/132] Synchronous reset in non-flop blocks --- wally-pipelined/src/cache/cacheway.sv | 9 +++------ wally-pipelined/src/fpu/fregfile.sv | 2 +- wally-pipelined/src/ieu/regfile.sv | 2 +- wally-pipelined/src/privileged/csrc.sv | 4 ++-- wally-pipelined/src/privileged/csri.sv | 6 ++---- wally-pipelined/src/privileged/csrsr.sv | 2 +- 6 files changed, 10 insertions(+), 15 deletions(-) diff --git a/wally-pipelined/src/cache/cacheway.sv b/wally-pipelined/src/cache/cacheway.sv index 242d596f8..d8a48f4c1 100644 --- a/wally-pipelined/src/cache/cacheway.sv +++ b/wally-pipelined/src/cache/cacheway.sv @@ -104,11 +104,9 @@ module cacheway #(parameter NUMLINES=512, parameter BLOCKLEN = 256, TAGLEN = 26, always_ff @(posedge clk, posedge reset) begin - if (reset) - ValidBits <= {NUMLINES{1'b0}}; - else if (InvalidateAll) - ValidBits <= {NUMLINES{1'b0}}; - else if (SetValid & (WriteEnable | VDWriteEnable)) ValidBits[WAdr] <= 1'b1; + if (reset) ValidBits <= {NUMLINES{1'b0}}; + else if (InvalidateAll) ValidBits <= {NUMLINES{1'b0}}; + else if (SetValid & (WriteEnable | VDWriteEnable)) ValidBits[WAdr] <= 1'b1; else if (ClearValid & (WriteEnable | VDWriteEnable)) ValidBits[WAdr] <= 1'b0; end @@ -118,7 +116,6 @@ module cacheway #(parameter NUMLINES=512, parameter BLOCKLEN = 256, TAGLEN = 26, generate if(DIRTY_BITS) begin - always_ff @(posedge clk, posedge reset) begin if (reset) DirtyBits <= {NUMLINES{1'b0}}; diff --git a/wally-pipelined/src/fpu/fregfile.sv b/wally-pipelined/src/fpu/fregfile.sv index fd8e0f608..492f7b924 100644 --- a/wally-pipelined/src/fpu/fregfile.sv +++ b/wally-pipelined/src/fpu/fregfile.sv @@ -39,7 +39,7 @@ module fregfile ( // write fourth port on rising edge of clock (A4/WD4/WE4) // write occurs on falling edge of clock - always_ff @(negedge clk or posedge reset) + always_ff @(negedge clk) // or posedge reset) if (reset) for(i=0; i<32; i++) rf[i] <= 0; else if (we4) rf[a4] <= wd4; diff --git a/wally-pipelined/src/ieu/regfile.sv b/wally-pipelined/src/ieu/regfile.sv index 73b62a579..c05a655c4 100644 --- a/wally-pipelined/src/ieu/regfile.sv +++ b/wally-pipelined/src/ieu/regfile.sv @@ -43,7 +43,7 @@ module regfile ( // reset is intended for simulation only, not synthesis - always_ff @(negedge clk or posedge reset) + always_ff @(negedge clk) // or posedge reset) if (reset) for(i=1; i<32; i++) rf[i] <= 0; else if (we3) rf[a3] <= wd3; diff --git a/wally-pipelined/src/privileged/csrc.sv b/wally-pipelined/src/privileged/csrc.sv index 647f859b1..10eb9df8f 100644 --- a/wally-pipelined/src/privileged/csrc.sv +++ b/wally-pipelined/src/privileged/csrc.sv @@ -149,7 +149,7 @@ module csrc #(parameter for (i = 3; i < `COUNTERS; i = i+1) begin assign WriteHPMCOUNTERM[i] = CSRMWriteM && (CSRAdrM == MHPMCOUNTERBASE + i); assign NextHPMCOUNTERM[i][`XLEN-1:0] = WriteHPMCOUNTERM[i] ? CSRWriteValM : HPMCOUNTERPlusM[i][`XLEN-1:0]; - always @(posedge clk, posedge reset) // ModelSim doesn't like syntax of passing array element to flop + always @(posedge clk) //, posedge reset) // ModelSim doesn't like syntax of passing array element to flop if (reset) HPMCOUNTER_REGW[i][`XLEN-1:0] <= #1 0; else if (~StallW) HPMCOUNTER_REGW[i][`XLEN-1:0] <= #1 NextHPMCOUNTERM[i]; @@ -159,7 +159,7 @@ module csrc #(parameter assign HPMCOUNTERPlusM[i] = {HPMCOUNTERH_REGW[i], HPMCOUNTER_REGW[i]} + {63'b0, CounterEvent[i] & ~MCOUNTINHIBIT_REGW[i]}; assign WriteHPMCOUNTERHM[i] = CSRMWriteM && (CSRAdrM == MHPMCOUNTERHBASE + i); assign NextHPMCOUNTERHM[i] = WriteHPMCOUNTERHM[i] ? CSRWriteValM : HPMCOUNTERPlusM[i][63:32]; - always @(posedge clk, posedge reset) // ModelSim doesn't like syntax of passing array element to flop + always @(posedge clk) //, posedge reset) // ModelSim doesn't like syntax of passing array element to flop if (reset) HPMCOUNTERH_REGW[i][`XLEN-1:0] <= #1 0; else if (~StallW) HPMCOUNTERH_REGW[i][`XLEN-1:0] <= #1 NextHPMCOUNTERHM[i]; end else begin diff --git a/wally-pipelined/src/privileged/csri.sv b/wally-pipelined/src/privileged/csri.sv index 3b54d871a..18056bec9 100644 --- a/wally-pipelined/src/privileged/csri.sv +++ b/wally-pipelined/src/privileged/csri.sv @@ -78,19 +78,17 @@ module csri #(parameter assign MIP_WRITE_MASK = 12'h000; assign SIP_WRITE_MASK = 12'h000; end - always @(posedge clk, posedge reset) begin // *** I strongly feel that IntInM should go directly to IP_REGW -- Ben 9/7/21 + always @(posedge clk) //, posedge reset) begin // *** I strongly feel that IntInM should go directly to IP_REGW -- Ben 9/7/21 if (reset) IP_REGW_writeable <= 10'b0; else if (WriteMIPM) IP_REGW_writeable <= (CSRWriteValM[9:0] & MIP_WRITE_MASK[9:0]) | IntInM[9:0]; // MTIP unclearable else if (WriteSIPM) IP_REGW_writeable <= (CSRWriteValM[9:0] & SIP_WRITE_MASK[9:0]) | IntInM[9:0]; // MTIP unclearable // else if (WriteUIPM) IP_REGW = (CSRWriteValM & 12'hBBB) | (NextIPM & 12'h080); // MTIP unclearable else IP_REGW_writeable <= IP_REGW_writeable | IntInM[9:0]; // *** check this turns off interrupts properly even when MIDELEG changes - end - always @(posedge clk, posedge reset) begin + always @(posedge clk) //, posedge reset) begin if (reset) IE_REGW <= 12'b0; else if (WriteMIEM) IE_REGW <= (CSRWriteValM[11:0] & 12'hAAA); // MIE controls M and S fields else if (WriteSIEM) IE_REGW <= (CSRWriteValM[11:0] & 12'h222) | (IE_REGW & 12'h888); // only S fields // else if (WriteUIEM) IE_REGW = (CSRWriteValM & 12'h111) | (IE_REGW & 12'hAAA); // only U field - end endgenerate // restricted views of registers diff --git a/wally-pipelined/src/privileged/csrsr.sv b/wally-pipelined/src/privileged/csrsr.sv index dfa2132d9..6669bb296 100644 --- a/wally-pipelined/src/privileged/csrsr.sv +++ b/wally-pipelined/src/privileged/csrsr.sv @@ -108,7 +108,7 @@ module csrsr ( // registers for STATUS bits // complex register with reset, write enable, and the ability to update other bits in certain cases - always_ff @(posedge clk, posedge reset) + always_ff @(posedge clk) //, posedge reset) if (reset) begin STATUS_TSR_INT <= #1 0; STATUS_TW_INT <= #1 0; From 1a6fb2fad9b01341e0fc3bfe7254d142908d0fcf Mon Sep 17 00:00:00 2001 From: David Harris Date: Tue, 26 Oct 2021 08:38:13 -0700 Subject: [PATCH 053/132] Forgot to save cacheway merge --- wally-pipelined/src/cache/cacheway.sv | 7 ------- 1 file changed, 7 deletions(-) diff --git a/wally-pipelined/src/cache/cacheway.sv b/wally-pipelined/src/cache/cacheway.sv index e92fd77e5..bb760bbab 100644 --- a/wally-pipelined/src/cache/cacheway.sv +++ b/wally-pipelined/src/cache/cacheway.sv @@ -112,19 +112,12 @@ module cacheway #(parameter NUMLINES=512, parameter BLOCKLEN = 256, TAGLEN = 26, always_ff @(posedge clk, posedge reset) begin -<<<<<<< HEAD - if (reset) ValidBits <= {NUMLINES{1'b0}}; - else if (InvalidateAll) ValidBits <= {NUMLINES{1'b0}}; - else if (SetValid & (WriteEnable | VDWriteEnable)) ValidBits[WAdr] <= 1'b1; - else if (ClearValid & (WriteEnable | VDWriteEnable)) ValidBits[WAdr] <= 1'b0; -======= if (reset) ValidBits <= {NUMLINES{1'b0}}; else if (InvalidateAll) ValidBits <= {NUMLINES{1'b0}}; else if (SetValidD & (WriteEnableD | VDWriteEnableD)) ValidBits[WAdrD] <= 1'b1; else if (ClearValidD & (WriteEnableD | VDWriteEnableD)) ValidBits[WAdrD] <= 1'b0; ->>>>>>> 520b9f17d7e813e4be9ef79613d6d9ab07b90817 end always_ff @(posedge clk) begin From ca700610f88bb6e0bc18c2de6fddc6dd7e6c5cea Mon Sep 17 00:00:00 2001 From: David Harris Date: Tue, 26 Oct 2021 08:51:49 -0700 Subject: [PATCH 054/132] removed referenc outputs --- .../riscv-test-suite/rv32i_m/C/Makefrag | 28 - .../riscv-test-suite/rv32i_m/F/Makefrag | 146 -- .../riscv-test-suite/rv32i_m/I/Makefrag | 39 - .../rv32i_m/K_unratified/Makefrag | 65 - .../riscv-test-suite/rv32i_m/M/Makefrag | 8 - .../rv32i_m/Zifencei/Makefrag | 1 - .../rv32i_m/privilege/Makefrag | 16 - .../C/references/cadd-01.reference_output | 1340 -------------- .../C/references/caddi-01.reference_output | 880 --------- .../references/caddi16sp-01.reference_output | 264 --- .../references/caddi4spn-01.reference_output | 40 - .../C/references/caddiw-01.reference_output | 876 --------- .../C/references/caddw-01.reference_output | 1356 -------------- .../C/references/cand-01.reference_output | 1344 -------------- .../C/references/candi-01.reference_output | 880 --------- .../C/references/cbeqz-01.reference_output | 300 --- .../C/references/cbnez-01.reference_output | 300 --- .../C/references/cebreak-01.reference_output | 8 - .../C/references/cj-01.reference_output | 36 - .../C/references/cjalr-01.reference_output | 64 - .../C/references/cjr-01.reference_output | 64 - .../C/references/cld-01.reference_output | 28 - .../C/references/cldsp-01.reference_output | 64 - .../C/references/cli-01.reference_output | 64 - .../C/references/clui-01.reference_output | 64 - .../C/references/clw-01.reference_output | 28 - .../C/references/clwsp-01.reference_output | 64 - .../C/references/cmv-01.reference_output | 300 --- .../C/references/cnop-01.reference_output | 28 - .../C/references/cor-01.reference_output | 1360 -------------- .../C/references/csd-01.reference_output | 264 --- .../C/references/csdsp-01.reference_output | 264 --- .../C/references/cslli-01.reference_output | 296 --- .../C/references/csrai-01.reference_output | 296 --- .../C/references/csrli-01.reference_output | 300 --- .../C/references/csub-01.reference_output | 1344 -------------- .../C/references/csubw-01.reference_output | 1340 -------------- .../C/references/csw-01.reference_output | 264 --- .../C/references/cswsp-01.reference_output | 268 --- .../C/references/cxor-01.reference_output | 1328 ------------- .../references/aes64ds-01.reference_output | 116 -- .../references/aes64ds-rwp1.reference_output | 156 -- .../references/aes64dsm-01.reference_output | 116 -- .../references/aes64dsm-rwp1.reference_output | 156 -- .../references/aes64es-01.reference_output | 116 -- .../references/aes64es-rwp1.reference_output | 156 -- .../references/aes64esm-01.reference_output | 116 -- .../references/aes64esm-rwp1.reference_output | 156 -- .../references/aes64im-01.reference_output | 300 --- .../references/aes64im-rwp1.reference_output | 488 ----- .../references/aes64im-rwp2.reference_output | 112 -- .../references/aes64ks1i-01.reference_output | 172 -- .../references/aes64ks2-01.reference_output | 440 ----- .../references/andn-01.reference_output | 1048 ----------- .../references/clmul-01.reference_output | 1052 ----------- .../references/clmulh-01.reference_output | 1052 ----------- .../references/orn-01.reference_output | 1052 ----------- .../references/pack-01.reference_output | 1048 ----------- .../references/packh-01.reference_output | 1052 ----------- .../references/packu-01.reference_output | 1044 ----------- .../references/packuw-01.reference_output | 1052 ----------- .../references/packw-01.reference_output | 1052 ----------- .../references/rev.b-01.reference_output | 520 ------ .../references/rev8-01.reference_output | 520 ------ .../references/rev8.w-01.reference_output | 520 ------ .../references/rol-01.reference_output | 1052 ----------- .../references/rolw-01.reference_output | 1052 ----------- .../references/ror-01.reference_output | 1052 ----------- .../references/rori-01.reference_output | 580 ------ .../references/roriw-01.reference_output | 572 ------ .../references/rorw-01.reference_output | 1052 ----------- .../references/sha256sig0-01.reference_output | 300 --- .../sha256sig0-rwp1.reference_output | 488 ----- .../sha256sig0-rwp2.reference_output | 112 -- .../references/sha256sig1-01.reference_output | 300 --- .../sha256sig1-rwp1.reference_output | 488 ----- .../sha256sig1-rwp2.reference_output | 112 -- .../references/sha256sum0-01.reference_output | 300 --- .../sha256sum0-rwp1.reference_output | 488 ----- .../sha256sum0-rwp2.reference_output | 112 -- .../references/sha256sum1-01.reference_output | 300 --- .../sha256sum1-rwp1.reference_output | 488 ----- .../sha256sum1-rwp2.reference_output | 112 -- .../references/sha512sig0-01.reference_output | 300 --- .../sha512sig0-rwp1.reference_output | 488 ----- .../sha512sig0-rwp2.reference_output | 112 -- .../references/sha512sig1-01.reference_output | 300 --- .../sha512sig1-rwp1.reference_output | 488 ----- .../sha512sig1-rwp2.reference_output | 112 -- .../references/sha512sum0-01.reference_output | 300 --- .../sha512sum0-rwp1.reference_output | 488 ----- .../sha512sum0-rwp2.reference_output | 112 -- .../references/sha512sum1-01.reference_output | 300 --- .../sha512sum1-rwp1.reference_output | 488 ----- .../sha512sum1-rwp2.reference_output | 112 -- .../references/sm3p0-01.reference_output | 300 --- .../references/sm3p0-rwp1.reference_output | 488 ----- .../references/sm3p0-rwp2.reference_output | 112 -- .../references/sm3p1-01.reference_output | 300 --- .../references/sm3p1-rwp1.reference_output | 488 ----- .../references/sm3p1-rwp2.reference_output | 112 -- .../references/sm4ed-01.reference_output | 564 ------ .../references/sm4ed-rwp1.reference_output | 52 - .../references/sm4ks-01.reference_output | 564 ------ .../references/sm4ks-rwp1.reference_output | 52 - .../references/xnor-01.reference_output | 1052 ----------- .../references/xperm.b-01.reference_output | 1092 ----------- .../references/xperm.n-01.reference_output | 1092 ----------- .../M/references/div-01.reference_output | 1356 -------------- .../M/references/divu-01.reference_output | 1648 ----------------- .../M/references/divuw-01.reference_output | 1644 ---------------- .../M/references/divw-01.reference_output | 1344 -------------- .../M/references/mul-01.reference_output | 1364 -------------- .../M/references/mulh-01.reference_output | 1356 -------------- .../M/references/mulhsu-01.reference_output | 1484 --------------- .../M/references/mulhu-01.reference_output | 1628 ---------------- .../M/references/mulw-01.reference_output | 1344 -------------- .../M/references/rem-01.reference_output | 1332 ------------- .../M/references/remu-01.reference_output | 1644 ---------------- .../M/references/remuw-01.reference_output | 1636 ---------------- .../M/references/remw-01.reference_output | 1352 -------------- .../references/Fencei.reference_output | 4 - .../references/ebreak.reference_output | 8 - .../references/ecall.reference_output | 8 - .../misalign-beq-01.reference_output | 132 -- .../misalign-bge-01.reference_output | 132 -- .../misalign-bgeu-01.reference_output | 132 -- .../misalign-blt-01.reference_output | 132 -- .../misalign-bltu-01.reference_output | 132 -- .../misalign-bne-01.reference_output | 132 -- .../misalign-jal-01.reference_output | 132 -- .../misalign-ld-01.reference_output | 144 -- .../misalign-lh-01.reference_output | 132 -- .../misalign-lhu-01.reference_output | 132 -- .../misalign-lw-01.reference_output | 136 -- .../misalign-lwu-01.reference_output | 136 -- .../misalign-sd-01.reference_output | 144 -- .../misalign-sh-01.reference_output | 132 -- .../misalign-sw-01.reference_output | 136 -- .../misalign1-jalr-01.reference_output | 132 -- .../misalign2-jalr-01.reference_output | 132 -- wally-pipelined/testbench/tests.vh | 153 ++ 142 files changed, 153 insertions(+), 69891 deletions(-) delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cadd-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/caddi-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/caddi16sp-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/caddi4spn-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/caddiw-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/caddw-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cand-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/candi-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cbeqz-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cbnez-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cebreak-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cj-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cjalr-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cjr-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cld-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cldsp-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cli-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/clui-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/clw-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/clwsp-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cmv-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cnop-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cor-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/csd-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/csdsp-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cslli-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/csrai-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/csrli-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/csub-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/csubw-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/csw-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cswsp-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cxor-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/aes64ds-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/aes64ds-rwp1.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/aes64dsm-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/aes64dsm-rwp1.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/aes64es-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/aes64es-rwp1.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/aes64esm-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/aes64esm-rwp1.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/aes64im-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/aes64im-rwp1.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/aes64im-rwp2.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/aes64ks1i-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/aes64ks2-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/andn-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/clmul-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/clmulh-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/orn-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/pack-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/packh-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/packu-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/packuw-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/packw-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/rev.b-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/rev8-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/rev8.w-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/rol-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/rolw-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/ror-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/rori-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/roriw-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/rorw-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha256sig0-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha256sig0-rwp1.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha256sig0-rwp2.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha256sig1-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha256sig1-rwp1.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha256sig1-rwp2.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha256sum0-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha256sum0-rwp1.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha256sum0-rwp2.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha256sum1-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha256sum1-rwp1.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha256sum1-rwp2.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha512sig0-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha512sig0-rwp1.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha512sig0-rwp2.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha512sig1-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha512sig1-rwp1.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha512sig1-rwp2.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha512sum0-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha512sum0-rwp1.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha512sum0-rwp2.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha512sum1-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha512sum1-rwp1.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha512sum1-rwp2.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sm3p0-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sm3p0-rwp1.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sm3p0-rwp2.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sm3p1-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sm3p1-rwp1.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sm3p1-rwp2.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sm4ed-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sm4ed-rwp1.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sm4ks-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sm4ks-rwp1.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/xnor-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/xperm.b-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/xperm.n-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/M/references/div-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/M/references/divu-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/M/references/divuw-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/M/references/divw-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/M/references/mul-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/M/references/mulh-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/M/references/mulhsu-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/M/references/mulhu-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/M/references/mulw-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/M/references/rem-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/M/references/remu-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/M/references/remuw-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/M/references/remw-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/Zifencei/references/Fencei.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/ebreak.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/ecall.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign-beq-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign-bge-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign-bgeu-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign-blt-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign-bltu-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign-bne-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign-jal-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign-ld-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign-lh-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign-lhu-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign-lw-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign-lwu-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign-sd-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign-sh-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign-sw-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign1-jalr-01.reference_output delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign2-jalr-01.reference_output diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv32i_m/C/Makefrag b/tests/wally-riscv-arch-test/riscv-test-suite/rv32i_m/C/Makefrag index b2474c13d..79d1bd169 100644 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv32i_m/C/Makefrag +++ b/tests/wally-riscv-arch-test/riscv-test-suite/rv32i_m/C/Makefrag @@ -28,34 +28,6 @@ # Description: Makefrag for RV32I architectural tests rv32i_sc_tests = \ - cadd-01 \ - caddi-01 \ - caddi16sp-01 \ - caddi4spn-01 \ - cand-01 \ - candi-01 \ - cbeqz-01 \ - cbnez-01 \ - cj-01 \ - cjal-01 \ - cjalr-01 \ - cjr-01 \ - cli-01 \ - clui-01 \ - clw-01 \ - clwsp-01 \ - cmv-01 \ - cnop-01 \ - cor-01 \ - cslli-01 \ - csrai-01 \ - csrli-01 \ - csub-01 \ - csw-01 \ - cswsp-01 \ - cxor-01 \ - cebreak-01 - rv32i_tests = $(addsuffix .elf, $(rv32i_sc_tests)) diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv32i_m/F/Makefrag b/tests/wally-riscv-arch-test/riscv-test-suite/rv32i_m/F/Makefrag index 768a3450f..253e9e0d3 100644 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv32i_m/F/Makefrag +++ b/tests/wally-riscv-arch-test/riscv-test-suite/rv32i_m/F/Makefrag @@ -6,152 +6,6 @@ # Description: Makefrag for RV32IF architectural tests rv32if_sc_tests = \ - fadd_b1-01 \ - fadd_b10-01 \ - fadd_b11-01 \ - fadd_b12-01 \ - fadd_b13-01 \ - fadd_b2-01 \ - fadd_b3-01 \ - fadd_b4-01 \ - fadd_b5-01 \ - fadd_b7-01 \ - fadd_b8-01 \ - fclass_b1-01 \ - fcvt.s.w_b25-01 \ - fcvt.s.w_b26-01 \ - fcvt.s.wu_b25-01 \ - fcvt.s.wu_b26-01 \ - fcvt.w.s_b1-01 \ - fcvt.w.s_b22-01 \ - fcvt.w.s_b23-01 \ - fcvt.w.s_b24-01 \ - fcvt.w.s_b27-01 \ - fcvt.w.s_b28-01 \ - fcvt.w.s_b29-01 \ - fcvt.wu.s_b1-01 \ - fcvt.wu.s_b22-01 \ - fcvt.wu.s_b23-01 \ - fcvt.wu.s_b24-01 \ - fcvt.wu.s_b27-01 \ - fcvt.wu.s_b28-01 \ - fcvt.wu.s_b29-01 \ - fdiv_b1-01 \ - fdiv_b2-01 \ - fdiv_b20-01 \ - fdiv_b21-01 \ - fdiv_b3-01 \ - fdiv_b4-01 \ - fdiv_b5-01 \ - fdiv_b6-01 \ - fdiv_b7-01 \ - fdiv_b8-01 \ - fdiv_b9-01 \ - feq_b1-01 \ - feq_b19-01 \ - fle_b1-01 \ - fle_b19-01 \ - flt_b1-01 \ - flt_b19-01 \ - flw-align-01 \ - fmadd_b1-01 \ - fmadd_b14-01 \ - fmadd_b15-01 \ - fmadd_b16-01 \ - fmadd_b17-01 \ - fmadd_b18-01 \ - fmadd_b2-01 \ - fmadd_b3-01 \ - fmadd_b4-01 \ - fmadd_b5-01 \ - fmadd_b6-01 \ - fmadd_b7-01 \ - fmadd_b8-01 \ - fmax_b1-01 \ - fmax_b19-01 \ - fmin_b1-01 \ - fmin_b19-01 \ - fmsub_b1-01 \ - fmsub_b14-01 \ - fmsub_b15-01 \ - fmsub_b16-01 \ - fmsub_b17-01 \ - fmsub_b18-01 \ - fmsub_b2-01 \ - fmsub_b3-01 \ - fmsub_b4-01 \ - fmsub_b5-01 \ - fmsub_b6-01 \ - fmsub_b7-01 \ - fmsub_b8-01 \ - fmul_b1-01 \ - fmul_b2-01 \ - fmul_b3-01 \ - fmul_b4-01 \ - fmul_b5-01 \ - fmul_b6-01 \ - fmul_b7-01 \ - fmul_b8-01 \ - fmul_b9-01 \ - fmv.w.x_b25-01 \ - fmv.w.x_b26-01 \ - fmv.x.w_b1-01 \ - fmv.x.w_b22-01 \ - fmv.x.w_b23-01 \ - fmv.x.w_b24-01 \ - fmv.x.w_b27-01 \ - fmv.x.w_b28-01 \ - fmv.x.w_b29-01 \ - fnmadd_b1-01 \ - fnmadd_b14-01 \ - fnmadd_b15-01 \ - fnmadd_b16-01 \ - fnmadd_b17-01 \ - fnmadd_b18-01 \ - fnmadd_b2-01 \ - fnmadd_b3-01 \ - fnmadd_b4-01 \ - fnmadd_b5-01 \ - fnmadd_b6-01 \ - fnmadd_b7-01 \ - fnmadd_b8-01 \ - fnmsub_b1-01 \ - fnmsub_b14-01 \ - fnmsub_b15-01 \ - fnmsub_b16-01 \ - fnmsub_b17-01 \ - fnmsub_b18-01 \ - fnmsub_b2-01 \ - fnmsub_b3-01 \ - fnmsub_b4-01 \ - fnmsub_b5-01 \ - fnmsub_b6-01 \ - fnmsub_b7-01 \ - fnmsub_b8-01 \ - fsgnj_b1-01 \ - fsgnjn_b1-01 \ - fsgnjx_b1-01 \ - fsqrt_b1-01 \ - fsqrt_b2-01 \ - fsqrt_b20-01 \ - fsqrt_b3-01 \ - fsqrt_b4-01 \ - fsqrt_b5-01 \ - fsqrt_b7-01 \ - fsqrt_b8-01 \ - fsqrt_b9-01 \ - fsub_b1-01 \ - fsub_b10-01 \ - fsub_b11-01 \ - fsub_b12-01 \ - fsub_b13-01 \ - fsub_b2-01 \ - fsub_b3-01 \ - fsub_b4-01 \ - fsub_b5-01 \ - fsub_b7-01 \ - fsub_b8-01 \ - fsw-align-01 \ diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv32i_m/I/Makefrag b/tests/wally-riscv-arch-test/riscv-test-suite/rv32i_m/I/Makefrag index bb2bfc2cd..9331e7e14 100644 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv32i_m/I/Makefrag +++ b/tests/wally-riscv-arch-test/riscv-test-suite/rv32i_m/I/Makefrag @@ -28,45 +28,6 @@ # Description: Makefrag for RV32I architectural tests rv32i_sc_tests = \ - add-01 \ - addi-01 \ - and-01 \ - andi-01 \ - auipc-01 \ - beq-01 \ - bge-01 \ - bgeu-01 \ - blt-01 \ - bltu-01 \ - bne-01 \ - jal-01 \ - jalr-01 \ - lb-align-01 \ - lbu-align-01 \ - lh-align-01 \ - lhu-align-01 \ - lui-01 \ - lw-align-01 \ - or-01 \ - ori-01 \ - sb-align-01 \ - sh-align-01 \ - sll-01 \ - slli-01 \ - slt-01 \ - slti-01 \ - sltiu-01 \ - sltu-01 \ - sra-01 \ - srai-01 \ - srl-01 \ - srli-01 \ - sub-01 \ - sw-align-01 \ - xor-01 \ - xori-01 \ - fence-01 - rv32i_tests = $(addsuffix .elf, $(rv32i_sc_tests)) diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv32i_m/K_unratified/Makefrag b/tests/wally-riscv-arch-test/riscv-test-suite/rv32i_m/K_unratified/Makefrag index 11788461a..31462ca2f 100644 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv32i_m/K_unratified/Makefrag +++ b/tests/wally-riscv-arch-test/riscv-test-suite/rv32i_m/K_unratified/Makefrag @@ -24,71 +24,6 @@ # Description: Makefrag for RV32K compliance tests rv32k_sc_tests = \ - aes32dsi-01 \ - aes32dsi-rwp1 \ - aes32dsmi-01 \ - aes32dsmi-rwp1 \ - aes32esi-01 \ - aes32esi-rwp1 \ - aes32esmi-01 \ - aes32esmi-rwp1 \ - andn-01 \ - clmul-01 \ - clmulh-01 \ - orn-01 \ - pack-01 \ - packh-01 \ - packu-01 \ - rev.b-01 \ - rev8-01 \ - rol-01 \ - ror-01 \ - rori-01 \ - sha256sig0-01 \ - sha256sig0-rwp1 \ - sha256sig0-rwp2 \ - sha256sig1-01 \ - sha256sig1-rwp1 \ - sha256sig1-rwp2 \ - sha256sum0-01 \ - sha256sum0-rwp1 \ - sha256sum0-rwp2 \ - sha256sum1-01 \ - sha256sum1-rwp1 \ - sha256sum1-rwp2 \ - sha512sig0h-01 \ - sha512sig0h-rwp1 \ - sha512sig0h-rwp2 \ - sha512sig0l-01 \ - sha512sig0l-rwp1 \ - sha512sig0l-rwp2 \ - sha512sig1h-01 \ - sha512sig1h-rwp1 \ - sha512sig1h-rwp2 \ - sha512sig1l-01 \ - sha512sig1l-rwp1 \ - sha512sig1l-rwp2 \ - sha512sum0r-01 \ - sha512sum0r-rwp1 \ - sha512sum0r-rwp2 \ - sha512sum1r-01 \ - sha512sum1r-rwp1 \ - sha512sum1r-rwp2 \ - sm3p0-01 \ - sm3p0-rwp1 \ - sm3p0-rwp2 \ - sm3p1-01 \ - sm3p1-rwp1 \ - sm3p1-rwp2 \ - sm4ed-01 \ - sm4ed-rwp1 \ - sm4ks-01 \ - sm4ks-rwp1 \ - unzip-01 \ - xnor-01 \ - xperm.b-01 \ - xperm.n-01 \ - zip-01 \ rv32k_tests = $(addsuffix .elf, $(rv32k_sc_tests)) diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv32i_m/M/Makefrag b/tests/wally-riscv-arch-test/riscv-test-suite/rv32i_m/M/Makefrag index 4e3f72a2a..1426cad31 100644 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv32i_m/M/Makefrag +++ b/tests/wally-riscv-arch-test/riscv-test-suite/rv32i_m/M/Makefrag @@ -29,14 +29,6 @@ # Description: Makefrag for RV32IM architectural tests rv32im_sc_tests = \ - div-01 \ - divu-01 \ - mul-01 \ - mulh-01 \ - mulhsu-01 \ - mulhu-01 \ - rem-01 \ - remu-01 rv32im_tests = $(addsuffix .elf, $(rv32im_sc_tests)) diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv32i_m/Zifencei/Makefrag b/tests/wally-riscv-arch-test/riscv-test-suite/rv32i_m/Zifencei/Makefrag index 70a567d15..79d1bd169 100644 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv32i_m/Zifencei/Makefrag +++ b/tests/wally-riscv-arch-test/riscv-test-suite/rv32i_m/Zifencei/Makefrag @@ -28,7 +28,6 @@ # Description: Makefrag for RV32I architectural tests rv32i_sc_tests = \ - Fencei rv32i_tests = $(addsuffix .elf, $(rv32i_sc_tests)) diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv32i_m/privilege/Makefrag b/tests/wally-riscv-arch-test/riscv-test-suite/rv32i_m/privilege/Makefrag index f88f0a8cc..79d1bd169 100644 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv32i_m/privilege/Makefrag +++ b/tests/wally-riscv-arch-test/riscv-test-suite/rv32i_m/privilege/Makefrag @@ -28,22 +28,6 @@ # Description: Makefrag for RV32I architectural tests rv32i_sc_tests = \ - ebreak \ - ecall \ - misalign-beq-01 \ - misalign-bge-01 \ - misalign-bgeu-01 \ - misalign-blt-01 \ - misalign-bltu-01 \ - misalign-bne-01 \ - misalign-jal-01 \ - misalign-lh-01 \ - misalign-lhu-01 \ - misalign-lw-01 \ - misalign-sh-01 \ - misalign-sw-01 \ - misalign1-jalr-01 \ - misalign2-jalr-01 rv32i_tests = $(addsuffix .elf, $(rv32i_sc_tests)) diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cadd-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cadd-01.reference_output deleted file mode 100644 index 590ec0bc8..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cadd-01.reference_output +++ /dev/null @@ -1,1340 +0,0 @@ -00080000 -80000000 -7ffffffe -ffffffff -66666664 -e6666666 -e0000000 -ffffffff -00000000 -80000080 -00000000 -00008000 -33333333 -b3333333 -00000000 -00000000 -00000002 -40000000 -00000003 -c0000000 -fffff007 -ffffffff -00000014 -00000000 -f800001f -ffffffff -0000003f -ffffc000 -00000080 -00080000 -66666766 -66666666 -00000209 -00000000 -66666a65 -66666666 -ffffc7ff -ffffffff -00001000 -00800000 -55557554 -55555555 -b5053333 -00000000 -00007ff8 -00000000 -0000ffff -f8000000 -0001ffff -fff80000 -00080000 -00000000 -00080000 -00800000 -00140000 -00000000 -001fffff -ff000000 -00400000 -00001000 -00800000 -20000000 -00fffffe -00000000 -01ffffff -00000000 -03fff7ff -00000000 -08000000 -00000800 -0fffffff -80000000 -20000007 -00000000 -3ffffffc -00000000 -d5555555 -55555555 -00080000 -00000001 -00000000 -00000012 -00000000 -c0000004 -b504f334 -00000008 -00000006 -00000020 -ffffffff -ffffe03f -ffffffff -fffff8ff -fffffffd -000001ff -00000000 -00100400 -ffffffef -000007ff -00000006 -00001000 -fffffdff -00001fff -fffffffb -00003fff -00002000 -00010000 -00400000 -00020000 -ffdfffff -0003ffff -55555555 -555d5555 -ffffffff -000ffffd -ffdfffff -001fffff -20000000 -00400000 -00000000 -00840000 -55555555 -56555555 -00400000 -02000000 -00000005 -04000000 -fffffffd -07ffffff -fffffffa -0fffffff -00000000 -e0000000 -ffffff7f -3fffffff -00000ffe -00000000 -ffeffffc -ffffffff -f7fffffa -ffffffff -fffffff6 -dfffffff -ffffffee -fffffffb -ffffffe3 -ffffffff -ffffffbf -000000ff -ffffff83 -ffffffff -fffffefe -fffdffff -fffffe1f -ffffffff -4afb08cc -ffffffff -fffff7ff -7fffffff -ffffefff -00ffffff -ffffdffe -fffffdff -ffffbfde -ffffffff -ffff7efe -ffffffff -fffefffe -fffdffff -fffd7ffe -ffffffff -fffc000f -ffffffff -fff80003 -ffffffff -ffebfffe -ffffffff -ffdfffff -00ffffff -ffb7fffe -ffffffff -ff800001 -ffffffff -ff00ffff -ffffffff -fdffffff -07ffffff -fc00003f -ffffffff -f7fffffa -ffffffff -f00fffff -ffffffff -dfffffff -03ffffff -bfffffff -003fffff -77fffffe -ffffffff -fffffffe -fffffdfe -ffffffff -00003ffd -fdfffffe -fffffffb -00000003 -fffffff8 -ffffffff -00000fef -fffffffe -ffffffd7 -fffffff6 -ffffffbf -0000ffff -ffffff80 -4afb0ccc -fffffeff -fffffffe -7ffffdff -00000003 -fffffc00 -ffffffbe -fffff7ff -fffffffe -ffdfefff -fdfffffe -ffffdfff -003fffff -ffffc000 -ffffffff -ffffffff -7fffffff -ffff0000 -ffffffff -fffeffff -fffbfffe -fffbffff -fffffffe -ffd7ffff -fffffffe -ffafffff -fffffffe -ffdffffe -ffffffff -ffc0001f -000001ff -ff800000 -00000005 -ff000000 -7fffffff -fe000000 -1fffffff -fc000000 -55555555 -4d555555 -ffffffff -f001ffff -55555555 -35555555 -fbfffffe -bfffffff -5555555d -55555555 -f5a5b778 -aaaaaaa9 -0000007f -fc000000 -00000100 -10000000 -4afb10ce -ffffffff -000007ef -00000000 -aaaaeaab -aaaaaaaa -c0007fff -ffffffff -00020002 -00000000 -001fffff -fff00000 -005fffff -00000000 -05000000 -00000000 -35333332 -33333333 -04000000 -00080000 -08000000 -00000008 -0fffffbf -00000000 -40000000 -00000000 -00000080 -00000001 -fffffffe -00000001 -fdffffff -00000003 -80000000 -00000008 -ffbfffff -0000003f -ffffffff -ffff807f -00000080 -00000200 -ffffff7f -000003ff -aaaaaaaa -aaaacaaa -00000000 -00240000 -02000000 -02000000 -aaaaaaaa -baaaaaaa -b504ef33 -00000000 -ffffdffe -f7ffffff -fffeffff -ffffffff -55535554 -55555555 -ffc03fff -ffffffff -ff7fffff -000fffff -feffffff -0000007f -efffffff -001fffff -80000007 -ffffffff -ffffffff -ffffffef -ffffffff -00003fdf -fffffffe -ffffff7f -00000005 -ffffff80 -ffffffff -bffffeff -55555554 -55555155 -00000004 -fffff000 -00000005 -ffff8000 -07ffffff -ffff0000 -bffffffe -fffbffff -ffffffff -ffefffff -ffffffff -ff7fffff -ffffffff -3dffffff -007fffff -fc000000 -fffffbfe -efffffff -aaaaaaa9 -aaaaa8aa -00000006 -00000000 -55555558 -55555555 -aaaaaaad -aaaaaaaa -00000008 -00000000 -33333336 -33333333 -66666669 -66666666 -4afb0cd0 -ffffffff -b504f336 -00000000 -00000005 -00000000 -55555557 -55555555 -00000003 -00000000 -00000007 -00000000 -33333335 -33333333 -66666668 -66666666 -b504f335 -00000000 -55555559 -55555555 -aaaaaaae -aaaaaaaa -00000009 -00000000 -33333337 -33333333 -6666666a -66666666 -4afb0cd1 -ffffffff -b504f337 -00000000 -55555558 -55555555 -aaaaaaaa -aaaaaaaa -ffffffff -ffffffff -5555555a -55555555 -88888888 -88888888 -bbbbbbbb -bbbbbbbb -a0506222 -55555554 -0a5a4888 -55555556 -55555557 -55555555 -aaaaaaa9 -aaaaaaaa -55555555 -55555555 -55555559 -55555555 -88888887 -88888888 -bbbbbbba -bbbbbbbb -0a5a4887 -55555556 -aaaaaaab -aaaaaaaa -00000000 -00000000 -5555555b -55555555 -88888889 -88888888 -bbbbbbbc -bbbbbbbb -a0506223 -55555554 -0a5a4889 -55555556 -aaaaaaad -aaaaaaaa -ffffffff -ffffffff -55555554 -55555555 -aaaaaaaf -aaaaaaaa -dddddddd -dddddddd -11111110 -11111111 -f5a5b777 -aaaaaaa9 -5faf9ddd -aaaaaaab -aaaaaaac -aaaaaaaa -fffffffe -ffffffff -aaaaaaaa -aaaaaaaa -aaaaaaae -aaaaaaaa -dddddddc -dddddddd -1111110f -11111111 -5faf9ddc -aaaaaaab -00000000 -00000000 -55555555 -55555555 -aaaaaab0 -aaaaaaaa -ddddddde -dddddddd -11111111 -11111111 -f5a5b778 -aaaaaaa9 -5faf9dde -aaaaaaab -00000008 -00000000 -5555555a -55555555 -aaaaaaaf -aaaaaaaa -0000000a -00000000 -33333338 -33333333 -6666666b -66666666 -4afb0cd2 -ffffffff -b504f338 -00000000 -00000007 -00000000 -55555559 -55555555 -00000005 -00000000 -00000009 -00000000 -33333337 -33333333 -6666666a -66666666 -b504f337 -00000000 -5555555b -55555555 -aaaaaab0 -aaaaaaaa -0000000b -00000000 -33333339 -33333333 -6666666c -66666666 -4afb0cd3 -ffffffff -b504f339 -00000000 -33333336 -33333333 -88888888 -88888888 -dddddddd -dddddddd -33333338 -33333333 -66666666 -66666666 -99999999 -99999999 -7e2e4000 -33333332 -e8382666 -33333333 -33333335 -33333333 -88888887 -88888888 -33333333 -33333333 -33333337 -33333333 -66666665 -66666666 -99999998 -99999999 -e8382665 -33333333 -88888889 -88888888 -ddddddde -dddddddd -33333339 -33333333 -66666667 -66666666 -9999999a -99999999 -7e2e4001 -33333332 -e8382667 -33333333 -66666669 -66666666 -bbbbbbbb -bbbbbbbb -11111110 -11111111 -6666666b -66666666 -99999999 -99999999 -cccccccc -cccccccc -b1617333 -66666665 -1b6b5999 -66666667 -66666668 -66666666 -bbbbbbba -bbbbbbbb -66666666 -66666666 -6666666a -66666666 -99999998 -99999999 -cccccccb -cccccccc -1b6b5998 -66666667 -bbbbbbbc -bbbbbbbb -11111111 -11111111 -6666666c -66666666 -9999999a -99999999 -cccccccd -cccccccc -b1617334 -66666665 -1b6b599a -66666667 -4afb0cd0 -ffffffff -a0506222 -55555554 -f5a5b777 -aaaaaaa9 -4afb0cd2 -ffffffff -7e2e4000 -33333332 -b1617333 -66666665 -95f6199a -fffffffe -00000000 -00000000 -4afb0ccf -ffffffff -a0506221 -55555554 -4afb0ccd -ffffffff -4afb0cd1 -ffffffff -7e2e3fff -33333332 -b1617332 -66666665 -ffffffff -ffffffff -a0506223 -55555554 -f5a5b778 -aaaaaaa9 -4afb0cd3 -ffffffff -7e2e4001 -33333332 -b1617334 -66666665 -95f6199b -fffffffe -00000001 -00000000 -b504f336 -00000000 -0a5a4888 -55555556 -5faf9ddd -aaaaaaab -b504f338 -00000000 -e8382666 -33333333 -1b6b5999 -66666667 -00000000 -00000000 -6a09e666 -00000001 -b504f335 -00000000 -0a5a4887 -55555556 -b504f333 -00000000 -b504f337 -00000000 -e8382665 -33333333 -1b6b5998 -66666667 -6a09e665 -00000001 -0a5a4889 -55555556 -5faf9dde -aaaaaaab -b504f339 -00000000 -e8382667 -33333333 -1b6b599a -66666667 -00000001 -00000000 -6a09e667 -00000001 -00000005 -00000000 -55555557 -55555555 -aaaaaaac -aaaaaaaa -00000007 -00000000 -33333335 -33333333 -66666668 -66666666 -4afb0ccf -ffffffff -b504f335 -00000000 -00000004 -00000000 -55555556 -55555555 -00000002 -00000000 -00000006 -00000000 -33333334 -33333333 -66666667 -66666666 -b504f334 -00000000 -55555558 -55555555 -aaaaaaad -aaaaaaaa -00000008 -00000000 -33333336 -33333333 -66666669 -66666666 -4afb0cd0 -ffffffff -b504f336 -00000000 -55555557 -55555555 -aaaaaaa9 -aaaaaaaa -fffffffe -ffffffff -55555559 -55555555 -88888887 -88888888 -bbbbbbba -bbbbbbbb -a0506221 -55555554 -0a5a4887 -55555556 -55555556 -55555555 -aaaaaaa8 -aaaaaaaa -55555554 -55555555 -55555558 -55555555 -88888886 -88888888 -bbbbbbb9 -bbbbbbbb -0a5a4886 -55555556 -aaaaaaaa -aaaaaaaa -ffffffff -ffffffff -5555555a -55555555 -88888888 -88888888 -bbbbbbbb -bbbbbbbb -a0506222 -55555554 -0a5a4888 -55555556 -00000003 -00000000 -55555555 -55555555 -aaaaaaaa -aaaaaaaa -00000005 -00000000 -33333333 -33333333 -66666666 -66666666 -4afb0ccd -ffffffff -b504f333 -00000000 -aaaaaaae -aaaaaaaa -00000009 -00000000 -33333337 -33333333 -6666666a -66666666 -4afb0cd1 -ffffffff -b504f337 -00000000 -00000006 -00000000 -55555558 -55555555 -00000004 -00000000 -00000008 -00000000 -33333336 -33333333 -66666669 -66666666 -b504f336 -00000000 -5555555a -55555555 -aaaaaaaf -aaaaaaaa -0000000a -00000000 -33333338 -33333333 -6666666b -66666666 -4afb0cd2 -ffffffff -b504f338 -00000000 -33333335 -33333333 -88888887 -88888888 -dddddddc -dddddddd -33333337 -33333333 -66666665 -66666666 -99999998 -99999999 -7e2e3fff -33333332 -e8382665 -33333333 -33333334 -33333333 -88888886 -88888888 -33333332 -33333333 -33333336 -33333333 -66666664 -66666666 -99999997 -99999999 -e8382664 -33333333 -88888888 -88888888 -dddddddd -dddddddd -33333338 -33333333 -66666666 -66666666 -99999999 -99999999 -7e2e4000 -33333332 -e8382666 -33333333 -66666668 -66666666 -bbbbbbba -bbbbbbbb -1111110f -11111111 -6666666a -66666666 -99999998 -99999999 -cccccccb -cccccccc -b1617332 -66666665 -1b6b5998 -66666667 -66666667 -66666666 -bbbbbbb9 -bbbbbbbb -66666665 -66666666 -66666669 -66666666 -99999997 -99999999 -ccccccca -cccccccc -1b6b5997 -66666667 -bbbbbbbb -bbbbbbbb -11111110 -11111111 -6666666b -66666666 -99999999 -99999999 -cccccccc -cccccccc -b1617333 -66666665 -1b6b5999 -66666667 -b504f335 -00000000 -0a5a4887 -55555556 -5faf9ddc -aaaaaaab -b504f337 -00000000 -e8382665 -33333333 -1b6b5998 -66666667 -ffffffff -ffffffff -6a09e665 -00000001 -b504f334 -00000000 -0a5a4886 -55555556 -b504f332 -00000000 -b504f336 -00000000 -e8382664 -33333333 -1b6b5997 -66666667 -6a09e664 -00000001 -0a5a4888 -55555556 -5faf9ddd -aaaaaaab -b504f338 -00000000 -e8382666 -33333333 -1b6b5999 -66666667 -00000000 -00000000 -6a09e666 -00000001 -55555559 -55555555 -aaaaaaab -aaaaaaaa -00000000 -00000000 -5555555b -55555555 -88888889 -88888888 -bbbbbbbc -bbbbbbbb -a0506223 -55555554 -0a5a4889 -55555556 -55555558 -55555555 -aaaaaaaa -aaaaaaaa -55555556 -55555555 -5555555a -55555555 -88888888 -88888888 -bbbbbbbb -bbbbbbbb -0a5a4888 -55555556 -aaaaaaac -aaaaaaaa -00000001 -00000000 -5555555c -55555555 -8888888a -88888888 -bbbbbbbd -bbbbbbbb -a0506224 -55555554 -0a5a488a -55555556 -aaaaaaae -aaaaaaaa -00000000 -00000000 -55555555 -55555555 -aaaaaab0 -aaaaaaaa -ddddddde -dddddddd -11111111 -11111111 -f5a5b778 -aaaaaaa9 -5faf9dde -aaaaaaab -aaaaaaad -aaaaaaaa -ffffffff -ffffffff -aaaaaaab -aaaaaaaa -aaaaaaaf -aaaaaaaa -dddddddd -dddddddd -11111110 -11111111 -5faf9ddd -aaaaaaab -00000001 -00000000 -55555556 -55555555 -aaaaaab1 -aaaaaaaa -dddddddf -dddddddd -11111112 -11111111 -f5a5b779 -aaaaaaa9 -5faf9ddf -aaaaaaab -00000009 -00000000 -5555555b -55555555 -aaaaaab0 -aaaaaaaa -0000000b -00000000 -33333339 -33333333 -6666666c -66666666 -4afb0cd3 -ffffffff -b504f339 -00000000 -00000008 -00000000 -5555555a -55555555 -00000006 -00000000 -0000000a -00000000 -33333338 -33333333 -6666666b -66666666 -b504f338 -00000000 -5555555c -55555555 -aaaaaab1 -aaaaaaaa -0000000c -00000000 -3333333a -33333333 -6666666d -66666666 -4afb0cd4 -ffffffff -b504f33a -00000000 -33333337 -33333333 -88888889 -88888888 -ddddddde -dddddddd -33333339 -33333333 -66666667 -66666666 -9999999a -99999999 -7e2e4001 -33333332 -e8382667 -33333333 -33333336 -33333333 -88888888 -88888888 -33333334 -33333333 -33333338 -33333333 -66666666 -66666666 -99999999 -99999999 -e8382666 -33333333 -8888888a -88888888 -dddddddf -dddddddd -3333333a -33333333 -66666668 -66666666 -9999999b -99999999 -7e2e4002 -33333332 -e8382668 -33333333 -6666666a -66666666 -bbbbbbbc -bbbbbbbb -11111111 -11111111 -6666666c -66666666 -9999999a -99999999 -cccccccd -cccccccc -b1617334 -66666665 -1b6b599a -66666667 -66666669 -66666666 -bbbbbbbb -bbbbbbbb -66666667 -66666666 -6666666b -66666666 -99999999 -99999999 -cccccccc -cccccccc -1b6b5999 -66666667 -bbbbbbbd -bbbbbbbb -11111112 -11111111 -6666666d -66666666 -9999999b -99999999 -ccccccce -cccccccc -b1617335 -66666665 -1b6b599b -66666667 -4afb0cd1 -ffffffff -a0506223 -55555554 -4afb0cd3 -ffffffff -7e2e4001 -33333332 -b1617334 -66666665 -95f6199b -fffffffe -00000001 -00000000 -4afb0cd0 -ffffffff -a0506222 -55555554 -4afb0cce -ffffffff -4afb0cd2 -ffffffff -7e2e4000 -33333332 -b1617333 -66666665 -00000000 -00000000 -a0506224 -55555554 -f5a5b779 -aaaaaaa9 -4afb0cd4 -ffffffff -7e2e4002 -33333332 -b1617335 -66666665 -95f6199c -fffffffe -00000002 -00000000 -b504f337 -00000000 -0a5a4889 -55555556 -5faf9dde -aaaaaaab -b504f339 -00000000 -e8382667 -33333333 -1b6b599a -66666667 -00000001 -00000000 -6a09e667 -00000001 -b504f336 -00000000 -0a5a4888 -55555556 -b504f334 -00000000 -b504f338 -00000000 -e8382666 -33333333 -1b6b5999 -66666667 -6a09e666 -00000001 -0a5a488a -55555556 -5faf9ddf -aaaaaaab -b504f33a -00000000 -e8382668 -33333333 -1b6b599b -66666667 -00000002 -00000000 -6a09e668 -00000001 -00000002 -00000000 -55555554 -55555555 -00000000 -00000000 -00000004 -00000000 -33333332 -33333333 -66666665 -66666666 -b504f332 -00000000 -55555556 -55555555 -aaaaaaab -aaaaaaaa -00000006 -00000000 -33333334 -33333333 -66666667 -66666666 -4afb0cce -ffffffff -b504f334 -00000000 -00000007 -00000000 -55555559 -55555555 -bfffffff -ffffffff -00000001 -00000010 -00000000 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/caddi-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/caddi-01.reference_output deleted file mode 100644 index 952bff5f5..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/caddi-01.reference_output +++ /dev/null @@ -1,880 +0,0 @@ -fffffffa -ffffffff -4afb0cdd -ffffffff -5555555b -55555555 -00000005 -00000000 -fffffbdf -ffffffff -aaaaaaaa -aaaaaaaa -fffffc1e -ffffffff -55555556 -55555555 -00000002 -80000000 -fffffff0 -ffffffff -fffffffa -7fffffff -00000000 -00000000 -40000004 -00000000 -00000007 -fffffffc -0000000a -00000000 -00000002 -00000000 -b504f329 -00000000 -ffffffee -fff7ffff -01000015 -00000000 -fffdffe9 -ffffffff -00000007 -00000000 -0000000d -00000000 -00000017 -00000000 -00000000 -00000000 -0000003e -00000000 -0000009f -00000000 -00000104 -00000000 -00000206 -00000000 -00000407 -00000000 -0000081f -00000000 -00001006 -00000000 -00002004 -00000000 -00004007 -00000000 -00008004 -00000000 -00010004 -00000000 -0001fffd -00000000 -00040002 -00000000 -0007ffea -00000000 -000ffff7 -00000000 -001ffff6 -00000000 -00400004 -00000000 -007fffe0 -00000000 -01ffffef -00000000 -04000004 -00000000 -08000006 -00000000 -10000002 -00000000 -1fffffe0 -00000000 -80000000 -00000000 -0000000a -00000001 -00000006 -00000002 -0000000a -00000004 -00000007 -00000008 -fffffffd -0000000f -fffffffc -0000001f -00000002 -00000040 -00000006 -00000080 -00000008 -00000100 -00000000 -00000200 -00000005 -00000400 -fffffffd -000007ff -00000006 -00001000 -fffffffb -00001fff -00000009 -00004000 -00000000 -00008000 -00000005 -00010000 -00000005 -00020000 -ffffffe0 -0003ffff -00000003 -00080000 -00000003 -00100000 -00000006 -00200000 -00000005 -00400000 -00000002 -00800000 -fffffffd -00ffffff -00000004 -02000000 -00000001 -04000000 -00000008 -08000000 -00000004 -10000000 -00000003 -20000000 -fffffffe -3fffffff -00000006 -00000000 -00000006 -00000000 -fffffff7 -ffffffff -ffffffea -ffffffff -ffffffda -ffffffff -ffffffc5 -ffffffff -ffffff7a -ffffffff -fffffefd -ffffffff -fffffe03 -ffffffff -fffff805 -ffffffff -ffffeffc -ffffffff -ffffe005 -ffffffff -ffffbfee -ffffffff -ffff8003 -ffffffff -ffff0002 -ffffffff -fffbfffe -ffffffff -fff7fffd -ffffffff -ffefffff -ffffffff -ffe00005 -ffffffff -ffc0001e -ffffffff -ff7ffff9 -ffffffff -ff000009 -ffffffff -fdfffffb -ffffffff -fc00000e -ffffffff -f8000005 -ffffffff -f0000005 -ffffffff -dffffffe -ffffffff -bfffffff -ffffffff -7ffffff8 -ffffffff -0000000f -ffffffff -00000007 -fffffffe -ffffffff -fffffff7 -00000003 -fffffff0 -ffffffee -ffffffdf -0000000e -ffffffc0 -00000004 -ffffff80 -ffffffff -fffffeff -00000005 -fffffe00 -00000006 -fffffc00 -fffffff6 -fffff7ff -ffffffe9 -ffffefff -00000003 -ffffe000 -00000003 -ffffc000 -00000004 -ffff8000 -ffffffe9 -fffeffff -0000000a -fffe0000 -00000004 -fffc0000 -fffffff7 -ffefffff -00000005 -ffe00000 -00000001 -ffc00000 -ffffffff -ff7fffff -00000005 -ff000000 -ffffffff -fdffffff -ffffffee -fbffffff -ffffffee -f7ffffff -00000001 -f0000000 -00000014 -e0000000 -00000002 -c0000000 -00000006 -00000000 -00000008 -00000000 -0000000d -00000000 -00000009 -00000000 -00000001 -00000000 -fffffffe -ffffffff -00000005 -00000000 -00000007 -00000000 -0000000c -00000000 -00000003 -00000000 -0000000e -00000000 -0000000a -00000000 -00000002 -00000000 -ffffffff -ffffffff -55555558 -55555555 -5555555a -55555555 -5555555f -55555555 -55555553 -55555555 -55555550 -55555555 -55555557 -55555555 -55555559 -55555555 -5555555e -55555555 -55555555 -55555555 -55555560 -55555555 -5555555c -55555555 -55555554 -55555555 -55555551 -55555555 -aaaaaaad -aaaaaaaa -aaaaaaaf -aaaaaaaa -aaaaaab4 -aaaaaaaa -aaaaaab0 -aaaaaaaa -aaaaaaa8 -aaaaaaaa -aaaaaaa5 -aaaaaaaa -aaaaaaac -aaaaaaaa -aaaaaaae -aaaaaaaa -aaaaaab3 -aaaaaaaa -aaaaaab5 -aaaaaaaa -aaaaaab1 -aaaaaaaa -aaaaaaa9 -aaaaaaaa -aaaaaaa6 -aaaaaaaa -00000008 -00000000 -0000000a -00000000 -0000000f -00000000 -0000000b -00000000 -00000003 -00000000 -00000000 -00000000 -00000007 -00000000 -00000009 -00000000 -0000000e -00000000 -00000005 -00000000 -00000010 -00000000 -0000000c -00000000 -00000004 -00000000 -00000001 -00000000 -33333336 -33333333 -33333338 -33333333 -3333333d -33333333 -33333339 -33333333 -33333331 -33333333 -3333332e -33333333 -33333335 -33333333 -33333337 -33333333 -3333333c -33333333 -33333333 -33333333 -3333333e -33333333 -3333333a -33333333 -33333332 -33333333 -3333332f -33333333 -66666669 -66666666 -6666666b -66666666 -66666670 -66666666 -6666666c -66666666 -66666664 -66666666 -66666661 -66666666 -66666668 -66666666 -6666666a -66666666 -6666666f -66666666 -66666666 -66666666 -66666671 -66666666 -6666666d -66666666 -66666665 -66666666 -66666662 -66666666 -4afb0cd0 -ffffffff -4afb0cd2 -ffffffff -4afb0cd7 -ffffffff -4afb0cd3 -ffffffff -4afb0ccb -ffffffff -4afb0cc8 -ffffffff -4afb0ccf -ffffffff -4afb0cd1 -ffffffff -4afb0cd6 -ffffffff -4afb0ccd -ffffffff -4afb0cd8 -ffffffff -4afb0cd4 -ffffffff -4afb0ccc -ffffffff -4afb0cc9 -ffffffff -b504f336 -00000000 -b504f338 -00000000 -b504f33d -00000000 -b504f339 -00000000 -b504f331 -00000000 -b504f32e -00000000 -b504f335 -00000000 -b504f337 -00000000 -b504f33c -00000000 -b504f333 -00000000 -b504f33e -00000000 -b504f33a -00000000 -b504f332 -00000000 -b504f32f -00000000 -00000005 -00000000 -0000000c -00000000 -00000008 -00000000 -00000000 -00000000 -fffffffd -ffffffff -00000004 -00000000 -00000006 -00000000 -0000000b -00000000 -00000002 -00000000 -0000000d -00000000 -00000009 -00000000 -00000001 -00000000 -fffffffe -ffffffff -55555557 -55555555 -55555559 -55555555 -5555555e -55555555 -5555555a -55555555 -55555552 -55555555 -5555554f -55555555 -55555556 -55555555 -55555558 -55555555 -5555555d -55555555 -55555554 -55555555 -5555555f -55555555 -5555555b -55555555 -55555553 -55555555 -55555550 -55555555 -00000003 -00000000 -00000005 -00000000 -0000000a -00000000 -00000006 -00000000 -fffffffe -ffffffff -fffffffb -ffffffff -00000002 -00000000 -00000004 -00000000 -00000009 -00000000 -00000000 -00000000 -0000000b -00000000 -00000007 -00000000 -ffffffff -ffffffff -fffffffc -ffffffff -00000007 -00000000 -00000009 -00000000 -0000000e -00000000 -0000000a -00000000 -ffffffff -ffffffff -00000006 -00000000 -00000008 -00000000 -0000000d -00000000 -00000004 -00000000 -0000000f -00000000 -0000000b -00000000 -00000003 -00000000 -00000000 -00000000 -33333335 -33333333 -33333337 -33333333 -3333333c -33333333 -33333338 -33333333 -33333330 -33333333 -3333332d -33333333 -33333334 -33333333 -33333336 -33333333 -3333333b -33333333 -33333332 -33333333 -3333333d -33333333 -33333339 -33333333 -33333331 -33333333 -3333332e -33333333 -66666668 -66666666 -6666666a -66666666 -6666666f -66666666 -6666666b -66666666 -66666663 -66666666 -66666660 -66666666 -66666667 -66666666 -66666669 -66666666 -6666666e -66666666 -66666665 -66666666 -66666670 -66666666 -6666666c -66666666 -66666664 -66666666 -66666661 -66666666 -b504f335 -00000000 -b504f337 -00000000 -b504f33c -00000000 -b504f338 -00000000 -b504f330 -00000000 -b504f32d -00000000 -b504f334 -00000000 -b504f336 -00000000 -b504f33b -00000000 -b504f332 -00000000 -b504f33d -00000000 -b504f339 -00000000 -b504f331 -00000000 -b504f32e -00000000 -55555559 -55555555 -5555555b -55555555 -55555560 -55555555 -5555555c -55555555 -55555554 -55555555 -55555551 -55555555 -55555558 -55555555 -5555555a -55555555 -5555555f -55555555 -55555556 -55555555 -55555561 -55555555 -5555555d -55555555 -55555555 -55555555 -55555552 -55555555 -aaaaaaae -aaaaaaaa -aaaaaab0 -aaaaaaaa -aaaaaab5 -aaaaaaaa -aaaaaab1 -aaaaaaaa -aaaaaaa9 -aaaaaaaa -aaaaaaa6 -aaaaaaaa -aaaaaaad -aaaaaaaa -aaaaaaaf -aaaaaaaa -aaaaaab4 -aaaaaaaa -aaaaaaab -aaaaaaaa -aaaaaab6 -aaaaaaaa -aaaaaab2 -aaaaaaaa -aaaaaaaa -aaaaaaaa -aaaaaaa7 -aaaaaaaa -00000009 -00000000 -0000000b -00000000 -00000010 -00000000 -0000000c -00000000 -00000004 -00000000 -00000001 -00000000 -00000008 -00000000 -0000000a -00000000 -0000000f -00000000 -00000006 -00000000 -00000011 -00000000 -0000000d -00000000 -00000002 -00000000 -33333337 -33333333 -33333339 -33333333 -3333333e -33333333 -3333333a -33333333 -33333332 -33333333 -3333332f -33333333 -33333336 -33333333 -33333338 -33333333 -3333333d -33333333 -33333334 -33333333 -3333333f -33333333 -3333333b -33333333 -33333333 -33333333 -33333330 -33333333 -6666666a -66666666 -6666666c -66666666 -66666671 -66666666 -6666666d -66666666 -66666665 -66666666 -66666662 -66666666 -66666669 -66666666 -6666666b -66666666 -66666670 -66666666 -66666667 -66666666 -66666672 -66666666 -4afb0ccd -ffffffff -4afb0cca -ffffffff -b504f337 -00000000 -b504f339 -00000000 -b504f33e -00000000 -b504f33a -00000000 -b504f332 -00000000 -b504f32f -00000000 -b504f336 -00000000 -b504f338 -00000000 -b504f33d -00000000 -b504f334 -00000000 -b504f33f -00000000 -b504f33b -00000000 -b504f333 -00000000 -b504f330 -00000000 -6666666e -66666666 -66666666 -66666666 -66666663 -66666666 -4afb0cd1 -ffffffff -4afb0cd3 -ffffffff -4afb0cd8 -ffffffff -4afb0cd4 -ffffffff -4afb0ccc -ffffffff -4afb0cc9 -ffffffff -4afb0cd0 -ffffffff -4afb0cd2 -ffffffff -4afb0cd7 -ffffffff -4afb0cce -ffffffff -4afb0cd9 -ffffffff -4afb0cd5 -ffffffff diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/caddi16sp-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/caddi16sp-01.reference_output deleted file mode 100644 index 2db3a6676..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/caddi16sp-01.reference_output +++ /dev/null @@ -1,264 +0,0 @@ -00000200 -00000000 -001fff70 -00000000 -0000008f -ffffffc0 -fffffdfe -ffffffff -00000010 -80000000 -00000030 -00000000 -0000008f -80000000 -000000f1 -00000000 -ffff01ef -ffffffff -00000152 -00000000 -ffffffd4 -ffffffff -00000088 -00000000 -00000160 -00000000 -ffffffd0 -ffffffff -00000230 -00000000 -00000270 -00000000 -00000250 -00000000 -00000440 -00000000 -000007b0 -00000000 -00000fb0 -00000000 -00002080 -00000000 -000040f0 -00000000 -00008010 -00000000 -00010020 -00000000 -00020100 -00000000 -00040060 -00000000 -00080050 -00000000 -00100040 -00000000 -00400060 -00000000 -007fff70 -00000000 -00ffffa0 -00000000 -01ffffd0 -00000000 -04000070 -00000000 -08000030 -00000000 -0fffff60 -00000000 -1fffffb0 -00000000 -3ffffe00 -00000000 -7fffffc0 -00000000 -00000020 -00000001 -00000060 -00000002 -ffffffc0 -00000003 -00000050 -00000008 -00000080 -00000010 -ffffffb0 -0000001f -ffffff60 -0000003f -ffffff90 -0000007f -ffffffc0 -000000ff -00000070 -00000200 -00000010 -00000400 -ffffffd0 -000007ff -000001f0 -00001000 -000000f0 -00002000 -00000030 -00004000 -00000070 -00008000 -00000030 -00010000 -00000030 -00020000 -fffffea0 -0003ffff -ffffffd0 -0007ffff -00000080 -00100000 -000001f0 -00200000 -000000f0 -00400000 -ffffffd0 -007fffff -ffffffe0 -00ffffff -00000020 -02000000 -ffffffc0 -03ffffff -00000040 -08000000 -00000020 -10000000 -00000030 -20000000 -00000050 -40000000 -ffffffef -ffdfffff -000001ef -ffc00000 -0000002f -ff800000 -0000007f -ff000000 -ffffff7f -fdffffff -0000014f -fc000000 -ffffffbf -f7ffffff -ffffff8f -efffffff -fffffeff -dfffffff -ffffff9f -bfffffff -55555655 -55555555 -aaaaaa6a -aaaaaaaa -fffffff0 -ffffffff -0000004d -00000000 -0000001b -00000000 -ffffffb7 -ffffffff -0000013f -00000000 -fffffecf -ffffffff -ffffff1f -ffffffff -fffffd7f -ffffffff -fffffebf -ffffffff -fffffe5f -ffffffff -fffffdef -ffffffff -fffff83f -ffffffff -fffff04f -ffffffff -ffffdfef -ffffffff -ffffbeff -ffffffff -ffff806f -ffffffff -fffe008f -ffffffff -fffc007f -ffffffff -fff8008f -ffffffff -ffefffef -ffffffff -ffe0002f -ffffffff -ffc0007f -ffffffff -ff80001f -ffffffff -ff00007f -ffffffff -fe00002f -ffffffff -fbffffaf -ffffffff -f800002f -ffffffff -efffffcf -ffffffff -dfffffbf -ffffffff -bffffeef -ffffffff -7fffff9f -ffffffff -0000006f -ffffffff -ffffff6f -fffffffd -ffffff5f -fffffffb -0000008f -fffffff8 -ffffff5f -ffffffef -000000ff -ffffffe0 -ffffff5f -ffffff7f -ffffffcf -fffffeff -ffffff5f -fffffdff -fffffeef -fffffbff -0000000f -fffff800 -0000006f -fffff000 -0000003f -ffffe000 -000000ff -ffffc000 -0000003f -ffff8000 -000001ef -ffff0000 -ffffff5f -fffdffff -ffffffef -fffbffff -ffffff8f -fff7ffff -ffffffdf -ffefffff diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/caddi4spn-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/caddi4spn-01.reference_output deleted file mode 100644 index e332d28bd..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/caddi4spn-01.reference_output +++ /dev/null @@ -1,40 +0,0 @@ -00000200 -00000000 -000003fc -00000000 -00000004 -00000000 -00000008 -00000000 -00000010 -00000000 -00000020 -00000000 -00000040 -00000000 -00000080 -00000000 -00000100 -00000000 -000003f8 -00000000 -000003f4 -00000000 -000003ec -00000000 -000002fc -00000000 -000001fc -00000000 -00000154 -00000000 -000002a8 -00000000 -000003dc -00000000 -000003bc -00000000 -0000037c -00000000 -00000000 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/caddiw-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/caddiw-01.reference_output deleted file mode 100644 index a0517529a..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/caddiw-01.reference_output +++ /dev/null @@ -1,876 +0,0 @@ -00000020 -00000000 -00008007 -00000000 -ffffffff -ffffffff -fffff002 -ffffffff -fffffde9 -ffffffff -ffffffe0 -ffffffff -fffffff8 -ffffffff -ff80001e -ffffffff -00000000 -00000000 -00000005 -00000000 -00000004 -00000000 -00000005 -00000000 -00000004 -00000000 -fff00001 -ffffffff -c0000007 -ffffffff -fffffff4 -ffffffff -00000000 -00000000 -0ffffffb -00000000 -ffffffee -ffffffff -ffffffee -ffffffff -00000019 -00000000 -00000006 -00000000 -00000008 -00000000 -0000000d -00000000 -00000009 -00000000 -00000001 -00000000 -fffffffe -ffffffff -00000005 -00000000 -00000007 -00000000 -0000000c -00000000 -00000003 -00000000 -0000000e -00000000 -0000000a -00000000 -00000002 -00000000 -ffffffff -ffffffff -55555558 -00000000 -5555555a -00000000 -5555555f -00000000 -5555555b -00000000 -55555553 -00000000 -55555550 -00000000 -55555557 -00000000 -55555559 -00000000 -5555555e -00000000 -55555555 -00000000 -55555560 -00000000 -5555555c -00000000 -55555554 -00000000 -55555551 -00000000 -aaaaaaad -ffffffff -aaaaaaaf -ffffffff -aaaaaab4 -ffffffff -aaaaaab0 -ffffffff -aaaaaaa8 -ffffffff -aaaaaaa5 -ffffffff -aaaaaaac -ffffffff -aaaaaaae -ffffffff -aaaaaab3 -ffffffff -aaaaaaaa -ffffffff -aaaaaab5 -ffffffff -aaaaaab1 -ffffffff -aaaaaaa9 -ffffffff -aaaaaaa6 -ffffffff -00000008 -00000000 -0000000a -00000000 -0000000f -00000000 -0000000b -00000000 -00000003 -00000000 -00000000 -00000000 -00000007 -00000000 -00000009 -00000000 -0000000e -00000000 -00000005 -00000000 -00000010 -00000000 -0000000c -00000000 -00000004 -00000000 -00000001 -00000000 -33333336 -00000000 -33333338 -00000000 -3333333d -00000000 -33333339 -00000000 -33333331 -00000000 -3333332e -00000000 -33333335 -00000000 -33333337 -00000000 -3333333c -00000000 -33333333 -00000000 -3333333e -00000000 -3333333a -00000000 -33333332 -00000000 -3333332f -00000000 -66666669 -00000000 -6666666b -00000000 -66666670 -00000000 -6666666c -00000000 -66666664 -00000000 -66666661 -00000000 -66666668 -00000000 -6666666a -00000000 -6666666f -00000000 -66666666 -00000000 -66666671 -00000000 -6666666d -00000000 -66666665 -00000000 -66666662 -00000000 -4afb0cd0 -00000000 -4afb0cd2 -00000000 -4afb0cd7 -00000000 -4afb0cd3 -00000000 -4afb0ccb -00000000 -4afb0cc8 -00000000 -4afb0ccf -00000000 -4afb0cd1 -00000000 -4afb0cd6 -00000000 -4afb0ccd -00000000 -4afb0cd8 -00000000 -4afb0cd4 -00000000 -4afb0ccc -00000000 -4afb0cc9 -00000000 -b504f336 -ffffffff -b504f338 -ffffffff -b504f33d -ffffffff -b504f339 -ffffffff -b504f331 -ffffffff -b504f32e -ffffffff -b504f335 -ffffffff -b504f337 -ffffffff -b504f33c -ffffffff -b504f333 -ffffffff -b504f33e -ffffffff -b504f33a -ffffffff -b504f332 -ffffffff -b504f32f -ffffffff -00000005 -00000000 -00000007 -00000000 -0000000c -00000000 -00000008 -00000000 -00000000 -00000000 -fffffffd -ffffffff -00000004 -00000000 -00000006 -00000000 -0000000b -00000000 -00000002 -00000000 -0000000d -00000000 -00000009 -00000000 -00000001 -00000000 -fffffffe -ffffffff -55555557 -00000000 -55555559 -00000000 -5555555e -00000000 -5555555a -00000000 -55555552 -00000000 -5555554f -00000000 -55555556 -00000000 -55555558 -00000000 -5555555d -00000000 -55555554 -00000000 -5555555f -00000000 -5555555b -00000000 -55555553 -00000000 -55555550 -00000000 -00000003 -00000000 -00000005 -00000000 -0000000a -00000000 -00000006 -00000000 -fffffffe -ffffffff -fffffffb -ffffffff -00000002 -00000000 -00000009 -00000000 -00000000 -00000000 -0000000b -00000000 -00000007 -00000000 -ffffffff -ffffffff -fffffffc -ffffffff -00000007 -00000000 -00000009 -00000000 -0000000e -00000000 -0000000a -00000000 -00000002 -00000000 -ffffffff -ffffffff -00000006 -00000000 -00000008 -00000000 -0000000d -00000000 -00000004 -00000000 -0000000f -00000000 -0000000b -00000000 -00000003 -00000000 -00000000 -00000000 -33333335 -00000000 -33333337 -00000000 -3333333c -00000000 -33333338 -00000000 -33333330 -00000000 -3333332d -00000000 -33333334 -00000000 -33333336 -00000000 -3333333b -00000000 -33333332 -00000000 -3333333d -00000000 -33333339 -00000000 -33333331 -00000000 -3333332e -00000000 -66666668 -00000000 -6666666a -00000000 -6666666f -00000000 -6666666b -00000000 -66666663 -00000000 -66666660 -00000000 -66666667 -00000000 -66666669 -00000000 -6666666e -00000000 -66666665 -00000000 -66666670 -00000000 -6666666c -00000000 -66666664 -00000000 -66666661 -00000000 -b504f335 -ffffffff -b504f337 -ffffffff -b504f33c -ffffffff -b504f338 -ffffffff -b504f330 -ffffffff -b504f32d -ffffffff -b504f334 -ffffffff -b504f336 -ffffffff -b504f33b -ffffffff -b504f332 -ffffffff -b504f33d -ffffffff -b504f339 -ffffffff -b504f331 -ffffffff -b504f32e -ffffffff -55555559 -00000000 -5555555b -00000000 -55555560 -00000000 -5555555c -00000000 -55555554 -00000000 -55555551 -00000000 -55555558 -00000000 -5555555a -00000000 -5555555f -00000000 -55555556 -00000000 -55555561 -00000000 -5555555d -00000000 -55555555 -00000000 -55555552 -00000000 -aaaaaaae -ffffffff -aaaaaab0 -ffffffff -aaaaaab5 -ffffffff -aaaaaab1 -ffffffff -aaaaaaa9 -ffffffff -aaaaaaa6 -ffffffff -aaaaaaad -ffffffff -aaaaaaaf -ffffffff -aaaaaab4 -ffffffff -aaaaaaab -ffffffff -aaaaaab6 -ffffffff -aaaaaab2 -ffffffff -aaaaaaaa -ffffffff -aaaaaaa7 -ffffffff -00000009 -00000000 -0000000b -00000000 -00000010 -00000000 -0000000c -00000000 -00000004 -00000000 -00000001 -00000000 -00000008 -00000000 -0000000a -00000000 -0000000f -00000000 -00000006 -00000000 -00000011 -00000000 -0000000d -00000000 -00000005 -00000000 -00000002 -00000000 -33333337 -00000000 -33333339 -00000000 -3333333e -00000000 -3333333a -00000000 -33333332 -00000000 -3333332f -00000000 -33333336 -00000000 -33333338 -00000000 -3333333d -00000000 -33333334 -00000000 -3333333f -00000000 -3333333b -00000000 -33333333 -00000000 -33333330 -00000000 -6666666a -00000000 -6666666c -00000000 -66666671 -00000000 -6666666d -00000000 -66666665 -00000000 -66666662 -00000000 -66666669 -00000000 -6666666b -00000000 -66666670 -00000000 -66666667 -00000000 -66666672 -00000000 -6666666e -00000000 -66666666 -00000000 -66666663 -00000000 -4afb0cd1 -00000000 -4afb0cd3 -00000000 -4afb0cd8 -00000000 -4afb0cd4 -00000000 -4afb0ccc -00000000 -4afb0cc9 -00000000 -4afb0cd0 -00000000 -4afb0cd2 -00000000 -4afb0cd7 -00000000 -4afb0cce -00000000 -4afb0cd9 -00000000 -4afb0cd5 -00000000 -4afb0ccd -00000000 -4afb0cca -00000000 -b504f337 -ffffffff -b504f339 -ffffffff -b504f33e -ffffffff -b504f33a -ffffffff -b504f332 -ffffffff -b504f32f -ffffffff -b504f336 -ffffffff -b504f338 -ffffffff -b504f33d -ffffffff -b504f334 -ffffffff -b504f33f -ffffffff -b504f33b -ffffffff -b504f333 -ffffffff -b504f330 -ffffffff -fffffff2 -ffffffff -00000026 -00000000 -00000037 -00000000 -00000080 -00000000 -000000fc -00000000 -000001ff -00000000 -000003fc -00000000 -00000806 -00000000 -00001005 -00000000 -00002002 -00000000 -00003ffd -00000000 -0000fffb -00000000 -0001fffa -00000000 -00040002 -00000000 -00080005 -00000000 -00100004 -00000000 -00200008 -00000000 -00400006 -00000000 -007ffff7 -00000000 -00fffffe -00000000 -02000006 -00000000 -04000006 -00000000 -08000000 -00000000 -1ffffff9 -00000000 -3fffffef -00000000 -80000000 -ffffffff -fffffffe -ffffffff -fffffffb -ffffffff -00000002 -00000000 -00000003 -00000000 -00000004 -00000000 -00000004 -00000000 -0000000f -00000000 -00000010 -00000000 -00000005 -00000000 -0000000f -00000000 -00000002 -00000000 -fffffff8 -ffffffff -00000005 -00000000 -fffffff6 -ffffffff -00000010 -00000000 -00000005 -00000000 -00000006 -00000000 -fffffff9 -ffffffff -0000000b -00000000 -00000004 -00000000 -00000007 -00000000 -0000001f -00000000 -00000004 -00000000 -00000005 -00000000 -00000002 -00000000 -00000015 -00000000 -ffffffe0 -ffffffff -fffffff6 -ffffffff -00000007 -00000000 -fffffffa -ffffffff -fffffffd -ffffffff -ffffffff -ffffffff -fffffff0 -ffffffff -ffffffdd -ffffffff -ffffffc3 -ffffffff -ffffff81 -ffffffff -ffffff0e -ffffffff -fffffbe9 -ffffffff -fffff801 -ffffffff -ffffe01e -ffffffff -ffffc003 -ffffffff -ffff7fff -ffffffff -ffff0003 -ffffffff -fffe0004 -ffffffff -fffc0009 -ffffffff -fff8001e -ffffffff -ffdffffd -ffffffff -ffbfffff -ffffffff -ff00000a -ffffffff -fdfffff8 -ffffffff -fc000003 -ffffffff -f8000000 -ffffffff -f0000004 -ffffffff -00000000 -00000000 -00000005 -00000000 -fffffffb -ffffffff -00000002 -00000000 -ffffffff -ffffffff -ffffffff -ffffffff -00000008 -00000000 -00000005 -00000000 -ffffffff -ffffffff -00000009 -00000000 -00000003 -00000000 -fffffffd -ffffffff -fffffff8 -ffffffff -e0000001 -ffffffff -80000008 -ffffffff -0000000f -00000000 -0000001e -00000000 -fffffff6 -ffffffff -fffffff7 -ffffffff -00000003 -00000000 -00000014 -00000000 -00000003 -00000000 -00000004 -00000000 -fffffff5 -ffffffff -00000002 -00000000 -00000014 -00000000 -00000001 -00000000 -fffffffe -ffffffff -ffffffdf -ffffffff -fffffffd -ffffffff -0000001e -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/caddw-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/caddw-01.reference_output deleted file mode 100644 index 694ffc03c..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/caddw-01.reference_output +++ /dev/null @@ -1,1356 +0,0 @@ -ffffffff -ffffffff -ffffffec -ffffffff -7ffffffe -00000000 -fffff800 -ffffffff -fffffffd -ffffffff -00000100 -00000000 -ffffffff -ffffffff -00000000 -00000000 -00000001 -00000000 -00000003 -00000000 -40000008 -00000000 -66666677 -00000000 -00000020 -00000000 -0000003f -00000000 -333333b2 -00000000 -fff001ff -ffffffff -00000400 -00000000 -02000800 -00000000 -00001004 -00000000 -ffffffff -ffffffff -00004005 -00000000 -00008000 -00000000 -0000ffff -00000000 -4afd0ccd -00000000 -00040003 -00000000 -00080000 -00000000 -00100000 -00000000 -00200000 -00000000 -003fffff -00000000 -00800000 -00000000 -00fffff9 -00000000 -01fffffa -00000000 -08000000 -00000000 -07fffffc -00000000 -11000000 -00000000 -75555555 -00000000 -40000006 -00000000 -7fffffff -00000000 -01000000 -00000000 -fffeffff -ffffffff -00000000 -00000000 -fdffffff -ffffffff -00000004 -00000000 -fffffff8 -ffffffff -00000005 -00000000 -fffffff8 -ffffffff -ffffefff -ffffffff -ffffffff -ffffffff -4afb0cce -00000000 -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -4afb0cce -00000000 -7fffffff -00000000 -fffffff6 -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -fffeffff -ffffffff -00000000 -00000000 -aaaaaaaa -ffffffff -66666665 -00000000 -55555555 -00000000 -20000000 -00000000 -aaaaaaaa -ffffffff -00000000 -00000000 -fdffffff -ffffffff -00000004 -00000000 -00000000 -00000000 -00000003 -00000000 -4afb0cc9 -00000000 -000007f7 -00000000 -ffffffee -ffffffff -ffffffdf -ffffffff -ffffffbc -ffffffff -ffffff7c -ffffffff -0ffffeff -00000000 -fffffcfe -ffffffff -fffffbff -ffffffff -ff7ff7fe -ffffffff -fffff0ff -ffffffff -ffffdfff -ffffffff -efffbffe -ffffffff -ffff7ffe -ffffffff -66656665 -00000000 -fffdbffe -ffffffff -fffc0008 -ffffffff -fff3fffe -ffffffff -ffefffff -ffffffff -ffdfffff -ffffffff -ffc03fff -ffffffff -aa2aaaaa -ffffffff -ff00001f -ffffffff -fdfffff7 -ffffffff -ffffffff -ffffffff -f7ffffff -ffffffff -f0000001 -ffffffff -dfffffff -ffffffff -bffffffc -ffffffff -800000ff -ffffffff -00000fff -00000000 -fffffbfe -ffffffff -fffffffb -ffffffff -fffefffe -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -fffffffe -ffffffff -fffffffe -ffffffff -ffff7ffe -ffffffff -fff7fffe -ffffffff -fffffffe -ffffffff -ffffffff -ffffffff -fffffffe -ffffffff -ffffffff -ffffffff -fffffffe -ffffffff -0001ffff -00000000 -55555555 -00000000 -fff7fffe -ffffffff -fffffffe -ffffffff -00000004 -00000000 -00003fff -00000000 -fffffff5 -ffffffff -fffffffe -ffffffff -fffff7fe -ffffffff -ffffffff -ffffffff -fffffffe -ffffffff -fffffffe -ffffffff -ffffffde -ffffffff -fffffffe -ffffffff -33333331 -00000000 -55555154 -00000000 -aaaaabaa -ffffffff -00000008 -00000000 -4afb0cde -00000000 -00000040 -00000000 -0000007d -00000000 -000000ff -00000000 -00000400 -00000000 -00001fff -00000000 -00006fff -00000000 -0000ffff -00000000 -0003ffff -00000000 -0007ffff -00000000 -00100000 -00000000 -00200000 -00000000 -003fffff -00000000 -007ffff7 -00000000 -b2aaaaab -ffffffff -80000000 -ffffffff -ffffffff -ffffffff -33333332 -00000000 -ffdfffff -ffffffff -01000000 -00000000 -ffffbfff -ffffffff -efffffff -ffffffff -55555556 -00000000 -66666666 -00000000 -00000000 -00000000 -bfffffff -ffffffff -4afb0ccd -00000000 -fffffffb -ffffffff -00000009 -00000000 -01000000 -00000000 -ffffdfff -ffffffff -aaaaaaaa -ffffffff -aaaaaaab -ffffffff -fffffffd -ffffffff -fffffffd -ffffffff -fffffff3 -ffffffff -ffffbfee -ffffffff -55555515 -00000000 -ffffff85 -ffffffff -fffffdff -ffffffff -fffdffff -ffffffff -ffdffffe -ffffffff -55155554 -00000000 -ff01ffff -ffffffff -fbfffffe -ffffffff -f7ffffff -ffffffff -dfffdffe -ffffffff -bffffffe -ffffffff -ffffffee -ffffffff -66666664 -00000000 -ffffffff -ffffffff -ffffffff -ffffffff -fffffff7 -ffffffff -b504f331 -ffffffff -fffffffe -ffffffff -fffffffe -ffffffff -66666666 -00000000 -effffffe -ffffffff -fffffff9 -ffffffff -fffffffe -ffffffff -ffeffffe -ffffffff -4afb0ccc -00000000 -00000006 -00000000 -55555558 -00000000 -aaaaaaad -ffffffff -00000008 -00000000 -33333336 -00000000 -66666669 -00000000 -4afb0cd0 -00000000 -b504f336 -ffffffff -00000005 -00000000 -55555557 -00000000 -00000003 -00000000 -00000007 -00000000 -33333335 -00000000 -66666668 -00000000 -b504f335 -ffffffff -55555559 -00000000 -aaaaaaae -ffffffff -00000009 -00000000 -33333337 -00000000 -6666666a -00000000 -4afb0cd1 -00000000 -b504f337 -ffffffff -55555558 -00000000 -aaaaaaaa -ffffffff -ffffffff -ffffffff -5555555a -00000000 -88888888 -ffffffff -bbbbbbbb -ffffffff -a0506222 -ffffffff -0a5a4888 -00000000 -55555557 -00000000 -aaaaaaa9 -ffffffff -55555555 -00000000 -55555559 -00000000 -88888887 -ffffffff -bbbbbbba -ffffffff -0a5a4887 -00000000 -aaaaaaab -ffffffff -00000000 -00000000 -5555555b -00000000 -88888889 -ffffffff -bbbbbbbc -ffffffff -a0506223 -ffffffff -0a5a4889 -00000000 -aaaaaaad -ffffffff -ffffffff -ffffffff -55555554 -00000000 -aaaaaaaf -ffffffff -dddddddd -ffffffff -11111110 -00000000 -f5a5b777 -ffffffff -5faf9ddd -00000000 -aaaaaaac -ffffffff -fffffffe -ffffffff -aaaaaaaa -ffffffff -aaaaaaae -ffffffff -dddddddc -ffffffff -1111110f -00000000 -5faf9ddc -00000000 -00000000 -00000000 -55555555 -00000000 -aaaaaab0 -ffffffff -ddddddde -ffffffff -11111111 -00000000 -f5a5b778 -ffffffff -5faf9dde -00000000 -00000008 -00000000 -5555555a -00000000 -aaaaaaaf -ffffffff -0000000a -00000000 -33333338 -00000000 -6666666b -00000000 -4afb0cd2 -00000000 -b504f338 -ffffffff -00000007 -00000000 -55555559 -00000000 -00000005 -00000000 -00000009 -00000000 -33333337 -00000000 -6666666a -00000000 -b504f337 -ffffffff -5555555b -00000000 -aaaaaab0 -ffffffff -0000000b -00000000 -33333339 -00000000 -6666666c -00000000 -4afb0cd3 -00000000 -b504f339 -ffffffff -33333336 -00000000 -88888888 -ffffffff -dddddddd -ffffffff -33333338 -00000000 -66666666 -00000000 -99999999 -ffffffff -7e2e4000 -00000000 -e8382666 -ffffffff -33333335 -00000000 -88888887 -ffffffff -33333333 -00000000 -33333337 -00000000 -66666665 -00000000 -99999998 -ffffffff -e8382665 -ffffffff -88888889 -ffffffff -ddddddde -ffffffff -33333339 -00000000 -66666667 -00000000 -9999999a -ffffffff -7e2e4001 -00000000 -e8382667 -ffffffff -66666669 -00000000 -bbbbbbbb -ffffffff -11111110 -00000000 -6666666b -00000000 -99999999 -ffffffff -cccccccc -ffffffff -b1617333 -ffffffff -1b6b5999 -00000000 -66666668 -00000000 -bbbbbbba -ffffffff -66666666 -00000000 -6666666a -00000000 -99999998 -ffffffff -cccccccb -ffffffff -1b6b5998 -00000000 -bbbbbbbc -ffffffff -11111111 -00000000 -6666666c -00000000 -9999999a -ffffffff -cccccccd -ffffffff -b1617334 -ffffffff -1b6b599a -00000000 -4afb0cd0 -00000000 -a0506222 -ffffffff -f5a5b777 -ffffffff -4afb0cd2 -00000000 -7e2e4000 -00000000 -b1617333 -ffffffff -95f6199a -ffffffff -00000000 -00000000 -4afb0ccf -00000000 -a0506221 -ffffffff -4afb0ccd -00000000 -4afb0cd1 -00000000 -7e2e3fff -00000000 -b1617332 -ffffffff -ffffffff -ffffffff -a0506223 -ffffffff -f5a5b778 -ffffffff -4afb0cd3 -00000000 -7e2e4001 -00000000 -b1617334 -ffffffff -95f6199b -ffffffff -00000001 -00000000 -b504f336 -ffffffff -0a5a4888 -00000000 -5faf9ddd -00000000 -b504f338 -ffffffff -e8382666 -ffffffff -1b6b5999 -00000000 -00000000 -00000000 -6a09e666 -00000000 -b504f335 -ffffffff -0a5a4887 -00000000 -b504f333 -ffffffff -b504f337 -ffffffff -e8382665 -ffffffff -1b6b5998 -00000000 -6a09e665 -00000000 -0a5a4889 -00000000 -5faf9dde -00000000 -b504f339 -ffffffff -e8382667 -ffffffff -1b6b599a -00000000 -00000001 -00000000 -6a09e667 -00000000 -00000005 -00000000 -55555557 -00000000 -aaaaaaac -ffffffff -00000007 -00000000 -33333335 -00000000 -66666668 -00000000 -4afb0ccf -00000000 -b504f335 -ffffffff -00000004 -00000000 -55555556 -00000000 -00000002 -00000000 -00000006 -00000000 -33333334 -00000000 -66666667 -00000000 -b504f334 -ffffffff -55555558 -00000000 -aaaaaaad -ffffffff -00000008 -00000000 -33333336 -00000000 -66666669 -00000000 -4afb0cd0 -00000000 -b504f336 -ffffffff -55555557 -00000000 -aaaaaaa9 -ffffffff -fffffffe -ffffffff -55555559 -00000000 -88888887 -ffffffff -bbbbbbba -ffffffff -a0506221 -ffffffff -0a5a4887 -00000000 -55555556 -00000000 -aaaaaaa8 -ffffffff -55555554 -00000000 -55555558 -00000000 -88888886 -ffffffff -bbbbbbb9 -ffffffff -0a5a4886 -00000000 -aaaaaaaa -ffffffff -ffffffff -ffffffff -5555555a -00000000 -88888888 -ffffffff -bbbbbbbb -ffffffff -a0506222 -ffffffff -0a5a4888 -00000000 -00000003 -00000000 -55555555 -00000000 -aaaaaaaa -ffffffff -00000005 -00000000 -33333333 -00000000 -66666666 -00000000 -4afb0ccd -00000000 -b504f333 -ffffffff -00000002 -00000000 -aaaaaaae -ffffffff -00000009 -00000000 -33333337 -00000000 -6666666a -00000000 -4afb0cd1 -00000000 -b504f337 -ffffffff -00000006 -00000000 -55555558 -00000000 -00000004 -00000000 -00000008 -00000000 -33333336 -00000000 -66666669 -00000000 -b504f336 -ffffffff -5555555a -00000000 -aaaaaaaf -ffffffff -0000000a -00000000 -33333338 -00000000 -6666666b -00000000 -4afb0cd2 -00000000 -b504f338 -ffffffff -33333335 -00000000 -88888887 -ffffffff -dddddddc -ffffffff -33333337 -00000000 -66666665 -00000000 -99999998 -ffffffff -7e2e3fff -00000000 -e8382665 -ffffffff -33333334 -00000000 -88888886 -ffffffff -33333332 -00000000 -33333336 -00000000 -66666664 -00000000 -99999997 -ffffffff -e8382664 -ffffffff -88888888 -ffffffff -dddddddd -ffffffff -33333338 -00000000 -66666666 -00000000 -99999999 -ffffffff -7e2e4000 -00000000 -e8382666 -ffffffff -66666668 -00000000 -bbbbbbba -ffffffff -1111110f -00000000 -6666666a -00000000 -99999998 -ffffffff -cccccccb -ffffffff -b1617332 -ffffffff -1b6b5998 -00000000 -66666667 -00000000 -bbbbbbb9 -ffffffff -66666665 -00000000 -66666669 -00000000 -99999997 -ffffffff -ccccccca -ffffffff -1b6b5997 -00000000 -bbbbbbbb -ffffffff -11111110 -00000000 -6666666b -00000000 -99999999 -ffffffff -cccccccc -ffffffff -b1617333 -ffffffff -1b6b5999 -00000000 -b504f335 -ffffffff -0a5a4887 -00000000 -5faf9ddc -00000000 -b504f337 -ffffffff -e8382665 -ffffffff -1b6b5998 -00000000 -ffffffff -ffffffff -6a09e665 -00000000 -b504f334 -ffffffff -0a5a4886 -00000000 -b504f332 -ffffffff -b504f336 -ffffffff -e8382664 -ffffffff -1b6b5997 -00000000 -6a09e664 -00000000 -0a5a4888 -00000000 -5faf9ddd -00000000 -b504f338 -ffffffff -e8382666 -ffffffff -1b6b5999 -00000000 -00000000 -00000000 -6a09e666 -00000000 -55555559 -00000000 -aaaaaaab -ffffffff -00000000 -00000000 -5555555b -00000000 -88888889 -ffffffff -bbbbbbbc -ffffffff -a0506223 -ffffffff -0a5a4889 -00000000 -55555558 -00000000 -aaaaaaaa -ffffffff -55555556 -00000000 -5555555a -00000000 -88888888 -ffffffff -bbbbbbbb -ffffffff -0a5a4888 -00000000 -aaaaaaac -ffffffff -00000001 -00000000 -5555555c -00000000 -8888888a -ffffffff -bbbbbbbd -ffffffff -a0506224 -ffffffff -0a5a488a -00000000 -aaaaaaae -ffffffff -00000000 -00000000 -55555555 -00000000 -aaaaaab0 -ffffffff -ddddddde -ffffffff -11111111 -00000000 -f5a5b778 -ffffffff -5faf9dde -00000000 -aaaaaaad -ffffffff -ffffffff -ffffffff -aaaaaaab -ffffffff -aaaaaaaf -ffffffff -dddddddd -ffffffff -11111110 -00000000 -5faf9ddd -00000000 -00000001 -00000000 -55555556 -00000000 -aaaaaab1 -ffffffff -dddddddf -ffffffff -11111112 -00000000 -f5a5b779 -ffffffff -5faf9ddf -00000000 -00000009 -00000000 -5555555b -00000000 -aaaaaab0 -ffffffff -0000000b -00000000 -33333339 -00000000 -6666666c -00000000 -4afb0cd3 -00000000 -b504f339 -ffffffff -00000008 -00000000 -5555555a -00000000 -00000006 -00000000 -0000000a -00000000 -33333338 -00000000 -6666666b -00000000 -b504f338 -ffffffff -5555555c -00000000 -aaaaaab1 -ffffffff -0000000c -00000000 -3333333a -00000000 -6666666d -00000000 -4afb0cd4 -00000000 -b504f33a -ffffffff -33333337 -00000000 -88888889 -ffffffff -ddddddde -ffffffff -33333339 -00000000 -66666667 -00000000 -9999999a -ffffffff -7e2e4001 -00000000 -e8382667 -ffffffff -33333336 -00000000 -88888888 -ffffffff -33333334 -00000000 -33333338 -00000000 -66666666 -00000000 -99999999 -ffffffff -e8382666 -ffffffff -8888888a -ffffffff -dddddddf -ffffffff -3333333a -00000000 -66666668 -00000000 -9999999b -ffffffff -7e2e4002 -00000000 -e8382668 -ffffffff -6666666a -00000000 -bbbbbbbc -ffffffff -11111111 -00000000 -6666666c -00000000 -9999999a -ffffffff -cccccccd -ffffffff -b1617334 -ffffffff -1b6b599a -00000000 -66666669 -00000000 -bbbbbbbb -ffffffff -66666667 -00000000 -6666666b -00000000 -99999999 -ffffffff -cccccccc -ffffffff -1b6b5999 -00000000 -bbbbbbbd -ffffffff -11111112 -00000000 -6666666d -00000000 -9999999b -ffffffff -ccccccce -ffffffff -b1617335 -ffffffff -1b6b599b -00000000 -4afb0cd1 -00000000 -a0506223 -ffffffff -f5a5b778 -ffffffff -4afb0cd3 -00000000 -7e2e4001 -00000000 -b1617334 -ffffffff -95f6199b -ffffffff -00000001 -00000000 -4afb0cd0 -00000000 -a0506222 -ffffffff -4afb0cce -00000000 -4afb0cd2 -00000000 -7e2e4000 -00000000 -b1617333 -ffffffff -00000000 -00000000 -a0506224 -ffffffff -f5a5b779 -ffffffff -4afb0cd4 -00000000 -7e2e4002 -00000000 -b1617335 -ffffffff -95f6199c -ffffffff -00000002 -00000000 -b504f337 -ffffffff -0a5a4889 -00000000 -5faf9dde -00000000 -b504f339 -ffffffff -e8382667 -ffffffff -1b6b599a -00000000 -00000001 -00000000 -6a09e667 -00000000 -b504f336 -ffffffff -0a5a4888 -00000000 -b504f334 -ffffffff -b504f338 -ffffffff -e8382666 -ffffffff -1b6b5999 -00000000 -6a09e666 -00000000 -0a5a488a -00000000 -5faf9ddf -00000000 -b504f33a -ffffffff -e8382668 -ffffffff -1b6b599b -00000000 -00000002 -00000000 -6a09e668 -00000000 -55555554 -00000000 -00000000 -00000000 -00000004 -00000000 -33333332 -00000000 -66666665 -00000000 -b504f332 -ffffffff -55555556 -00000000 -aaaaaaab -ffffffff -00000006 -00000000 -33333334 -00000000 -66666667 -00000000 -4afb0cce -00000000 -b504f334 -ffffffff -00000007 -00000000 -55555559 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cand-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cand-01.reference_output deleted file mode 100644 index dd19b9232..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cand-01.reference_output +++ /dev/null @@ -1,1344 +0,0 @@ -00000000 -00000000 -ffffffff -fffffdff -00000800 -00000000 -00000000 -00000000 -00000000 -80000000 -00000000 -00000000 -ffffffbf -7fffffff -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000008 -00000000 -00000010 -00000000 -00000020 -00000000 -00000000 -00000000 -00000000 -00000000 -00000100 -00000000 -00000200 -00000000 -00000400 -00000000 -00000800 -00000000 -00000000 -00000000 -00002000 -00000000 -00000000 -00000000 -00008000 -00000000 -00010000 -00000000 -00020000 -00000000 -00000000 -00000000 -00080000 -00000000 -00100000 -00000000 -00200000 -00000000 -00800000 -00000000 -01000000 -00000000 -00000000 -00000000 -00000000 -00000000 -08000000 -00000000 -00000000 -00000000 -00000000 -00000000 -40000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000002 -00000000 -00000000 -00000000 -00000008 -00000000 -00000010 -00000000 -00000000 -00000000 -00000040 -00000000 -00000000 -00000000 -00000100 -00000000 -00000200 -00000000 -00000400 -00000000 -00000800 -00000000 -00000000 -00000000 -00002000 -00000000 -00004000 -00000000 -00000000 -00000000 -00010000 -00000000 -00000000 -00000000 -00040000 -00000000 -00080000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -01000000 -00000000 -00000000 -00000000 -04000000 -00000000 -08000000 -00000000 -10000000 -00000000 -00000000 -00000000 -40000000 -00000006 -00000000 -00000000 -08000000 -00000000 -c0000000 -00000080 -00000000 -ffffffef -ffefffff -ffffffdf -fffff7ff -00000000 -00400000 -fffffcff -ffffffff -00800000 -00000000 -fffff7ff -fffff7ff -00000000 -00000000 -ffffdfff -fbffffff -00010000 -00000000 -efff7fff -ffffffff -fffeffbf -ffffffff -00000000 -40000000 -fffaffff -ffffffff -fff7ffff -7fffffff -ffefefff -ffffffff -00004000 -00000000 -66266667 -66666666 -00000000 -00000004 -00000400 -00000000 -fdbfffff -ffffffff -00000003 -00000000 -00000000 -00000800 -efffffff -ffbfffff -00000004 -00000000 -00000000 -00000000 -00000000 -02000000 -ffffffff -fffffbfe -04000000 -00000000 -fffeffff -fffffffb -ffffffff -fffffff5 -efffffff -ffffffef -00000200 -00000000 -00008000 -00000000 -55555555 -55555555 -33333332 -33333233 -00000000 -20000000 -00002000 -00000000 -ffefffff -fffff7ff -00000006 -00000000 -00000000 -00000200 -ffffffff -ffffbfbf -00000040 -00000000 -00000000 -00004000 -fffffdff -fffdffff -00000000 -00008000 -33333334 -33333333 -55555556 -55455555 -ffffffff -ffdffff7 -00000004 -00000000 -ffffffff -ff7fbfff -00000000 -00800000 -ffffffff -fdffffff -00400000 -00000000 -00000000 -00000400 -00000400 -00000000 -00000000 -00000002 -fffffffc -bfffffff -15555555 -55555555 -aaaaaaaa -aaaaa8aa -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -01000000 -00000000 -02000000 -00000000 -00000000 -00000000 -10000000 -00000000 -20000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000008 -00000000 -00000000 -00000000 -00000100 -00000000 -00001000 -00000000 -00000000 -00000000 -00010000 -00000000 -00000000 -00000000 -00040000 -00000000 -00080000 -00000000 -00000000 -00000000 -00200000 -00000000 -00000000 -00000000 -00000000 -00000004 -00000000 -4afb0cca -ffffffff -ffffffd7 -ffffffff -b504f323 -00000000 -ff7fff7f -ffffffff -66666667 -66666666 -00040000 -00000000 -ffff7ffd -ffffffff -33313334 -33333333 -fffbf7ff -ffffffff -fff7ffff -fffdffff -4adb0cce -ffffffff -00400000 -00000000 -feffffff -ffffffbf -fdffffff -ffffffdf -dfffffff -ffffefff -00000000 -00000040 -fffeffff -fffffffb -ffffffff -ffdfffdf -ffefffff -ffffff7f -b504f333 -00000000 -ffffffff -ffffefff -00004000 -00000000 -ffffffff -f7ff7fff -ffffffff -ffeeffff -00000000 -00000800 -ffffdfff -ffdfffff -ffff7fff -ff7fffff -04000000 -00000000 -00000004 -00000000 -00000002 -00000000 -00000003 -00000000 -00000001 -00000000 -00000002 -00000000 -00000001 -00000000 -00000003 -00000000 -00000002 -00000000 -00000001 -00000000 -00000003 -00000000 -00000002 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000002 -00000000 -00000001 -00000000 -00000002 -00000000 -00000002 -00000000 -00000003 -00000000 -00000002 -00000000 -00000000 -00000000 -00000003 -00000000 -00000002 -00000000 -00000000 -00000000 -00000001 -00000000 -55555555 -55555555 -00000000 -00000000 -00000005 -00000000 -11111111 -11111111 -44444444 -44444444 -40510445 -55555555 -15045111 -00000000 -00000000 -00000000 -55555554 -55555555 -00000000 -00000000 -00000004 -00000000 -11111110 -11111111 -44444445 -44444444 -15045110 -00000000 -55555554 -55555555 -00000001 -00000000 -00000004 -00000000 -11111114 -11111111 -44444445 -44444444 -40510444 -55555555 -15045114 -00000000 -00000000 -00000000 -aaaaaaaa -aaaaaaaa -00000000 -00000000 -22222222 -22222222 -22222222 -22222222 -0aaa0888 -aaaaaaaa -a000a222 -00000000 -00000002 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -22222222 -22222222 -22222220 -22222222 -a000a222 -00000000 -00000002 -00000000 -aaaaaaaa -aaaaaaaa -00000002 -00000000 -22222220 -22222222 -22222222 -22222222 -0aaa088a -aaaaaaaa -a000a220 -00000000 -00000001 -00000000 -00000005 -00000000 -00000000 -00000000 -00000005 -00000000 -00000001 -00000000 -00000004 -00000000 -00000005 -00000000 -00000001 -00000000 -00000000 -00000000 -00000004 -00000000 -00000000 -00000000 -00000004 -00000000 -00000000 -00000000 -00000005 -00000000 -00000000 -00000000 -00000004 -00000000 -00000001 -00000000 -00000004 -00000000 -00000004 -00000000 -00000005 -00000000 -00000004 -00000000 -00000004 -00000000 -00000003 -00000000 -11111111 -11111111 -22222222 -22222222 -00000001 -00000000 -33333333 -33333333 -22222222 -22222222 -02330001 -33333333 -31003333 -00000000 -00000002 -00000000 -11111110 -11111111 -00000000 -00000000 -00000000 -00000000 -33333332 -33333333 -22222221 -22222222 -31003332 -00000000 -11111112 -11111111 -22222223 -22222222 -00000002 -00000000 -33333330 -33333333 -22222223 -22222222 -02330002 -33333333 -31003330 -00000000 -00000002 -00000000 -44444444 -44444444 -22222222 -22222222 -00000004 -00000000 -22222222 -22222222 -66666666 -66666666 -42620444 -66666666 -24046222 -00000000 -00000002 -00000000 -44444444 -44444444 -00000000 -00000000 -00000004 -00000000 -22222222 -22222222 -66666664 -66666666 -24046222 -00000000 -44444446 -44444444 -22222222 -22222222 -00000006 -00000000 -22222224 -22222222 -66666666 -66666666 -42620446 -66666666 -24046224 -00000000 -00000001 -00000000 -40510445 -55555555 -0aaa0888 -aaaaaaaa -00000005 -00000000 -02330001 -33333333 -42620444 -66666666 -4afb0ccd -ffffffff -00000001 -00000000 -00000000 -00000000 -40510444 -55555555 -00000000 -00000000 -00000004 -00000000 -02330000 -33333333 -42620445 -66666666 -00000000 -00000000 -40510444 -55555555 -0aaa0889 -aaaaaaaa -00000004 -00000000 -02330004 -33333333 -42620445 -66666666 -4afb0ccc -ffffffff -00000004 -00000000 -00000003 -00000000 -15045111 -00000000 -a000a222 -00000000 -00000001 -00000000 -31003333 -00000000 -24046222 -00000000 -00000001 -00000000 -b504f333 -00000000 -00000002 -00000000 -15045110 -00000000 -00000000 -00000000 -00000000 -00000000 -31003332 -00000000 -24046221 -00000000 -b504f332 -00000000 -15045112 -00000000 -a000a223 -00000000 -00000002 -00000000 -31003330 -00000000 -24046223 -00000000 -00000002 -00000000 -b504f330 -00000000 -00000002 -00000000 -00000000 -00000000 -00000002 -00000000 -00000000 -00000000 -00000002 -00000000 -00000002 -00000000 -00000000 -00000000 -00000002 -00000000 -00000002 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000002 -00000000 -00000000 -00000000 -00000002 -00000000 -00000002 -00000000 -00000002 -00000000 -00000002 -00000000 -00000000 -00000000 -00000002 -00000000 -00000002 -00000000 -00000000 -00000000 -00000000 -00000000 -55555554 -55555555 -00000000 -00000000 -00000004 -00000000 -11111110 -11111111 -44444444 -44444444 -40510444 -55555555 -15045110 -00000000 -00000000 -00000000 -55555554 -55555555 -00000000 -00000000 -00000004 -00000000 -11111110 -11111111 -44444444 -44444444 -15045110 -00000000 -55555554 -55555555 -00000000 -00000000 -00000004 -00000000 -11111114 -11111111 -44444444 -44444444 -40510444 -55555555 -15045114 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000004 -00000000 -00000000 -00000000 -00000004 -00000000 -00000004 -00000000 -00000000 -00000000 -00000004 -00000000 -00000000 -00000000 -00000004 -00000000 -00000000 -00000000 -00000004 -00000000 -00000000 -00000000 -00000004 -00000000 -00000000 -00000000 -00000004 -00000000 -00000004 -00000000 -00000004 -00000000 -00000004 -00000000 -00000004 -00000000 -00000002 -00000000 -11111110 -11111111 -22222222 -22222222 -00000000 -00000000 -33333332 -33333333 -22222222 -22222222 -02330000 -33333333 -31003332 -00000000 -00000002 -00000000 -11111110 -11111111 -00000000 -00000000 -00000000 -00000000 -33333332 -33333333 -22222220 -22222222 -31003332 -00000000 -11111112 -11111111 -22222222 -22222222 -00000002 -00000000 -33333330 -33333333 -22222222 -22222222 -02330002 -33333333 -31003330 -00000000 -00000001 -00000000 -44444445 -44444444 -22222220 -22222222 -00000005 -00000000 -22222221 -22222222 -66666664 -66666666 -42620445 -66666666 -24046221 -00000000 -00000000 -00000000 -44444444 -44444444 -00000000 -00000000 -00000004 -00000000 -22222220 -22222222 -66666665 -66666666 -24046220 -00000000 -44444444 -44444444 -22222221 -22222222 -00000004 -00000000 -22222224 -22222222 -66666665 -66666666 -42620444 -66666666 -24046224 -00000000 -00000002 -00000000 -15045110 -00000000 -a000a222 -00000000 -00000000 -00000000 -31003332 -00000000 -24046222 -00000000 -00000000 -00000000 -b504f332 -00000000 -00000002 -00000000 -15045110 -00000000 -00000000 -00000000 -00000000 -00000000 -31003332 -00000000 -24046220 -00000000 -b504f332 -00000000 -15045112 -00000000 -a000a222 -00000000 -00000002 -00000000 -31003330 -00000000 -24046222 -00000000 -00000002 -00000000 -b504f330 -00000000 -00000002 -00000000 -55555554 -55555555 -00000002 -00000000 -00000004 -00000000 -11111112 -11111111 -44444446 -44444444 -40510444 -55555555 -15045112 -00000000 -00000002 -00000000 -55555554 -55555555 -00000000 -00000000 -00000004 -00000000 -11111112 -11111111 -44444444 -44444444 -15045112 -00000000 -55555556 -55555555 -00000002 -00000000 -00000006 -00000000 -11111114 -11111111 -44444446 -44444444 -40510446 -55555555 -15045114 -00000000 -00000003 -00000000 -00000001 -00000000 -aaaaaaaa -aaaaaaaa -00000001 -00000000 -22222223 -22222222 -22222222 -22222222 -0aaa0889 -aaaaaaaa -a000a223 -00000000 -00000002 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -22222222 -22222222 -22222221 -22222222 -a000a222 -00000000 -00000002 -00000000 -aaaaaaab -aaaaaaaa -00000002 -00000000 -22222220 -22222222 -22222223 -22222222 -0aaa088a -aaaaaaaa -a000a220 -00000000 -00000002 -00000000 -00000004 -00000000 -00000002 -00000000 -00000004 -00000000 -00000002 -00000000 -00000006 -00000000 -00000004 -00000000 -00000002 -00000000 -00000002 -00000000 -00000004 -00000000 -00000000 -00000000 -00000004 -00000000 -00000002 -00000000 -00000004 -00000000 -00000002 -00000000 -00000006 -00000000 -00000002 -00000000 -00000006 -00000000 -00000004 -00000000 -00000006 -00000000 -00000006 -00000000 -00000004 -00000000 -00000000 -00000000 -11111114 -11111111 -22222220 -22222222 -00000004 -00000000 -33333330 -33333333 -22222224 -22222222 -02330004 -33333333 -31003330 -00000000 -00000000 -00000000 -11111114 -11111111 -00000000 -00000000 -00000004 -00000000 -33333330 -33333333 -22222224 -22222222 -31003330 -00000000 -11111114 -11111111 -22222220 -22222222 -00000004 -00000000 -33333334 -33333333 -22222224 -22222222 -02330004 -33333333 -31003334 -00000000 -00000003 -00000000 -44444445 -44444444 -22222222 -22222222 -00000005 -00000000 -22222223 -22222222 -66666666 -66666666 -42620445 -66666666 -24046223 -00000000 -00000002 -00000000 -44444444 -44444444 -00000000 -00000000 -00000004 -00000000 -22222222 -22222222 -66666665 -66666666 -24046222 -00000000 -44444446 -44444444 -22222223 -22222222 -00000006 -00000000 -22222224 -22222222 -66666667 -66666666 -42620446 -66666666 -24046224 -00000000 -00000002 -00000000 -40510444 -55555555 -0aaa088a -aaaaaaaa -00000004 -00000000 -02330002 -33333333 -42620446 -66666666 -4afb0ccc -ffffffff -00000002 -00000000 -00000002 -00000000 -40510444 -55555555 -00000000 -00000000 -00000004 -00000000 -02330002 -33333333 -42620444 -66666666 -00000002 -00000000 -40510446 -55555555 -0aaa088a -aaaaaaaa -00000006 -00000000 -02330004 -33333333 -42620446 -66666666 -4afb0cce -ffffffff -00000004 -00000000 -00000000 -00000000 -15045114 -00000000 -a000a220 -00000000 -00000004 -00000000 -31003330 -00000000 -24046224 -00000000 -00000004 -00000000 -b504f330 -00000000 -00000000 -00000000 -15045114 -00000000 -00000000 -00000000 -00000004 -00000000 -31003330 -00000000 -24046224 -00000000 -b504f330 -00000000 -15045114 -00000000 -a000a220 -00000000 -00000004 -00000000 -31003334 -00000000 -24046224 -00000000 -00000004 -00000000 -b504f334 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000004 -00000000 -00000000 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/candi-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/candi-01.reference_output deleted file mode 100644 index 97587e66d..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/candi-01.reference_output +++ /dev/null @@ -1,880 +0,0 @@ -00000009 -00000000 -fffffff5 -ffffffff -00000004 -00000000 -00000003 -00000000 -00002000 -00000000 -00000000 -00000000 -0000001f -00000000 -00000000 -00000000 -00000000 -80000000 -00000005 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000008 -00000000 -00000010 -00000000 -00000003 -00000000 -ffff7ff7 -ffffffff -00000000 -00400000 -00000000 -00000000 -00000000 -00800000 -00000002 -00000000 -00000000 -00000000 -00000000 -00000000 -00000020 -00000000 -00000000 -00000000 -00000000 -00000000 -00000100 -00000000 -00000000 -00000000 -00000400 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00008000 -00000000 -00010000 -00000000 -00020000 -00000000 -00040000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -01000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -20000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000002 -00000000 -00000000 -00000000 -00000008 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00100000 -00000000 -00200000 -00000000 -01000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -20000000 -00000000 -00000000 -fffffff8 -ffffffff -fffffffd -ffffffff -fffffff8 -ffffffff -00000007 -00000000 -ffffffc0 -ffffffff -00000006 -00000000 -00000007 -00000000 -00000004 -00000000 -00000000 -00000000 -00000004 -00000000 -00000007 -00000000 -00000004 -00000000 -00000004 -00000000 -00000003 -00000000 -fffdfffd -ffffffff -fff7fff6 -ffffffff -ffeffffc -ffffffff -00000003 -00000000 -00000004 -00000000 -ff7fffff -ffffffff -fefffffe -ffffffff -fdfffffa -ffffffff -fbfffffb -ffffffff -f7fffffe -ffffffff -0000000f -00000000 -dffffffc -ffffffff -bfffffef -ffffffff -00000006 -00000000 -fffffffe -fffffffe -fffffffb -fffffffd -00000002 -00000000 -00000000 -00000000 -fffffffd -ffffffdf -00000009 -00000000 -00000006 -00000000 -fffffffe -fffffeff -00000005 -00000000 -ffffffe0 -fffffbff -0000000f -00000000 -00000006 -00000000 -00000005 -00000000 -00000004 -00000000 -fffffffe -ffff7fff -00000005 -00000000 -00000006 -00000000 -0000000f -00000000 -fffffffb -fff7ffff -00000005 -00000000 -00000003 -00000000 -fffffffc -ffbfffff -00000009 -00000000 -00000008 -00000000 -ffffffea -fdffffff -fffffffe -fbffffff -fffffffd -f7ffffff -00000002 -00000000 -ffffffff -dfffffff -55555555 -55555555 -00000008 -00000000 -00000003 -00000000 -00000001 -00000000 -00000002 -00000000 -00000002 -00000000 -00000002 -00000000 -00000003 -00000000 -00000002 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000003 -00000000 -00000003 -00000000 -00000003 -00000000 -00000000 -00000000 -00000001 -00000000 -00000005 -00000000 -00000000 -00000000 -00000004 -00000000 -55555554 -55555555 -55555551 -55555555 -00000000 -00000000 -00000004 -00000000 -00000001 -00000000 -00000000 -00000000 -00000001 -00000000 -00000005 -00000000 -55555554 -55555555 -00000002 -00000000 -00000000 -00000000 -0000000a -00000000 -00000002 -00000000 -aaaaaaaa -aaaaaaaa -aaaaaaaa -aaaaaaaa -00000002 -00000000 -00000000 -00000000 -00000000 -00000000 -0000000a -00000000 -00000002 -00000000 -aaaaaaaa -aaaaaaaa -aaaaaaa8 -aaaaaaaa -00000001 -00000000 -00000005 -00000000 -00000000 -00000000 -00000004 -00000000 -00000004 -00000000 -00000001 -00000000 -00000000 -00000000 -00000004 -00000000 -00000001 -00000000 -00000000 -00000000 -00000001 -00000000 -00000005 -00000000 -00000005 -00000000 -00000004 -00000000 -00000003 -00000000 -00000001 -00000000 -00000002 -00000000 -00000002 -00000000 -33333332 -33333333 -33333333 -33333333 -00000002 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000003 -00000000 -00000003 -00000000 -33333333 -33333333 -33333330 -33333333 -00000002 -00000000 -00000004 -00000000 -00000002 -00000000 -00000006 -00000000 -66666666 -66666666 -66666662 -66666666 -00000002 -00000000 -00000004 -00000000 -00000000 -00000000 -00000000 -00000000 -00000002 -00000000 -00000006 -00000000 -66666666 -66666666 -66666664 -66666666 -00000001 -00000000 -00000005 -00000000 -00000008 -00000000 -00000004 -00000000 -4afb0ccc -ffffffff -4afb0cc9 -ffffffff -00000000 -00000000 -00000004 -00000000 -00000009 -00000000 -00000000 -00000000 -00000009 -00000000 -00000005 -00000000 -4afb0ccd -ffffffff -4afb0ccc -ffffffff -00000003 -00000000 -00000001 -00000000 -00000002 -00000000 -00000002 -00000000 -b504f332 -00000000 -b504f333 -00000000 -00000002 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000003 -00000000 -00000003 -00000000 -b504f333 -00000000 -b504f330 -00000000 -00000002 -00000000 -00000000 -00000000 -00000002 -00000000 -00000002 -00000000 -00000002 -00000000 -00000002 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000002 -00000000 -00000002 -00000000 -00000002 -00000000 -00000000 -00000000 -00000000 -00000000 -00000004 -00000000 -00000000 -00000000 -00000004 -00000000 -55555554 -55555555 -55555550 -55555555 -00000000 -00000000 -00000004 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000004 -00000000 -55555554 -55555555 -55555554 -55555555 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000004 -00000000 -00000000 -00000000 -00000004 -00000000 -00000004 -00000000 -00000000 -00000000 -00000000 -00000000 -00000004 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000004 -00000000 -00000004 -00000000 -00000004 -00000000 -00000002 -00000000 -00000000 -00000000 -00000002 -00000000 -00000002 -00000000 -33333332 -33333333 -33333332 -33333333 -00000002 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000002 -00000000 -00000002 -00000000 -33333332 -33333333 -33333330 -33333333 -00000001 -00000000 -00000005 -00000000 -00000000 -00000000 -00000004 -00000000 -66666664 -66666666 -66666661 -66666666 -00000000 -00000000 -00000004 -00000000 -00000001 -00000000 -00000000 -00000000 -00000001 -00000000 -00000005 -00000000 -66666665 -66666666 -66666664 -66666666 -00000002 -00000000 -00000000 -00000000 -00000002 -00000000 -00000002 -00000000 -b504f332 -00000000 -b504f332 -00000000 -00000002 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000002 -00000000 -00000002 -00000000 -b504f332 -00000000 -b504f330 -00000000 -00000002 -00000000 -00000004 -00000000 -00000002 -00000000 -00000006 -00000000 -55555556 -55555555 -55555552 -55555555 -00000002 -00000000 -00000004 -00000000 -00000000 -00000000 -00000000 -00000000 -00000002 -00000000 -00000006 -00000000 -55555556 -55555555 -55555554 -55555555 -00000003 -00000000 -00000001 -00000000 -0000000a -00000000 -00000002 -00000000 -aaaaaaaa -aaaaaaaa -aaaaaaab -aaaaaaaa -00000002 -00000000 -00000009 -00000000 -00000000 -00000000 -0000000b -00000000 -00000003 -00000000 -aaaaaaab -aaaaaaaa -aaaaaaa8 -aaaaaaaa -00000002 -00000000 -00000004 -00000000 -00000002 -00000000 -00000006 -00000000 -00000006 -00000000 -00000002 -00000000 -00000002 -00000000 -00000004 -00000000 -00000000 -00000000 -00000000 -00000000 -00000002 -00000000 -00000006 -00000000 -00000006 -00000000 -00000004 -00000000 -00000000 -00000000 -00000004 -00000000 -00000000 -00000000 -00000004 -00000000 -33333334 -33333333 -33333330 -33333333 -00000000 -00000000 -00000004 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000004 -00000000 -33333334 -33333333 -33333334 -33333333 -00000003 -00000000 -00000005 -00000000 -00000002 -00000000 -00000006 -00000000 -66666666 -66666666 -66666663 -66666666 -00000002 -00000000 -00000004 -00000000 -00000001 -00000000 -00000000 -00000000 -00000003 -00000000 -4afb0cce -ffffffff -4afb0ccc -ffffffff -00000000 -00000000 -00000004 -00000000 -00000000 -00000000 -00000004 -00000000 -b504f334 -00000000 -b504f330 -00000000 -00000000 -00000000 -00000004 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000004 -00000000 -b504f334 -00000000 -b504f334 -00000000 -00000007 -00000000 -66666667 -66666666 -66666664 -66666666 -00000002 -00000000 -00000004 -00000000 -0000000a -00000000 -00000006 -00000000 -4afb0cce -ffffffff -4afb0cca -ffffffff -00000002 -00000000 -00000004 -00000000 -00000008 -00000000 -00000000 -00000000 -0000000a -00000000 -00000006 -00000000 -00000000 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cbeqz-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cbeqz-01.reference_output deleted file mode 100644 index 649e7c2e1..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cbeqz-01.reference_output +++ /dev/null @@ -1,300 +0,0 @@ -ff76df58 -ff76df56 -ff76df5b -ff76df56 -ff76df5d -ff76df56 -ff76df5f -ff76df56 -ff76df61 -ff76df56 -ff76df63 -ff76df56 -ff76df64 -ff76df56 -ff76df66 -ff76df56 -ff76df68 -ff76df56 -ff76df6a -ff76df56 -ff76df6c -ff76df56 -ff76df6e -ff76df56 -ff76df70 -ff76df56 -ff76df72 -ff76df56 -ff76df74 -ff76df56 -ff76df76 -ff76df56 -ff76df78 -ff76df56 -ff76df7a -ff76df56 -ff76df7c -ff76df56 -ff76df7e -ff76df56 -ff76df80 -ff76df56 -ff76df82 -ff76df56 -ff76df84 -ff76df56 -ff76df86 -ff76df56 -ff76df88 -ff76df56 -ff76df8a -ff76df56 -ff76df8c -ff76df56 -ff76df8e -ff76df56 -ff76df90 -ff76df56 -ff76df92 -ff76df56 -ff76df94 -ff76df56 -ff76df96 -ff76df56 -ff76df98 -ff76df56 -ff76df9a -ff76df56 -ff76df9c -ff76df56 -ff76df9e -ff76df56 -ff76dfa0 -ff76df56 -ff76dfa2 -ff76df56 -ff76dfa4 -ff76df56 -ff76dfa6 -ff76df56 -ff76dfa8 -ff76df56 -ff76dfaa -ff76df56 -ff76dfac -ff76df56 -ff76dfae -ff76df56 -ff76dfb0 -ff76df56 -ff76dfb2 -ff76df56 -ff76dfb4 -ff76df56 -ff76dfb6 -ff76df56 -ff76dfb8 -ff76df56 -ff76dfba -ff76df56 -ff76dfbc -ff76df56 -ff76dfbe -ff76df56 -ff76dfc0 -ff76df56 -ff76dfc2 -ff76df56 -ff76dfc4 -ff76df56 -ff76dfc6 -ff76df56 -ff76dfc8 -ff76df56 -ff76dfca -ff76df56 -ff76dfcc -ff76df56 -ff76dfce -ff76df56 -ff76dfd0 -ff76df56 -ff76dfd2 -ff76df56 -ff76dfd4 -ff76df56 -ff76dfd6 -ff76df56 -ff76dfd8 -ff76df56 -ff76dfda -ff76df56 -ff76dfdc -ff76df56 -ff76dfde -ff76df56 -ff76dfe0 -ff76df56 -ff76dfe2 -ff76df56 -ff76dfe4 -ff76df56 -ff76dfe6 -ff76df56 -ff76dfe8 -ff76df56 -ff76dfea -ff76df56 -ff76dfec -ff76df56 -ff76dfee -ff76df56 -ff76dff0 -ff76df56 -ff76dff2 -ff76df56 -ff76dff4 -ff76df56 -ff76dff6 -ff76df56 -ff76dff8 -ff76df56 -ff76dffa -ff76df56 -ff76dffc -ff76df56 -ff76dffe -ff76df56 -ff76e000 -ff76df56 -ff76e002 -ff76df56 -ff76e004 -ff76df56 -ff76e006 -ff76df56 -ff76e008 -ff76df56 -ff76e00a -ff76df56 -ff76e00c -ff76df56 -ff76e00e -ff76df56 -ff76e010 -ff76df56 -ff76e012 -ff76df56 -ff76e014 -ff76df56 -ff76e016 -ff76df56 -ff76e018 -ff76df56 -ff76e01a -ff76df56 -ff76e01c -ff76df56 -ff76e01e -ff76df56 -ff76e020 -ff76df56 -ff76e022 -ff76df56 -ff76e024 -ff76df56 -ff76e026 -ff76df56 -ff76e028 -ff76df56 -ff76e02a -ff76df56 -ff76e02c -ff76df56 -ff76e02e -ff76df56 -ff76e030 -ff76df56 -ff76e032 -ff76df56 -ff76e034 -ff76df56 -ff76e036 -ff76df56 -ff76e038 -ff76df56 -ff76e03a -ff76df56 -ff76e03c -ff76df56 -ff76e03e -ff76df56 -ff76e040 -ff76df56 -ff76e042 -ff76df56 -ff76e044 -ff76df56 -ff76e046 -ff76df56 -ff76e048 -ff76df56 -ff76e04a -ff76df56 -ff76e04c -ff76df56 -ff76e04e -ff76df56 -ff76e050 -ff76df56 -ff76e052 -ff76df56 -ff76e054 -ff76df56 -ff76e056 -ff76df56 -ff76e058 -ff76df56 -ff76e05a -ff76df56 -ff76e05c -ff76df56 -ff76e05e -ff76df56 -ff76e060 -ff76df56 -ff76e062 -ff76df56 -ff76e064 -ff76df56 -ff76e066 -ff76df56 -ff76e068 -ff76df56 -ff76e06a -ff76df56 -ff76e06c -ff76df56 -ff76e06e -ff76df56 -ff76e070 -ff76df56 -ff76e072 -ff76df56 -ff76e074 -ff76df56 -ff76e076 -ff76df56 -ff76e078 -ff76df56 -ff76e07a -ff76df56 -ff76e07c -ff76df56 -ff76e07e -ff76df56 -ff76e080 -ff76df56 -00000000 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cbnez-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cbnez-01.reference_output deleted file mode 100644 index 44004550b..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cbnez-01.reference_output +++ /dev/null @@ -1,300 +0,0 @@ -ff76df57 -ff76df56 -ff76df59 -ff76df56 -ff76df5a -ff76df56 -ff76df5b -ff76df56 -ff76df5e -ff76df56 -ff76df61 -ff76df56 -ff76df63 -ff76df56 -ff76df66 -ff76df56 -ff76df67 -ff76df56 -ff76df68 -ff76df56 -ff76df69 -ff76df56 -ff76df6a -ff76df56 -ff76df6d -ff76df56 -ff76df70 -ff76df56 -ff76df73 -ff76df56 -ff76df76 -ff76df56 -ff76df77 -ff76df56 -ff76df78 -ff76df56 -ff76df79 -ff76df56 -ff76df7c -ff76df56 -ff76df7f -ff76df56 -ff76df82 -ff76df56 -ff76df83 -ff76df56 -ff76df86 -ff76df56 -ff76df87 -ff76df56 -ff76df88 -ff76df56 -ff76df8b -ff76df56 -ff76df8c -ff76df56 -ff76df8f -ff76df56 -ff76df92 -ff76df56 -ff76df95 -ff76df56 -ff76df96 -ff76df56 -ff76df99 -ff76df56 -ff76df9a -ff76df56 -ff76df9b -ff76df56 -ff76df9c -ff76df56 -ff76df9d -ff76df56 -ff76df9e -ff76df56 -ff76df9f -ff76df56 -ff76dfa0 -ff76df56 -ff76dfa1 -ff76df56 -ff76dfa4 -ff76df56 -ff76dfa5 -ff76df56 -ff76dfa6 -ff76df56 -ff76dfa9 -ff76df56 -ff76dfaa -ff76df56 -ff76dfab -ff76df56 -ff76dfac -ff76df56 -ff76dfaf -ff76df56 -ff76dfb2 -ff76df56 -ff76dfb5 -ff76df56 -ff76dfb6 -ff76df56 -ff76dfb7 -ff76df56 -ff76dfb8 -ff76df56 -ff76dfbb -ff76df56 -ff76dfbc -ff76df56 -ff76dfbd -ff76df56 -ff76dfc0 -ff76df56 -ff76dfc1 -ff76df56 -ff76dfc4 -ff76df56 -ff76dfc7 -ff76df56 -ff76dfca -ff76df56 -ff76dfcb -ff76df56 -ff76dfce -ff76df56 -ff76dfd1 -ff76df56 -ff76dfd4 -ff76df56 -ff76dfd5 -ff76df56 -ff76dfd8 -ff76df56 -ff76dfd9 -ff76df56 -ff76dfdc -ff76df56 -ff76dfdd -ff76df56 -ff76dfde -ff76df56 -ff76dfdf -ff76df56 -ff76dfe0 -ff76df56 -ff76dfe3 -ff76df56 -ff76dfe6 -ff76df56 -ff76dfe7 -ff76df56 -ff76dfea -ff76df56 -ff76dfed -ff76df56 -ff76dff0 -ff76df56 -ff76dff3 -ff76df56 -ff76dff4 -ff76df56 -ff76dff7 -ff76df56 -ff76dff8 -ff76df56 -ff76dffb -ff76df56 -ff76dffc -ff76df56 -ff76dfff -ff76df56 -ff76e000 -ff76df56 -ff76e001 -ff76df56 -ff76e002 -ff76df56 -ff76e003 -ff76df56 -ff76e004 -ff76df56 -ff76e005 -ff76df56 -ff76e006 -ff76df56 -ff76e009 -ff76df56 -ff76e00a -ff76df56 -ff76e00b -ff76df56 -ff76e00c -ff76df56 -ff76e00d -ff76df56 -ff76e00e -ff76df56 -ff76e00f -ff76df56 -ff76e010 -ff76df56 -ff76e013 -ff76df56 -ff76e014 -ff76df56 -ff76e017 -ff76df56 -ff76e018 -ff76df56 -ff76e01b -ff76df56 -ff76e01c -ff76df56 -ff76e01f -ff76df56 -ff76e020 -ff76df56 -ff76e021 -ff76df56 -ff76e022 -ff76df56 -ff76e023 -ff76df56 -ff76e026 -ff76df56 -ff76e029 -ff76df56 -ff76e02a -ff76df56 -ff76e02d -ff76df56 -ff76e02e -ff76df56 -ff76e02f -ff76df56 -ff76e032 -ff76df56 -ff76e035 -ff76df56 -ff76e036 -ff76df56 -ff76e037 -ff76df56 -ff76e038 -ff76df56 -ff76e03b -ff76df56 -ff76e03c -ff76df56 -ff76e03f -ff76df56 -ff76e042 -ff76df56 -ff76e045 -ff76df56 -ff76e046 -ff76df56 -ff76e047 -ff76df56 -ff76e04a -ff76df56 -ff76e04d -ff76df56 -ff76e04e -ff76df56 -ff76e051 -ff76df56 -ff76e054 -ff76df56 -ff76e057 -ff76df56 -ff76e05a -ff76df56 -ff76e05b -ff76df56 -ff76e05e -ff76df56 -ff76e05f -ff76df56 -ff76e060 -ff76df56 -ff76e061 -ff76df56 -ff76e064 -ff76df56 -ff76e065 -ff76df56 -ff76e068 -ff76df56 -ff76e06b -ff76df56 -ff76e06e -ff76df56 -ff76e071 -ff76df56 -00000000 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cebreak-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cebreak-01.reference_output deleted file mode 100644 index 91fef5137..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cebreak-01.reference_output +++ /dev/null @@ -1,8 +0,0 @@ -00000000 -11111111 -0000010f -00000000 -00000003 -00000000 -000003a0 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cj-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cj-01.reference_output deleted file mode 100644 index 9a7f95af0..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cj-01.reference_output +++ /dev/null @@ -1,36 +0,0 @@ -ff76df59 -ff76df56 -ff76df5a -ff76df56 -ff76df5d -ff76df56 -ff76df60 -ff76df56 -ff76df63 -ff76df56 -ff76df66 -ff76df56 -ff76df69 -ff76df56 -ff76df6c -ff76df56 -ff76df6f -ff76df56 -ff76df70 -ff76df56 -ff76df71 -ff76df56 -ff76df72 -ff76df56 -ff76df75 -ff76df56 -ff76df76 -ff76df56 -ff76df77 -ff76df56 -ff76df78 -ff76df56 -ff76df79 -ff76df56 -ff76df7a -ff76df56 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cjalr-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cjalr-01.reference_output deleted file mode 100644 index d982fc98d..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cjalr-01.reference_output +++ /dev/null @@ -1,64 +0,0 @@ -00000009 -00000000 -0000000f -00000000 -00000009 -00000000 -0000000f -00000000 -00000009 -00000000 -0000000f -00000000 -00000009 -00000000 -0000000f -00000000 -00000009 -00000000 -0000000f -00000000 -00000009 -00000000 -0000000f -00000000 -00000009 -00000000 -0000000f -00000000 -00000009 -00000000 -0000000f -00000000 -00000009 -00000000 -0000000f -00000000 -00000009 -00000000 -0000000f -00000000 -00000009 -00000000 -0000000f -00000000 -00000009 -00000000 -0000000f -00000000 -00000009 -00000000 -0000000f -00000000 -00000009 -00000000 -0000000f -00000000 -0000000f -00000000 -00000009 -00000000 -0000000f -00000000 -00000000 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cjr-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cjr-01.reference_output deleted file mode 100644 index 2f2b30af8..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cjr-01.reference_output +++ /dev/null @@ -1,64 +0,0 @@ -00000013 -00000000 -00000013 -00000000 -00000013 -00000000 -00000013 -00000000 -00000013 -00000000 -00000013 -00000000 -00000013 -00000000 -00000013 -00000000 -00000013 -00000000 -00000013 -00000000 -00000013 -00000000 -00000013 -00000000 -00000013 -00000000 -00000013 -00000000 -00000013 -00000000 -00000013 -00000000 -00000013 -00000000 -00000013 -00000000 -00000013 -00000000 -00000013 -00000000 -00000013 -00000000 -00000013 -00000000 -00000013 -00000000 -00000013 -00000000 -00000013 -00000000 -00000013 -00000000 -00000013 -00000000 -00000013 -00000000 -00000013 -00000000 -00000013 -00000000 -00000013 -00000000 -00000000 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cld-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cld-01.reference_output deleted file mode 100644 index 948362034..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cld-01.reference_output +++ /dev/null @@ -1,28 +0,0 @@ -babecafe -00000000 -babecafe -00000000 -babecafe -00000000 -babecafe -00000000 -babecafe -00000000 -babecafe -00000000 -babecafe -00000000 -babecafe -00000000 -babecafe -00000000 -babecafe -00000000 -babecafe -00000000 -babecafe -00000000 -babecafe -00000000 -00000000 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cldsp-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cldsp-01.reference_output deleted file mode 100644 index 67d1521c6..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cldsp-01.reference_output +++ /dev/null @@ -1,64 +0,0 @@ -babecafe -00000000 -babecafe -00000000 -babecafe -00000000 -babecafe -00000000 -babecafe -00000000 -babecafe -00000000 -babecafe -00000000 -babecafe -00000000 -babecafe -00000000 -babecafe -00000000 -babecafe -00000000 -babecafe -00000000 -babecafe -00000000 -babecafe -00000000 -babecafe -00000000 -babecafe -00000000 -babecafe -00000000 -babecafe -00000000 -babecafe -00000000 -babecafe -00000000 -babecafe -00000000 -babecafe -00000000 -babecafe -00000000 -babecafe -00000000 -babecafe -00000000 -babecafe -00000000 -babecafe -00000000 -babecafe -00000000 -babecafe -00000000 -babecafe -00000000 -babecafe -00000000 -00000000 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cli-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cli-01.reference_output deleted file mode 100644 index 87e492b52..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cli-01.reference_output +++ /dev/null @@ -1,64 +0,0 @@ -ffffffe0 -ffffffff -00000000 -00000000 -0000001f -00000000 -00000001 -00000000 -00000002 -00000000 -00000004 -00000000 -00000008 -00000000 -00000010 -00000000 -ffffffea -ffffffff -fffffffe -ffffffff -fffffffd -ffffffff -fffffffb -ffffffff -fffffff7 -ffffffff -ffffffef -ffffffff -00000015 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/clui-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/clui-01.reference_output deleted file mode 100644 index ab6452d51..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/clui-01.reference_output +++ /dev/null @@ -1,64 +0,0 @@ -fffef000 -ffffffff -0001f000 -00000000 -ffff7000 -ffffffff -00011000 -00000000 -00001000 -00000000 -00002000 -00000000 -00004000 -00000000 -00008000 -00000000 -00015000 -00000000 -fffea000 -ffffffff -00010000 -00000000 -fffe0000 -ffffffff -ffffe000 -ffffffff -ffffd000 -ffffffff -ffffb000 -ffffffff -00001000 -00000000 -00001000 -00000000 -00001000 -00000000 -00000000 -00000000 -00001000 -00000000 -00001000 -00000000 -00001000 -00000000 -00001000 -00000000 -00001000 -00000000 -00001000 -00000000 -00001000 -00000000 -00001000 -00000000 -00001000 -00000000 -00001000 -00000000 -00001000 -00000000 -00001000 -00000000 -00000000 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/clw-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/clw-01.reference_output deleted file mode 100644 index fc36c1e86..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/clw-01.reference_output +++ /dev/null @@ -1,28 +0,0 @@ -babecafe -ffffffff -babecafe -ffffffff -babecafe -ffffffff -babecafe -ffffffff -babecafe -ffffffff -babecafe -ffffffff -babecafe -ffffffff -babecafe -ffffffff -babecafe -ffffffff -babecafe -ffffffff -babecafe -ffffffff -babecafe -ffffffff -babecafe -ffffffff -00000000 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/clwsp-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/clwsp-01.reference_output deleted file mode 100644 index a2230c8a0..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/clwsp-01.reference_output +++ /dev/null @@ -1,64 +0,0 @@ -babecafe -ffffffff -babecafe -ffffffff -babecafe -ffffffff -babecafe -ffffffff -babecafe -ffffffff -babecafe -ffffffff -babecafe -ffffffff -babecafe -ffffffff -babecafe -ffffffff -babecafe -ffffffff -babecafe -ffffffff -babecafe -ffffffff -babecafe -ffffffff -babecafe -ffffffff -babecafe -ffffffff -babecafe -ffffffff -babecafe -ffffffff -babecafe -ffffffff -babecafe -ffffffff -babecafe -ffffffff -babecafe -ffffffff -babecafe -ffffffff -babecafe -ffffffff -babecafe -ffffffff -babecafe -ffffffff -babecafe -ffffffff -babecafe -ffffffff -babecafe -ffffffff -babecafe -ffffffff -babecafe -ffffffff -babecafe -ffffffff -00000000 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cmv-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cmv-01.reference_output deleted file mode 100644 index aea12cbc2..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cmv-01.reference_output +++ /dev/null @@ -1,300 +0,0 @@ -00000000 -80000000 -00000000 -00000000 -ffffffff -7fffffff -00000001 -00000000 -00000002 -00000000 -00000004 -00000000 -00000008 -00000000 -00000010 -00000000 -00000000 -00000000 -00000040 -00000000 -00000080 -00000000 -00000100 -00000000 -00000200 -00000000 -00000400 -00000000 -00000800 -00000000 -00001000 -00000000 -00002000 -00000000 -00004000 -00000000 -00008000 -00000000 -00010000 -00000000 -00020000 -00000000 -00040000 -00000000 -00080000 -00000000 -00100000 -00000000 -00200000 -00000000 -00400000 -00000000 -00800000 -00000000 -01000000 -00000000 -02000000 -00000000 -04000000 -00000000 -08000000 -00000000 -10000000 -00000000 -20000000 -00000000 -40000000 -00000000 -80000000 -00000000 -00000000 -00000001 -00000000 -00000002 -00000000 -00000004 -00000000 -00000008 -00000000 -00000010 -00000000 -00000020 -00000000 -00000040 -00000000 -00000080 -00000000 -00000100 -00000000 -00000200 -00000000 -00000400 -00000000 -00000800 -00000000 -00001000 -00000000 -00002000 -00000000 -00004000 -00000000 -00008000 -00000000 -00010000 -00000000 -00020000 -00000000 -00040000 -00000000 -00080000 -00000000 -00100000 -00000000 -00200000 -00000000 -00400000 -00000000 -00800000 -00000000 -01000000 -00000000 -02000000 -00000000 -04000000 -00000000 -08000000 -00000000 -10000000 -00000000 -20000000 -00000000 -40000000 -fffffffe -ffffffff -fffffffd -ffffffff -fffffffb -ffffffff -fffffff7 -ffffffff -ffffffef -ffffffff -ffffffdf -ffffffff -ffffffbf -ffffffff -ffffff7f -ffffffff -fffffeff -ffffffff -fffffdff -ffffffff -fffffbff -ffffffff -fffff7ff -ffffffff -ffffefff -ffffffff -ffffdfff -ffffffff -ffffbfff -ffffffff -ffff7fff -ffffffff -fffeffff -ffffffff -fffdffff -ffffffff -fffbffff -ffffffff -fff7ffff -ffffffff -ffefffff -ffffffff -ffffffff -dfffffff -ffffffff -bfffffff -55555555 -55555555 -aaaaaaaa -aaaaaaaa -00000003 -00000000 -00000005 -00000000 -33333333 -33333333 -66666666 -66666666 -4afb0ccd -ffffffff -b504f333 -00000000 -55555554 -55555555 -33333332 -33333333 -66666665 -66666666 -b504f332 -00000000 -55555556 -55555555 -aaaaaaab -aaaaaaaa -00000006 -00000000 -33333334 -33333333 -66666667 -66666666 -4afb0cce -ffffffff -b504f334 -00000000 -ffdfffff -ffffffff -ffbfffff -ffffffff -ff7fffff -ffffffff -feffffff -ffffffff -fdffffff -ffffffff -fbffffff -ffffffff -f7ffffff -ffffffff -efffffff -ffffffff -dfffffff -ffffffff -bfffffff -ffffffff -7fffffff -ffffffff -ffffffff -fffffffe -ffffffff -fffffffd -ffffffff -fffffffb -ffffffff -fffffff7 -ffffffff -ffffffef -ffffffff -ffffffdf -ffffffff -ffffffbf -ffffffff -ffffff7f -ffffffff -fffffeff -ffffffff -fffffdff -ffffffff -fffffbff -ffffffff -fffff7ff -ffffffff -ffffefff -ffffffff -ffffdfff -ffffffff -ffffbfff -ffffffff -ffff7fff -ffffffff -fffeffff -ffffffff -fffdffff -ffffffff -fffbffff -ffffffff -fff7ffff -ffffffff -ffefffff -ffffffff -ffdfffff -ffffffff -ffbfffff -ffffffff -ff7fffff -ffffffff -feffffff -ffffffff -fdffffff -ffffffff -fbffffff -ffffffff -f7ffffff -ffffffff -efffffff -00000020 -00000000 -00000000 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cnop-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cnop-01.reference_output deleted file mode 100644 index 43e0ceb3d..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cnop-01.reference_output +++ /dev/null @@ -1,28 +0,0 @@ -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cor-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cor-01.reference_output deleted file mode 100644 index 5d8a6af6a..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cor-01.reference_output +++ /dev/null @@ -1,1360 +0,0 @@ -02000000 -80000000 -00000000 -80000000 -ffffffff -ffffffff -00000005 -00000000 -fffdffff -ffffffff -ffffffff -ffffffff -ffffff7f -ffffffff -00000002 -00000200 -dfffffff -ffffffff -0000000d -00000000 -00000019 -00000000 -00000023 -00000000 -ffff7fff -ffffffff -02000080 -00000000 -00000100 -00000000 -00000200 -10000000 -ffffffff -ffffffbf -00000840 -00000000 -00001100 -00000000 -00002000 -00080000 -00004000 -00000010 -00808000 -00000000 -ffffffff -fffdffff -fbffffff -ffffffff -00040002 -00000000 -00080010 -00000000 -b514f334 -00000000 -fdffffff -ffffffff -ff7fffff -ffffffff -ffffffff -fffffff7 -ffffffbf -ffffffff -02000000 -c0000000 -04000004 -00000000 -08020000 -00000000 -10000004 -00000000 -60000000 -00000000 -4afb0ccd -ffffffff -80020000 -00000000 -ffffffff -fdffffff -ffffffff -efffffff -00000005 -00000004 -4afb0ccd -ffffffff -00000006 -00000010 -00000400 -00000020 -33333334 -33333373 -00000007 -00000080 -00000002 -00000100 -ffffffff -ffffbfff -00000000 -00000408 -efffffff -ffffffff -33333332 -33333333 -fffdffff -ffffffff -55555556 -55555555 -00000000 -00008008 -01000000 -00010000 -fffbffff -ffffffff -ffefffff -ffffffff -00000008 -00080000 -ffffffff -ffffff7f -00000000 -01200000 -00000003 -00400000 -33333333 -33b33333 -4afb0ccd -ffffffff -33333333 -33333333 -00000000 -04400000 -ffffffff -ffff7fff -20000000 -10000000 -08000000 -20000000 -fffffff8 -ffffffff -fffffffe -ffffffff -ffffffff -ffffffff -fffffffb -ffffffff -ffffffff -ffffffff -ffffffef -ffffffff -ffffffdf -ffffffff -ffffffbf -ffffffff -ffffffff -ffffffff -fffffdff -ffffffff -fffffbff -ffffffff -ffffffff -ffffffff -ffffefff -ffffffff -ffffdfff -ffffffff -ffffbfff -ffffffff -ffffffff -ffffffff -fffeffff -ffffffff -ffffffff -ffffffff -fff7ffff -ffffffff -ffefffff -ffffffff -ffdfffff -ffffffff -ffbfffff -ffffffff -ff7fffff -ffffffff -feffffff -ffffffff -fdffffff -ffffffff -fbffffff -ffffffff -f7ffffff -ffffffff -efffffff -ffffffff -dfffffff -ffffffff -bfffffff -ffffffff -7fffffff -ffffffff -ffffffff -ffffffff -ffffffff -fffffffd -ffffffff -fffffffb -ffffffff -fffffff7 -ffffffff -ffffffef -ffffffff -ffffffdf -ffffffff -ffffffbf -ffffffff -ffffffff -ffffffff -fffffeff -ffffffff -fffffdff -ffffffff -fffffbff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffff7fff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffefffff -ffffffff -ffdfffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -fdffffff -ffffffff -fbffffff -ffffffff -f7ffffff -ffffffff -efffffff -ffffffff -dfffffff -ffffffff -bfffffff -55555557 -55555555 -eeeeeeee -eeeeeeee -ffffffff -f7ffffff -fffdffff -ffffffff -00000800 -00000000 -fffeffff -ffffffff -ffffffff -fffff7ff -dfffffff -ffffffff -00040000 -00000000 -feffffff -ffffffff -ffdfffff -ffffffff -7fffffff -ffffffff -a0000000 -00000000 -00000008 -00000001 -00004000 -00000002 -fff7ffff -ffffffff -ffffffff -dfffffff -ffffffff -fffffeff -00000003 -00000080 -00000000 -00040100 -66666666 -66666666 -00000008 -00000800 -00000002 -00001000 -00000000 -10002000 -b504f334 -00004000 -00000000 -00088000 -ffefffff -ffffffff -ffffffff -ffdfffff -ffffffff -ffffffff -40000000 -08000000 -00100000 -20000000 -00000000 -40000080 -fffffffe -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffdf -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -fffff7ff -ffffffff -ffffefff -ffffffff -ffffdfff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -fff7ffff -ffffffff -ffdfffff -ffffffff -bfffffff -ffffffff -7fffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -fffffffb -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -fffffeff -ffffffff -ffffffff -ffffffff -fffffbff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ff7fffff -ffffffff -feffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -dfffffff -ffffffff -ffffffff -00000003 -00000000 -aaaaaaab -aaaaaaaa -00000007 -00000000 -33333333 -33333333 -66666667 -66666666 -4afb0ccf -ffffffff -b504f333 -00000000 -00000003 -00000000 -55555557 -55555555 -00000003 -00000000 -00000007 -00000000 -33333333 -33333333 -66666667 -66666666 -b504f333 -00000000 -55555557 -55555555 -aaaaaaab -aaaaaaaa -00000007 -00000000 -33333337 -33333333 -66666667 -66666666 -4afb0ccf -ffffffff -b504f337 -00000000 -55555557 -55555555 -55555555 -55555555 -ffffffff -ffffffff -55555555 -55555555 -77777777 -77777777 -77777777 -77777777 -5fff5ddd -ffffffff -f555f777 -55555555 -55555557 -55555555 -55555555 -55555555 -55555555 -55555555 -55555555 -55555555 -77777777 -77777777 -77777775 -77777777 -f555f777 -55555555 -55555557 -55555555 -ffffffff -ffffffff -55555557 -55555555 -77777775 -77777777 -77777777 -77777777 -5fff5ddf -ffffffff -f555f775 -55555555 -aaaaaaab -aaaaaaaa -ffffffff -ffffffff -aaaaaaaa -aaaaaaaa -aaaaaaaf -aaaaaaaa -bbbbbbbb -bbbbbbbb -eeeeeeee -eeeeeeee -eafbaeef -ffffffff -bfaefbbb -aaaaaaaa -aaaaaaaa -aaaaaaaa -fffffffe -ffffffff -aaaaaaaa -aaaaaaaa -aaaaaaae -aaaaaaaa -bbbbbbba -bbbbbbbb -eeeeeeef -eeeeeeee -bfaefbba -aaaaaaaa -fffffffe -ffffffff -aaaaaaab -aaaaaaaa -aaaaaaae -aaaaaaaa -bbbbbbbe -bbbbbbbb -eeeeeeef -eeeeeeee -eafbaeee -ffffffff -bfaefbbe -aaaaaaaa -00000007 -00000000 -55555555 -55555555 -aaaaaaaf -aaaaaaaa -00000005 -00000000 -33333337 -33333333 -66666667 -66666666 -4afb0ccd -ffffffff -b504f337 -00000000 -00000007 -00000000 -55555555 -55555555 -00000005 -00000000 -00000005 -00000000 -33333337 -33333333 -66666665 -66666666 -b504f337 -00000000 -55555557 -55555555 -aaaaaaaf -aaaaaaaa -00000007 -00000000 -33333335 -33333333 -66666667 -66666666 -4afb0ccf -ffffffff -b504f335 -00000000 -33333333 -33333333 -77777777 -77777777 -bbbbbbbb -bbbbbbbb -33333337 -33333333 -33333333 -33333333 -77777777 -77777777 -7bfb3fff -ffffffff -b737f333 -33333333 -33333333 -33333333 -77777777 -77777777 -33333333 -33333333 -33333337 -33333333 -33333333 -33333333 -77777777 -77777777 -b737f333 -33333333 -77777777 -77777777 -bbbbbbbb -bbbbbbbb -33333337 -33333333 -33333337 -33333333 -77777777 -77777777 -7bfb3fff -ffffffff -b737f337 -33333333 -66666667 -66666666 -77777777 -77777777 -66666667 -66666666 -77777777 -77777777 -66666666 -66666666 -6eff6eef -ffffffff -f766f777 -66666666 -66666666 -66666666 -77777776 -77777777 -66666666 -66666666 -66666666 -66666666 -77777776 -77777777 -66666667 -66666666 -f766f776 -66666666 -77777776 -77777777 -eeeeeeef -eeeeeeee -66666666 -66666666 -77777776 -77777777 -66666667 -66666666 -6eff6eee -ffffffff -f766f776 -66666666 -4afb0ccf -ffffffff -5fff5ddd -ffffffff -eafbaeef -ffffffff -4afb0ccd -ffffffff -7bfb3fff -ffffffff -6eff6eef -ffffffff -4afb0ccd -ffffffff -ffffffff -ffffffff -4afb0ccf -ffffffff -5fff5ddd -ffffffff -4afb0ccd -ffffffff -4afb0ccd -ffffffff -7bfb3fff -ffffffff -6eff6eed -ffffffff -ffffffff -ffffffff -5fff5ddf -ffffffff -eafbaeef -ffffffff -4afb0ccf -ffffffff -7bfb3ffd -ffffffff -6eff6eef -ffffffff -4afb0ccf -ffffffff -fffffffd -ffffffff -b504f333 -00000000 -f555f777 -55555555 -bfaefbbb -aaaaaaaa -b504f337 -00000000 -b737f333 -33333333 -f766f777 -66666666 -ffffffff -ffffffff -b504f333 -00000000 -b504f333 -00000000 -f555f777 -55555555 -b504f333 -00000000 -b504f337 -00000000 -b737f333 -33333333 -f766f777 -66666666 -b504f333 -00000000 -f555f777 -55555555 -bfaefbbb -aaaaaaaa -b504f337 -00000000 -b737f337 -33333333 -f766f777 -66666666 -ffffffff -ffffffff -b504f337 -00000000 -00000003 -00000000 -55555557 -55555555 -aaaaaaaa -aaaaaaaa -00000007 -00000000 -33333333 -33333333 -66666666 -66666666 -4afb0ccf -ffffffff -b504f333 -00000000 -00000002 -00000000 -55555556 -55555555 -00000002 -00000000 -00000006 -00000000 -33333332 -33333333 -66666667 -66666666 -b504f332 -00000000 -55555556 -55555555 -aaaaaaab -aaaaaaaa -00000006 -00000000 -33333336 -33333333 -66666667 -66666666 -4afb0cce -ffffffff -b504f336 -00000000 -55555557 -55555555 -55555555 -55555555 -fffffffe -ffffffff -55555555 -55555555 -77777777 -77777777 -77777776 -77777777 -5fff5ddd -ffffffff -f555f777 -55555555 -55555556 -55555555 -55555554 -55555555 -55555554 -55555555 -55555554 -55555555 -77777776 -77777777 -77777775 -77777777 -f555f776 -55555555 -55555556 -55555555 -ffffffff -ffffffff -55555556 -55555555 -77777774 -77777777 -77777777 -77777777 -5fff5dde -ffffffff -f555f774 -55555555 -00000003 -00000000 -55555555 -55555555 -aaaaaaaa -aaaaaaaa -00000005 -00000000 -33333333 -33333333 -66666666 -66666666 -4afb0ccd -ffffffff -b504f333 -00000000 -00000002 -00000000 -aaaaaaae -aaaaaaaa -00000005 -00000000 -33333337 -33333333 -66666666 -66666666 -4afb0ccd -ffffffff -b504f337 -00000000 -00000006 -00000000 -55555554 -55555555 -00000004 -00000000 -00000004 -00000000 -33333336 -33333333 -66666665 -66666666 -b504f336 -00000000 -55555556 -55555555 -aaaaaaaf -aaaaaaaa -00000006 -00000000 -33333334 -33333333 -66666667 -66666666 -4afb0cce -ffffffff -b504f334 -00000000 -33333333 -33333333 -77777777 -77777777 -bbbbbbba -bbbbbbbb -33333337 -33333333 -33333333 -33333333 -77777776 -77777777 -7bfb3fff -ffffffff -b737f333 -33333333 -33333332 -33333333 -77777776 -77777777 -33333332 -33333333 -33333336 -33333333 -33333332 -33333333 -77777777 -77777777 -b737f332 -33333333 -77777776 -77777777 -bbbbbbbb -bbbbbbbb -33333336 -33333333 -33333336 -33333333 -77777777 -77777777 -7bfb3ffe -ffffffff -b737f336 -33333333 -66666667 -66666666 -77777775 -77777777 -eeeeeeef -eeeeeeee -66666665 -66666666 -77777777 -77777777 -66666667 -66666666 -6eff6eed -ffffffff -f766f777 -66666666 -66666667 -66666666 -77777775 -77777777 -66666665 -66666666 -66666665 -66666666 -77777777 -77777777 -66666665 -66666666 -f766f777 -66666666 -77777777 -77777777 -eeeeeeef -eeeeeeee -66666667 -66666666 -77777775 -77777777 -66666667 -66666666 -6eff6eef -ffffffff -f766f775 -66666666 -b504f333 -00000000 -f555f777 -55555555 -bfaefbba -aaaaaaaa -b504f337 -00000000 -b737f333 -33333333 -f766f776 -66666666 -ffffffff -ffffffff -b504f333 -00000000 -b504f332 -00000000 -f555f776 -55555555 -b504f332 -00000000 -b504f336 -00000000 -b737f332 -33333333 -f766f777 -66666666 -b504f332 -00000000 -f555f776 -55555555 -bfaefbbb -aaaaaaaa -b504f336 -00000000 -b737f336 -33333333 -f766f777 -66666666 -fffffffe -ffffffff -b504f336 -00000000 -55555557 -55555555 -55555557 -55555555 -fffffffe -ffffffff -55555557 -55555555 -77777777 -77777777 -77777776 -77777777 -5fff5ddf -ffffffff -f555f777 -55555555 -55555556 -55555555 -55555556 -55555555 -55555556 -55555555 -55555556 -55555555 -77777776 -77777777 -77777777 -77777777 -f555f776 -55555555 -55555556 -55555555 -ffffffff -ffffffff -55555556 -55555555 -77777776 -77777777 -77777777 -77777777 -5fff5dde -ffffffff -f555f776 -55555555 -aaaaaaab -aaaaaaaa -ffffffff -ffffffff -aaaaaaab -aaaaaaaa -aaaaaaaf -aaaaaaaa -bbbbbbbb -bbbbbbbb -eeeeeeef -eeeeeeee -eafbaeef -ffffffff -bfaefbbb -aaaaaaaa -aaaaaaab -aaaaaaaa -ffffffff -ffffffff -aaaaaaab -aaaaaaaa -aaaaaaaf -aaaaaaaa -bbbbbbbb -bbbbbbbb -eeeeeeef -eeeeeeee -bfaefbbb -aaaaaaaa -ffffffff -ffffffff -aaaaaaab -aaaaaaaa -aaaaaaaf -aaaaaaaa -bbbbbbbf -bbbbbbbb -eeeeeeef -eeeeeeee -eafbaeef -ffffffff -bfaefbbf -aaaaaaaa -00000007 -00000000 -55555557 -55555555 -aaaaaaae -aaaaaaaa -00000007 -00000000 -33333337 -33333333 -66666666 -66666666 -4afb0ccf -ffffffff -b504f337 -00000000 -00000006 -00000000 -55555556 -55555555 -00000006 -00000000 -00000006 -00000000 -33333336 -33333333 -66666667 -66666666 -b504f336 -00000000 -55555556 -55555555 -aaaaaaaf -aaaaaaaa -00000006 -00000000 -33333336 -33333333 -66666667 -66666666 -4afb0cce -ffffffff -b504f336 -00000000 -33333337 -33333333 -77777775 -77777777 -bbbbbbbe -bbbbbbbb -33333335 -33333333 -33333337 -33333333 -77777776 -77777777 -7bfb3ffd -ffffffff -b737f337 -33333333 -33333336 -33333333 -77777774 -77777777 -33333334 -33333333 -33333334 -33333333 -33333336 -33333333 -77777775 -77777777 -b737f336 -33333333 -77777776 -77777777 -bbbbbbbf -bbbbbbbb -33333336 -33333333 -33333334 -33333333 -77777777 -77777777 -7bfb3ffe -ffffffff -b737f334 -33333333 -66666667 -66666666 -77777777 -77777777 -eeeeeeef -eeeeeeee -66666667 -66666666 -77777777 -77777777 -66666667 -66666666 -6eff6eef -ffffffff -f766f777 -66666666 -66666667 -66666666 -77777777 -77777777 -66666667 -66666666 -66666667 -66666666 -77777777 -77777777 -66666667 -66666666 -f766f777 -66666666 -77777777 -77777777 -eeeeeeef -eeeeeeee -66666667 -66666666 -77777777 -77777777 -66666667 -66666666 -6eff6eef -ffffffff -f766f777 -66666666 -4afb0ccf -ffffffff -5fff5ddf -ffffffff -eafbaeee -ffffffff -4afb0ccf -ffffffff -7bfb3fff -ffffffff -6eff6eee -ffffffff -4afb0ccf -ffffffff -ffffffff -ffffffff -4afb0cce -ffffffff -5fff5dde -ffffffff -4afb0cce -ffffffff -4afb0cce -ffffffff -7bfb3ffe -ffffffff -6eff6eef -ffffffff -fffffffe -ffffffff -5fff5dde -ffffffff -eafbaeef -ffffffff -4afb0cce -ffffffff -7bfb3ffe -ffffffff -6eff6eef -ffffffff -4afb0cce -ffffffff -fffffffe -ffffffff -b504f337 -00000000 -f555f775 -55555555 -bfaefbbe -aaaaaaaa -b504f335 -00000000 -b737f337 -33333333 -f766f776 -66666666 -fffffffd -ffffffff -b504f337 -00000000 -b504f336 -00000000 -f555f774 -55555555 -b504f334 -00000000 -b504f334 -00000000 -b737f336 -33333333 -f766f775 -66666666 -b504f336 -00000000 -f555f776 -55555555 -bfaefbbf -aaaaaaaa -b504f336 -00000000 -b737f334 -33333333 -f766f777 -66666666 -fffffffe -ffffffff -b504f334 -00000000 -55555554 -55555555 -00000000 -00000000 -00000004 -00000000 -33333332 -33333333 -66666665 -66666666 -b504f332 -00000000 -55555556 -55555555 -aaaaaaab -aaaaaaaa -00000006 -00000000 -33333334 -33333333 -66666667 -66666666 -4afb0cce -ffffffff -b504f334 -00000000 -00000007 -00000000 -55555555 -55555555 -00000000 -80000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/csd-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/csd-01.reference_output deleted file mode 100644 index 681f90d60..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/csd-01.reference_output +++ /dev/null @@ -1,264 +0,0 @@ -00000000 -80000000 -00000000 -00000000 -ffffffff -7fffffff -00000001 -00000000 -ffffffff -ffdfffff -00000002 -00000000 -00000004 -00000000 -00000008 -00000000 -00000010 -00000000 -00000020 -00000000 -00000040 -00000000 -00000080 -00000000 -00000100 -00000000 -00000200 -00000000 -00000400 -00000000 -00000800 -00000000 -00001000 -00000000 -00002000 -00000000 -00004000 -00000000 -00008000 -00000000 -00010000 -00000000 -00020000 -00000000 -00040000 -00000000 -00080000 -00000000 -00100000 -00000000 -00200000 -00000000 -00400000 -00000000 -00800000 -00000000 -01000000 -00000000 -02000000 -00000000 -04000000 -00000000 -08000000 -00000000 -10000000 -00000000 -20000000 -00000000 -40000000 -00000000 -80000000 -00000000 -00000000 -00000001 -00000000 -00000002 -00000000 -00000004 -00000000 -00000008 -00000000 -00000010 -00000000 -00000020 -00000000 -00000040 -00000000 -00000080 -00000000 -00000100 -00000000 -00000200 -00000000 -00000400 -00000000 -00000800 -00000000 -00001000 -00000000 -00002000 -00000000 -00004000 -00000000 -00008000 -00000000 -00010000 -00000000 -00020000 -00000000 -00040000 -00000000 -00080000 -00000000 -00100000 -00000000 -00200000 -00000000 -00400000 -00000000 -00800000 -00000000 -01000000 -00000000 -02000000 -00000000 -04000000 -00000000 -08000000 -00000000 -10000000 -00000000 -20000000 -00000000 -40000000 -fffffffe -ffffffff -fffffffd -ffffffff -ffffffff -f7ffffff -ffffffff -efffffff -ffffffff -dfffffff -ffffffff -bfffffff -55555555 -55555555 -aaaaaaaa -aaaaaaaa -fffffff8 -ffffffff -fffffffb -ffffffff -fffffff7 -ffffffff -ffffffef -ffffffff -ffffffdf -ffffffff -ffffffbf -ffffffff -ffffff7f -ffffffff -fffffeff -ffffffff -fffffdff -ffffffff -fffffbff -ffffffff -fffff7ff -ffffffff -ffffefff -ffffffff -ffffdfff -ffffffff -ffffbfff -ffffffff -ffff7fff -ffffffff -fffeffff -ffffffff -fffdffff -ffffffff -fffbffff -ffffffff -fff7ffff -ffffffff -ffefffff -ffffffff -ffdfffff -ffffffff -ffbfffff -ffffffff -ff7fffff -ffffffff -feffffff -ffffffff -fdffffff -ffffffff -fbffffff -ffffffff -f7ffffff -ffffffff -efffffff -ffffffff -dfffffff -ffffffff -bfffffff -ffffffff -7fffffff -ffffffff -ffffffff -fffffffe -ffffffff -fffffffd -ffffffff -fffffffb -ffffffff -fffffff7 -ffffffff -ffffffef -ffffffff -ffffffdf -ffffffff -ffffffbf -ffffffff -ffffff7f -ffffffff -fffffeff -ffffffff -fffffdff -ffffffff -fffffbff -ffffffff -fffff7ff -ffffffff -ffffefff -ffffffff -ffffdfff -ffffffff -ffffbfff -ffffffff -ffff7fff -ffffffff -fffeffff -ffffffff -fffdffff -ffffffff -fffbffff -ffffffff -fff7ffff -ffffffff -ffefffff -ffffffff -ffbfffff -ffffffff -ff7fffff -ffffffff -feffffff -ffffffff -fdffffff -ffffffff -fbffffff diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/csdsp-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/csdsp-01.reference_output deleted file mode 100644 index 5fdc2bcac..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/csdsp-01.reference_output +++ /dev/null @@ -1,264 +0,0 @@ -00000000 -80000000 -00000000 -00000000 -ffffffff -7fffffff -00000001 -00000000 -ffffffdf -ffffffff -00000002 -00000000 -00000004 -00000000 -00000008 -00000000 -00000010 -00000000 -00000020 -00000000 -00000040 -00000000 -00000080 -00000000 -00000100 -00000000 -00000200 -00000000 -00000400 -00000000 -00000800 -00000000 -00001000 -00000000 -00002000 -00000000 -00004000 -00000000 -00008000 -00000000 -00010000 -00000000 -00020000 -00000000 -00040000 -00000000 -00080000 -00000000 -00100000 -00000000 -00200000 -00000000 -00400000 -00000000 -00800000 -00000000 -01000000 -00000000 -02000000 -00000000 -04000000 -00000000 -08000000 -00000000 -10000000 -00000000 -20000000 -00000000 -40000000 -00000000 -80000000 -00000000 -00000000 -00000001 -00000000 -00000002 -00000000 -00000004 -00000000 -00000008 -00000000 -00000010 -00000000 -00000020 -00000000 -00000040 -00000000 -00000080 -00000000 -00000100 -00000000 -00000200 -00000000 -00000400 -00000000 -00000800 -00000000 -00001000 -00000000 -00002000 -00000000 -00004000 -00000000 -00008000 -00000000 -00010000 -00000000 -00020000 -00000000 -00040000 -00000000 -00080000 -00000000 -00100000 -00000000 -00200000 -00000000 -00400000 -00000000 -00800000 -00000000 -01000000 -00000000 -02000000 -00000000 -04000000 -00000000 -08000000 -00000000 -10000000 -00000000 -20000000 -00000000 -40000000 -fffffffe -ffffffff -fffffffd -ffffffff -fffffffb -ffffffff -ffffffff -f7ffffff -ffffffff -efffffff -ffffffff -dfffffff -ffffffff -bfffffff -55555555 -55555555 -aaaaaaaa -aaaaaaaa -ffffffbf -ffffffff -fffffff7 -ffffffff -ffffffef -ffffffff -ffffff7f -ffffffff -fffffeff -ffffffff -fffffdff -ffffffff -fffffbff -ffffffff -fffff7ff -ffffffff -ffffefff -ffffffff -ffffdfff -ffffffff -ffffbfff -ffffffff -ffff7fff -ffffffff -fffeffff -ffffffff -fffdffff -ffffffff -fffbffff -ffffffff -fff7ffff -ffffffff -ffefffff -ffffffff -ffdfffff -ffffffff -ffbfffff -ffffffff -ff7fffff -ffffffff -feffffff -ffffffff -fdffffff -ffffffff -fbffffff -ffffffff -f7ffffff -ffffffff -efffffff -ffffffff -dfffffff -ffffffff -bfffffff -ffffffff -7fffffff -ffffffff -ffffffff -fffffffe -ffffffff -fffffffd -ffffffff -fffffffb -ffffffff -fffffff7 -ffffffff -ffffffef -ffffffff -ffffffdf -ffffffff -ffffffbf -ffffffff -ffffff7f -ffffffff -fffffeff -ffffffff -fffffdff -ffffffff -fffffbff -ffffffff -fffff7ff -ffffffff -ffffefff -ffffffff -ffffdfff -ffffffff -ffffbfff -ffffffff -ffff7fff -ffffffff -fffeffff -ffffffff -fffdffff -ffffffff -fffbffff -ffffffff -fff7ffff -ffffffff -ffefffff -ffffffff -ffdfffff -ffffffff -ffbfffff -ffffffff -ff7fffff -ffffffff -feffffff -ffffffff -fdffffff -ffffffff -fbffffff -00000000 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cslli-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cslli-01.reference_output deleted file mode 100644 index 522eaeb56..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cslli-01.reference_output +++ /dev/null @@ -1,296 +0,0 @@ -fffe0000 -fbffffff -04f33400 -000000b5 -00000800 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -ffffffff -00001000 -00000000 -00000000 -01000000 -00000000 -00000002 -00000200 -00000000 -00008000 -00000000 -00000200 -00000000 -00002000 -00000000 -00010000 -00000000 -00000000 -00000000 -00080000 -00000000 -40000000 -00000000 -00000000 -00000000 -00000000 -00000001 -20000000 -00000000 -00000000 -00000001 -00000000 -00000000 -80000000 -00000000 -08000000 -00000000 -00000000 -00000002 -00000000 -00100000 -00000000 -00200000 -00000000 -00000020 -00000000 -00000004 -02000000 -00000000 -00000000 -00000000 -00000000 -00000010 -00000000 -00010000 -00000000 -00000020 -00000000 -00000100 -00000000 -00020000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000080 -00000000 -00000040 -00000000 -00004000 -00000000 -00000400 -00000000 -00000000 -00000000 -00000400 -00000000 -00000000 -00000000 -00100000 -00000000 -00000000 -00000000 -00020000 -00000000 -00040000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -80000000 -00000000 -00000000 -00000000 -08000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00400000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -fffffc00 -ffffffff -fffffa00 -ffffffff -ffff6000 -ffffffff -fffffee0 -ffffffff -ffffff78 -ffffffff -ffbe0000 -ffffffff -ffbf0000 -ffffffff -fdfc0000 -ffffffff -ffffdfe0 -ffffffff -fffffbfe -ffffffff -ffff7fe0 -ffffffff -00000000 -80000000 -00000000 -ffbffc00 -00000000 -ffffdfff -7ffe0000 -ffffffff -ffdfffc0 -ffffffff -fffbfffc -ffffffff -00000000 -f7fffc00 -fdffff80 -ffffffff -fffffff0 -dfffffff -ffffffe0 -7fffffff -ffff0000 -ffffffff -00000000 -e0000000 -00000000 -c0000000 -00000000 -f8000000 -55555540 -55555555 -55554000 -55555555 -00018000 -00000000 -80000000 -00000002 -00000000 -99800000 -cccc0000 -cccccccc -00000000 -ec333400 -27999800 -000005a8 -55555550 -55555555 -66640000 -66666666 -99994000 -99999999 -d413ccc8 -00000002 -aaab0000 -aaaaaaaa -aaab0000 -aaaaaaaa -00000300 -00000000 -ccccccd0 -cccccccc -9999c000 -99999999 -00000000 -c0000000 -fffc0000 -ffffffdf -fefffff0 -ffffffff -ffffe000 -fffffffb -fffc0000 -fffffeff -f7fffff0 -ffffffff -fff80000 -fffff7ff -fffc0000 -fffff7ff -fffffc00 -ffffffef -ffff0000 -fffff7ff -00000000 -ffff8000 -00000000 -80000000 -fffffe00 -ffffff7f -fffc0000 -fffdffff -00000000 -e0000000 -00000000 -e0000000 -ffffff00 -fffffbff -ffffffe0 -fffffeff -ffff0000 -ffefffff -fffc0000 -ff7fffff -ffff0000 -ffbfffff -ffffff00 -ffff7fff -00000000 -ff800000 -fffffc00 -ffefffff -00000000 -e0000000 -fffffffc -ffffbfff -00000000 -ff800000 -00000000 -ff800000 -00000000 -ff800000 -00000000 -f8000000 -80000000 -ffffffff -fffffffc -ffefffff -fffffff0 -ff7fffff -fffff000 -ffffffff -00000000 -fffffc00 -00000000 -e0000000 -00000000 -ff800000 -fffffff8 -f7ffffff diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/csrai-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/csrai-01.reference_output deleted file mode 100644 index 1d9e7bb20..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/csrai-01.reference_output +++ /dev/null @@ -1,296 +0,0 @@ -ffffbfff -ffffffff -00000000 -00000000 -00000000 -00000000 -00000000 -fffc0000 -00000000 -00000000 -7fffffff -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000002 -00000000 -00000000 -00000000 -00000000 -00000000 -00000080 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000800 -00000000 -00000000 -00000000 -00000000 -00000000 -00002000 -00000000 -00020000 -00000000 -00000200 -00000000 -00000020 -00000000 -00000008 -00000000 -00020000 -00000000 -00000000 -00000000 -00100000 -00000000 -00000020 -00000000 -01000000 -00000000 -00040000 -00000000 -00200000 -00000000 -00020000 -00000000 -40000000 -00000000 -00000000 -00000000 -00400000 -00000000 -00100000 -00000000 -00080000 -00000000 -00200000 -00000000 -00000000 -00000001 -80000000 -00000000 -00080000 -00000000 -00000000 -00000002 -00000000 -00000100 -20000000 -00000000 -00000000 -00000800 -10000000 -00000000 -00000010 -00000000 -00010000 -00000000 -00000000 -00000000 -00000000 -00000040 -00080000 -00000000 -00000000 -00020000 -00000000 -00000004 -00000000 -00000000 -00000000 -00000000 -00000000 -00000020 -00000000 -00200000 -00000000 -01000000 -00000000 -00000800 -00000000 -00000000 -00000000 -00000000 -00000000 -00100000 -00000000 -00040000 -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -fffffffe -ffffffff -ffffffff -ffffffff -fffffffe -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -fffffffd -ffffffff -ffffffbf -ffffffff -ffffffdf -ffffffff -fffffffe -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -fffffbff -ffffffff -ffffff7f -ffffffff -fdffffff -ffffffff -ffffffff -ffffffff -fffdffff -ffffffff -ffbfffff -000000aa -00000000 -aaaaaaaa -ffeaaaaa -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -cccccccc -00000000 -ffffffff -ffffffff -00000000 -00000000 -aaaaaaaa -0000aaaa -66666666 -00006666 -00000001 -00000000 -00000000 -00000000 -55555555 -01555555 -aaaaaaaa -fffaaaaa -00000000 -00000000 -33333333 -00000000 -99999999 -00019999 -fff4afb0 -ffffffff -0002d413 -00000000 -ffffffff -ffffffff -ffffffff -ffffffff -ffdfffff -ffffffff -ffffffff -ffffffff -fffffff7 -ffffffff -fffff7ff -ffffffff -ff7fffff -ffffffff -ffffefff -ffffffff -fffeffff -ffffffff -fffeffff -ffffffff -ffffefff -ffffffff -ffffffff -ffffffff -ffffbfff -ffffffff -ffffffff -ffffffff -fdffffff -ffffffff -ffefffff -ffffffff -fffbffff -ffffffff -ffefffff -ffffffff -ffffffff -ffffffef -ffffffff -ffffffff -fffffbff -ffffffff -ffffffff -fffffff7 -ffffffff -ffffffff -fbffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffdfff -ffffffff -ffffffff -ffffffff -fffffeff -ffffffff -ffffffdf -ffffffff -ffffff7f -ffffffff -fffffffb -ffffffff -fffffeff -ffffffff -ffffffff -ffffffff -fffdffff -ffffffff -ffbfffff -ffffffff -fffffbff diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/csrli-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/csrli-01.reference_output deleted file mode 100644 index 34c72c144..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/csrli-01.reference_output +++ /dev/null @@ -1,300 +0,0 @@ -ffffffff -1fff7fff -00002000 -00000000 -00000000 -00000000 -00000000 -00001000 -00000000 -00000000 -ffffffff -007fffff -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000040 -00000000 -00000000 -00000000 -00000040 -00000000 -00000010 -00000000 -00000200 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00002000 -00000000 -00010000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000020 -00000000 -00000020 -00000000 -00040000 -00000000 -00002000 -00000000 -00000800 -00000000 -00000000 -00000000 -00000400 -00000000 -00000000 -00000000 -00200000 -00000000 -00000000 -00000000 -00400000 -00000000 -00040000 -00000000 -00000000 -00000001 -00020000 -00000000 -00000000 -00000000 -02000000 -00000000 -80000000 -00000000 -00000080 -00000000 -00040000 -00000000 -80000000 -00000000 -00000000 -00000000 -00000000 -00000080 -00000000 -00000020 -00000000 -00000800 -00000000 -00000400 -00000000 -00000020 -00000000 -00004000 -00000002 -00000000 -00000000 -00000008 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000008 -00000000 -00000010 -00000000 -00002000 -00000000 -00000008 -00000000 -00004000 -00000000 -00000000 -00000000 -00001000 -00000002 -00000000 -00000000 -00000000 -00000000 -00200000 -ffffffff -0003ffff -ffffffff -000fffff -ffffffff -03ffffff -ffffffff -00000000 -fffffffd -1fffffff -fffffffb -1fffffff -0001ffff -00000000 -ffffffff -00000000 -00000003 -00000000 -000001ff -00000000 -ffffffff -0007ffff -ffffff7f -0fffffff -ffffffff -0003ffff -ffffffff -00007fff -fffffdff -07ffffff -ffffffbf -007fffff -ffffdfff -1fffffff -ffffffff -00001fff -ffffffff -00000001 -fffffff7 -0000ffff -00000003 -00000000 -000001f7 -00000000 -ffffffff -000007bf -ffffffff -0077ffff -ffffffff -037fffff -ffffffff -0000bfff -aaaaaaaa -00000000 -aaaaaaaa -02aaaaaa -00000000 -00000000 -66666666 -00006666 -cccccccc -000ccccc -000001ff -00000000 -016a09e6 -00000000 -55555555 -00000000 -99999999 -19999999 -33333333 -00033333 -002d413c -00000000 -55555555 -15555555 -aaaaaaaa -00002aaa -00000000 -00000000 -cccccccc -000ccccc -66666666 -00666666 -fa57d866 -07ffffff -00000000 -00000000 -00004000 -00000000 -ffff7fff -07ffffff -ffffffff -00000000 -ffffbfff -00ffffff -00000007 -00000000 -ffbfffff -3fffffff -ffbfffff -1fffffff -fffeffff -003fffff -fffdffff -003fffff -ffff7fff -0007ffff -ffffffff -00000001 -ffffffff -00000000 -00000003 -00000000 -000001ff -00000000 -ffbfffff -001fffff -0001ffff -00000000 -00000001 -00000000 -7fffffff -07ffffff -00000007 -00000000 -fdffffff -0007ffff -efffffff -001fffff -fff7ffff -000007ff -ffffffff -01fffffb -ffffffff -1fffff7f -ffffffff -003ffffd -00000007 -00000000 -ffffbfff -00000001 -ffffffff -000ffffb -ffffffff -7fffbfff -ffffffff -1fffdfff -ffffffff -3fff7fff -ffffffff -07ffbfff -ffffffff -00003ffb -000001ff -00000000 -ffffffff -000ffbff -ffffffff -00001fef -0001fdff -00000000 -00000000 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/csub-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/csub-01.reference_output deleted file mode 100644 index 70de73b36..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/csub-01.reference_output +++ /dev/null @@ -1,1344 +0,0 @@ -00000000 -80001000 -00000000 -00000000 -00000005 -80000000 -ffffffff -007fffff -fe000000 -7fffffff -00000081 -00000000 -ffffffff -7fffbfff -00800002 -00000000 -dffffffd -ffffffff -7ffffffb -ffffffff -fffffff7 -ffefffff -fffffff7 -ffffffff -ffffffdf -ffffff7f -0fffffc0 -00000000 -ffffff7f -ffffffef -fefffeff -ffffffff -fffffe00 -00001fff -fffffbfb -ffffffff -fffff7f8 -ffffffff -00000000 -00000000 -ffffdfff -ffffdfff -ffffc004 -ffffffff -ffff8001 -ffffffff -ffff4000 -ffffffff -fffdffff -fffffeff -fffc0004 -ffffffff -fff7fffa -ffffffff -4aeb0ccd -ffffffff -ffe00800 -ffffffff -ffbfffff -fff7ffff -ff7fffff -fffffffe -feffffff -fffffffd -fbfffffb -ffffffff -f8000000 -03ffffff -f0000000 -0001ffff -e0000004 -ffffffff -c0000004 -ffffffff -80000000 -00000003 -00000000 -00007fff -00200000 -fffffffe -fffffffc -fffffffb -fffffff8 -fffffff7 -ffffffff -ffffffdf -fdffffff -ffffffdf -ffffffbf -ffffffbf -00000000 -007fff80 -00080000 -ffffff00 -00000006 -fffffe00 -ffffffff -ffeffbff -00000000 -07fff800 -ffffffdf -ffffefff -fffffff9 -ffffdfff -ffff7fff -ffff7fff -55555555 -55545555 -efffffff -fffdffff -00000000 -07fc0000 -00000080 -fff80000 -04000000 -fff00000 -ffffffff -ffdffbff -00000000 -ffc00800 -dfffffff -ff7fffff -ffffffff -fefdffff -00400000 -fe000000 -aaaaaaab -a6aaaaaa -4afb0cce -f7ffffff -00000000 -b0000000 -55555554 -35555555 -10000000 -c0000000 -00000001 -ffffc000 -00000003 -00000008 -00004005 -00000000 -20000009 -00000000 -00000011 -00400000 -00000017 -00000000 -00000041 -00000800 -ffe00100 -ffffffff -00000201 -00000080 -ffe00400 -ffffffff -55555d56 -55555555 -00001000 -fc000000 -00002001 -00000002 -00004003 -00000000 -4afb8ccf -ffffffff -00090001 -00000000 -ffe20000 -ffffffff -00040001 -08000000 -00080000 -fffc0000 -f0100000 -ffffffff -f8200000 -ffffffff -00400001 -00010000 -0100000a -00000000 -01fffff8 -00000000 -04000001 -00000010 -07fffff0 -00000000 -76666667 -66666666 -20000001 -10000000 -40000000 -ffffffc0 -80000005 -00000000 -00000008 -00000001 -fffffffb -00000001 -fffffffe -00000003 -ffffffe0 -00000007 -4afb0ccf -0000000f -fc000000 -0000001f -00000000 -ffff0040 -55555556 -555555d5 -00000201 -00000100 -fff00000 -000001ff -00000001 -40000400 -00000000 -f0000800 -00000001 -08001000 -00000000 -e0002000 -00000001 -00005000 -00000001 -01008000 -55555557 -55565555 -00000004 -00020000 -00000001 -000c0000 -00000001 -00080000 -00001001 -00100000 -00000003 -00200000 -b504f335 -00400000 -00000000 -007ffff0 -00000001 -09000000 -00000001 -02000004 -55555557 -59555555 -01000001 -08000000 -55555556 -65555555 -00000005 -20000000 -00000021 -40000000 -aaaaaaab -aaaaabaa -88888889 -88888888 -4afb0cd5 -ffffffff -fffffff0 -ffffffff -00000030 -00000000 -b504f433 -00000000 -00000400 -00000000 -00002000 -fffffe00 -00007fc0 -00000000 -00010000 -fffffffc -00020000 -fffffff8 -00040001 -00000040 -99a9999b -99999999 -00800000 -ffffff80 -02000001 -00080000 -b2aaaaab -aaaaaaaa -44000001 -00000000 -7ff80000 -00000000 -04000001 -00000001 -cccccccd -ccccccec -00000002 -00000040 -fffffffd -000001ff -00000001 -00080400 -00000000 -00000000 -fffffc00 -0003ffff -00000000 -000ff800 -00800001 -00200000 -01000001 -02000000 -00000001 -20200000 -4afb0cca -ffffffff -ffffff78 -ffffffff -00000300 -00000000 -fffffdef -ffffffff -fffffbff -ffbfffff -fffff7ff -feffffff -ffffeffd -ffffffff -ffffe000 -0000ffff -ffffc000 -000003ff -1fff0000 -00000000 -fffe0000 -00ffffff -9995999a -99999999 -fff80000 -7fffffff -ffc00005 -ffffffff -b484f331 -00000000 -bfffffff -ffffdfff -ffffffff -fbfffffb -04000000 -fffffff8 -fffffff9 -ffffffdf -00010000 -fffffe00 -ffffffff -ffffefff -55555554 -55554555 -b504f332 -ffff8000 -00400000 -ffe00000 -fffffeff -ffbfffff -00000020 -ff800000 -00000400 -ff000000 -feffffff -fdffffff -00000800 -f8000000 -fff7ffff -bfffffff -aaaaaaa6 -aaaaaaaa -00000000 -00000000 -aaaaaaae -aaaaaaaa -55555559 -55555555 -fffffffe -ffffffff -ccccccd0 -cccccccc -9999999d -99999999 -b504f336 -00000000 -4afb0cd0 -ffffffff -00000001 -00000000 -aaaaaaaf -aaaaaaaa -00000003 -00000000 -ffffffff -ffffffff -ccccccd1 -cccccccc -9999999e -99999999 -4afb0cd1 -ffffffff -aaaaaaad -aaaaaaaa -55555558 -55555555 -fffffffd -ffffffff -cccccccf -cccccccc -9999999c -99999999 -b504f335 -00000000 -4afb0ccf -ffffffff -55555552 -55555555 -00000000 -00000000 -aaaaaaab -aaaaaaaa -55555550 -55555555 -22222222 -22222222 -eeeeeeef -eeeeeeee -0a5a4888 -55555556 -a0506222 -55555554 -55555553 -55555555 -00000001 -00000000 -55555555 -55555555 -55555551 -55555555 -22222223 -22222222 -eeeeeef0 -eeeeeeee -a0506223 -55555554 -ffffffff -ffffffff -aaaaaaaa -aaaaaaaa -5555554f -55555555 -22222221 -22222222 -eeeeeeee -eeeeeeee -0a5a4887 -55555556 -a0506221 -55555554 -aaaaaaa7 -aaaaaaaa -55555555 -55555555 -00000000 -00000000 -aaaaaaa5 -aaaaaaaa -77777777 -77777777 -44444444 -44444444 -5faf9ddd -aaaaaaab -f5a5b777 -aaaaaaa9 -aaaaaaa8 -aaaaaaaa -55555556 -55555555 -aaaaaaaa -aaaaaaaa -77777778 -77777777 -44444445 -44444444 -f5a5b778 -aaaaaaa9 -55555554 -55555555 -ffffffff -ffffffff -aaaaaaa4 -aaaaaaaa -77777776 -77777777 -44444443 -44444444 -5faf9ddc -aaaaaaab -f5a5b776 -aaaaaaa9 -00000002 -00000000 -aaaaaab0 -aaaaaaaa -5555555b -55555555 -00000000 -00000000 -ccccccd2 -cccccccc -9999999f -99999999 -b504f338 -00000000 -4afb0cd2 -ffffffff -00000003 -00000000 -aaaaaab1 -aaaaaaaa -00000005 -00000000 -00000001 -00000000 -ccccccd3 -cccccccc -999999a0 -99999999 -4afb0cd3 -ffffffff -aaaaaaaf -aaaaaaaa -5555555a -55555555 -ffffffff -ffffffff -ccccccd1 -cccccccc -9999999e -99999999 -b504f337 -00000000 -4afb0cd1 -ffffffff -33333330 -33333333 -ddddddde -dddddddd -3333332e -33333333 -00000000 -00000000 -cccccccd -cccccccc -e8382666 -33333333 -7e2e4000 -33333332 -33333331 -33333333 -dddddddf -dddddddd -33333333 -33333333 -3333332f -33333333 -00000001 -00000000 -ccccccce -cccccccc -7e2e4001 -33333332 -dddddddd -dddddddd -88888888 -88888888 -3333332d -33333333 -ffffffff -ffffffff -cccccccc -cccccccc -e8382665 -33333333 -7e2e3fff -33333332 -66666663 -66666666 -11111111 -11111111 -bbbbbbbc -bbbbbbbb -66666661 -66666666 -33333333 -33333333 -00000000 -00000000 -1b6b5999 -66666667 -b1617333 -66666665 -66666664 -66666666 -11111112 -11111111 -66666666 -66666666 -66666662 -66666666 -33333334 -33333333 -00000001 -00000000 -b1617334 -66666665 -11111110 -11111111 -bbbbbbbb -bbbbbbbb -66666660 -66666666 -33333332 -33333333 -ffffffff -ffffffff -1b6b5998 -66666667 -b1617332 -66666665 -4afb0cca -ffffffff -f5a5b778 -aaaaaaa9 -a0506223 -55555554 -4afb0cc8 -ffffffff -17c7d99a -cccccccc -e494a667 -99999998 -00000000 -00000000 -95f6199a -fffffffe -4afb0ccb -ffffffff -f5a5b779 -aaaaaaa9 -4afb0ccd -ffffffff -4afb0cc9 -ffffffff -17c7d99b -cccccccc -e494a668 -99999998 -95f6199b -fffffffe -f5a5b777 -aaaaaaa9 -a0506222 -55555554 -4afb0cc7 -ffffffff -17c7d999 -cccccccc -e494a666 -99999998 -ffffffff -ffffffff -95f61999 -fffffffe -b504f330 -00000000 -5faf9dde -aaaaaaab -0a5a4889 -55555556 -b504f32e -00000000 -81d1c000 -cccccccd -4e9e8ccd -9999999a -6a09e666 -00000001 -00000000 -00000000 -b504f331 -00000000 -5faf9ddf -aaaaaaab -b504f333 -00000000 -b504f32f -00000000 -81d1c001 -cccccccd -4e9e8cce -9999999a -00000001 -00000000 -5faf9ddd -aaaaaaab -0a5a4888 -55555556 -b504f32d -00000000 -81d1bfff -cccccccd -4e9e8ccc -9999999a -6a09e665 -00000001 -ffffffff -ffffffff -ffffffff -ffffffff -aaaaaaad -aaaaaaaa -55555558 -55555555 -fffffffd -ffffffff -cccccccf -cccccccc -9999999c -99999999 -b504f335 -00000000 -4afb0ccf -ffffffff -00000000 -00000000 -aaaaaaae -aaaaaaaa -00000002 -00000000 -fffffffe -ffffffff -ccccccd0 -cccccccc -9999999d -99999999 -4afb0cd0 -ffffffff -aaaaaaac -aaaaaaaa -55555557 -55555555 -fffffffc -ffffffff -ccccccce -cccccccc -9999999b -99999999 -b504f334 -00000000 -4afb0cce -ffffffff -55555551 -55555555 -ffffffff -ffffffff -aaaaaaaa -aaaaaaaa -5555554f -55555555 -22222221 -22222222 -eeeeeeee -eeeeeeee -0a5a4887 -55555556 -a0506221 -55555554 -55555552 -55555555 -00000000 -00000000 -55555554 -55555555 -55555550 -55555555 -22222222 -22222222 -eeeeeeef -eeeeeeee -a0506222 -55555554 -fffffffe -ffffffff -aaaaaaa9 -aaaaaaaa -5555554e -55555555 -22222220 -22222222 -eeeeeeed -eeeeeeee -0a5a4886 -55555556 -a0506220 -55555554 -fffffffd -ffffffff -aaaaaaab -aaaaaaaa -55555556 -55555555 -fffffffb -ffffffff -cccccccd -cccccccc -9999999a -99999999 -b504f333 -00000000 -4afb0ccd -ffffffff -fffffffe -ffffffff -5555555a -55555555 -ffffffff -ffffffff -ccccccd1 -cccccccc -9999999e -99999999 -b504f337 -00000000 -4afb0cd1 -ffffffff -00000002 -00000000 -aaaaaab0 -aaaaaaaa -00000004 -00000000 -00000000 -00000000 -ccccccd2 -cccccccc -9999999f -99999999 -4afb0cd2 -ffffffff -aaaaaaae -aaaaaaaa -55555559 -55555555 -fffffffe -ffffffff -ccccccd0 -cccccccc -9999999d -99999999 -b504f336 -00000000 -4afb0cd0 -ffffffff -3333332f -33333333 -dddddddd -dddddddd -88888888 -88888888 -3333332d -33333333 -ffffffff -ffffffff -cccccccc -cccccccc -e8382665 -33333333 -7e2e3fff -33333332 -33333330 -33333333 -ddddddde -dddddddd -33333332 -33333333 -3333332e -33333333 -00000000 -00000000 -cccccccd -cccccccc -7e2e4000 -33333332 -dddddddc -dddddddd -88888887 -88888888 -3333332c -33333333 -fffffffe -ffffffff -cccccccb -cccccccc -e8382664 -33333333 -7e2e3ffe -33333332 -66666662 -66666666 -11111110 -11111111 -bbbbbbbb -bbbbbbbb -66666660 -66666666 -33333332 -33333333 -ffffffff -ffffffff -1b6b5998 -66666667 -b1617332 -66666665 -66666663 -66666666 -11111111 -11111111 -66666665 -66666666 -66666661 -66666666 -33333333 -33333333 -00000000 -00000000 -b1617333 -66666665 -1111110f -11111111 -bbbbbbba -bbbbbbbb -6666665f -66666666 -33333331 -33333333 -fffffffe -ffffffff -1b6b5997 -66666667 -b1617331 -66666665 -b504f32f -00000000 -5faf9ddd -aaaaaaab -0a5a4888 -55555556 -b504f32d -00000000 -81d1bfff -cccccccd -4e9e8ccc -9999999a -6a09e665 -00000001 -ffffffff -ffffffff -b504f330 -00000000 -5faf9dde -aaaaaaab -b504f332 -00000000 -b504f32e -00000000 -81d1c000 -cccccccd -4e9e8ccd -9999999a -00000000 -00000000 -5faf9ddc -aaaaaaab -0a5a4887 -55555556 -b504f32c -00000000 -81d1bffe -cccccccd -4e9e8ccb -9999999a -6a09e664 -00000001 -fffffffe -ffffffff -55555553 -55555555 -00000001 -00000000 -aaaaaaac -aaaaaaaa -55555551 -55555555 -22222223 -22222222 -eeeeeef0 -eeeeeeee -0a5a4889 -55555556 -a0506223 -55555554 -55555554 -55555555 -00000002 -00000000 -55555556 -55555555 -55555552 -55555555 -22222224 -22222222 -eeeeeef1 -eeeeeeee -a0506224 -55555554 -00000000 -00000000 -aaaaaaab -aaaaaaaa -55555550 -55555555 -22222222 -22222222 -eeeeeeef -eeeeeeee -0a5a4888 -55555556 -a0506222 -55555554 -aaaaaaa8 -aaaaaaaa -55555556 -55555555 -00000001 -00000000 -aaaaaaa6 -aaaaaaaa -77777778 -77777777 -44444445 -44444444 -5faf9dde -aaaaaaab -f5a5b778 -aaaaaaa9 -aaaaaaa9 -aaaaaaaa -55555557 -55555555 -aaaaaaab -aaaaaaaa -aaaaaaa7 -aaaaaaaa -77777779 -77777777 -44444446 -44444444 -f5a5b779 -aaaaaaa9 -55555555 -55555555 -00000000 -00000000 -aaaaaaa5 -aaaaaaaa -77777777 -77777777 -44444444 -44444444 -5faf9ddd -aaaaaaab -f5a5b777 -aaaaaaa9 -00000003 -00000000 -aaaaaab1 -aaaaaaaa -5555555c -55555555 -00000001 -00000000 -ccccccd3 -cccccccc -999999a0 -99999999 -b504f339 -00000000 -4afb0cd3 -ffffffff -00000004 -00000000 -aaaaaab2 -aaaaaaaa -00000006 -00000000 -00000002 -00000000 -ccccccd4 -cccccccc -999999a1 -99999999 -4afb0cd4 -ffffffff -aaaaaab0 -aaaaaaaa -5555555b -55555555 -00000000 -00000000 -ccccccd2 -cccccccc -9999999f -99999999 -b504f338 -00000000 -4afb0cd2 -ffffffff -33333331 -33333333 -dddddddf -dddddddd -8888888a -88888888 -3333332f -33333333 -00000001 -00000000 -ccccccce -cccccccc -e8382667 -33333333 -7e2e4001 -33333332 -33333332 -33333333 -dddddde0 -dddddddd -33333334 -33333333 -33333330 -33333333 -00000002 -00000000 -cccccccf -cccccccc -7e2e4002 -33333332 -ddddddde -dddddddd -88888889 -88888888 -3333332e -33333333 -00000000 -00000000 -cccccccd -cccccccc -e8382666 -33333333 -7e2e4000 -33333332 -66666664 -66666666 -11111112 -11111111 -bbbbbbbd -bbbbbbbb -66666662 -66666666 -33333334 -33333333 -00000001 -00000000 -1b6b599a -66666667 -b1617334 -66666665 -66666665 -66666666 -11111113 -11111111 -66666667 -66666666 -66666663 -66666666 -33333335 -33333333 -00000002 -00000000 -b1617335 -66666665 -11111111 -11111111 -bbbbbbbc -bbbbbbbb -66666661 -66666666 -33333333 -33333333 -00000000 -00000000 -1b6b5999 -66666667 -b1617333 -66666665 -4afb0ccb -ffffffff -f5a5b779 -aaaaaaa9 -a0506224 -55555554 -4afb0cc9 -ffffffff -17c7d99b -cccccccc -e494a668 -99999998 -00000001 -00000000 -95f6199b -fffffffe -4afb0ccc -ffffffff -f5a5b77a -aaaaaaa9 -4afb0cce -ffffffff -4afb0cca -ffffffff -17c7d99c -cccccccc -e494a669 -99999998 -95f6199c -fffffffe -f5a5b778 -aaaaaaa9 -a0506223 -55555554 -4afb0cc8 -ffffffff -17c7d99a -cccccccc -e494a667 -99999998 -00000000 -00000000 -95f6199a -fffffffe -b504f331 -00000000 -5faf9ddf -aaaaaaab -0a5a488a -55555556 -b504f32f -00000000 -81d1c001 -cccccccd -4e9e8cce -9999999a -6a09e667 -00000001 -00000001 -00000000 -b504f332 -00000000 -5faf9de0 -aaaaaaab -b504f334 -00000000 -b504f330 -00000000 -81d1c002 -cccccccd -4e9e8ccf -9999999a -00000002 -00000000 -5faf9dde -aaaaaaab -0a5a4889 -55555556 -b504f32e -00000000 -81d1c000 -cccccccd -4e9e8ccd -9999999a -6a09e666 -00000001 -00000000 -00000000 -aaaaaaac -aaaaaaaa -00000000 -00000000 -fffffffc -ffffffff -ccccccce -cccccccc -9999999b -99999999 -4afb0cce -ffffffff -aaaaaaaa -aaaaaaaa -55555555 -55555555 -fffffffa -ffffffff -cccccccc -cccccccc -99999999 -99999999 -b504f332 -00000000 -4afb0ccc -ffffffff -00000001 -00000000 -aaaaaaaf -aaaaaaaa -00000000 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/csubw-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/csubw-01.reference_output deleted file mode 100644 index 4881ba833..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/csubw-01.reference_output +++ /dev/null @@ -1,1340 +0,0 @@ -ffffffff -ffffffff -00000000 -00000000 -00400001 -00000000 -33333333 -00000000 -fffff000 -ffffffff -00000001 -00000000 -aaaaaaaa -ffffffff -00000002 -00000000 -fffffffe -ffffffff -33333330 -00000000 -fffffff9 -ffffffff -fffffff9 -ffffffff -fff7ffdf -ffffffff -ffdfffbf -ffffffff -001fff80 -00000000 -00003f00 -00000000 -fffffdef -ffffffff -fffffc00 -ffffffff -ffffe7ff -ffffffff -ffffdbff -ffffffff -55551556 -00000000 -ffef7fff -ffffffff -aaa9aaaa -ffffffff -fffdffff -ffffffff -fffc0000 -ffffffff -fff90000 -ffffffff -fff00000 -ffffffff -ffe00000 -ffffffff -07c00000 -00000000 -ff77ffff -ffffffff -ff000004 -ffffffff -fe002000 -ffffffff -fc000000 -ffffffff -f7ffffff -ffffffff -10000000 -00000000 -dfffffff -ffffffff -26666667 -00000000 -7fffffff -00000000 -ffff7fff -ffffffff -00000000 -00000000 -aaaaaaab -ffffffff -00001000 -00000000 -ffffffff -ffffffff -00000001 -00000000 -00000000 -00000000 -00020000 -00000000 -00000000 -00000000 -00000000 -00000000 -ffffffff -ffffffff -00000003 -00000000 -ffffffff -ffffffff -00000000 -00000000 -00000000 -00000000 -ffffffff -ffffffff -00000000 -00000000 -00000400 -00000000 -ffffffff -ffffffff -fffffdff -ffffffff -33333333 -00000000 -00000000 -00000000 -33333334 -00000000 -fffffffd -ffffffff -00040000 -00000000 -b504f334 -ffffffff -00000000 -00000000 -00000007 -00000000 -00000000 -00000000 -ffffffff -ffffffff -ffffffff -ffffffff -4afb0cd0 -00000000 -33333337 -00000000 -00000005 -00000000 -00000008 -00000000 -0000000c -00000000 -00000021 -00000000 -00000041 -00000000 -40000081 -00000000 -00000104 -00000000 -66666867 -00000000 -00000400 -00000000 -00000802 -00000000 -00001011 -00000000 -66668667 -00000000 -00003000 -00000000 -ff808000 -ffffffff -40010001 -00000000 -0002000a -00000000 -00040401 -00000000 -00080001 -00000000 -00100001 -00000000 -00200001 -00000000 -00400001 -00000000 -55d55555 -00000000 -00fffffa -00000000 -01fffffa -00000000 -04000001 -00000000 -88000001 -ffffffff -0ffffffa -00000000 -20000000 -00000000 -40000003 -00000000 -80000011 -ffffffff -f0000000 -ffffffff -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -ffff0000 -ffffffff -00000021 -00000000 -ffffffc0 -ffffffff -00000007 -00000000 -fffe0000 -ffffffff -c0000000 -ffffffff -00000001 -00000000 -00000000 -00000000 -fffffff0 -ffffffff -00000000 -00000000 -e0000000 -ffffffff -00001001 -00000000 -fffffff0 -ffffffff -00001001 -00000000 -00000001 -00000000 -00000007 -00000000 -00000000 -00000000 -00000000 -00000000 -00040001 -00000000 -00000000 -00000000 -0000000a -00000000 -80000000 -ffffffff -00000007 -00000000 -00000001 -00000000 -ff800000 -ffffffff -5555554c -00000000 -fffff008 -ffffffff -00000040 -00000000 -fc000080 -ffffffff -80000100 -ffffffff -000001fc -00000000 -fffc0800 -ffffffff -00010001 -00000000 -00080001 -00000000 -00100801 -00000000 -00800001 -00000000 -01000008 -00000000 -02000004 -00000000 -04000001 -00000000 -c504f332 -ffffffff -ffffffff -ffffffff -00020001 -00000000 -20000001 -00000000 -4afb0ccc -00000000 -80000000 -ffffffff -fffffffb -ffffffff -04000001 -00000000 -00000004 -00000000 -00100001 -00000000 -c0000000 -ffffffff -00000000 -00000000 -00000001 -00000000 -00000001 -00000000 -fffffffb -ffffffff -fffffff7 -ffffffff -ffffffdf -ffffffff -b504f2b1 -ffffffff -7ffffeff -00000000 -fffff7fd -ffffffff -ffffdfff -ffffffff -ffffbeff -ffffffff -00000000 -00000000 -ffb7ffff -ffffffff -03000000 -00000000 -f9ffffff -ffffffff -fbffffff -ffffffff -f7fffffb -ffffffff -ffffffff -ffffffff -80000000 -ffffffff -80000000 -ffffffff -fffffffe -ffffffff -00000000 -00000000 -ffffffff -ffffffff -20000000 -00000000 -02000000 -00000000 -b504f332 -ffffffff -ffffffff -ffffffff -aaaaaaab -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -40000000 -00000000 -55555555 -00000000 -00000000 -00000000 -aaaaaaae -ffffffff -55555559 -00000000 -fffffffe -ffffffff -ccccccd0 -ffffffff -9999999d -ffffffff -b504f336 -ffffffff -4afb0cd0 -00000000 -00000001 -00000000 -aaaaaaaf -ffffffff -00000003 -00000000 -ffffffff -ffffffff -ccccccd1 -ffffffff -9999999e -ffffffff -4afb0cd1 -00000000 -aaaaaaad -ffffffff -55555558 -00000000 -fffffffd -ffffffff -cccccccf -ffffffff -9999999c -ffffffff -b504f335 -ffffffff -4afb0ccf -00000000 -55555552 -00000000 -00000000 -00000000 -aaaaaaab -ffffffff -55555550 -00000000 -22222222 -00000000 -eeeeeeef -ffffffff -0a5a4888 -00000000 -a0506222 -ffffffff -55555553 -00000000 -00000001 -00000000 -55555555 -00000000 -55555551 -00000000 -22222223 -00000000 -eeeeeef0 -ffffffff -a0506223 -ffffffff -ffffffff -ffffffff -aaaaaaaa -ffffffff -5555554f -00000000 -22222221 -00000000 -eeeeeeee -ffffffff -0a5a4887 -00000000 -a0506221 -ffffffff -aaaaaaa7 -ffffffff -55555555 -00000000 -00000000 -00000000 -aaaaaaa5 -ffffffff -77777777 -00000000 -44444444 -00000000 -5faf9ddd -00000000 -f5a5b777 -ffffffff -aaaaaaa8 -ffffffff -55555556 -00000000 -aaaaaaaa -ffffffff -aaaaaaa6 -ffffffff -77777778 -00000000 -44444445 -00000000 -f5a5b778 -ffffffff -55555554 -00000000 -ffffffff -ffffffff -aaaaaaa4 -ffffffff -77777776 -00000000 -44444443 -00000000 -5faf9ddc -00000000 -f5a5b776 -ffffffff -00000002 -00000000 -aaaaaab0 -ffffffff -5555555b -00000000 -00000000 -00000000 -ccccccd2 -ffffffff -9999999f -ffffffff -b504f338 -ffffffff -4afb0cd2 -00000000 -00000003 -00000000 -aaaaaab1 -ffffffff -00000005 -00000000 -00000001 -00000000 -ccccccd3 -ffffffff -999999a0 -ffffffff -4afb0cd3 -00000000 -aaaaaaaf -ffffffff -5555555a -00000000 -ffffffff -ffffffff -ccccccd1 -ffffffff -9999999e -ffffffff -b504f337 -ffffffff -4afb0cd1 -00000000 -33333330 -00000000 -ddddddde -ffffffff -88888889 -ffffffff -3333332e -00000000 -00000000 -00000000 -cccccccd -ffffffff -e8382666 -ffffffff -7e2e4000 -00000000 -33333331 -00000000 -dddddddf -ffffffff -33333333 -00000000 -3333332f -00000000 -00000001 -00000000 -ccccccce -ffffffff -7e2e4001 -00000000 -dddddddd -ffffffff -88888888 -ffffffff -3333332d -00000000 -ffffffff -ffffffff -cccccccc -ffffffff -e8382665 -ffffffff -7e2e3fff -00000000 -66666663 -00000000 -11111111 -00000000 -bbbbbbbc -ffffffff -66666661 -00000000 -33333333 -00000000 -00000000 -00000000 -1b6b5999 -00000000 -b1617333 -ffffffff -66666664 -00000000 -11111112 -00000000 -66666666 -00000000 -66666662 -00000000 -33333334 -00000000 -00000001 -00000000 -b1617334 -ffffffff -11111110 -00000000 -bbbbbbbb -ffffffff -66666660 -00000000 -33333332 -00000000 -ffffffff -ffffffff -1b6b5998 -00000000 -b1617332 -ffffffff -4afb0cca -00000000 -f5a5b778 -ffffffff -a0506223 -ffffffff -4afb0cc8 -00000000 -17c7d99a -00000000 -e494a667 -ffffffff -00000000 -00000000 -95f6199a -ffffffff -4afb0ccb -00000000 -f5a5b779 -ffffffff -4afb0ccd -00000000 -4afb0cc9 -00000000 -17c7d99b -00000000 -e494a668 -ffffffff -95f6199b -ffffffff -f5a5b777 -ffffffff -a0506222 -ffffffff -4afb0cc7 -00000000 -17c7d999 -00000000 -e494a666 -ffffffff -ffffffff -ffffffff -95f61999 -ffffffff -b504f330 -ffffffff -5faf9dde -00000000 -0a5a4889 -00000000 -b504f32e -ffffffff -81d1c000 -ffffffff -4e9e8ccd -00000000 -6a09e666 -00000000 -00000000 -00000000 -b504f331 -ffffffff -5faf9ddf -00000000 -b504f333 -ffffffff -b504f32f -ffffffff -81d1c001 -ffffffff -4e9e8cce -00000000 -00000001 -00000000 -5faf9ddd -00000000 -0a5a4888 -00000000 -b504f32d -ffffffff -81d1bfff -ffffffff -4e9e8ccc -00000000 -6a09e665 -00000000 -ffffffff -ffffffff -ffffffff -ffffffff -aaaaaaad -ffffffff -55555558 -00000000 -fffffffd -ffffffff -cccccccf -ffffffff -9999999c -ffffffff -b504f335 -ffffffff -4afb0ccf -00000000 -00000000 -00000000 -aaaaaaae -ffffffff -00000002 -00000000 -fffffffe -ffffffff -ccccccd0 -ffffffff -9999999d -ffffffff -4afb0cd0 -00000000 -aaaaaaac -ffffffff -55555557 -00000000 -fffffffc -ffffffff -ccccccce -ffffffff -9999999b -ffffffff -b504f334 -ffffffff -4afb0cce -00000000 -55555551 -00000000 -ffffffff -ffffffff -aaaaaaaa -ffffffff -5555554f -00000000 -22222221 -00000000 -eeeeeeee -ffffffff -0a5a4887 -00000000 -a0506221 -ffffffff -55555552 -00000000 -00000000 -00000000 -55555554 -00000000 -55555550 -00000000 -22222222 -00000000 -eeeeeeef -ffffffff -a0506222 -ffffffff -fffffffe -ffffffff -aaaaaaa9 -ffffffff -5555554e -00000000 -22222220 -00000000 -eeeeeeed -ffffffff -0a5a4886 -00000000 -a0506220 -ffffffff -fffffffd -ffffffff -aaaaaaab -ffffffff -55555556 -00000000 -fffffffb -ffffffff -cccccccd -ffffffff -9999999a -ffffffff -b504f333 -ffffffff -4afb0ccd -00000000 -5555555a -00000000 -ffffffff -ffffffff -ccccccd1 -ffffffff -9999999e -ffffffff -b504f337 -ffffffff -4afb0cd1 -00000000 -00000002 -00000000 -aaaaaab0 -ffffffff -00000004 -00000000 -00000000 -00000000 -ccccccd2 -ffffffff -9999999f -ffffffff -4afb0cd2 -00000000 -aaaaaaae -ffffffff -55555559 -00000000 -fffffffe -ffffffff -ccccccd0 -ffffffff -9999999d -ffffffff -b504f336 -ffffffff -4afb0cd0 -00000000 -3333332f -00000000 -dddddddd -ffffffff -88888888 -ffffffff -3333332d -00000000 -ffffffff -ffffffff -cccccccc -ffffffff -e8382665 -ffffffff -7e2e3fff -00000000 -33333330 -00000000 -ddddddde -ffffffff -33333332 -00000000 -3333332e -00000000 -00000000 -00000000 -cccccccd -ffffffff -7e2e4000 -00000000 -dddddddc -ffffffff -88888887 -ffffffff -3333332c -00000000 -fffffffe -ffffffff -cccccccb -ffffffff -e8382664 -ffffffff -7e2e3ffe -00000000 -66666662 -00000000 -11111110 -00000000 -bbbbbbbb -ffffffff -66666660 -00000000 -33333332 -00000000 -ffffffff -ffffffff -1b6b5998 -00000000 -b1617332 -ffffffff -66666663 -00000000 -11111111 -00000000 -66666665 -00000000 -66666661 -00000000 -33333333 -00000000 -00000000 -00000000 -b1617333 -ffffffff -1111110f -00000000 -bbbbbbba -ffffffff -6666665f -00000000 -33333331 -00000000 -fffffffe -ffffffff -1b6b5997 -00000000 -b1617331 -ffffffff -b504f32f -ffffffff -5faf9ddd -00000000 -0a5a4888 -00000000 -b504f32d -ffffffff -81d1bfff -ffffffff -4e9e8ccc -00000000 -6a09e665 -00000000 -ffffffff -ffffffff -b504f330 -ffffffff -5faf9dde -00000000 -b504f332 -ffffffff -b504f32e -ffffffff -81d1c000 -ffffffff -4e9e8ccd -00000000 -00000000 -00000000 -5faf9ddc -00000000 -0a5a4887 -00000000 -b504f32c -ffffffff -81d1bffe -ffffffff -4e9e8ccb -00000000 -6a09e664 -00000000 -fffffffe -ffffffff -55555553 -00000000 -00000001 -00000000 -aaaaaaac -ffffffff -55555551 -00000000 -22222223 -00000000 -eeeeeef0 -ffffffff -0a5a4889 -00000000 -a0506223 -ffffffff -55555554 -00000000 -00000002 -00000000 -55555556 -00000000 -55555552 -00000000 -22222224 -00000000 -eeeeeef1 -ffffffff -a0506224 -ffffffff -00000000 -00000000 -aaaaaaab -ffffffff -55555550 -00000000 -22222222 -00000000 -eeeeeeef -ffffffff -0a5a4888 -00000000 -a0506222 -ffffffff -aaaaaaa8 -ffffffff -55555556 -00000000 -00000001 -00000000 -aaaaaaa6 -ffffffff -77777778 -00000000 -44444445 -00000000 -5faf9dde -00000000 -f5a5b778 -ffffffff -aaaaaaa9 -ffffffff -55555557 -00000000 -aaaaaaab -ffffffff -aaaaaaa7 -ffffffff -77777779 -00000000 -44444446 -00000000 -f5a5b779 -ffffffff -55555555 -00000000 -00000000 -00000000 -aaaaaaa5 -ffffffff -77777777 -00000000 -44444444 -00000000 -5faf9ddd -00000000 -f5a5b777 -ffffffff -00000003 -00000000 -aaaaaab1 -ffffffff -5555555c -00000000 -00000001 -00000000 -ccccccd3 -ffffffff -999999a0 -ffffffff -b504f339 -ffffffff -4afb0cd3 -00000000 -00000004 -00000000 -aaaaaab2 -ffffffff -00000006 -00000000 -00000002 -00000000 -ccccccd4 -ffffffff -999999a1 -ffffffff -4afb0cd4 -00000000 -aaaaaab0 -ffffffff -5555555b -00000000 -00000000 -00000000 -ccccccd2 -ffffffff -9999999f -ffffffff -b504f338 -ffffffff -4afb0cd2 -00000000 -33333331 -00000000 -dddddddf -ffffffff -8888888a -ffffffff -3333332f -00000000 -00000001 -00000000 -ccccccce -ffffffff -e8382667 -ffffffff -7e2e4001 -00000000 -33333332 -00000000 -dddddde0 -ffffffff -33333334 -00000000 -00000002 -00000000 -cccccccf -ffffffff -7e2e4002 -00000000 -ddddddde -ffffffff -88888889 -ffffffff -3333332e -00000000 -00000000 -00000000 -cccccccd -ffffffff -e8382666 -ffffffff -7e2e4000 -00000000 -66666664 -00000000 -11111112 -00000000 -bbbbbbbd -ffffffff -66666662 -00000000 -33333334 -00000000 -00000001 -00000000 -1b6b599a -00000000 -b1617334 -ffffffff -66666665 -00000000 -11111113 -00000000 -66666667 -00000000 -66666663 -00000000 -33333335 -00000000 -00000002 -00000000 -b1617335 -ffffffff -11111111 -00000000 -bbbbbbbc -ffffffff -66666661 -00000000 -33333333 -00000000 -00000000 -00000000 -1b6b5999 -00000000 -b1617333 -ffffffff -4afb0ccb -00000000 -f5a5b779 -ffffffff -a0506224 -ffffffff -4afb0cc9 -00000000 -17c7d99b -00000000 -e494a668 -ffffffff -00000001 -00000000 -95f6199b -ffffffff -4afb0ccc -00000000 -f5a5b77a -ffffffff -4afb0cce -00000000 -4afb0cca -00000000 -17c7d99c -00000000 -e494a669 -ffffffff -95f6199c -ffffffff -f5a5b778 -ffffffff -a0506223 -ffffffff -4afb0cc8 -00000000 -17c7d99a -00000000 -e494a667 -ffffffff -00000000 -00000000 -95f6199a -ffffffff -b504f331 -ffffffff -5faf9ddf -00000000 -0a5a488a -00000000 -b504f32f -ffffffff -81d1c001 -ffffffff -4e9e8cce -00000000 -6a09e667 -00000000 -00000001 -00000000 -b504f332 -ffffffff -5faf9de0 -00000000 -b504f334 -ffffffff -b504f330 -ffffffff -81d1c002 -ffffffff -4e9e8ccf -00000000 -00000002 -00000000 -5faf9dde -00000000 -0a5a4889 -00000000 -b504f32e -ffffffff -81d1c000 -ffffffff -4e9e8ccd -00000000 -6a09e666 -00000000 -00000000 -00000000 -fffffffe -ffffffff -aaaaaaac -ffffffff -00000000 -00000000 -fffffffc -ffffffff -ccccccce -ffffffff -9999999b -ffffffff -4afb0cce -00000000 -aaaaaaaa -ffffffff -55555555 -00000000 -fffffffa -ffffffff -cccccccc -ffffffff -99999999 -ffffffff -b504f332 -ffffffff -4afb0ccc -00000000 -00000001 -00000000 -aaaaaaaf -ffffffff diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/csw-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/csw-01.reference_output deleted file mode 100644 index 1af6353b8..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/csw-01.reference_output +++ /dev/null @@ -1,264 +0,0 @@ -00000000 -deadbeef -00000000 -deadbeef -ffffffff -deadbeef -00000001 -deadbeef -ffffffff -deadbeef -00000002 -deadbeef -00000004 -deadbeef -00000008 -deadbeef -00000010 -deadbeef -00000020 -deadbeef -00000040 -deadbeef -00000080 -deadbeef -00000100 -deadbeef -00000200 -deadbeef -00000400 -deadbeef -00000800 -deadbeef -00001000 -deadbeef -00002000 -deadbeef -00004000 -deadbeef -00008000 -deadbeef -00010000 -deadbeef -00020000 -deadbeef -00040000 -deadbeef -00080000 -deadbeef -00100000 -deadbeef -00200000 -deadbeef -00400000 -deadbeef -00800000 -deadbeef -01000000 -deadbeef -02000000 -deadbeef -04000000 -deadbeef -08000000 -deadbeef -10000000 -deadbeef -20000000 -deadbeef -40000000 -deadbeef -80000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -fffffffe -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -55555555 -deadbeef -aaaaaaaa -deadbeef -fffffffd -deadbeef -fffffffb -deadbeef -fffffff7 -deadbeef -ffffffef -deadbeef -ffffffdf -deadbeef -ffffffbf -deadbeef -ffffff7f -deadbeef -fffffeff -deadbeef -fffffdff -deadbeef -fffffbff -deadbeef -fffff7ff -deadbeef -ffffefff -deadbeef -ffffdfff -deadbeef -ffffbfff -deadbeef -ffff7fff -deadbeef -fffeffff -deadbeef -fffdffff -deadbeef -fffbffff -deadbeef -fff7ffff -deadbeef -ffefffff -deadbeef -ffdfffff -deadbeef -ffbfffff -deadbeef -ff7fffff -deadbeef -feffffff -deadbeef -fdffffff -deadbeef -fbffffff -deadbeef -f7ffffff -deadbeef -efffffff -deadbeef -dfffffff -deadbeef -bfffffff -deadbeef -7fffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -00000000 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cswsp-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cswsp-01.reference_output deleted file mode 100644 index 825b07e70..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cswsp-01.reference_output +++ /dev/null @@ -1,268 +0,0 @@ -00000000 -deadbeef -00000000 -deadbeef -ffffffff -deadbeef -00000001 -deadbeef -00000009 -deadbeef -00000002 -deadbeef -00000004 -deadbeef -00000008 -deadbeef -00000010 -deadbeef -00000020 -deadbeef -00000040 -deadbeef -00000080 -deadbeef -00000100 -deadbeef -00000200 -deadbeef -00000400 -deadbeef -00000800 -deadbeef -00001000 -deadbeef -00002000 -deadbeef -00004000 -deadbeef -00008000 -deadbeef -00010000 -deadbeef -00020000 -deadbeef -00040000 -deadbeef -00080000 -deadbeef -00100000 -deadbeef -00200000 -deadbeef -00400000 -deadbeef -00800000 -deadbeef -01000000 -deadbeef -02000000 -deadbeef -04000000 -deadbeef -08000000 -deadbeef -10000000 -deadbeef -20000000 -deadbeef -40000000 -deadbeef -80000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -fffffffe -deadbeef -fffffffd -deadbeef -fffffffb -deadbeef -fffffff7 -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -55555555 -deadbeef -aaaaaaaa -deadbeef -00000010 -deadbeef -ffffffef -deadbeef -ffffffdf -deadbeef -ffffffbf -deadbeef -ffffff7f -deadbeef -fffffeff -deadbeef -fffffdff -deadbeef -fffffbff -deadbeef -fffff7ff -deadbeef -ffffefff -deadbeef -ffffdfff -deadbeef -ffffbfff -deadbeef -ffff7fff -deadbeef -fffeffff -deadbeef -fffdffff -deadbeef -fffbffff -deadbeef -fff7ffff -deadbeef -ffefffff -deadbeef -ffdfffff -deadbeef -ffbfffff -deadbeef -ff7fffff -deadbeef -feffffff -deadbeef -fdffffff -deadbeef -fbffffff -deadbeef -f7ffffff -deadbeef -efffffff -deadbeef -dfffffff -deadbeef -bfffffff -deadbeef -7fffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -00000000 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cxor-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cxor-01.reference_output deleted file mode 100644 index 83949081f..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/C/references/cxor-01.reference_output +++ /dev/null @@ -1,1328 +0,0 @@ -fffff7ff -7fffffff -00000000 -00000000 -00008000 -80000000 -fffffffe -fffffdff -00000000 -00000000 -b504f332 -00000000 -00000200 -80000000 -00040001 -00000000 -00000002 -00000020 -66666661 -66666666 -00020008 -00000000 -b504f322 -00000000 -66666647 -66666666 -00100040 -00000000 -ffffff7f -ffffbfff -fffffeff -efffffff -fffffdff -fffffff7 -fffffbff -ffbfffff -00000800 -00000040 -ffffefff -fffeffff -00002000 -00000000 -ffff3fff -ffffffff -00008000 -02000000 -00010000 -20000000 -00020002 -00000000 -20080000 -00000000 -ffafffff -ffffffff -00200000 -00100000 -ffbff7ff -ffffffff -ff7fffff -fdffffff -67666666 -66666666 -02100000 -00000000 -04010000 -00000000 -f7ffffff -feffffff -5afb0ccd -ffffffff -20000000 -00040000 -bfefffff -ffffffff -80000000 -00010000 -00000000 -00020001 -20000000 -00000002 -fffbffff -fffffffb -66666665 -6666666e -00000000 -00000110 -00000080 -00000020 -ffffbfff -ffffffbf -aaaaaaaa -aaaaaa2a -00000000 -00000140 -ffffffff -ffeffdff -feffffff -fffffbff -ffffffff -fffdf7ff -00000000 -02001000 -ffffffff -ffffdffb -aaaaaaaa -aaaaeaaa -00000000 -40008000 -66666667 -66676666 -00000040 -00020000 -00000020 -00040000 -ffffffff -fff7ffff -ffff7fff -ffefffff -ffffff7f -ffdfffff -ffffffff -ffbffff7 -ffffffbf -ff7fffff -00000000 -01080000 -fffff7ff -fdffffff -00040000 -04000000 -ffffff7f -f7ffffff -ffffffff -efffdfff -fffdffff -dfffffff -fdffffff -bfffffff -fffffffe -ffffffdf -ccccccce -cccccccc -00100004 -00000000 -fffff7f7 -ffffffff -00001010 -00000000 -ffffffdf -fffdffff -00000041 -00000000 -00000280 -00000000 -4afb0dcb -ffffffff -ccccc8cc -cccccccc -10000800 -00000000 -ffffefff -ffffffff -ffffdfff -ffffffdf -ffffbff7 -ffffffff -00028000 -00000000 -00010000 -08000000 -02020000 -00000000 -fffbffff -ffffffff -fff7fffb -ffffffff -00000000 -00000000 -00200000 -00000001 -b544f331 -00000000 -00000000 -00000000 -21000000 -00000000 -fdffffff -ff7fffff -fbfffffc -ffffffff -08000000 -00000000 -10000000 -08000000 -dffffeff -ffffffff -40000000 -00000800 -77ffffff -ffffffff -ffbfffff -fffffffe -ffffffff -fbfffffd -ffffffff -ffffffeb -00000000 -00000008 -00000000 -00100010 -ffffffff -ff7fffdf -00004000 -00000040 -ffffffff -ff7fff7f -00000000 -00800100 -ffffffff -fffff9ff -ffffbfff -fffffbff -08000000 -00000800 -00000002 -00001000 -bfffffff -ffffdfff -fffffff9 -ffffbfff -fdffffff -ffff7fff -ffffdfff -fffeffff -00000400 -00020000 -fffdffff -fffbffff -fbffffff -fff7ffff -00000000 -02100000 -ffffffff -ffdfdfff -00000008 -00400000 -00008000 -00800000 -00080000 -01000000 -ffffffff -fdfbffff -ffffffff -fbfdffff -ffffffff -f7bfffff -00000000 -10008000 -fffffdff -dfffffff -00000009 -40000000 -aaaaaaaa -aaaa8aaa -aaaaaaaa -aaaaaaab -55555545 -55555555 -00000400 -00000000 -ffffeff7 -ffffffff -00008000 -00010000 -fff7fff9 -ffffffff -efdfffff -ffffffff -ff7ffff6 -ffffffff -feffffff -ffffffdf -e7ffffff -ffffffff -80000000 -00000010 -fbffffff -fffffffd -ffffffff -7ffffffb -efffffff -fffffff7 -33333334 -333333b3 -fffffffa -fffffdff -ffffffff -fffff3ff -ffffffff -ffffeeff -00000001 -00004000 -00000000 -00008004 -66666665 -66466666 -00000080 -01000000 -01000000 -08000000 -00000400 -10000000 -0000000c -00000000 -00040010 -00000000 -00000024 -00000000 -fffffeff -ffffbfff -ffffdfff -ffffffff -00010000 -00000100 -cceccccc -cccccccc -aeaaaaaa -aaaaaaaa -bfffffff -fffffff7 -7fffffff -fffbffff -ffffffff -fffffffd -fffffffe -ffffffef -ffffffff -fff7ffdf -fffffffb -ffffffbf -00000000 -00000000 -fffffff9 -fffffeff -fffffbff -fffffbff -00000000 -00001100 -00000000 -00040200 -55555555 -555d5555 -ffffffff -ffdfffef -00000000 -04200000 -ffffffff -9fffffff -00000000 -40000800 -55575555 -55555555 -00000000 -00000000 -55555556 -55555555 -aaaaaaa9 -aaaaaaaa -00000006 -00000000 -33333330 -33333333 -66666665 -66666666 -4afb0cce -ffffffff -b504f330 -00000000 -00000001 -00000000 -55555557 -55555555 -00000003 -00000000 -00000007 -00000000 -33333331 -33333333 -66666666 -66666666 -b504f331 -00000000 -55555555 -55555555 -aaaaaaa8 -aaaaaaaa -00000005 -00000000 -33333337 -33333333 -66666664 -66666666 -4afb0ccd -ffffffff -b504f337 -00000000 -55555556 -55555555 -00000000 -00000000 -ffffffff -ffffffff -55555550 -55555555 -66666666 -66666666 -33333333 -33333333 -1fae5998 -aaaaaaaa -e051a666 -55555555 -55555557 -55555555 -00000001 -00000000 -55555555 -55555555 -55555551 -55555555 -66666667 -66666666 -33333330 -33333333 -e051a667 -55555555 -00000003 -00000000 -fffffffe -ffffffff -55555553 -55555555 -66666661 -66666666 -33333332 -33333333 -1fae599b -aaaaaaaa -e051a661 -55555555 -aaaaaaa9 -aaaaaaaa -ffffffff -ffffffff -00000000 -00000000 -aaaaaaaf -aaaaaaaa -99999999 -99999999 -cccccccc -cccccccc -e051a667 -55555555 -1fae5999 -aaaaaaaa -aaaaaaa8 -aaaaaaaa -fffffffe -ffffffff -aaaaaaaa -aaaaaaaa -aaaaaaae -aaaaaaaa -99999998 -99999999 -cccccccf -cccccccc -1fae5998 -aaaaaaaa -fffffffc -ffffffff -00000001 -00000000 -aaaaaaac -aaaaaaaa -9999999e -99999999 -cccccccd -cccccccc -e051a664 -55555555 -1fae599e -aaaaaaaa -00000006 -00000000 -55555550 -55555555 -aaaaaaaf -aaaaaaaa -00000000 -00000000 -33333336 -33333333 -66666663 -66666666 -4afb0cc8 -ffffffff -b504f336 -00000000 -00000007 -00000000 -55555551 -55555555 -00000005 -00000000 -00000001 -00000000 -33333337 -33333333 -66666660 -66666666 -b504f337 -00000000 -55555553 -55555555 -aaaaaaae -aaaaaaaa -00000003 -00000000 -33333331 -33333333 -66666662 -66666666 -4afb0ccb -ffffffff -b504f331 -00000000 -33333330 -33333333 -66666666 -66666666 -99999999 -99999999 -33333336 -33333333 -00000000 -00000000 -55555555 -55555555 -79c83ffe -cccccccc -8637c000 -33333333 -33333331 -33333333 -66666667 -66666666 -33333333 -33333333 -33333337 -33333333 -00000001 -00000000 -55555556 -55555555 -8637c001 -33333333 -66666665 -66666666 -99999998 -99999999 -33333335 -33333333 -00000007 -00000000 -55555554 -55555555 -79c83ffd -cccccccc -8637c007 -33333333 -66666665 -66666666 -33333333 -33333333 -cccccccc -cccccccc -66666663 -66666666 -55555555 -55555555 -00000000 -00000000 -2c9d6aab -99999999 -d3629555 -66666666 -66666664 -66666666 -33333332 -33333333 -66666666 -66666666 -66666662 -66666666 -55555554 -55555555 -00000003 -00000000 -d3629554 -66666666 -33333330 -33333333 -cccccccd -cccccccc -66666660 -66666666 -55555552 -55555555 -00000001 -00000000 -2c9d6aa8 -99999999 -d3629552 -66666666 -4afb0cce -ffffffff -1fae5998 -aaaaaaaa -e051a667 -55555555 -4afb0cc8 -ffffffff -79c83ffe -cccccccc -2c9d6aab -99999999 -00000000 -00000000 -fffffffe -ffffffff -4afb0ccf -ffffffff -1fae5999 -aaaaaaaa -4afb0ccd -ffffffff -4afb0cc9 -ffffffff -79c83fff -cccccccc -2c9d6aa8 -99999999 -ffffffff -ffffffff -1fae599b -aaaaaaaa -e051a666 -55555555 -4afb0ccb -ffffffff -79c83ff9 -cccccccc -2c9d6aaa -99999999 -00000003 -00000000 -fffffff9 -ffffffff -b504f330 -00000000 -e051a666 -55555555 -1fae5999 -aaaaaaaa -b504f336 -00000000 -8637c000 -33333333 -d3629555 -66666666 -fffffffe -ffffffff -00000000 -00000000 -b504f331 -00000000 -e051a667 -55555555 -b504f333 -00000000 -b504f337 -00000000 -8637c001 -33333333 -d3629556 -66666666 -00000001 -00000000 -e051a665 -55555555 -1fae5998 -aaaaaaaa -b504f335 -00000000 -8637c007 -33333333 -d3629554 -66666666 -fffffffd -ffffffff -00000007 -00000000 -00000001 -00000000 -55555557 -55555555 -aaaaaaa8 -aaaaaaaa -00000007 -00000000 -33333331 -33333333 -66666664 -66666666 -4afb0ccf -ffffffff -b504f331 -00000000 -00000000 -00000000 -55555556 -55555555 -00000002 -00000000 -00000006 -00000000 -33333330 -33333333 -66666667 -66666666 -b504f330 -00000000 -55555554 -55555555 -aaaaaaa9 -aaaaaaaa -00000004 -00000000 -33333336 -33333333 -66666665 -66666666 -4afb0ccc -ffffffff -b504f336 -00000000 -55555557 -55555555 -00000001 -00000000 -fffffffe -ffffffff -55555551 -55555555 -66666667 -66666666 -33333332 -33333333 -1fae5999 -aaaaaaaa -e051a667 -55555555 -55555556 -55555555 -00000000 -00000000 -55555554 -55555555 -55555550 -55555555 -66666666 -66666666 -33333331 -33333333 -e051a666 -55555555 -00000002 -00000000 -ffffffff -ffffffff -55555552 -55555555 -66666660 -66666666 -33333333 -33333333 -1fae599a -aaaaaaaa -e051a660 -55555555 -00000003 -00000000 -55555555 -55555555 -aaaaaaaa -aaaaaaaa -00000005 -00000000 -33333333 -33333333 -66666666 -66666666 -4afb0ccd -ffffffff -aaaaaaae -aaaaaaaa -00000001 -00000000 -33333337 -33333333 -66666662 -66666666 -4afb0cc9 -ffffffff -b504f337 -00000000 -00000006 -00000000 -55555550 -55555555 -00000004 -00000000 -00000000 -00000000 -33333336 -33333333 -66666661 -66666666 -b504f336 -00000000 -55555552 -55555555 -aaaaaaaf -aaaaaaaa -00000002 -00000000 -33333330 -33333333 -66666663 -66666666 -4afb0cca -ffffffff -b504f330 -00000000 -33333331 -33333333 -66666667 -66666666 -99999998 -99999999 -33333337 -33333333 -00000001 -00000000 -55555554 -55555555 -79c83fff -cccccccc -8637c001 -33333333 -33333330 -33333333 -66666666 -66666666 -33333332 -33333333 -33333336 -33333333 -00000000 -00000000 -55555557 -55555555 -8637c000 -33333333 -66666664 -66666666 -99999999 -99999999 -33333334 -33333333 -00000006 -00000000 -55555555 -55555555 -79c83ffc -cccccccc -8637c006 -33333333 -66666666 -66666666 -33333330 -33333333 -cccccccf -cccccccc -66666660 -66666666 -55555556 -55555555 -00000003 -00000000 -2c9d6aa8 -99999999 -d3629556 -66666666 -66666667 -66666666 -33333331 -33333333 -66666665 -66666666 -55555557 -55555555 -00000000 -00000000 -d3629557 -66666666 -33333333 -33333333 -ccccccce -cccccccc -66666663 -66666666 -55555551 -55555555 -00000002 -00000000 -2c9d6aab -99999999 -d3629551 -66666666 -b504f331 -00000000 -e051a667 -55555555 -1fae5998 -aaaaaaaa -b504f337 -00000000 -8637c001 -33333333 -d3629554 -66666666 -ffffffff -ffffffff -00000001 -00000000 -b504f330 -00000000 -e051a666 -55555555 -b504f332 -00000000 -b504f336 -00000000 -8637c000 -33333333 -d3629557 -66666666 -00000000 -00000000 -e051a664 -55555555 -1fae5999 -aaaaaaaa -b504f334 -00000000 -8637c006 -33333333 -d3629555 -66666666 -fffffffc -ffffffff -00000006 -00000000 -55555555 -55555555 -00000003 -00000000 -fffffffc -ffffffff -55555553 -55555555 -66666665 -66666666 -33333330 -33333333 -1fae599b -aaaaaaaa -e051a665 -55555555 -55555554 -55555555 -00000002 -00000000 -55555556 -55555555 -55555552 -55555555 -66666664 -66666666 -33333333 -33333333 -e051a664 -55555555 -00000000 -00000000 -fffffffd -ffffffff -55555550 -55555555 -66666662 -66666666 -33333331 -33333333 -1fae5998 -aaaaaaaa -e051a662 -55555555 -aaaaaaa8 -aaaaaaaa -fffffffe -ffffffff -00000001 -00000000 -aaaaaaae -aaaaaaaa -99999998 -99999999 -cccccccd -cccccccc -e051a666 -55555555 -1fae5998 -aaaaaaaa -aaaaaaa9 -aaaaaaaa -ffffffff -ffffffff -aaaaaaab -aaaaaaaa -aaaaaaaf -aaaaaaaa -99999999 -99999999 -ccccccce -cccccccc -1fae5999 -aaaaaaaa -fffffffd -ffffffff -00000000 -00000000 -aaaaaaad -aaaaaaaa -9999999f -99999999 -cccccccc -cccccccc -e051a665 -55555555 -1fae599f -aaaaaaaa -00000005 -00000000 -55555553 -55555555 -aaaaaaac -aaaaaaaa -00000003 -00000000 -33333335 -33333333 -66666660 -66666666 -4afb0ccb -ffffffff -b504f335 -00000000 -00000004 -00000000 -55555552 -55555555 -00000006 -00000000 -00000002 -00000000 -33333334 -33333333 -66666663 -66666666 -b504f334 -00000000 -55555550 -55555555 -aaaaaaad -aaaaaaaa -00000000 -00000000 -33333332 -33333333 -66666661 -66666666 -4afb0cc8 -ffffffff -b504f332 -00000000 -33333337 -33333333 -66666661 -66666666 -9999999e -99999999 -33333331 -33333333 -00000007 -00000000 -55555552 -55555555 -79c83ff9 -cccccccc -8637c007 -33333333 -33333336 -33333333 -66666660 -66666666 -33333334 -33333333 -33333330 -33333333 -00000006 -00000000 -55555551 -55555555 -8637c006 -33333333 -66666662 -66666666 -9999999f -99999999 -33333332 -33333333 -00000000 -00000000 -55555553 -55555555 -79c83ffa -cccccccc -8637c000 -33333333 -66666664 -66666666 -33333332 -33333333 -cccccccd -cccccccc -66666662 -66666666 -55555554 -55555555 -00000001 -00000000 -2c9d6aaa -99999999 -d3629554 -66666666 -66666665 -66666666 -33333333 -33333333 -66666667 -66666666 -66666663 -66666666 -55555555 -55555555 -00000002 -00000000 -d3629555 -66666666 -33333331 -33333333 -cccccccc -cccccccc -66666661 -66666666 -55555553 -55555555 -00000000 -00000000 -2c9d6aa9 -99999999 -d3629553 -66666666 -4afb0ccd -ffffffff -1fae599b -aaaaaaaa -e051a664 -55555555 -4afb0ccb -ffffffff -79c83ffd -cccccccc -2c9d6aa8 -99999999 -00000003 -00000000 -fffffffd -ffffffff -4afb0ccc -ffffffff -1fae599a -aaaaaaaa -4afb0cce -ffffffff -4afb0cca -ffffffff -79c83ffc -cccccccc -2c9d6aab -99999999 -fffffffc -ffffffff -1fae5998 -aaaaaaaa -e051a665 -55555555 -4afb0cc8 -ffffffff -79c83ffa -cccccccc -2c9d6aa9 -99999999 -00000000 -00000000 -fffffffa -ffffffff -b504f337 -00000000 -e051a661 -55555555 -1fae599e -aaaaaaaa -b504f331 -00000000 -8637c007 -33333333 -d3629552 -66666666 -fffffff9 -ffffffff -00000007 -00000000 -b504f336 -00000000 -e051a660 -55555555 -b504f334 -00000000 -b504f330 -00000000 -8637c006 -33333333 -d3629551 -66666666 -00000006 -00000000 -e051a662 -55555555 -1fae599f -aaaaaaaa -b504f332 -00000000 -8637c000 -33333333 -d3629553 -66666666 -fffffffa -ffffffff -00000000 -00000000 -b504f333 -00000000 -00000002 -00000000 -55555554 -55555555 -00000000 -00000000 -00000004 -00000000 -33333332 -33333333 -66666665 -66666666 -55555556 -55555555 -aaaaaaab -aaaaaaaa -00000006 -00000000 -33333334 -33333333 -66666667 -66666666 -4afb0cce -ffffffff -b504f334 -00000000 -00000007 -00000000 -55555551 -55555555 -00000000 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/aes64ds-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/aes64ds-01.reference_output deleted file mode 100644 index 700a0d10f..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/aes64ds-01.reference_output +++ /dev/null @@ -1,116 +0,0 @@ -386a3652 -d5a50930 -5892ac53 -72042d68 -b3167add -ca9e8ed4 -cbc64d4b -febbcf06 -61926f3d -ee23cb9f -79146e2e -2c25fd23 -e2db5a30 -61f14d54 -af1e7778 -7fc17c28 -3b0f81f0 -ac8f5a47 -1fb1f4cc -c60bb9c9 -f83a450c -93c55f90 -7226d031 -c669b748 -e89ff775 -fbb9c95b -0d533ec7 -eb0502e1 -376149ef -961cba2b -512c2285 -71883be1 -b54ed57e -0a3393a7 -ae7875e2 -9db9dd26 -55143757 -771b4a64 -648f4cea -04159c04 -3f71ff22 -7e48e74b -7d0477e1 -7ed66955 -26142117 -630c2bba -613b2ac8 -4df5eb83 -00000000 -00000000 -527fb552 -a94a5252 -0d7ac960 -9f9c5119 -5fa807b1 -33c71227 -3110801f -59ecdd88 -f43ed29a -4b79db78 -205252fc -525256c6 -1b1a296f -71c5b7aa -89621847 -0ebef11d -6e74ade2 -2235f91c -85377596 -e8dface7 -73116797 -41dcf2f0 -eacfb43a -cee6914f -6b1e3fc1 -8f0faf01 -02bd13d0 -038a2cca -06abbcf7 -00d3e4b8 -0a58b390 -0545d88c -8448ed5e -50b915a7 -da468d6c -579d70fd -92f668d4 -6498a45d -165c6572 -ccb6f886 -25a1d976 -66245b6d -b2a28b08 -49d12e28 -4e94c2ee -32234c42 -3d95fa54 -0bc37ba6 -cb392f34 -82ff8ec4 -8743de7c -44e9e39b -fb6a36bf -d5a54081 -38a3f352 -9ed70930 -58773f53 -7dd72d68 -b0bb53a0 -3c99e0ae -ef7fb52d -a94ae593 -20c0cdfc -fe5a56c6 -00000000 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/aes64ds-rwp1.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/aes64ds-rwp1.reference_output deleted file mode 100644 index 94447d5d3..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/aes64ds-rwp1.reference_output +++ /dev/null @@ -1,156 +0,0 @@ -e8f210f4 -03211540 -22ecc6b8 -eb624c9a -5965efd4 -789f8622 -92e9aeaa -7dcafc4c -a7d68f61 -aad7579d -58c8d48e -f6a3b3c3 -7e45ea6e -b77fba52 -a7e58e4b -6798a89d -0e8b4cf8 -3b4a2fc3 -b517adc3 -2a017937 -8b2f508a -2fc50869 -6edf60f4 -12b99d90 -cd569b10 -e4a5401e -8b2979f4 -560393b2 -e298a54b -6b058785 -28d4d67b -be48a372 -98a489f1 -88f85bfa -36ecb050 -ceaaadd7 -5e0523e2 -79c3a736 -9eace54f -99b5a1e4 -28c7d7cb -929b878d -69e199ee -6be3840b -7c216c53 -914094c6 -03d94ebe -81517a72 -33bf4365 -73559784 -d0d8c21a -04469855 -5fd084b8 -74ba82a9 -5aa15017 -83ca9634 -1e392a83 -39e59d38 -f20b746f -4b91ce3f -4590a637 -a55a8284 -ecd9f974 -7f9d38e5 -eab9fee6 -b1231c3c -bd1a2885 -4c67eb2a -0ead8284 -7facdadd -270fd5db -d429ee1c -f9ce5a26 -4763ef73 -0937bd7e -ae814f22 -a9bc398d -af7af1b1 -fab218b9 -a7778dfd -ca826b37 -484d4fb5 -96b5efad -3cb8e260 -60de99c4 -bd70a8a2 -354d3710 -337866bc -4f5004da -a52988d9 -3898a995 -d4e3437d -e8079f77 -fa42f841 -a041de82 -61532bc2 -85b90f22 -4d09c349 -22cd271c -ca434896 -c19b7580 -59423e06 -953be889 -0b600f74 -0777bb12 -26202de7 -2c9563db -e3f0b673 -b31f4467 -2e0d2d65 -34eabdd0 -3ee636ae -052ab8a0 -26312d4a -29681f95 -f38dccab -95d097ef -706b6d47 -9895ab30 -5a36ade7 -1bf76d7c -5e2c5381 -a8381757 -e83e7c3b -f050070c -2a4f40d9 -bdad0618 -6789b0a8 -dfae8291 -a7ac97bf -5a3b0a10 -390bf8b7 -a6be2c33 -a595435f -82df206c -2299dd0f -8471e13c -31b3ac79 -b2ff00e9 -7fe27608 -667adc6f -69cc9988 -b46c32c7 -5a54fa4c -63b76c83 -14973213 -fa78b5bc -21a6afab -00d1ccd9 -0c2effc9 -d1116db8 -f3b0e499 -4b5ae888 -09935efe -46d8b04c -ba746245 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/aes64dsm-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/aes64dsm-01.reference_output deleted file mode 100644 index b210e6b5b..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/aes64dsm-01.reference_output +++ /dev/null @@ -1,116 +0,0 @@ -49b32be7 -6e102017 -35b2ab19 -91f3a8f9 -7454b99b -837bdb2d -ad8d3d16 -517363cd -3f3b68cd -a559a9cc -d5789818 -6e1a0aa9 -972586b5 -b70cbf94 -6eddd1dc -26d4eaf2 -33ed0398 -4111cba5 -6953b519 -1d8d032e -76c2c6f9 -b51b5067 -00000000 -00000000 -a9e847f3 -6292ebcb -a661c0a0 -131ae0e4 -4ef2cb87 -840c9e0d -6514b912 -59fe55d1 -45858515 -7c42ffcc -08ee51f6 -96c673fc -f0b3d0b2 -c14078bb -d0de6221 -ffde6ec6 -4fddb2b3 -600ed622 -a0996fb9 -2cff084f -7c587353 -be731122 -106130f9 -6e57739a -48b84048 -ace6bd1c -4b5f011d -a78fda67 -9e88fd35 -b89de08e -9c4646dd -0c0ab473 -a657703f -67b73808 -b53bcf2f -d8360c41 -19e84d6d -97c05734 -729ece65 -7f87f0a1 -1f58fd0e -73f534ee -87e5eed9 -3c9c184a -a115f316 -4ce0f020 -9e95b52c -c9465f4f -b6f8a540 -b7231f7d -d01a89c8 -4d69313b -48c6a153 -0ca2fd3c -b616db9d -4d42ac2c -2325780f -e1781499 -3e39a9d1 -1fbdec15 -5275ffa5 -cdc0642e -99f4c87d -166fdca0 -8af34367 -aca6909e -36ab9c2a -7d66a8c7 -5e7b5aec -0e314eef -14cf6f42 -d6799626 -e8c1230c -2c7a7635 -73125ed6 -aa7dc828 -6e57fba4 -6c5c7a9f -b2f24f17 -519bbdc6 -1c96a313 -6e29192e -a4d44576 -da844ffe -76d56898 -16c53369 -20b8f3de -f84e29cf -4ee97752 -2e6c8754 -00000000 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/aes64dsm-rwp1.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/aes64dsm-rwp1.reference_output deleted file mode 100644 index 369b16aab..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/aes64dsm-rwp1.reference_output +++ /dev/null @@ -1,156 +0,0 @@ -52914d70 -3f18c797 -f7676848 -32372b71 -8cee4124 -a1cae1c9 -b8a27a1f -12ae9d26 -9bd59647 -6566ed59 -64cbcda8 -39120907 -08aff9e1 -697b2416 -133c2f87 -59a91923 -ba52ed34 -057b9e7d -cfc35494 -27efbe13 -6b7d4c24 -8033aa92 -8e8d7c5a -bd4f3f6b -bfe8c98e -4a1ad09f -dc6370e0 -45a268fb -b5d2ac5f -78a47ccc -b452e85f -4d531e27 -5cc1c51c -0e1364a8 -f289fcbd -48419285 -f424a6ec -da3d529e -e45db495 -8fbe653d -52368611 -84904354 -d790c27a -055ae4bc -3d17e9a1 -dc20c4bb -42efcb4c -cc312a0f -c974f6e1 -bdf6334d -1de7b49e -7b15e203 -92eff23c -0be9f8ff -c389aa5c -507f884c -7d3b4e86 -018357ac -9109106a -73f704ab -52d939f6 -0b9ac5ad -9c3ee2f8 -8b65b263 -9a5ee56a -45db96ba -f55f74d4 -d1e5b967 -fdae20d6 -ace0ba22 -d40c7789 -07658ee3 -c308f676 -b664751f -55200088 -60010526 -f5ab847b -61fabbb5 -39ee122c -6c051dd4 -2d44a4d9 -f3cc11d1 -71732043 -8739bc04 -406b64ac -7231f276 -e6435aa0 -0ca6605b -9c5e696a -9af78e3e -1be7a9c9 -b682330e -35264c58 -962c962d -7d600dad -0d3d45ae -5702ffbb -af7ea6b9 -644fd22d -95eab991 -871980b1 -06ebcf01 -af6f5758 -75765142 -a053b59f -65ebedaf -8bb16d56 -a03b763b -6a3c9841 -aaee7f50 -a9f95dbe -5300dbc8 -983958ce -4bd7c02c -5bfae08a -6e38632c -a768df2d -c84fb701 -aa2de3f2 -e21277a1 -427ad510 -189d4e6b -8dae897a -46e8ebd4 -d5c69921 -8499d736 -4811efb8 -94cdb41b -73efea14 -77d60183 -f67a6295 -e9716e8b -b6b33230 -a8a71635 -6206e297 -a59688d2 -64a823c7 -b6bcf9a4 -09cee88b -0ffcdbcb -0ab6f5e6 -3ef5bdc2 -d8a01b4e -0d6dde06 -7c2c056e -47693eb2 -eee5ac2c -d7704460 -144cd549 -faf81402 -78a5ee26 -ae47c512 -b8c9f9f9 -4ae269fb -b54ba13d -f9055540 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/aes64es-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/aes64es-01.reference_output deleted file mode 100644 index ab8c7a0e6..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/aes64es-01.reference_output +++ /dev/null @@ -1,116 +0,0 @@ -c5776b63 -7b6f7cf2 -02848155 -0989616e -44a0ba78 -7e2be052 -338d226d -f087e6a8 -ad8420cc -23f7f8b9 -a52d1dc7 -957561f7 -a256acf2 -6c3277b7 -44401065 -a4bc9818 -3938bf64 -468fa8e0 -37e859b3 -d7f16ac1 -edcd6363 -63243563 -4e6816c6 -a8998300 -70b9bb5e -d7b11312 -ac5512b4 -e57fa041 -a5df0b9e -7cde4ea1 -c0a30a88 -741cb941 -bf15bb0d -422e334a -e065af46 -04b14368 -d82dd539 -1c79891a -188f0917 -92cb8d89 -a60a95dc -3f00a66d -68895441 -0f42a1b0 -162de68c -0dbb99bf -9498559b -e98ef8ce -df87d9e1 -11281e69 -00000000 -00000000 -9e570370 -661d3548 -6363bde8 -1f63634b -8a74a6ba -2e8bdd1c -a9377a6c -ea4ec865 -08f4d5e7 -6dae568d -5c3a95c2 -62243291 -79ac06e0 -0ae4d349 -884f5e46 -149081de -dbb82a60 -dc0bee22 -17135dc4 -3d440c64 -737e97cd -ec19a75f -f540ffbc -2138a310 -d2da9d51 -8ff3b692 -85aa3c45 -7f33ef50 -a8024dd0 -fb9ff943 -5b004c6a -39b1d14a -cfbefc53 -ed58cb20 -a02ce352 -b35a8329 -84d66e09 -1a2f3b1b -9a232707 -e205c7eb -75809604 -c3b21218 -cc93d834 -f1f7fd71 -15e53fb7 -2631a536 -f0c9a4ad -af47829c -c0a259ca -7d72d4fa -c577d730 -2b6f7cfe -76676b63 -7bab01f2 -eee68155 -09abf96e -edcd28bb -2a2435d0 -0eb5c161 -b9f63e86 -c625bde8 -1fb4784b -00000000 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/aes64es-rwp1.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/aes64es-rwp1.reference_output deleted file mode 100644 index 5f336776e..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/aes64es-rwp1.reference_output +++ /dev/null @@ -1,156 +0,0 @@ -dca78d08 -1e54a501 -148b7450 -21accb6c -6f025d3c -b25101d4 -4a728f91 -919239a5 -844269df -16abe758 -7b5c3230 -4adf0306 -4a9fd4db -97b52563 -0d35176d -d35abf58 -a45bd5de -8f883806 -278ced31 -591004b8 -03592af3 -d9244e99 -e6a91a8d -e458db60 -27c84e74 -c86f8640 -7a06fa08 -f921019a -13b726b7 -c42715ad -5a525cfd -1c001209 -183b4232 -e48367d8 -b6737b93 -a2d191f5 -2b7f3546 -2831236b -6a81f75f -4e034af9 -dceac5db -452d6c90 -ca415334 -0c8293f1 -99542855 -d201cf8d -e6ac0ab8 -c2102139 -51303fe3 -89b05acf -2eefa23a -73bec4b0 -a1e7e498 -0342de4c -4023d98c -c99258ad -aec9edce -ce3560c5 -42fbb322 -bc4133c2 -8bd0eeb8 -b5aec5cf -9f96364f -6f587d35 -99f631dd -a1e659ec -623a7d88 -b5975bd9 -da2a18cf -a5811e78 -f3884f90 -0e042ab9 -7c3dda68 -690f5f73 -eeb8ae0d -e0fe9edc -4e332afe -e105204f -929ad2b1 -00e65f20 -d87d95b8 -4a114c03 -844a1122 -3ee4e1d6 -90a4b89c -2ed1c380 -70112874 -da65254d -0a0c1bbe -4c34cb28 -145ab9e5 -d8828316 -c5a666e6 -5271a2ec -8de02713 -c960716f -dcb14bdc -927c00e2 -887a38de -11a23160 -6b2c6a42 -82a347f0 -a698875c -6870614f -e5e614dd -f1a93822 -ce04cc14 -3479a3b6 -adbada97 -370e6be3 -3c17af51 -c7196169 -0dd7aa21 -dfce7a8d -e56ec4e5 -d14cebaa -0651ba9e -d7d2b3e0 -0b148641 -fd8f7340 -25458cca -14a3cafe -79c5eb39 -6a375598 -21adfb62 -a846697a -0b2a7d95 -4a5cc425 -da69a80c -97819430 -5ffc208d -0926fb38 -7de4a92e -dce5788a -360ba353 -6f28a238 -30a56203 -7c02d34e -c3474472 -99462804 -9a57fbc2 -b5b3071c -4841156a -862b64d8 -d8d303ce -54c4b6ff -0f65534d -2d3626aa -f5cc2a28 -00be76c8 -6d131450 -7c946a28 -b2aeeb1c -d786f9ea -bf2cb3d8 -6461c551 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/aes64esm-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/aes64esm-01.reference_output deleted file mode 100644 index 56234b327..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/aes64esm-01.reference_output +++ /dev/null @@ -1,116 +0,0 @@ -28b2e9c9 -e8ddc06f -fec1d9b4 -481d25ff -1a55a8c1 -c1668aca -7e1b9602 -79501d0d -03ff9f4a -6ccbe941 -33742f3a -27d83fb6 -a80fe9e4 -5f1063b2 -00000000 -00000000 -59e07013 -908767f1 -11781549 -7630ca01 -f23e4a35 -2ed3fcea -b3d21c8b -514905af -001c93a3 -211a2b77 -c3e3c3bc -cd2b7ee3 -3cc45740 -90cc3829 -b184a276 -8e5c783a -dc46e066 -47e31cad -db184ce3 -425e22a0 -18c527e3 -e64584d1 -8f3397a2 -f9245cdc -b7ac55ab -6f8a0514 -cea4019f -368420ce -cc099d32 -c00dd1ae -484216de -f61145f3 -c35705f1 -af143cc9 -cbc33221 -309f421a -e364112c -3ced63b4 -2c4e20f4 -2f6163b5 -0871fb60 -2ebe15e1 -b09868c8 -e614d62d -03d9594d -ae2ba538 -4ac7e15d -7a4dfb29 -632e7a04 -f857c912 -d005a3a9 -405878bb -9f573cdd -20a524ba -37865c70 -9ea78da5 -4333092e -9ce5cdb9 -91c76ccc -e9a024c7 -0b0ed716 -ed536482 -48a25de1 -d258bfc6 -6f7ae4c6 -4e89ebf2 -44cba95b -cca90274 -3282a6c8 -3277a8b3 -62125b16 -dfd06925 -b04730f2 -0d50064e -22d3b6de -3b1b9378 -f016dd5c -152b3277 -949efd44 -607163f8 -3266e8c4 -829b128f -7a8b4e8f -3f7ae556 -25974506 -494da287 -615dd9b0 -5c219c27 -455c6a6a -51336d2c -5f2a933a -f2c1686e -aa13b6ca -99d173ae -7739c1fe -5f14489b -680a3a09 -e25c4d63 -00000000 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/aes64esm-rwp1.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/aes64esm-rwp1.reference_output deleted file mode 100644 index 2f0f74e2c..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/aes64esm-rwp1.reference_output +++ /dev/null @@ -1,156 +0,0 @@ -91af27e7 -ce2eb2bc -27152aa3 -91872f13 -5c9c03cf -027ae5ab -c124488b -660beb19 -42a54fd8 -88c87d3f -bdbb1437 -d4bc9961 -a9f4981f -00957a8b -8f0711db -b03d00e3 -2669d368 -ecef87bd -7cb658e5 -7577d92e -7b6e4fd9 -73efb006 -9e9e7fa7 -4e9325ff -54d88cd5 -a25b2eb6 -10709779 -7cc902f4 -79c14bc6 -41cf16c3 -a6ebe90d -313f3138 -1f2ee381 -44956c65 -b166da20 -02c79a48 -d6f08687 -ff5256aa -430f5857 -c567267a -f5646ad3 -ce490013 -c1a09b16 -01695dd9 -aa65601f -fd2dd998 -d59d42f2 -ed3c372c -934f9cfd -a96e3952 -5f2f6148 -578689e1 -d02727ea -277a931d -f5d30010 -af8a79f2 -2a43e1cc -868694ca -c671bf20 -f4f2c7cd -e06b9f19 -508902ca -54f41dcd -a44948da -52941a5f -6af76c03 -00275ed4 -cd737866 -d7f65b5d -468b79f6 -fe540c02 -ed0e4d37 -a74cfce4 -1789b561 -c6e177a5 -c49e0204 -666af356 -c565bc97 -bfe1291c -d9a8af47 -90a4d66a -ccb3e289 -cc9352f0 -b8464f5c -98dc90c4 -d5885bba -45ee67f1 -38d7724a -3ff3543b -ae869c2f -ffd4764f -90f94ee8 -60831e1e -585a721d -28c55feb -c34ba19e -26915e13 -7eb7f431 -3091a81d -113dee20 -d3c7fa81 -823c98b0 -ac015c14 -10767525 -5f2a219e -0e5b4354 -74c8f957 -cb8bd8c0 -83ce4057 -35cd1059 -33941163 -566847af -02541413 -4ebf5c4b -4fc9210d -fbb162f4 -5e8c04a5 -ef8e2710 -53c9387a -c5d3e7b0 -c6a32360 -58559b15 -97c8d9e8 -051d0189 -cfa0c9b3 -c76c3d6b -e5a11a97 -6387180b -7a032648 -701f0cd1 -ff96aec9 -eeb863d9 -c5d32d25 -bb5c92be -31bc2565 -1c7b70ca -3712e435 -0f5101bc -08e6f0ac -4b1007af -de224c44 -e1a26937 -0c34a2ec -d23a0af3 -32037e89 -c0268bb4 -ffc54b05 -af97913e -056c3260 -821fc15c -2dd520e2 -7ef52706 -1e7d8a02 -ef66458e -13ffd2c6 -5c817935 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/aes64im-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/aes64im-01.reference_output deleted file mode 100644 index 01fc206e0..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/aes64im-01.reference_output +++ /dev/null @@ -1,300 +0,0 @@ -00000000 -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -00000000 -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -be082513 -deadbeef -52099289 -deadbeef -248444c4 -deadbeef -1f4f2f6f -deadbeef -8fa797b7 -deadbeef -c7d3cbdb -deadbeef -e3e9e5ed -deadbeef -f1f4f2f6 -deadbeef -13be0825 -deadbeef -89520992 -deadbeef -c4248444 -deadbeef -6f1f4f2f -deadbeef -b78fa797 -deadbeef -dbc7d3cb -deadbeef -ede3e9e5 -deadbeef -f6f1f4f2 -deadbeef -2513be08 -deadbeef -92895209 -deadbeef -44c42484 -deadbeef -2f6f1f4f -deadbeef -97b78fa7 -deadbeef -cbdbc7d3 -deadbeef -e5ede3e9 -deadbeef -f2f6f1f4 -deadbeef -082513be -deadbeef -09928952 -deadbeef -8444c424 -deadbeef -4f2f6f1f -deadbeef -a797b78f -deadbeef -d3cbdbc7 -deadbeef -e9e5ede3 -deadbeef -f4f2f6f1 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -0b0d090e -deadbeef -ee815097 -deadbeef -fbad4f20 -deadbeef -8b14c9bc -deadbeef -607bf0cb -deadbeef -814653aa -deadbeef -3aacd31f -deadbeef -b4d951d0 -deadbeef -eaaaa9b2 -deadbeef -a4274a82 -deadbeef -c7ef3b79 -deadbeef -1ac19d05 -deadbeef -309e9e72 -deadbeef -94b7345a -deadbeef -d7bd7a3e -deadbeef -7d569544 -deadbeef -8e3a2d4c -deadbeef -0a0abec7 -deadbeef -4696dd98 -deadbeef -b1e354e2 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -41f7daec -deadbeef -adf66d76 -deadbeef -db7bbb3b -deadbeef -e0b0d090 -deadbeef -70586848 -deadbeef -382c3424 -deadbeef -1c161a12 -deadbeef -0e0b0d09 -deadbeef -ec41f7da -deadbeef -76adf66d -deadbeef -3bdb7bbb -deadbeef -90e0b0d0 -deadbeef -48705868 -deadbeef -24382c34 -deadbeef -121c161a -deadbeef -090e0b0d -deadbeef -daec41f7 -deadbeef -6d76adf6 -deadbeef -bb3bdb7b -deadbeef -d090e0b0 -deadbeef -68487058 -deadbeef -3424382c -deadbeef -1a121c16 -deadbeef -0d090e0b -deadbeef -f7daec41 -deadbeef -f66d76ad -deadbeef -7bbb3bdb -deadbeef -b0d090e0 -deadbeef -58684870 -deadbeef -2c342438 -deadbeef -161a121c -deadbeef -a5d8c4d1 -deadbeef -ffffffff -deadbeef diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/aes64im-rwp1.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/aes64im-rwp1.reference_output deleted file mode 100644 index a157e3c16..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/aes64im-rwp1.reference_output +++ /dev/null @@ -1,488 +0,0 @@ -e9ce59bf -9baab409 -20cc0924 -98f2b452 -5b452048 -0b0f7eea -8476d693 -6c023547 -8148a6d8 -b92dd850 -7eb75927 -46d227af -0dd09a3f -9c55496a -9675f16a -e9dbf32b -11ff1ad6 -7dd9bde4 -acf6b0ac -4f0e7329 -9c710ca7 -b0d3bac2 -636f5748 -eca75e9c -00e1a410 -a38b1ba1 -4d1a4341 -1f1d9808 -b2e5bcbe -e0e267f7 -53074732 -6fef7bd6 -f349a53e -084e462d -f268012d -64c32a8c -85d9f49f -f3461900 -faf6e5de -308f998a -5398276d -6c5d1ed4 -56913d4c -a32d78a1 -a42cb886 -3ff54ad7 -5bd34779 -c00ab528 -d625f8df -0c6725bc -5233cf7a -f0d326f7 -fba2922d -4da5ae55 -1515b62e -d5a6539a -edcd65dd -78ad91fe -083d55a3 -45d10407 -1a0fcf81 -c2836a06 -fb9e98a6 -997d6ba2 -04616759 -6682945d -d6d5b6ce -26575c5d -f33165dc -fe4064aa -d921965a -3bbcfaa4 -b1a509ca -bd7bb672 -a41fa9c5 -06da09d7 -cdae757a -3bdc1de0 -964e2340 -c2f9ebc8 -d7c90faa -aa93b392 -2836f055 -556c4c6d -41c6b234 -bd83b67d -433fb2cf -1636ec39 -acf18f8e -533d0070 -c4490a21 -3441a740 -e112782d -c8c164ff -4f5a418c -8e9392d2 -51b7c65e -b9ad09d2 -864aed5f -748f4175 -79b512a0 -8b70be8a -18496d21 -b866479b -50a51ff7 -3d0ac6f3 -feed5998 -835dbd20 -ee915c98 -58d5d905 -e85f373b -3f561c24 -5e3405bf -34783a4d -4994cd7b -f4d1d996 -15ba4783 -938b6a18 -ea45b87c -6c7495e7 -0f65a0a0 -5f2a25d6 -d79fac8e -7fc7122c -8e0adf12 -8af53896 -81fd5f28 -f909502b -ce2f06ec -6bc5cfea -b1d72401 -7bd4215e -8007dd12 -efee114b -ee7823fd -dcfb94e8 -1187dc02 -23046b17 -7dfda0b2 -f92aad54 -cfaf2ddf -9215923f -4fa750cc -a22780f4 -f261884d -c35a255f -b43c62bc -efddd405 -3b34241e -9f21cef9 -70f7b95d -8f03e503 -752a7a46 -281796c3 -8ad585b9 -d7e8693c -0c721591 -24a25aa0 -2244d448 -650ce3f6 -b14d1aea -d608fef2 -121290f0 -bed9e518 -befafcd8 -b818ccf6 -52c8a234 -ca6c9ff1 -13cda113 -8d8bacf8 -cc1ea618 -17a49273 -33e159e7 -e85b6d8c -ea532d08 -3f220927 -145df025 -67bc37df -00904f11 -da308ae7 -d235139a -6e5e995f -5859452a -fa3dfacb -5e3942b8 -3483de12 -f99ff86d -3141db26 -e49c1893 -13aff8c9 -1b63e76c -ec500736 -dab51b9a -6f9ee25f -ac08aae0 -1754020d -b268b272 -e61226e6 -d295e997 -7a9113e5 -5ef91789 -1562462c -775b40d6 -bee772ed -d65da8a0 -547acb3e -2e7e4d9e -9374a19d -d181b261 -6c8b5e62 -24da1627 -7c995be6 -0709b071 -6101f6ce -30ac07d0 -0c872b8f -e49adff7 -990c7a8f -fe1969d8 -594a7a09 -5e92ed2b -58b1c49a -5f747b0c -fe04416c -e3537f93 -3e6534b8 -1cac806c -c19acb47 -e49cdff7 -9af382af -c83d53f6 -c21852cc -68c8d8e9 -c4141160 -52135d56 -2de37f54 -4ab2d163 -00028364 -168555f9 -74f72eb1 -a3c87b65 -8b0a522a -896cbb2b -ebe3db2a -769344d4 -141c24d5 -6a5c5e66 -ce0c8056 -dca6f480 -72541426 -38de791a -e749c1fc -c3e3c21c -d0bc9a3a -2d3dcb25 -dabc13b9 -5720f8ef -4cedfddc -85e2cc35 -69ae119a -c35fadaf -75f1955d -3ca05250 -8a0e6aa2 -341c25a0 -dd3f62c5 -f138a1c5 -7c7e490e -6b55d58f -12d03774 -2dc51a2a -072cdbff -bddd2199 -c66c04a1 -f59b606c -5d7dd722 -b7b9be0a -64ee2c7c -ef42899e -3fcfd8f2 -10bd7661 -c030270d -adc99dd4 -374edbff -c12bab6c -a2cdf4c6 -0971ed61 -3ddfc84a -74bd2e93 -971acc3b -2b7599b3 -24188bcd -c823cb2f -b719fd5d -1ca9ad63 -6cfe896f -9e53d96f -2a4a2733 -61ac2690 -d5b5d8cc -7b41ceab -971d313c -b321b875 -a7451471 -96780b11 -3a468b02 -f7f576a7 -2ab7ea92 -74b3485c -e08ef17a -5f519095 -255e6aee -d41d2736 -3a2f646b -a87af0fa -31c45bb4 -57850f05 -ce3ba44b -07fa8737 -b5380c9b -42115846 -f1497cde -6df4310f -b71a1872 -b287d885 -6d8e7a4d -6ae0d032 -5f5cfb2c -5b20d542 -478be0c8 -ce3ffa8f -e728e41b -54f8735b -a3cac099 -ab078ca4 -5c353f66 -b507e365 -8e307d8d -c264fc6e -619d0ebc -f42501de -7a742aa0 -51704b2a -a57f8862 -b93723ed -2f0f6272 -b4721f32 -0552a2d2 -f2bac320 -d5a23f5f -0df07127 -f03a34e9 -f20f8ed8 -0fc5cb16 -697ab4d4 -b9800962 -9714ac5c -16a302e5 -a459e93b -4100c385 -9b07ed10 -afb2f00c -113ca5e9 -3deebb89 -4954b5b2 -ff9f876b -a797efa4 -3d8ec31d -14b5aa70 -80a1a4e8 -eb4a558f -7f5e5b17 -1bd80da6 -303509d1 -27a3e10d -62edfaa8 -800bf168 -255f378a -5ce4e7ad -7a9113c2 -5c931825 -5ffa42dd -d90690a4 -c15d2dd5 -7a6a777e -615890f7 -97cba8ed -27386a2b -68345712 -d8c795d4 -5f06f7ad -82ddebd3 -2d358398 -ed294ae9 -b2cb0c19 -8bd0b9f1 -939e1ac3 -24eeb7cf -0fc5352b -c6b02aee -096bf47b -d59a5b98 -f9513eaf -ecd58e89 -8e253ba9 -60197e39 -71dac456 -9fe681c6 -9bdf9ce3 -4aef382f -8f5ffe15 -06c60b79 -960ebf65 -19f07cef -f9da381e -374b8630 -288ce342 -0b843570 -fa9a0dea -381c56b4 -2de91157 -cc679c3b -d74af4eb -0e2d4669 -28b50b14 -f1d2b996 -fde3c55e -386c49b8 -81dca870 -064326c6 -53f39718 -39db8a8b -fdbc23ec -fb24d57d -18f7c1a0 -b61c76ab -e25eb8c5 -9b9426c9 -0556869a -d277af9d -1bec06be -e0e0a83f -e413f941 -1f1f57c0 -01bed3ee -0434d582 -5f7e9231 -08c817b0 -5a280b96 -36506813 -01be696c -3edc9bee -7da37a1e -6488f48f -702122da -d76fc834 -f27da73b -4c18c344 -bff0cc90 -47ca752b -400f336f -b8358ad4 -19be8a6c -4122e410 -f6f1e7a1 -026f9268 -04744065 -b656cf24 -52df1cb0 -0e8b61f7 -9c4b9066 -cbfa82a0 -dc9b7581 -e6e9b0ae -bf2f1a18 -d2eccdf1 -26a6bcae -faf6e1ef -d9594351 -05091e10 -52e0df3e -50ab8607 -75375e4f -0c472e1f -b6084436 -395a602d -00000000 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/aes64im-rwp2.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/aes64im-rwp2.reference_output deleted file mode 100644 index 11f31698b..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/aes64im-rwp2.reference_output +++ /dev/null @@ -1,112 +0,0 @@ -924770d3 -08577eb1 -5e7b5003 -de2093fd -7b89296c -93fdcab8 -7eb75927 -46d227af -7dc59a3a -d2d6b877 -9aa74d68 -f9a51e89 -a749f9c5 -cf84b683 -1890f9a3 -0bad8e56 -08ceac39 -854a9657 -31553304 -08c507c4 -53e8eb43 -137a9777 -2e94b019 -5031dd35 -ff1e5bef -5c74e45e -b2e5bcbe -e0e267f7 -6b9f15c4 -dc338383 -db0def1c -d3d649a3 -9a6ab329 -5ae6a228 -5491a906 -ee0d7aaf -acca7f0d -432779ee -2083db6c -c0cc07f8 -2cb7362c -af949e5e -a125a2a7 -f0852ca2 -a96ec2b3 -5cd2875e -5bd34779 -c00ab528 -708cc1b6 -9d02fc90 -aa38160f -3273ae1c -0b54aa22 -953b00b0 -de1ccadf -5388fa3f -3c53d0e3 -224c0601 -8ef1daf9 -f8b30e2c -f0e58650 -e8dac663 -e9ac0284 -1e2f05a3 -e5f0307e -3d7c95f9 -04616759 -6682945d -aaac3142 -8c8a18b2 -cbc5bac1 -2dddfaa6 -6f9fb997 -785036de -8530f49f -96944381 -a7298c66 -95a4d257 -fb6018e7 -6e445ac4 -d814d575 -807da245 -8c295990 -53b645ba -69b1dcbf -3d061437 -2836f055 -556c4c6d -08208d09 -7f216822 -936f5505 -2d25120e -dae98554 -14b91c79 -09fe899c -3c07bf4c -c6880007 -c5ec6148 -5d290934 -6218c6bc -6a013380 -7213516d -98a76a8d -43b1da75 -ae4839a1 -4652f62d -79b512a0 -8b70be8a -9e044706 -85986adb -a57ad1d5 -130ebf0e diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/aes64ks1i-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/aes64ks1i-01.reference_output deleted file mode 100644 index 2f24ee079..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/aes64ks1i-01.reference_output +++ /dev/null @@ -1,172 +0,0 @@ -c56f6bf2 -c56f6bf2 -bca32d60 -bca32d60 -b649a998 -b649a998 -6b2b75f4 -6b2b75f4 -76e71700 -76e71700 -95398f7e -95398f7e -cfa978b8 -cfa978b8 -283fe4ec -283fe4ec -0a11bff0 -0a11bff0 -cd16b8ef -cd16b8ef -63636343 -63636343 -121455ab -121455ab -410e5b1a -410e5b1a -3f60df46 -3f60df46 -12d06ffd -12d06ffd -4a0356fb -4a0356fb -ac6a0312 -ac6a0312 -c6d879b0 -c6d879b0 -4780bd4a -4780bd4a -891aa801 -891aa801 -6d9d0a91 -6d9d0a91 -7b777c63 -7b777c63 -16bb54b0 -16bb54b0 -0f2d9941 -0f2d9941 -6842e6bf -6842e6bf -0d89a18c -0d89a18c -df2855ce -df2855ce -e9871e9b -e9871e9b -948ed969 -948ed969 -00000000 -00000000 -9e1dc186 -9e1dc186 -b9573561 -b9573561 -0ef60348 -0ef60348 -66b53e70 -66b53e70 -8a8bbd4b -8a8bbd4b -1f74dde8 -1f74dde8 -c6b4a61c -c6b4a61c -2e2578ba -2e2578ba -08ae7a65 -08ae7a65 -eaf4566c -eaf4566c -a94ed58d -a94ed58d -6d37c8e7 -6d37c8e7 -79e49591 -79e49591 -62acd3c2 -62acd3c2 -5c240649 -5c240649 -0a3a32e0 -0a3a32e0 -db0b5ede -db0b5ede -14b8ee46 -14b8ee46 -88902a22 -88902a22 -dc4f8160 -dc4f8160 -73195d64 -73195d64 -3d7ea7c4 -3d7ea7c4 -1744975f -1744975f -ec130ccd -ec130ccd -d2f3ff10 -d2f3ff10 -21dab6bc -21dab6bc -f5389d92 -f5389d92 -8f40a351 -8f40a351 -a89f3c50 -a89f3c50 -7f02f945 -7f02f945 -85334d43 -85334d43 -fbaaefd0 -fbaaefd0 -cf584c4a -cf584c4a -39becb6a -39becb6a -5bb1fc20 -5bb1fc20 -ed00d153 -ed00d153 -842fe329 -842fe329 -b3d63b52 -b3d63b52 -a05a6e1b -a05a6e1b -1a2c8309 -1a2c8309 -75b227eb -75b227eb -e2801207 -e2801207 -9a059618 -9a059618 -c323c704 -c323c704 -1531d871 -1531d871 -f1e5a534 -f1e5a534 -ccf73f36 -ccf73f36 -2693fdb7 -2693fdb7 -c072a49c -c072a49c -afa2d4ad -afa2d4ad -f04759fa -f04759fa -7dc982ca -7dc982ca -76abd7fe -76abd7fe -2b670130 -2b670130 -248893fd -248893fd -1198f8e1 -1198f8e1 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/aes64ks2-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/aes64ks2-01.reference_output deleted file mode 100644 index 4621edd7c..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/aes64ks2-01.reference_output +++ /dev/null @@ -1,440 +0,0 @@ -50e93920 -254a9493 -0000000d -0000000d -ffffffff -ffffffff -fffeffff -20010000 -ffffffff -10000000 -ffffffff -08000000 -ffffbfff -04004000 -3fffffff -c2000000 -00000001 -fefffffe -00000002 -ff7ffffd -bfffffff -40400000 -00000000 -ffdfffff -00000000 -ffefffff -00000200 -fff7fdff -ffbfffff -00440000 -ffffffff -00020000 -00000000 -fffeffff -00000000 -ffff7fff -ffffbfff -00000000 -ffffffff -00002000 -00000000 -ffffefff -ffffbfff -00004800 -00010000 -fffefbff -04000000 -fbfffdff -00000000 -fffffeff -bfffffff -40000080 -ffffffff -00000040 -08000000 -f7ffffdf -00000000 -00000000 -fff7ffff -00080008 -ffffdfff -00002004 -feffffff -01000002 -00000000 -fffffffe -7ffffff7 -80000008 -40000000 -bfffffff -20000000 -dfffffff -10000080 -efffff7f -08000004 -f7fffffb -04800000 -fb7fffff -fdffffff -02000000 -03000000 -fcffffff -ff7ffff7 -00800008 -ffbfffff -00400000 -00200200 -ffdffdff -ffe7ffff -00180000 -00080000 -fff7ffff -00048000 -fffb7fff -00020000 -fffdffff -fffeffff -00010000 -ffff7fff -00008000 -ffffbfff -00004000 -00002000 -ffffdfff -ffffefff -00001000 -fffff3ff -00000c00 -fdfffbff -02000400 -00000200 -fffffdff -fffffeff -00000100 -00000080 -ffffff7f -00200040 -ffdfffbf -ffffffdf -00000020 -20000010 -dfffffef -fffffff7 -00000008 -effffffb -10000004 -00000000 -ffffffff -fffbfffe -00040001 -7fffffff -7ffffffb -bfffffff -9fffffff -dfffffff -dfffffdf -10000001 -effffffe -f7ffffdf -f7ffffdf -02000000 -fdfffbff -01000000 -fefffffe -ff7fffff -ff7fbfff -ffbfdfff -ffbfdfff -ffeffff6 -ffeffff6 -01080000 -fef7ffff -00040000 -fffbfffe -00028000 -fffd7fff -fffeffff -ffeeffff -ffffbffd -ffffbffd -00002000 -ffffddff -ffffefff -fdffefff -08000800 -f7fff7ff -00100400 -ffeffbff -00000100 -effffeff -ffffff7f -3fffff7f -ffffffff -ffffffff -ffffffdf -ffbfffdf -fffdffef -fffdffef -fffffff7 -fff7fff7 -fffffff9 -fffffff9 -ffffffff -fffffeff -01000000 -feffffff -efffffff -efffffff -fffffffc -fffffffc -00000000 -fffffbff -fffffffe -fffffffe -00000000 -fffffffe -00000002 -fffffffd -00000000 -7fffffff -ffffffed -ffffffed -ffffffff -ffff7fff -9507f887 -0c098d6d -196460c0 -9f6fba6d -a4c9610f -c22382d6 -c752b5b7 -df741db3 -c76e065e -ee51993e -77c4a8eb -6d651600 -abc99e1d -2db16bfe -739c9bc2 -28ef976f -74364d26 -c61df258 -9d933776 -ce3559a7 -f452bef8 -42abce97 -94367c85 -4460142b -3eba7e85 -94d1cc38 -0aa128d4 -233d131b -721878ba -6ddceb70 -b2969831 -46559b36 -ba2e7f3c -1a78e24a -093b4744 -2494dd83 -b11cf4be -8545ddf0 -ffffffff -feffffff -00000000 -ffbfffff -00000000 -fffffeff -00000008 -fffffff7 -02000000 -fdffffff -ffffffff -efffffff -aaaaaaaa -ffffffff -00000000 -fffffffd -ffffffff -feffffff -ffbfffff -ffbfffff -00000000 -fffdffff -fffffffd -fffffffd -ffffffff -ffffffdf -ffffffff -ffbfffff -ffffffff -ffffbfff -ffdfffff -ffdfffff -ffffffdf -7fffffdf -55555555 -15555555 -08000000 -00000000 -00000000 -04000000 -ffbfffff -ff3fffff -00200000 -00000000 -00080000 -000c0000 -ffffffff -fffdffff -ffffffff -fffeffff -fffff7ff -ffffd7ff -00200000 -00201000 -ffffffff -fffff7ff -20000000 -20000400 -ffffffff -fffffdff -00000000 -00000080 -00004000 -00004040 -ffffffff -ffffffef -00000000 -00000008 -00002000 -00002002 -00000000 -00000001 -7fffffff -7fffffff -40000000 -40000000 -dffffff7 -dffffff7 -08000000 -08000000 -44000000 -44000000 -fdfffdff -fdfffdff -01000000 -01000000 -80800000 -80800000 -ffefffff -ffefffff -fff7fffe -fff7fffe -fffbdfff -fffbdfff -fffeffff -fffeffff -ffff7fff -ffff7fff -ffffffff -ffffffff -ffffeffb -ffffeffb -fffff7ff -fffff7ff -fffffbff -fffffbff -aaaaa8aa -aaaaa8aa -fffffcff -fffffcff -ffffff7f -ffffff7f -00000010 -00000010 -80000008 -80000008 -00000014 -00000014 -fbffffff -04000040 -80800000 -80800000 -bfefffff -40100000 -fffdffff -00020800 -ffff7ff6 -00008009 -55554555 -00001000 -0000080e -0000080e -00000204 -00000204 -fffffeff -20000100 -ffffff7a -00000085 -ffffffb6 -00000049 -00000020 -00000020 -00400004 -00400004 -00000802 -00000802 -00000011 -00000011 -ffffffef -00000010 -00000000 -00000800 -fff7ffff -00080000 -0000000a -0000000a -ffffffff -01000000 -ffffffff -00040000 -00000020 -00000020 -ffffff7f -00000080 -fdffffff -02000000 -ffffffef -00000010 -ffffffff -00000004 -fffff7ff -00000800 -04000000 -04000000 -00000005 -00000005 -ffbfffff -00400000 -ffffffff -00000000 -00000000 -00000001 -fffffeff -00000100 -40000000 -40000000 -bfffffff -40000000 -00000000 -00100000 -860068c2 -43527ea2 -00000000 -bfffffff -ffffffff -00020000 -00000000 -ffffffef diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/andn-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/andn-01.reference_output deleted file mode 100644 index 8513be14d..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/andn-01.reference_output +++ /dev/null @@ -1,1048 +0,0 @@ -00000000 -00000000 -00000000 -00000000 -c38671b6 -6f061d6d -00000000 -00000000 -2502307f -485246bf -392e6fa3 -c50bd94a -80e4d23b -80627494 -cec7313a -2005b307 -5d003e38 -31410cba -0b815ef0 -9681bcad -83e2ba3a -3328804a -46e4abd8 -e48bf412 -242d8cef -061bf2da -d8d8dd47 -810d9484 -c1f36fae -0097ed4f -d7704260 -044bafe7 -058160e6 -3001038b -d8bca4df -a4603852 -e812dd49 -4084177d -3d32d01e -4216a775 -2037e34e -481c5e43 -874434d3 -50010372 -875e9bf5 -c00c84b7 -17d8a217 -a293021c -87f996d6 -0c80300b -0d42ea01 -0000b460 -2de4eb20 -0200900f -d6308385 -05215435 -ab72f99f -8a340809 -4e7b7359 -00c806cb -d96429c9 -b6de8bcf -c8cdf63e -a1981301 -c06209fb -30480609 -644918a7 -101d0c00 -4f63879f -3400001c -1f3c1ad7 -a2162046 -1bb3e347 -300d8260 -0bedcfc5 -c1084340 -14496066 -e50000a4 -88552f4b -042aa060 -04507198 -001e8241 -0256b0e2 -22800102 -9929dfeb -348532c0 -b22036ed -02880001 -83422130 -00144495 -2141c528 -50102014 -400397cd -07800242 -2001c392 -6180a261 -50942250 -10702019 -2c0090b1 -16a01400 -56d646e8 -98108110 -4510b7ae -5267c011 -00800bd9 -0c894280 -223c8755 -2a020918 -609200d7 -54985000 -82082833 -94910504 -012f68c9 -16421000 -0e620056 -923eb0ca -2300401d -03ab40c3 -c081b2ae -62a70209 -706d811d -0300818a -a601008c -8bc01740 -61620c07 -4243c262 -48112301 -65802100 -01808080 -a0c04383 -00042e02 -00438b44 -00000000 -00000000 -00000000 -00000000 -00000000 -40000000 -00000000 -20000000 -00000000 -40000000 -00000000 -08000000 -00000000 -a8000000 -00000000 -02000000 -00000000 -52000000 -00000000 -25800000 -00000000 -06c00000 -00000000 -54a00000 -00000000 -54200000 -00000000 -43200000 -00000000 -14000000 -00000000 -08320000 -00000000 -4d410000 -00000000 -91428000 -00000000 -820a0000 -00000000 -02602000 -00000000 -0000b000 -00000000 -60029800 -00000000 -82210400 -00000000 -01c00c00 -00000000 -40105500 -00000000 -2c00d200 -00000000 -43080800 -00000000 -b0005100 -00000000 -14002010 -00000000 -23038188 -00000000 -0d408030 -00000000 -05056902 -00000000 -90140242 -80000000 -10900208 -00000000 -08624845 -60000000 -40490500 -b0000000 -70010508 -00000000 -90108045 -40000000 -84750060 -70000000 -014aa031 -0b000000 -905e9560 -e2000000 -0404a207 -2c400000 -7b835008 -02000000 -a8804320 -7a400000 -00400344 -00c00000 -c1466049 -02ec0000 -51109501 -08860000 -244005c7 -82450000 -80140202 -01e90000 -1281013b -71050000 -05000504 -10002000 -949c4040 -10000000 -28000045 -e201e000 -ae202c62 -20042c00 -47508081 -56161000 -190228a1 -02960800 -00100504 -0c041080 -01551a00 -92801040 -030628c5 -46803300 -793503b0 -2061c490 -0824c000 -a0000840 -08120780 -92c92e34 -058b2020 -000016e6 -84404414 -20747604 -405c8a0a -08884215 -010f80c0 -0c44a118 -1093a202 -00095300 -06000000 -4800e418 -23820401 -82280a60 -0068a003 -0620a140 -80a84804 -200c0200 -02027000 -99000680 -01000a71 -29290800 -04a00806 -b2024200 -04000017 -81064000 -08444060 -00402800 -60048880 -c8013000 -40040228 -08c84000 -82480084 -03228000 -10808048 -00208000 -0261d527 -832c0000 -a0a46202 -08180000 -08118d07 -2a080000 -6084a180 -60c00000 -42216218 -13800000 -0904e404 -40200000 -d10dc11d -21400000 -0b605a8c -41800000 -04e30623 -01000000 -8530424d -0a000000 -e8104090 -48000000 -1081008a -08000000 -08a9340b -50000000 -0a0480ca -00000000 -0a800000 -80000000 -0ab0cc00 -00000000 -110116a1 -00000000 -c0280501 -00000000 -09026842 -00000000 -0034060c -00000000 -c0003a08 -00000000 -080a8540 -00000000 -200a2040 -00000000 -1c804140 -00000000 -80008200 -00000000 -08810300 -00000000 -81180a00 -00000000 -40541400 -00000000 -0328e000 -00000000 -88080000 -00000000 -04350000 -00000000 -10908000 -00000000 -c0038000 -00000000 -04110000 -00000000 -69920000 -00000000 -00000000 -00000000 -e0400000 -00000000 -99c00000 -00000000 -17400000 -00000000 -a0800000 -00000000 -04800000 -00000000 -01000000 -00000000 -4c000000 -00000000 -18000000 -00000000 -10000000 -00000000 -30000000 -00000000 -20000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -081602a0 -0168a920 -54c40248 -1012a08a -11828912 -40200012 -02ae1086 -269299c2 -2280178a -00152110 -0c2ef85d -24002200 -88062121 -02052111 -730f580d -49000483 -414124da -04019611 -00f428f1 -04c04041 -e1087378 -c3106040 -081001eb -0c040b00 -30e10845 -55618a14 -ba08575d -02352284 -1163166e -08155004 -b23c793c -89240013 -9802b3e8 -2311040c -12306b95 -80030414 -0802bf7e -21202284 -1016352d -0190e80a -10606b75 -209a40a2 -20c7281d -01038401 -64207a6e -42058313 -f3695e7c -8d201049 -0206ce0b -10596211 -00adca5b -0018884e -2393cd5a -0000480d -9585a3fa -63604161 -c81f21ff -200088d3 -1288f0c3 -42184280 -3203dcf8 -9c108b00 -31911bf7 -c6000e2d -6672eada -0024a430 -8a116ca0 -61ca40a5 -a630b44d -80052040 -686cc193 -3607b027 -69780d70 -40800101 -2d01d181 -24200715 -4928a17b -06a2291f -f6d6c917 -d4800143 -87b54144 -681cdc1f -b07d649a -e0644095 -e8474edc -70010242 -74e944f2 -040a27ac -c641de8d -112028da -6e1bd534 -a80a1799 -68a57aaf -76102e0b -4bcd2b08 -6081061b -4892bab2 -52880a5c -32634fc5 -2409a446 -11285db5 -208b400d -894e02c2 -0c255b70 -4c6774ad -2000fe62 -c3b9beef -2144cb7f -64fe0833 -0008f684 -a4cce666 -8526f5e1 -d2c8217e -a4e9cb1e -40681adf -0149d850 -92073309 -104b25e3 -1f7bf60f -264862ca -bcd00de7 -2c735232 -fc4e28b4 -01cc6135 -b4915fef -b853a012 -44170772 -50083f03 -d0746162 -5915e3f2 -264c4064 -00280928 -028884b0 -a0212156 -38e6a05d -92088000 -16118049 -a0050264 -44808120 -521a0488 -e501a402 -98a8c008 -01218042 -78052004 -982000a0 -2e000118 -06801052 -c3220c80 -42280120 -42000208 -01183245 -f088a6c0 -c2930404 -03e04044 -11904528 -9ad02091 -02207408 -d8209899 -12c41888 -6e180400 -102a4316 -6410c107 -8c108274 -764a40b4 -10220141 -946c0018 -00541008 -fd844400 -0a394014 -1d6d2002 -e620905c -91991044 -3268044a -1b2e2891 -2f086410 -d53c2488 -02180474 -c21668a8 -16a00242 -5c7fb009 -8160d030 -aeb0a908 -88623c00 -cc81f252 -34605048 -2041c022 -c508f730 -f0f1d8d3 -0600a106 -426e6dd9 -40700a00 -e715dfe5 -102a4001 -db54e658 -08848020 -a3729599 -80e40521 -6fd08d91 -4e020011 -1ad9c6d8 -e22100f5 -05d54cb2 -6020e401 -9e2e5be5 -795e0413 -866534cd -2080e20c -56f55245 -66127d00 -44eb31e4 -1f060430 -7db4d3b5 -7f20c144 -3372969f -8fc00006 -a38d0f39 -f2e04621 -b06670aa -ea741100 -23f7d227 -2c40622c -887aae6a -de14a008 -106607dc -6be0248e -c4aaf35a -1530140a -0981abb6 -b7e02901 -db14a009 -ca710223 -eea93b6f -167cc426 -fa342b15 -ec9a5180 -b7b8b1a0 -fb7a3b29 -3473f51f -f1bae488 -57d53e43 -63522412 -2141c6d1 -b3257d52 -e7ff25b9 -c196c580 -28c0d4ae -b6d3e849 -0942c3fb -79a2ed01 -418bfbb0 -13f5bc90 -af3aeaa3 -a111f5fb -1d849e2b -d4652688 -44339c10 -67ba7848 -746fe5b9 -caa0a141 -9064dbd9 -90034004 -080e5323 -002a2020 -20300201 -4030020e -28484392 -c2050029 -08000858 -04004a09 -00032000 -029471a8 -06320404 -00400841 -02d013c6 -0cc00682 -01550174 -88281820 -00a64420 -002a1731 -00484200 -f512e080 -00040095 -80e00090 -00010889 -04410520 -000d8019 -20401409 -00000100 -0a4bc278 -0002a012 -14000c10 -0001b440 -60100014 -00004022 -00028121 -00004040 -58000c20 -00002009 -094ce086 -00000400 -a9010234 -00000007 -e4502102 -00000203 -200c0631 -00000290 -a004b24e -00000122 -00262020 -0000000a -48008621 -00000042 -7001c198 -00000028 -ae096415 -00000010 -05246000 -0000000c -22500eb0 -00000006 -01168432 -00000002 -08180102 -00000000 -0900003c -00000000 -58c20584 -00000000 -10012108 -00000000 -18904405 -00000000 -00204406 -00000000 -0211e050 -00000000 -0001d120 -00000000 -00100221 -00000000 -00801212 -00000000 -00302000 -00000000 -00301042 -00000000 -00088000 -00000000 -00009a01 -00000000 -00020000 -00000000 -00024004 -00000000 -0001293e -00000000 -0000b807 -00000000 -00004520 -00000000 -00002000 -00000000 -00000829 -00000000 -00000a02 -00000000 -00000010 -00000000 -00000199 -00000000 -00000111 -00000000 -00000000 -00000000 -00000039 -00000000 -00000026 -00000000 -00000014 -00000000 -0000000f -00000000 -00000001 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -8a000126 -02319082 -2501db00 -4001088c -64622480 -24002828 -200228a9 -1c00210b -469702c2 -00008000 -d286104e -04208060 -64a41500 -0080ca60 -901017a8 -01048410 -02024005 -000020a7 -10100404 -00122224 -63544003 -00242808 -058a4836 -00048200 -0185341f -00090023 -10441064 -00060241 -0a630102 -00032612 -4844042a -00010201 -028c0189 -0000c14c -78010024 -00004812 -44008500 -00000241 -0007a220 -000000a0 -91406492 -00000290 -24000c0c -000004b0 -c1088219 -00000019 -14010091 -00000020 -201000e0 -00000020 -96410481 -00000030 -18804009 -00000000 -17050814 -00000010 -120e3907 -00000008 -0b011224 -00000001 -6010b028 -00000003 -1400402a -00000001 -60012142 -00000000 -4070a804 -00000000 -06100a08 -00000000 -00401538 -00000000 -00023e21 -00000000 -02040a08 -00000000 -008a0200 -00000000 -000089e8 -00000000 -00a44150 -00000000 -004046b0 -00000000 -0011c002 -00000000 -0000e000 -00000000 -00005110 -00000000 -0006410a -00000000 -00010608 -00000000 -0000088d -00000000 -00009500 -00000000 -00000308 -00000000 -00000070 -00000000 -00001c0c -00000000 -00000810 -00000000 -00000468 -00000000 -00000012 -00000000 -0000001c -00000000 -00000080 -00000000 -00000006 -00000000 -00000021 -00000000 -00000010 -00000000 -0000000b -00000000 -00000004 -00000000 -00000001 -00000000 -00000001 -00000000 -00000000 -00000000 -28521002 -31282100 -8455001a -20010070 -14890542 -4814096e -ea244400 -89807c48 -21100108 -00002048 -81050810 -08809818 -0042910c -f0499020 -404240a6 -c211d303 -12680020 -63009500 -040c0102 -593a04a1 -00342080 -29d1f0a0 -0400c646 -01e16080 -09804030 -2586a0a4 -a2a00020 -46000c09 -808141a8 -986c0160 -a0b84248 -7e548312 -10218491 -3d972c45 -c1932010 -a6e92c62 -11054580 -ccddc252 -04101905 -5f74600c -40850000 -71c97115 -62006804 -470be960 -504c210a -0013c801 -cc2100a4 -92c0be14 -10120c20 -3691023b -8105b601 -dbd57f24 -00040860 -09a188c0 -25638101 -1c7f5e89 -a2200000 -09a30c00 -ad490100 -6181e038 -06000842 -7a0329fc -88a02441 -93a1ea86 -11492102 -8d8bacf8 -115008e0 -83d36992 -c4280830 -644b8ad2 -e0400b00 -f30da6dc -f0412124 -20c3ba4b -d1800442 -70f7b95d -181c0001 -994f8d46 -ee22014b -d56cc52c -ba700000 -7ada1757 -9803042b -6aca68e3 -ae02444c -c1e37ade -74802406 -4994cd7b -a7000181 -ac040093 -d3608040 -38f5036d -d2502922 -22970dfe -95fec06b -8decae92 -3a131ea2 -e744d716 -66108600 -d9afc609 -25164823 -eb46e386 -c2f9e988 -f68c1763 -d7f4e402 -28673630 -58d67299 -6a5b2da8 -7375e54d -8ca3f894 -b277bae0 -76b2154b -f4ab5511 -6ac4ff4f -c2b7f909 -07d62d60 -b267b400 -56913d4c -533580e0 -bcd88611 -a5195dd5 -9e4f11f6 -4123da19 -00e1a410 -ac1714bc -ec856888 -307b497c -d6fb3210 -fc33f0d8 -cb3d257f -5ae10604 -5ba2c7dd -2af42d39 -92eeeb1c -d96429c9 -b4cc02c7 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/clmul-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/clmul-01.reference_output deleted file mode 100644 index af9c380f1..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/clmul-01.reference_output +++ /dev/null @@ -1,1052 +0,0 @@ -55555555 -55555555 -00140010 -11445401 -00000000 -00000000 -00000000 -40000000 -00000000 -60000000 -00000000 -50000000 -00000000 -08000000 -00000000 -b8000000 -00000000 -70000000 -00000000 -70000000 -00000000 -a5000000 -00000000 -6e000000 -00000000 -0a600000 -00000000 -11b00000 -00000000 -6eb00000 -00000000 -e5800000 -00000000 -21f40000 -00000000 -18650000 -00000000 -00000000 -00000000 -8e378000 -00000000 -32d2c000 -00000000 -4b881000 -00000000 -b0cc1800 -00000000 -a26aa400 -00000000 -00000000 -00000000 -00000000 -00000000 -64a87000 -00000000 -fa87e340 -00000000 -84895de0 -00000000 -b2861c90 -00000000 -5cd5df48 -00000000 -ae642da8 -00000000 -fbe4b0b6 -00000000 -c4531049 -80000000 -9606dc0e -40000000 -b6e9fb41 -e0000000 -5cc26cfb -b0000000 -657fab39 -70000000 -9ded44d9 -4c000000 -634a7a2f -70000000 -073bcd65 -9a000000 -59197415 -23800000 -d2592171 -ca400000 -a5770740 -be000000 -3b6762c7 -06800000 -a1d7b639 -66d80000 -8ff0960c -5dd80000 -09963c2c -5aa00000 -6e70dc73 -3c3b0000 -c2c594fa -89340000 -7487cc33 -b8118000 -8a488186 -b9862000 -efed1c42 -7275b000 -7e32f486 -8b3e9800 -8ab10903 -65930c00 -fa055df8 -b3beb600 -86d05367 -533a3200 -47b0061c -f4883f80 -781f63af -0bdb0d80 -ea4f2c9e -3d05fe60 -7dca914a -85d96740 -35e46cd2 -2a67e868 -04db84d1 -869d199c -7f6fbf64 -1fe2d880 -a59f0921 -b2371ce6 -a69f7ea9 -00000000 -00000000 -00000000 -80000000 -00000000 -40000000 -00000000 -e0000000 -00000000 -10000000 -00000000 -f8000000 -00000000 -1c000000 -00000000 -16000000 -00000000 -0e000000 -00000000 -ac800000 -00000000 -92400000 -00000000 -3c200000 -00000000 -61f00000 -00000000 -c6b00000 -00000000 -ba840000 -00000000 -f56a0000 -00000000 -92f30000 -00000000 -a4168000 -00000000 -d6cfc000 -00000000 -e4556000 -00000000 -105e2000 -00000000 -ac638800 -00000000 -c4b0c800 -00000000 -354c7000 -00000000 -1a3ff200 -00000000 -ef3a9200 -00000000 -404fc0c0 -00000000 -93af7000 -00000000 -df17c980 -00000000 -f41e8aa8 -00000000 -e7246e78 -00000000 -8ab26590 -00000000 -c51fb763 -00000000 -91bb9148 -c0000000 -206d1ff3 -40000000 -2f80e626 -00000000 -9ac482a9 -18000000 -c4d4defc -a0000000 -b0d8a852 -4e000000 -35d64806 -c1000000 -ff1f2d8e -1a000000 -95646529 -b9c00000 -0bf2bee6 -fb800000 -97d1ef68 -57800000 -e17e74df -2f000000 -a8e3a798 -11600000 -ad30f85d -e2c20000 -11b49bde -81200000 -a0655829 -9bfb8000 -363021b7 -138b4000 -0f5dfabd -4a9f0000 -2b200995 -94819000 -ca87d455 -8f24f000 -815f8aaf -58afec00 -847c519d -f5a02600 -6e1ed243 -b981c100 -98904715 -255ae500 -0d65cf0e -162b1f00 -37f99759 -a78e1ba0 -4695d66c -3befacc0 -3e285d71 -edd06718 -37c1233d -5de77334 -15914ee0 -32cc1786 -9038cff9 -339de029 -fa1d3b53 -35b0944e -a6b9c176 -a632f9cc -b46e2d72 -5aeff00b -8f76ee54 -b0e340a8 -df686e43 -44aa9cfa -ff876f35 -3ca82b6d -9fc4709c -9e3810ab -78aca5a6 -02a4b1e3 -940220d3 -05c233ce -9d052803 -65623ebe -c8668e4e -7f10d14c -f5f0a299 -a37a6480 -7f5934b7 -7d770f96 -2a5c6bac -18f46ccd -ee5413d5 -07ff568f -45c81364 -42fc60b0 -fb7a4062 -72f09655 -b2e7bcff -a174b8fe -76a97ebb -f365b7d3 -22c07e4f -61ecc46c -a3d18209 -3da714fe -43cc6f70 -3483a29b -c2afe2cd -24df6ff0 -3817790d -056faf40 -34afe9b8 -9fb01b3b -109c21ca -5aa02cce -6cd65562 -25069617 -6eaa25db -94f0e89c -69a0dcce -c63c479b -27d9fa3d -8ecc2a38 -d82e1fd4 -f738fe46 -0fd66e41 -ba1a2c3d -0356af81 -ad08e0d7 -6f89c9f5 -f360111f -174723bf -92eedc04 -3cfd622b -d9a4a3d2 -fc7a364a -db1b68a1 -e2564350 -6aa92434 -30191944 -e2900e61 -9581657a -0c62b481 -bd9d157a -e52662d0 -10c3915b -f0e0cc44 -a1ccb184 -a8da6556 -52534ba0 -856aa896 -8d811066 -e331a957 -3276f657 -fa88b794 -cbaf32db -6d847aba -4dc0054e -f15cbad9 -a7e22198 -3d44d15b -6b4fa6b3 -81239d07 -0477349e -4f8f2f3e -6ce79f36 -d23e2d07 -173ad2db -1ff2db6a -2a3820b8 -72e86a97 -f4dcb67a -c83e88f9 -97c7b01f -e356f26c -db859090 -948c3074 -b2c0a61e -aa0814fc -1ccbe7d0 -e825a8cc -469a3ff5 -01d383d9 -c63f6d5b -08043493 -a5df00ec -c0a3634a -574785bf -e2c96a80 -9dd45cf0 -65cab469 -9c6d922f -6fa8c691 -db65c33d -8c52ddc0 -25ee3144 -ca819e43 -6cd14533 -d9dd02ef -d9abc1c4 -a581d687 -a6626a70 -f2d90623 -e4cdc9b8 -eac4c1de -127ad386 -64199f4a -df242210 -a04ab62e -0f3d9404 -ae02f7e3 -f2db06b6 -74e46efa -2aefd23b -d75fa47d -6d84d540 -97c1d20c -ab9702c5 -86182296 -f3162d3e -553ac79e -3022ae8e -32ffd88f -e524e98d -39a48241 -0269246e -83a0c40d -4a998d49 -036e8c26 -5e6e57f1 -d19cc07f -8c8beced -a0ef464e -1565be4c -f7257386 -f3fd7b8b -9ba84d5e -dad4845b -36357c8f -45d964ce -ddf26081 -00882a48 -9c5710ac -09d197ea -9b31ec9c -01fd4814 -e7dbee63 -bf65640b -f1d63403 -86fee987 -12a04a00 -aa12b238 -7b2d0514 -47c33630 -3b541efd -7b9d78bb -3a25a3f8 -9bbc208a -777b0ce3 -dd668848 -d35a7135 -e5017777 -3745396e -107f2131 -728eea24 -1c7f9118 -727d5185 -7d79d52a -b1aa1a2a -c0756719 -6db2ca7c -2acda560 -f8e71258 -fb2f9deb -d7c66a69 -be55ad5f -3a818923 -ba24f726 -f29790e1 -1a42b494 -790d96fb -d5333031 -176a1f2e -1caea2e3 -8f5c19b9 -9ee647dd -72c98330 -fd6fb0ac -6c11b3ad -0c59d75c -6d24c33b -35ce5361 -448b9016 -303c3697 -5a4d61c6 -66e46aae -d26f54eb -a7b99c7a -917786ce -17daff74 -143dc0f0 -3a691380 -8900ad44 -c792f8d6 -36eef777 -f937060a -e4ed4a7f -15f213a0 -6a8d5ce0 -eb921d65 -24a84452 -c16c49f4 -a07c0750 -bf6d74ec -c11aae08 -317b9b44 -016f4d39 -35ee8a46 -39259ff0 -fd64355b -96a7a87b -6552bfab -e579758b -6259f404 -2c9e774c -762cb312 -df16d689 -87a1ae5c -cb50fa20 -8ab58ed0 -21fc9992 -51a990f2 -e98589c6 -38b039ba -fc6613be -f2bb7d5e -97796170 -3a5d16bb -e16743d4 -0bd83f85 -00931cd0 -bfc6dfcf -e600c2c8 -873a55ef -adb39106 -4523b7f9 -61e33ac8 -55643299 -62cc7d30 -53b294fa -5b46e0b4 -aa99bc22 -769bda00 -30e6b210 -4d1af6d7 -f5966a5f -093f62e8 -dd5c2139 -eb66e3d2 -afb1f2ef -2bc98126 -797c6364 -e638fe7c -ae428050 -dfe70942 -b9f8e06f -0e4e8052 -9e7f0648 -e4cf7360 -d05d40f2 -dcf13cb7 -ea9bb0d5 -2084f102 -4abf08fe -dc528de4 -c7a2e366 -8da55f60 -ceab3309 -4bbb43fa -d5b9e824 -154b9618 -d8dfa50c -ef062027 -7ecabf07 -74a8d338 -85398ffc -40f463ce -f323e0c7 -1ab9e04c -d8ecd870 -e27048aa -1b67ac30 -5018300e -7cabade0 -b9b2c5e8 -8b412d5b -10d6872c -bfa89d9b -0c1b68a4 -570ec409 -61b02eb4 -cf3666ae -8fc0ee4c -d7852f3a -f332e9d0 -31af809d -5c590e05 -7b2ba71b -40bf518e -9466604f -38a4f38e -d8a39c75 -3483ddc1 -ab1e3893 -0ffc9834 -cf785957 -2e4555db -69f10af3 -09c80860 -5188bc88 -6b7a0f0b -3f8c695b -b7e56056 -363519f6 -051c0ac4 -824028b9 -a70a8310 -6e4375cf -6f9f7c70 -cfd99fff -9add0bea -2d3e57ac -4bf922d0 -27d1e654 -7227993e -bfff8e24 -108a3222 -478cf57d -e69cfb04 -61b482ed -dae45842 -aef1c73a -42f7d7ba -91d87f25 -c38eaa50 -6a061537 -8447d7ec -761278ae -7caf6b9b -cc54a431 -67ba7848 -746fe5b9 -00000000 -00000000 -a67c4b3a -ec6f4980 -d7e842a0 -e4112a19 -8c6984ce -e7d3f988 -72e792d2 -93093b69 -4f4caade -dfb5c4df -4cefa028 -8beff7fb -9591834e -10bcbb96 -0222ae06 -8219a90b -21d7fedc -0382e45b -fe39f194 -6525beca -20188b19 -260e0762 -588b99f4 -54c4f99e -776c377e -3595adec -62e61da6 -9248384e -cf6e4573 -23c6bc01 -4ac82081 -b32ba0e4 -9730f59a -a97461c7 -6c2151d8 -c4a99ee1 -9d06b2b4 -9b217c1c -6de7db10 -a67f3999 -e391eadc -7f0937ce -dcdb17b2 -d6e9bf6f -2c4526ba -a7a30b18 -ca6980c0 -bde620d8 -bc4c1080 -c8831d80 -7245ec8a -e2245241 -732358ad -fd80b8cf -c960ed00 -783d3047 -0ecf49e5 -08fb6daf -c8c2b2ac -31abb3f0 -4a4dd33b -06dd50b9 -f0f3afda -33ce8011 -d88cbc04 -f9f844f9 -33799e5c -522ddb34 -119bf956 -941cc71f -76326958 -e0b6540e -e6a829f0 -97dd1459 -e88a6328 -e60f913a -74946c78 -20cd753b -8d3bc0d8 -1846be0d -0c8ade28 -747cfc03 -a5937b50 -55bd714c -abea0db8 -65fe980e -4fa68a51 -79c68e09 -3512f90a -469b514b -f8044a55 -d1dd77ac -d648ff55 -44b229b9 -0bd7c2bf -a6f2d0d8 -72185248 -90a7a8bb -4e7ca02e -95e6088a -29e27e64 -640abfa5 -7565cad6 -ff4860fa -84227578 -06a40b2e -c5798699 -de6a7058 -78a892ee -68c3af7b -ab3a070a -4c80af22 -e672e8c6 -dd5e0763 -d6582456 -05d6f41e -74efd280 -ee14663e -c9d2249c -961e16cf -89c417b0 -aed40cb6 -d0e89d7a -731123ab -960110a6 -5f52284b -965eda32 -309d6b79 -00000000 -00000000 -7bc46c00 -4606ad7b -b3f7b3e0 -426c92b2 -59dc9665 -e221333f -39e3991e -0518060e -e14fd738 -823d093b -699807af -fa40347d -558df750 -e48ec8a9 -e94aa13c -bd9d4d28 -ac131688 -097c5015 -c6b6e6ca -907f164c -8eb8db88 -ff0b511f -f9b3bf87 -ebcb3077 -566a4ca0 -4d91b84e -b5aed539 -3c115c31 -d1eb0826 -6233bd12 -ebb796a6 -5303deb3 -7192ad8a -40e2c7d6 -0e1667e0 -05ec3141 -0f353030 -a6bc227e -cb2f8c21 -c0ab9dd6 -5e7d5248 -01750d02 -4d4af26d -eade259d -490fd19a -989d0f39 -2dc1bb8e -f6d19537 -308726e0 -f6d1ea80 -4f9ef570 -919a41f3 -9f9095c4 -5a701723 -525fee60 -32dfc1a9 -dfdcf3d0 -5ef64932 -a88a7be5 -9fe3cb7b -f43e6d68 -c6545f52 -97cfff16 -409421aa -c9132173 -d4294f2f -59118ff5 -b7aa4e6c -54c235f9 -7aabf617 -42281670 -252122f3 -9f2c326c -8b50d353 -cc359d88 -28f01fbe -b8e734e7 -14a229cb -ed304f6a -15e2e9ee -d9358fc0 -702da7b9 -5be412a7 -af73fbb9 -fc1e1fa8 -c940eba8 -1e891938 -8b8737ae -29747024 -c3d3ce41 -c3a838b3 -2bda5460 -7a106c1c -53534d4d -c2ab3730 -bfc52c42 -c372d4a5 -4e72dae4 -cb8e53fd -44590406 -139c7bce -152bb431 -8c710818 -912e2d0b -6739d756 -0f403c2c -c3193f64 -a216a4d1 -e47757d8 -a5800941 -9dc97721 -ae090613 -e7c81bab -a6c3db6e -7ea861a6 -9290db20 -70bfc7ae -a789794d -92e709ae -23356d1e -65c19a3c -30d0ef2f -268db34a -530b3fd9 -236b2a1c -c9ce53bb -8c1e05d6 -698b7890 -b40d65da -a522d0fd -fd59cb93 -c4d61714 -541c16bb -4f26399d -e0d45768 -44ced599 -4887ebcb -b29fc4cc -edd81f4d -43a85742 -ab4d23d0 -2956d23a -78c62500 -c5ebbf41 -c2486f50 -2e98add9 -cbe2c612 -36c7d0c4 -46da1298 -192959af -c05a71d2 -b1f11cea -22eaa196 -c8fa166b -79b37881 -0ee2dd4a -c24038bc -a9f3eb59 -3ebf6fe8 -b58fea9b -4199c768 -45219c08 -af325a82 -b3c60b96 -bf40b590 -d9cd69a7 -e390803b -4735ee7f -5441bfca -fc15396d -a52934d6 -155934e6 -d520c700 -ce8980e2 -74c2ab97 -589abfa0 -194a0120 -8a33e40a -64c2bce5 -8d4adfba -a8da128e -fb8ce5a0 -d02b10b1 -45eff8ef -f4d521fe -b1c3ec48 -ea588290 -e55aafb7 -06ac9015 -f661f951 -43f2ee38 -518f46cd -024b2e5a -cef781ad -a403c9d8 -f249e607 -a6cf8f58 -bcf6daea -23f1ccf0 -b74bd202 -3be97095 -0db84cab -cfc82d4d -0716bc60 -c7e7c15f -9fc72e9c -b79c4de2 -4714223c -c1bb41fc -e4823e48 -b97b9880 -61a2afec -a33dbdcc -d7d30e6f -cfda61f8 -2c6b3678 -6ce85d10 -f2fd3336 -fd169d3c -4902ad4a -d255adf4 -f8c0cc5b -2f7d2822 -5a48f60b -35785880 -e85c7b0a -cb573f90 -a721acc4 -affc2e65 -8c83dc9e -a113857c -a0feb70f -b607989f -4a5bf799 -3b71823e -e26fc077 -f794f6e2 -0f9d0dfd -2abb356e -c7396006 -2e9c7b9c -8fb62ce4 -72781602 -d0749bb6 -ce66e256 -3a93d9d2 -35356ebb -8ecc4655 -88c55f60 -dc5aeb4c -54a5cb08 -ee76f65f -6ec48b3a -568ca6e4 -3a9e9b04 -3b59cb4b -8af8db02 -31f8894a -0144051d -13be4980 -00000000 -00000000 -00000000 -c0378000 -00000000 -e99fc400 -00000000 -56dd4900 -00000000 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/clmulh-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/clmulh-01.reference_output deleted file mode 100644 index b6406409f..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/clmulh-01.reference_output +++ /dev/null @@ -1,1052 +0,0 @@ -55555555 -55555555 -50155151 -11454404 -00000000 -00000000 -0abd0b4e -34bbbac7 -00000000 -00000000 -e4b72b0e -17f1c6bd -7c15f1f5 -1dc97a7f -d2fce903 -08b15795 -5a3a1f60 -59c20444 -26c7f7cb -2a5ad4e7 -ba589df7 -77041274 -a08e3262 -08f609e8 -72d322ea -00c4a4dc -2765a4a0 -2e727023 -ddcaf866 -63b82984 -b12d98f8 -25f55032 -2ffc50e2 -44c74792 -3d15e669 -0abee91e -832c5b58 -0a34e73f -3a1881fa -0f0a8245 -a55a33ec -6b0810d4 -408ee4ac -72632882 -ce0dc968 -155da612 -26569b1a -3fb35b2c -74f9420b -390f6080 -733a516f -1e677604 -cfb84cf9 -39e93609 -0f208e4d -7e29f06a -7a3136ac -2b9ab258 -5acbeeb6 -14dd1e2e -00000000 -00000000 -409291ee -22f36372 -1d047a50 -152a6924 -3d3a7d4a -28a11e96 -43df77e1 -24daabe0 -884f2ef5 -2201d7b8 -ec9024d4 -1899eaac -e4f90f31 -0b2bb6e7 -a0baf0ee -080db2e2 -325b230c -495ab010 -8940323c -39520e68 -e9f57d7c -47fcb507 -22449fbf -1ea011f4 -5bae8b5a -567ed413 -3a440486 -1edda219 -29b78af3 -327d671f -7fb19e9b -1a60227c -5d212d77 -77079671 -6bc11d37 -020fc2ae -39aeeb60 -15a898d0 -7d2c3d1a -242f4e1b -1e6377f1 -76b5f3f8 -d313dcc0 -09fcf1f8 -fa24cd75 -5d324b47 -0be5a6d7 -021d4ec8 -a66049f0 -2f67a8fa -6d36b201 -6eca19d1 -05e227eb -3053de18 -5061b7ae -09462c23 -3513e68e -7c960508 -5c2cc2a0 -7733e564 -2a9bc2fa -31c98464 -1e6a1d38 -7dc0a469 -4ebb8d9f -3c49282c -c726cc8b -06eddac4 -90e2a7bc -08968454 -00000000 -00000000 -a5f694ba -76a7676b -cc81ad1c -0a72d4ab -e9de876d -015cbbc2 -80b5b953 -7d29d8f5 -5fcc3a24 -3e8c4466 -d224d4ee -329c09f6 -caf9c459 -1ab60d97 -5c539d16 -0f64d7d8 -a44b19d6 -1a5817cb -312e03de -13c74cc6 -ffb3e94e -292d4202 -746eec4c -08b59778 -72cc0c6b -010bc68f -b8a92813 -1d8364e1 -72c436ad -03d2ad5f -9a2e9758 -723e96b0 -a55b8ea0 -25708c83 -d10bde06 -2de636ae -e3d7711a -0e2647dd -c8c27817 -069fc83f -5703a02b -7f4d327a -1de7e662 -3e5e1177 -1471d46f -00cf1626 -3a3a7487 -38cb8a8c -a10a871d -090ab2b0 -eb5aa863 -6c90d7da -4d8d664b -283e1c7c -95205070 -3b6a557b -79c91270 -18d410d2 -80a68d4b -4e7c0755 -aad8ef19 -1ba642cb -277b6222 -2782f2f6 -2f29e391 -06a450f2 -dc6c525b -13392592 -869e3013 -3a3dc768 -efecc863 -79b44eea -01d19341 -054ab944 -c8b309d6 -102b1f06 -fdbbc0ea -00ed81bf -24aa034c -15644322 -7e752a4b -0d29be02 -e9f87354 -7dd2df1c -a9b09378 -36510a20 -c9c7abdd -3d0c8d50 -6dfd4111 -18d5d38f -1fe54a3b -082f712b -9290a1a2 -756009e4 -d70956c0 -2a6d4fe4 -e1f046db -00c8aa66 -a1dfc1b2 -029b5aeb -1032ed38 -0552130e -c21f58c3 -00d695a2 -81f1c062 -2bd77034 -546d3864 -7c0a2cb0 -254c224b -0657e4e7 -71716e96 -57c3bc67 -57592cc1 -00a20dbc -fe786528 -30b3884c -480261a4 -7c75291a -d0cd654c -04cd2c71 -b24b8ee1 -3d6daa05 -4647db11 -146fda6f -f919f83f -2930f6c6 -98d3764c -09aade5d -184ee5ca -08491652 -5b3563d7 -47c4056d -d6b2d484 -032ed77c -0ea82e25 -7eb44972 -f45a56d4 -0111b38f -f83e2345 -312bf7ea -cbf795f4 -0d67293d -c19c93a8 -75cd5b3a -811e2504 -505950f1 -25a5608f -0027ab04 -418af5e5 -1791c717 -48db82be -36f2ea8e -5691df56 -315b8f5e -f6869c5f -2c01f541 -44b60344 -1292a569 -5f988d67 -00c49511 -110da20a -0f18d5d2 -b9d1a2cb -40c66226 -6c84a322 -313fda9c -0ab9a8e2 -0b487e18 -0b73bda4 -28367364 -e9050ff1 -19f068e4 -539f627c -070256dd -4c84bddb -0156921e -541c7d04 -0026a7ca -2d62e660 -01688058 -7d77ca7e -47e48a42 -ab368fc1 -09a4e255 -4abc94f2 -19dfd027 -907ca0c5 -74e4fc08 -5bdca3b4 -044a6dd6 -94cca9d3 -0a2adde7 -2c4535f8 -08e07fe2 -4ee376f0 -11592bd6 -7f134fff -1fb6c73d -4c79b3a0 -16dd1962 -9087ae4c -3504ccd2 -e21f9c15 -1511eab6 -5faffe5a -0e61651b -d9f59fa7 -2ec749d8 -20f608fb -01728d3b -34f0af73 -0ef10c9f -68b5225a -6cc10550 -1f8d2413 -119a91d2 -4315b4d6 -006f1f7b -45b52912 -064eb155 -3b50e1c9 -1187c7ce -08a2740a -0874e586 -962371f3 -39ff3b8f -e6337c65 -32a13e34 -9914d14c -41feac06 -3869537a -08a7b868 -5938c153 -165f6b8b -a68dd4be -054512f3 -a9ebb475 -2105f038 -a3d6563f -57b1775b -78da7320 -01a7499c -7e7a8adb -3d99c47e -458c545c -6ae6d8f7 -a6cb21d4 -4aaedf63 -cc866d93 -1e6d7094 -d8e6be86 -1e0cb7d7 -54e07a9f -4bb49a4b -b2e55a34 -0e36c917 -9057396e -249a3cc2 -ef24089d -002fca7d -c53f7630 -077b0320 -27b2bff9 -741d668e -76f96831 -12cef040 -0db2e869 -0ca41ec6 -1096654c -49135173 -435260d6 -158168e2 -3d9ec1bd -27024bcb -8dd3a82b -317a1fb0 -bdf3cdc6 -15acd39e -19342f99 -09241918 -0c9efd4b -542f6002 -b826a0dc -2035d155 -e3128229 -012cff73 -ccc8feda -00273856 -6f049ae5 -2399ae0e -d2137052 -0947b9fd -5abe9bdf -06f934aa -3a7394c3 -56f910b3 -26ad46c8 -358711bf -67784ff4 -1bb08f65 -5f315f0d -008454e7 -b6ec88f3 -679a6377 -5619ed22 -3e4043f0 -40d87f25 -14756832 -53b5d80f -5e73b25d -6b71330e -047405fc -d3987fa3 -03295046 -453e13f3 -0bac508b -39096a72 -07f4b7cf -a783432c -2188ca05 -3c444e95 -14d15949 -8615aacc -060e83e6 -8a4e6974 -070b2383 -8be23523 -3a5b52ea -adc34ef6 -0e77fc2b -b0cb45a4 -099f6389 -10a38c93 -18b1ca16 -b5e90cfa -1fdb8c06 -950925ba -00f5b9b0 -5fe4da62 -772fbab6 -f98087af -0af9e28a -dc7e9491 -39416d21 -6e771082 -4c40659e -1cb65615 -07d29d11 -ecda5f9b -2628fe55 -998b9efe -03a9e47c -87ac9b94 -75c68928 -87960812 -70d83d82 -80166619 -0a4bda8d -e9d56663 -29aa7c82 -19c02e4a -16d31515 -ae053c4b -0e0200c4 -d7b9184b -12adfe4b -a030c03f -112a4004 -4fb504c8 -2130e3ae -61fb67ab -2fa43874 -ee3f0017 -2404ff78 -87620dd8 -1b0a3eea -a1326378 -19a07f4c -1b8bab5c -1e99d3f2 -411977d0 -4a28f99f -9401c80b -0370dd5f -34ac2bc2 -0d56a02a -e579758b -6259f404 -a371233b -782e5a32 -80ed13e8 -23608a75 -53b71110 -10a2a023 -73de4494 -084f26f9 -8e9c377f -038853d9 -8d08f4e9 -03f3fbe0 -b13dcc76 -009d9887 -0f78515d -00347c0a -a7497756 -00521cc1 -d4fcf0c2 -001f148b -aeb3c9b0 -0013c24f -ef11aab3 -00003493 -1193903f -00077c5f -eeddf5ea -00020bb0 -040d2f6c -00009b92 -eea81987 -00006c8a -3742e943 -00003784 -94fa7ba6 -00003421 -3b2d314a -0000183d -6fe5c6e0 -00000111 -cbc4f917 -0000073d -fb524b85 -0000006a -3e2adfd6 -000001a6 -c568fcdc -000000cf -f1d4d906 -00000024 -8a8784ff -00000036 -2269d8fe -0000001c -351d6fb2 -00000002 -8f4f3b88 -00000007 -99eec50b -00000001 -dadfbdff -00000001 -b49d9a87 -00000000 -6d15fc63 -00000000 -1338d557 -00000000 -02e3eec8 -00000000 -006759a7 -00000000 -053c2570 -00000000 -03462261 -00000000 -00f1910e -00000000 -007e085e -00000000 -00369d2c -00000000 -000f16b6 -00000000 -00149b8b -00000000 -000dc218 -00000000 -00016710 -00000000 -0003f35a -00000000 -0000350a -00000000 -00009cca -00000000 -000006ae -00000000 -00003408 -00000000 -000017b6 -00000000 -000009cd -00000000 -0000062c -00000000 -000000df -00000000 -000000ab -00000000 -00000028 -00000000 -0000006b -00000000 -0000000a -00000000 -00000001 -00000000 -00000007 -00000000 -00000007 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -a1e7804f -4d9f09d5 -87765aee -1ecfae69 -e2d34b46 -1f2cca46 -3bd04ec4 -04245705 -645673ab -07f0d8dd -e3d8f9cf -02f6c706 -01984edb -009acb79 -af384d90 -00dd5038 -5c24bb7b -00462323 -2b291197 -0013f33d -52f66a8e -000a01b8 -53708fc6 -00004a98 -583e21be -0000260a -e0157e51 -0003080f -0fcddb2e -0001792c -1316b2a7 -00008725 -3d142fb8 -00007113 -8412d62b -00003c33 -aef57025 -00001aa0 -afe62720 -00000b0c -ee319fd6 -000000d6 -84e0322d -00000137 -10adae2b -0000010a -c5e2fd26 -000000f7 -d0bba8d8 -00000064 -70ddbc13 -00000005 -21fa9e21 -00000001 -34a377bb -00000005 -15362e68 -00000005 -501b0451 -00000003 -27efc239 -00000000 -a8b7f959 -00000000 -3a3829b8 -00000000 -340cfe3a -00000000 -01393578 -00000000 -096d9f41 -00000000 -046ca361 -00000000 -036620f3 -00000000 -002c32a3 -00000000 -00926cf1 -00000000 -001677c7 -00000000 -003e23ec -00000000 -0000e4f3 -00000000 -000581ce -00000000 -00013e28 -00000000 -00002cad -00000000 -00005b09 -00000000 -0000d0c5 -00000000 -00002609 -00000000 -0000187b -00000000 -00000fe4 -00000000 -000002ae -00000000 -000002c3 -00000000 -000002a2 -00000000 -000001fa -00000000 -000000e4 -00000000 -00000008 -00000000 -00000033 -00000000 -0000000f -00000000 -0000000d -00000000 -00000007 -00000000 -00000003 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -11aefb57 -04b1ca7c -e7adbb22 -68a7cac5 -ef6d6e58 -2349907e -af504b52 -5f99a504 -62210210 -23bd4c29 -21067e88 -68b2e78f -ef42d169 -2460d138 -fa0a2eef -5a425a8a -bc85c0cd -5a5b7247 -6bedc75d -071306a0 -1730bb67 -4737a911 -da7e0791 -04232eea -53fd6782 -642e8d5b -258c33e5 -30ebed00 -132dd1af -20e5cb1c -bc435f4c -12110ab4 -2842dd9b -198ba1f1 -3cd4643d -1d75aff7 -6045e475 -1b4df8cf -ba630ba8 -02f47ff0 -4386ef8b -2d939dde -0021738e -0b7344d6 -bb80bf46 -26eb7483 -af369d4c -78f6810f -a0b6549e -6d861d72 -fff6ef5e -458052b7 -b39cfc63 -78d48aad -e9ffbb9f -2caee6c8 -9784108d -1e883156 -353f149f -07b271f9 -aba9642e -73fe8510 -1ef02d8b -67211a14 -2f46f7fb -0f3f6dd5 -8d04bcec -566728dc -ee903e64 -4d9b830a -41c52713 -02aca30b -885f8df6 -77d369b0 -4e904fde -1177debc -aa9b19e9 -477862bb -0457ce7f -36bf4122 -fd91f99f -0ee62f2d -12a1de80 -38849785 -9ee46db8 -410e940a -21add357 -6f7ec022 -fee7913c -663dd695 -d7618caf -768999b0 -b72e056b -5c122bb9 -f5c5deda -141bfa71 -a14c0c06 -6e23b03c -6c4799ca -269a59ed -33f82154 -5faffea7 -40776125 -5276f9a2 -d4b4bae5 -189b5fca -db414412 -0ea248fe -489b5359 -0651a58d -04c31466 -19cb4060 -b918ea21 -5d9c4cb9 -da4e202d -63e19add -7ec2b4a1 -2cc8df67 -abdbef78 -766644de -287da15c -740ad3f5 -a0811993 -370198b6 -37253578 -0d8c6b11 -b9f0fd14 -4b3a43b7 -4bf29a25 -5add2f02 -09a56e3b -015a0cbc -cbcbe32d -70d5e6d7 -0562bc13 -60702e91 -3b7e6c66 -24de4f2a -630ed71e -5362bc18 -7d2c1891 -522cc1fb -73dc8ae5 -048d240d -140c3d1a -14b2dea9 -6886aa80 -7466a016 -2286514a -626a1500 -552c8765 -4dff7d75 -419d1be3 -55f5eeb6 -2228835c -49d63d5a -456aab51 -68a87d04 -13057684 -228ffa54 -14cc9279 -7f668870 -d63d9db7 -41d85c9d -d6653d33 -370da227 -6ea33759 -111e17aa -e2271cd8 -607972d1 -d40eaee2 -7a127efa -5bfa355d -6853f1eb -5a0f3ab4 -555bedc2 -c38b7ee9 -24eac001 -636f28f4 -4725ab15 -d3b8cf2b -1c19807c -f2012fc2 -5235d2fa -3774ca34 -5e8060de -be933aab -52345154 -6e973239 -75d5f543 -819fd908 -7cabb201 -5ae2a328 -2435f328 -9e63a2fd -2e2c3102 -a83da2a6 -2be47224 -1ec0054d -7693d31b -0f03841c -0451c8e1 -0340f7d9 -4aebc36c -1bc0f846 -7af83d9e -5c1f54f6 -226fd197 -0fc681fe -198ee9b1 -c338c553 -7ce35867 -22a7f546 -731372f4 -cf46a599 -15f47ce0 -86da0cc3 -6dd91183 -c855965b -3156aadb -1b89c427 -42f9ab8e -e49bb0e7 -4b27ae00 -d9ff6fdf -2e0ecf24 -bca42f92 -08691858 -88a50609 -1dcfe8ad -b658808e -0c68f428 -eb020c95 -072ea78b -e7f9082a -4d77b8ba -62e7790c -7363b1cd -8479f74e -2ecbfd26 -3b783c7e -78c4a66c -06cc6664 -7316ff90 -14c7fd93 -57e74e75 -c488394b -6725be6e -64462afc -3ee2d75a -365d9e1b -20905a07 -6a4be35e -550a36a5 -cea7a6c1 -0ed672d2 -457c6d81 -18fc44a5 -0144051d -13be4980 -00000000 -00000000 -e1c338db -37830eb6 -76215e30 -2d236b88 -38478359 -01c75bc1 -00000000 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/orn-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/orn-01.reference_output deleted file mode 100644 index 107396092..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/orn-01.reference_output +++ /dev/null @@ -1,1052 +0,0 @@ -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -7fffffff -ffffffff -ffffffff -ffffffff -5fffffff -ffffffff -dfffffff -ffffffff -cfffffff -ffffffff -b7ffffff -ffffffff -fdffffff -ffffffff -ffffffff -ffffffff -bf7fffff -ffffffff -ffbfffff -ffffffff -df7fffff -ffffffff -a3bfffff -00000000 -00000000 -ffffffff -76ffffff -ffffffff -fdffffff -ffffffff -eef2ffff -ffffffff -f5fe7fff -ffffffff -c2ffbfff -ffffffff -f9bfdfff -ffffffff -de239fff -ffffffff -eddec7ff -ffffffff -fedff7ff -ffffffff -0c84b1ff -ffffffff -347eb6ff -ffffffff -5fdef9ff -ffffffff -85bbddff -ffffffff -df375fdf -ffffffff -72ffdfff -ffffffff -fedeefff -ffffffff -bbfbf76b -ffffffff -3afd5f7f -ffffffff -70ff6e3c -7fffffff -75dff2ff -3fffffff -af7ff5ef -ffffffff -78afdb73 -afffffff -ef3aefdb -7fffffff -fffb67f5 -fbffffff -e6efe5ff -e5ffffff -4bff9be3 -66ffffff -efffb7d3 -fd7fffff -f7bf3eef -ffffffff -fbabcfeb -ffdfffff -c6f774ff -e7efffff -7e707d9e -578fffff -dfebfedb -aeffffff -fffbfbff -7f9fffff -dffafdbd -fdbcffff -ffb2fcd9 -d7f77fff -bb73bf34 -d750bfff -d377fdf9 -7fbbdfff -3fdbffdb -abfebfff -ebeedf7e -fefeb7ff -fcbbfffd -dfbabbff -def7ddff -4f3ffbff -bfff9e23 -6effc5ff -f7befffe -7f70cbff -1bbfecdf -d6dff3bf -efb7eaef -f67fbf1f -9bb7ffee -bfff63ff -fbd7fff7 -ef7ffe87 -defbeee7 -cf1f3feb -7ff17dfa -cdd7f0e1 -f7ea7bdb -d9e77efe -b3739fce -16d59ecf -e5cdc9f6 -b412d68a -92b13128 -cdf94b8e -d634ad50 -b10bc490 -f51a21e8 -2dc93212 -d8da0a6e -cb7f3f52 -7a0c7e29 -bc9f0136 -fd001a72 -9f1fee14 -d66b6d36 -add517dd -ff0fec45 -66b5aaa0 -f79a6dba -a29d6ac0 -f6e0e4a5 -32f87774 -76e8bab5 -b15b8772 -d6f38a49 -448aea95 -ffbd4188 -8f619f0e -7777b648 -c0081b72 -8b32327f -18e98ec0 -cd5db3b4 -4fc00b76 -fd4aa974 -a3c2a918 -aeae51d6 -e7332808 -1f73e025 -a8a2da71 -9f0cfa23 -831e0b4c -e8fbfd44 -9060cb4d -fbefbe72 -b07cd137 -4df7fe83 -dbb26df9 -7ebf7731 -a4ecfb8b -afacffd3 -9b18869e -ef5a7ad5 -cfa1c07f -babdfb29 -9edaf777 -7d34ee33 -f817409a -33cfffef -9d6e0f1d -efe9c97c -a70bacd7 -2d5fe93b -f5f6afb6 -ffbf8a7b -ccbb344f -91b7ee5f -dd12768e -fbfe7f7f -ff0e0971 -6eefbf0f -f708e34f -ffe7afcb -b877f4ee -f67db57d -eedcffa7 -fffdfdfc -7f06fdaa -7ffff6b7 -ff141aa8 -f9ff9f6b -fbc9fd83 -17bfbff7 -fdca6f08 -ffeff6bc -f2f931e3 -e9fd7ffb -ff7a98b7 -4fffe7de -aecc431f -fd6feedd -96ffcd17 -d5baf7ef -dfef7c10 -a5ffffe7 -db7fcd9f -b3fefedb -fff998c2 -fef5c9fb -fbf7538e -dfaedf57 -fbf2b2e7 -fcdf5e57 -defb7958 -fbeb9f5f -e3dbe929 -bf7dedfb -aec7af4e -dffcbbc7 -de1efbd8 -bdbbbff3 -eeff8fa2 -f8dcbdf7 -9f8f93f9 -75777fdd -d3bdff43 -577f7ee7 -7ec533fa -fff727fc -fef1cffb -fcecd75c -f9fffbdc -5c52efda -daddffbe -3ddfe56b -a59f7fee -fe7d56ff -ff7d77ff -dffedb7a -8afb4ebf -b7bfbffc -cf75bfbe -dedffa1a -dfb9dff5 -47c73a55 -7f3aff78 -b3ef2ea7 -eb2afbfe -136ff5c7 -97fff5f7 -a2fafea6 -766ed67d -1e7efcff -dff5c7a5 -95ad6bfd -ffedef52 -dead9fdf -f6ffcfc2 -f6c3ff57 -fbfed7d4 -fcdffffe -b7daed80 -66fffdf6 -efafb0ba -77ffffab -1be9f557 -d75f6bff -0f72fb91 -fff5bc79 -71bca1d0 -dfe7ff6f -8f3dbaff -fdf66b7f -2effc902 -cb73dfbf -ff6ed875 -77f4e3f9 -7fdd4cb4 -eefb6e3d -3f993d02 -7feff5f6 -6f64e7ad -f77df3bd -b361b010 -bbea7fbd -efb0f1c0 -a6fffe3b -ebd02d4d -ffbedf7f -efe07552 -ff9ed39b -df0bba39 -ddf7dbda -fd1139a4 -3ff93fcf -fa44c8ad -7bfcc5df -f3547e48 -9bd9cf7e -d94902ca -9efdffe5 -ce2e7447 -39bd7fbf -f7192179 -e1effdad -15a03321 -7936eac6 -b733640c -77bfbfdc -6aede476 -e97bfa0f -6d2db9e3 -7f7fedf1 -bffb6c5c -6d9bbb6c -27b012a3 -7c9af3cf -14a7dd83 -dc13f78e -2f6aa770 -cdbddfec -112154cc -effaae8d -f96eaffa -fefdfce1 -8fbff9ba -fb7bf8ab -2552fbf9 -ff6ebaf8 -0f99d8bc -94fff76c -b68c8fce -f7fdcfd2 -13e5cf6b -e41fe2a9 -47cd73ed -7697ebd5 -8364a709 -6df75da3 -d0917142 -fe34a15a -76427709 -e55f776c -20176dbe -fdf861c8 -9738bfb9 -b7e5da8e -5843990b -bdc8d020 -25fb16b4 -ff8eb1b1 -bd94509c -7f41ea23 -fe183d04 -6f5c2871 -386ef954 -bfae401e -0274846b -fa41b7ed -180c5db5 -7e610134 -41e5a5de -79c88ec0 -275bbf80 -e67ce511 -ae5fdcbb -a4b6b671 -b0f94bb3 -6dae4547 -7b7ffffd -ddf8ff37 -ffded6dd -f2fffedf -bffbdffb -cd3ad6bf -4afedebf -77bbbddb -7afe77cf -ac15fd7f -efeffc5f -ff7f22d2 -b97fffbf -eb4f6bbf -ff3f5bff -7d4b77fb -fbfdeeff -779ffe57 -4efffdff -ffdfebff -ff9effff -e3ffeff9 -69bbffff -dfd69f9f -ffe7bfff -5f6bdbbf -ba9d7fff -23ff7fee -5f7fffff -fd7776f4 -f7bfffff -bfbe77f7 -9f7bffff -b35f1fee -def9ffff -febfffff -9f5fffff -f7e777fe -7affffff -6fb9fcfb -17ffffff -fadbe1b7 -e7dfffff -51c3ad7f -f4ffffff -e3bfd7f7 -f77fffff -edffdf7d -7fffffff -fddfe7b9 -ffffffff -e2defe7f -a3ffffff -9bd75aff -b7ffffff -f77ef5e3 -cfffffff -b929dbdf -ffffffff -eb5873ea -7fffffff -fdffeff3 -ffffffff -cf5b1fff -ffffffff -1fadfdf6 -ffffffff -edcb6afd -ffffffff -b717b777 -ffffffff -beeffd37 -ffffffff -efe7cf7f -ffffffff -27f86fdf -ffffffff -37ffffff -ffffffff -ffab67ff -ffffffff -fa5fffff -ffffffff -fff755ff -ffffffff -79b9afff -ffffffff -eebe27ff -ffffffff -f569ffff -ffffffff -bade5fff -ffffffff -ff1b3fff -ffffffff -fda77fff -ffffffff -dfd8ffff -ffffffff -a67fffff -ffffffff -6dfbffff -ffffffff -fe3fffff -ffffffff -b3ffffff -ffffffff -6f5fffff -ffffffff -fb7fffff -ffffffff -bf7fffff -ffffffff -bcffffff -ffffffff -6fffffff -ffffffff -7fffffff -ffffffff -ffffffff -ffffffff -2fffffff -ffffffff -dfffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -fecd5def -8f7d2f3c -fbbfa7b7 -bf75e956 -fefef67f -dbedbebf -779de3ff -fb87ef74 -cc969fee -f67f57bf -ff5fae7e -ffbfeb1b -7ffbffe7 -fc85ecbc -b8ff9fff -ff5d75fa -7eb53f77 -ffffdf99 -ef2d7daa -ff9ddfeb -bb5f7e57 -ffc8fed1 -efff74ed -fffaf9f5 -f1fbd7ff -fff8fcb7 -6e7ff7ef -fff9ffbd -dad59eff -fffdee9b -7fbbf7ff -fffeff8f -ffd7ebfd -ffff57f4 -1af73feb -fffff9fe -fbf7ffda -fffff77e -ff7fe75c -ffffee97 -f7febf7e -fffff67e -7b79fdda -fffffff7 -ffc9f599 -ffffffff -ebf92e75 -fffffeef -f7f7e3de -ffffff7f -f7ecf9be -ffffffce -bfeb7f6b -fffffff2 -f4fbd3fe -ffffffff -f729ffb5 -ffffffff -bfb2e5ff -ffffffff -dcfc7ffa -fffffffd -fe6efb7d -ffffffff -9fffc9bb -ffffffff -e4f4adaf -ffffffff -ffffdfbf -ffffffff -fb2f7fff -ffffffff -ff77edf7 -ffffffff -f9fefedf -ffffffff -fcdef3ec -ffffffff -ff7ffdfc -ffffffff -ff7fddf9 -ffffffff -ffeffd5f -ffffffff -ffdec1fe -ffffffff -fffbe7f9 -ffffffff -ffff733f -ffffffff -fffaeeac -ffffffff -ffffb43d -ffffffff -fffffcff -ffffffff -ffffbf9f -ffffffff -fffffdcf -ffffffff -ffffc77b -ffffffff -fffff72f -ffffffff -fffffde9 -ffffffff -fffffbbb -ffffffff -fffffdf9 -ffffffff -fffffff6 -ffffffff -ffffffda -ffffffff -ffffffff -ffffffff -fffffffd -ffffffff -fffffff7 -ffffffff -fffffff2 -ffffffff -fffffffb -ffffffff -fffffffd -ffffffff -fffffffe -ffffffff -ffffffff -ffffffff -fc2ffffe -edef77bf -edeefdfb -edfddb4b -cf73175e -2ffee3fe -f37ddfef -9fee3cd9 -bedede4d -0d6f6a36 -3afe7fad -26fa4c5c -f55f7fed -aeffbfff -ffd0befe -15f5d975 -ef7efdf3 -5da7d6e6 -e6ae1fbf -ac5e6f96 -fd1ffb8b -a1effffd -9dedd7d7 -fa5fbeeb -fccffdfa -f85ff7bf -79e695e9 -7576ed10 -fe6bc7fd -6b46bfdb -beafffff -1ec5fe6d -fdd1f7be -6421fdf7 -f2a397ef -5675eff7 -fa51ffef -22f377ff -8bdfffef -15c27fb8 -ff75fff7 -ecbb9e1f -feffbbc6 -848c37e7 -fdfcb6ff -4c8d3afe -ff2cf6df -138fc73f -affebe3b -04fe62ab -de7efff5 -e86618df -f29dfbff -f41224f8 -ffffffff -bb161b5f -57bff77b -15c5f97e -7a7e6ebe -62bd098f -4fdfb5ff -ee64b01a -7bffff62 -674dfbef -ffa8eefc -9bbf6224 -7ffebfb4 -098db45f -be9b77fa -f3dd7d99 -9c9fdf3f -1e28cff0 -cbf8ffbf -464cc714 -6fd1ef7c -5d089b85 -9faffffd -ed35c08f -3b3f7a67 -63c134ab -dacfbff7 -c968e1e4 -5bf3e89d -6c4c5c26 -1d7d7afb -faf97b40 -e23e8bf3 -9aeae3bf -3b099b3f -de78f0f4 -fd370dff -f0aad36b -e1cbfd6f -dd8b15e7 -fc1f6f7f -09324d07 -baeffcaf -a9c16412 -9a426dbe -94888cf0 -f29afecf -87aee9f7 -ffdc5bff -c957f420 -27464bb3 -b587634c -6fd5eefb -3bd48e8f -c5349ffd -7cb39785 -eab32dd5 -4accfd03 -5669b5ba -ea3e2d20 -c42fccf9 -5c15d7b2 -38cde33f -893b9751 -cf4e82f4 -1ed4d470 -2b159a2f -78bc0149 -626a7b87 -5994f2c7 -34ff77ae -d056ebda -69a125cd -cf629486 -380217fa -88cb283e -abbdedff -fbbfdab6 -35dffff1 -fd35afed -77fef6fb -75e8fbec -33df79bd -fcc1e53f -d7df32ef -69d5daf3 -f38e7fff -bee3fe7f -f5bed778 -6fa2feee -b99af7fb -efffbf9f -f7fffbdf -eef1bfef -beb98ff6 -0977f37f -ebfcfaff -c976fdef -87dffd3f -0c7dfefd -fdfdff5f -ac7ffc3f -fbe45fef -513fff73 -fefb7fee -612faffe -ff5f6fbe -36335a75 -e3bffdbb -2a9ccb5f -7e6ffdf7 -279ee977 -e5f5ef7c -2dd63e69 -3c87eaef -071c94f8 -fbf1f7ff -76b4abff -b5fe6ddf -1d95cffa -dfbcf67b -6b3d9f7f -7fb9ffdf -891b83f7 -35ff8bf6 -b68a27fa -be5ddcaf -ce80f7f3 -daef5dbb -897d9fe5 -bf7f1f1f -75f32b51 -5f5ff95f -239853fd -afff5b7f -08d6920f -607effee -94038f33 -ff8370fe -a9632e3d -e2b7b347 -1141b67f -d47eef2f -faa97965 -3f9f5f8f -d6ac851f -d2de1d7d -07f5e51d -9da7befb -9875bad1 -d73efeaa -339863c4 -fffa4fb9 -c988a7cc -0d73fdee -5bc1c366 -06aed7f3 -132a7176 -37fce7b9 -498db88f -a331fc5f -c313bc1f -62fbfbdd -b1834066 -032cdfff -aa467bbe -79a7ff9f -9b9aaad1 -d9737f7e -e4367cca -1e4fafaf -3c2c0e92 -e3d4ffaf -b264d045 -b4c8cfdf -6baeea37 -540867f2 -e0f003e9 -c099be5d -f69b0ae6 -7dddcf7e -29ade05f -6dc3ccff -13e6d903 -d9adf7ff -0af2ee97 -0d453dff -2a5dc0a0 -cb293efd -e6a4d5ca -6ed2604e -a422af66 -8347ddfd -755961a9 -fc6c3192 -9aaacd63 -7886e3eb -9c1f741f -e1832ab6 -5902a9db -596f5f8b -1694bd33 -ca11073d -dd4ec4d8 -dc17ae6e -ef677106 -ebfff7e7 -f33b77dd -addffd9f -aff7f6f6 -5effedff -fdfffbef -fbf7dd75 -fb967e4b -7d9d5b5b -f5ecfeef -fdfdfc9f -feb3d97e -5ef7ffbf -fe7fbf7b -d84e59f7 -fe57d3e7 -9afdb576 -ffcfffe3 -ac3f7fcb -ffbe7ffb -fc7ee2ee -ffddf7ba -f7f7fff6 -ffff7bdf -ffabf773 -fffffffd -a7bf7fee -fffb3f6f -bdef77fe -ffffdde8 -b4ffd27a -ffffbfff -df7f84fb -fffffffd -f5fbe63f -ffffaf7e -7da7efc5 -ffffcf73 -779dff3d -ffffff1c -73bffa1e -fffff79f -fb756eff -fffff9e2 -fcfcfdeb -fffffe47 -fe6b13f7 -fffffff6 -9cdefffb -ffffff3f -fffffec9 -ffffffe4 -0fffbdff -ffffffcd -ffffb99d -ffffffe9 -eff5ba9f -fffffffd -bd5bf13f -ffffffff -b76fdaff -ffffffff -bbf97d7b -ffffffff -77edf313 -ffffffff -b75f5de8 -ffffffff -f7be8a3a -ffffffff -ef66abeb -ffffffff -f7f57db7 -ffffffff -ffafffdb -ffffffff -fe9fff73 -ffffffff -ffef9b6b -ffffffff -ff7fdb90 -ffffffff -ffdfaebf -ffffffff -ffff7fdd -ffffffff -ffe6afc7 -ffffffff -fff795fb -ffffffff -fffbefef -ffffffff -fffc7bbe -ffffffff -fffedc7f -ffffffff -ffffdeb7 -ffffffff -ffffe7ef -ffffffff -fffffaab -ffffffff -ffffeff9 -ffffffff -ffffff76 -ffffffff -fffffbdf -ffffffff -ffffff7f -ffffffff -fffffef4 -ffffffff -ffffffdd -ffffffff -ffffffbf -ffffffff -ffffffcd -ffffffff -fffffff2 -ffffffff -fffffff7 -ffffffff -fffffffb -ffffffff -fffffffc -ffffffff -fffffffe -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -deffffff -ffffffff -bef7ffff -ffffffff -4eaff5ff -00000000 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/pack-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/pack-01.reference_output deleted file mode 100644 index aecfc75e2..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/pack-01.reference_output +++ /dev/null @@ -1,1048 +0,0 @@ -00000000 -00000000 -5ae10604 -5ae10604 -c38671b6 -00000000 -2af42d39 -00000000 -2502307f -00000000 -392e6fa3 -00000000 -80e4d23b -00000000 -cec7313a -00000000 -5d003e38 -00000000 -0b815ef0 -00000000 -83e2ba3a -00000000 -46e4abd8 -00000000 -242d8cef -00000000 -d8d8dd47 -00000000 -c1f36fae -00000000 -d7704260 -00000000 -058160e6 -00000000 -d8bca4df -00000000 -e812dd49 -00000000 -00000000 -00000000 -2037e34e -00000000 -874434d3 -00000000 -875e9bf5 -00000000 -17d8a217 -00000000 -87f996d6 -00000000 -0d42ea01 -00000000 -2de4eb20 -00000000 -d6308385 -00000000 -ab72f99f -00000000 -4e7b7359 -00000000 -d96429c9 -00000000 -c8cdf63e -00000000 -c06209fb -00000000 -644918a7 -00000000 -4f63879f -80000000 -1f3c1ad7 -c0000000 -3bb3e347 -20000000 -2bedcfc5 -70000000 -7c496066 -e8000000 -a8552f4b -24000000 -24507198 -3a000000 -6656b0e2 -fd000000 -9929dfeb -02800000 -ff6036ed -4d400000 -93c22130 -10a00000 -a1c1c528 -98900000 -408b97cd -a8f80000 -aa8dc392 -db8c0000 -5c962250 -8c620000 -7c2890b1 -526b0000 -56f646e8 -28288000 -5710b7ae -3aaf4000 -3a810bd9 -ba452000 -22feb755 -54c37000 -fcd220d7 -9d416800 -8b082833 -29454400 -072f6ac9 -b6c00600 -0e724556 -91107f00 -3b50c99d -98dfbd80 -d6cbf3ae -3f6a4d40 -f66fa51d -8f8264e0 -aeb522fc -48b4be70 -63735e07 -12915378 -4b1d37e9 -33ecd4fc -0196f0c0 -323e7f5e -89476e6e -af5bc16d -00000000 -e92a6130 -00000000 -4bed2975 -00000000 -3206b471 -00000000 -4ef43b6f -00000000 -d236cded -00000000 -3480c0ad -00000000 -4360fec9 -00000000 -60e011eb -00000000 -522ae822 -00000000 -994a555f -00000000 -5d62953f -00000000 -cd07888b -00000000 -4ea4788d -00000000 -bb75156a -00000000 -709e60f1 -00000000 -3ff7e48d -00000000 -e716713f -00000000 -b03ff489 -00000000 -5c3d56e7 -00000000 -18ccd7f7 -00000000 -575d258e -00000000 -7ce1f4b3 -00000000 -6f9f34b2 -00000000 -4f832ec8 -00000000 -244d9206 -00000000 -5b130474 -00000000 -64e77961 -00000000 -305e3f80 -00000000 -61250888 -00000000 -07e8bf65 -00000000 -6291f0e2 -00000000 -58f45328 -00000000 -0a095049 -80000000 -3344cbb0 -c0000000 -e2ed8971 -60000000 -00f1f68e -f0000000 -48f71cb0 -98000000 -df880b11 -ec000000 -bd230058 -76000000 -86f90255 -8b000000 -80ebe557 -fb800000 -1db6027c -2c400000 -023590f7 -c2200000 -cd26ce1c -7b700000 -01b56748 -0cc80000 -5d3bbce0 -96fc0000 -fd1032e8 -dde60000 -f57083ef -d3570000 -75923260 -47f98000 -4616e73d -f9c74000 -8ccaec71 -7952a000 -6d5fcd18 -1ce93000 -2dedb6a7 -e301e800 -1d241ed6 -ac86ac00 -ddbad0b1 -de167a00 -a9e16e27 -06bf0d00 -1529755d -0e079180 -6273ed06 -d2955440 -6c5744bc -6ec13320 -a97bcc25 -f0f1c6b0 -d19e3224 -f0f54bc8 -56f547ab -92d9be34 -25329041 -058f7fe6 -5fefe911 -797d76df -598b88db -0aab4e37 -7727bd62 -8f64b9bc -b3aa58e5 -1d19df81 -3d56ac8b -7d3aed38 -b5ff09a7 -82283aee -14d5348f -963ab5d7 -f81a1e9f -740e023d -dd9329bf -dfe4c7a5 -66eef97f -af698a52 -865292ff -b2fe4fc2 -09fc3dff -e10e43d4 -64092bff -914aad80 -d92f97ff -e88130ba -30d04fff -0ae95557 -e6371fff -0b72bb91 -f8dd3fff -303ca1d0 -be5f7fff -832cbaff -70c2ffff -0c99c902 -d581ffff -3e0ad875 -1493ffff -6dd54cb4 -8d37ffff -1f893d02 -cc6fffff -6d64e7ad -bddfffff -3161b010 -5cbfffff -6fb0f1c0 -3e7fffff -a1d02d4d -b4ffffff -6be07552 -71ffffff -db0bba39 -b3ffffff -5d1139a4 -57ffffff -7a44c8ad -2fffffff -93547e48 -9fffffff -994902ca -3fffffff -4e2e7447 -7fffffff -f7192179 -ffffffff -15a03321 -ffffffff -b733640c -ffffffff -6aede476 -ffffffff -6d2db9e3 -ffffffff -bffb6c5c -ffffffff -27b012a3 -ffffffff -14a7dd83 -ffffffff -2f6aa770 -ffffffff -112154cc -ffffffff -f96eaffa -ffffffff -8fbff9ba -ffffffff -2552fbf9 -ffffffff -0f99d8bc -ffffffff -b68c8fce -ffffffff -13e5cf6b -ffffffff -47cd73ed -ffffffff -8364a709 -ffffffff -d0917142 -ffffffff -76427709 -ffffffff -20176dbe -ffffffff -9738bfb9 -ffffffff -5843990b -ffffffff -25fb16b4 -ffffffff -bd94509c -ffffffff -fe183d04 -ffffffff -386ef954 -ffffffff -0274846b -ffffffff -180c5db5 -ffffffff -41e5a5de -ffffffff -275bbf80 -ffffffff -ae5fdcbb -ffffffff -b0f94bb3 -ffffffff -1a5632e0 -96c03042 -d4d686cd -8033ada7 -31a3cf7b -6025666d -42ee9aa7 -f541ab61 -6a8877cf -cd09e875 -efeffc5f -f3d107a2 -883ead3f -46b88c5e -733f597f -00f0a572 -63dd2cff -269e1925 -4ef73dff -ff03170e -eb1873ff -0a710087 -291917ff -b74d1614 -ffe78fff -cf1ec7ba -ba185fff -457288a2 -5f67bfff -ee84a991 -f63c7fff -4c4006c3 -9d02ffff -65844c17 -d6f1ffff -e5c7946a -0c03ffff -64a14081 -5857ffff -cd41cad2 -16efffff -ee8f948a -e6dfffff -de38d7e2 -e4bfffff -8b9f8591 -f77fffff -0c96a183 -0affffff -88f931f4 -95ffffff -955235a4 -23ffffff -5c6c32a5 -97ffffff -4a7a5c05 -cfffffff -37e0de00 -1fffffff -0d770f3c -3fffffff -8dfc2307 -7fffffff -4e6ee408 -ffffffff -998d1525 -ffffffff -75ee935f -ffffffff -59cf4bb2 -ffffffff -97933e6c -ffffffff -9687f28f -ffffffff -d2fe2e7e -ffffffff -b6d75e84 -ffffffff -092936e8 -ffffffff -784abebb -ffffffff -4f829b65 -ffffffff -17b8b123 -ffffffff -8b16bb0d -ffffffff -39be2172 -ffffffff -91e42acb -ffffffff -975a8550 -ffffffff -b432d4f7 -ffffffff -b76d454d -ffffffff -cd9cb03a -ffffffff -eed7a24a -ffffffff -76b1fd3d -ffffffff -b3988b52 -ffffffff -3c464110 -ffffffff -9b01f7cc -ffffffff -5b331999 -ffffffff -2d37de81 -ffffffff -bf97e520 -ffffffff -6df8ccf6 -ffffffff -e08409f0 -ffffffff -432ff218 -ffffffff -03b1d74b -ffffffff -4b6ea010 -ffffffff -bbe8f88d -ffffffff -2f8b9e9d -66cc59ee -41b2bb9a -1ba9a6b5 -1d617a4d -fae6f67d -c3015fa0 -369580ff -a8e61cb6 -4c8281a2 -3b6b6093 -e717a666 -02b653e5 -4d3b8462 -cc1e0438 -b8fe90a6 -67def006 -6e803472 -e94ae4a8 -c32c4da8 -91d6cedd -a11f7657 -e4a7c5ba -cad764c4 -1844ebd2 -31f3c57c -2e67a854 -0a76f50a -99d68912 -5ac51cc8 -6d2b6540 -53aaf3b7 -c3c4b8a1 -ae53c374 -226b5502 -186211cb -ed48d09e -2874799a -2c2869b7 -2f3dc554 -25849de3 -e7b4b57e -099565a3 -7b692cda -cd872ab5 -af88e590 -80b68be6 -a2792e75 -b467fb8b -f7e7a342 -e94fbd21 -91e4f834 -18972e45 -af6a3e68 -671c82fc -b47053de -8b142f97 -d508ff34 -18d6084e -1690a1f7 -50dd1af1 -58fc0a18 -3b8f801d -962e5835 -87951cb6 -88b48922 -e0303f46 -e0f48d2f -7b1bda5e -7fb2d83b -31b0f86a -fa2f0afd -1cde8a08 -6b66ec95 -0bce1a9c -79fe0c5f -06a1096c -2080f2ac -03211cb3 -6776fd34 -01e48237 -1f36ddf8 -00b0fbce -7f65d54d -005516a9 -8fc0819e -0021bf99 -f2fbc7f9 -001f99de -ea7f7301 -000beec1 -2c42eeac -00079dd3 -de17b009 -00035bc3 -6be1fcde -0001db50 -1530959b -0000c1f1 -b7e06d03 -00004632 -ca71067b -00003cdc -167cd62e -00001ad8 -ec9a5dc8 -00000e5e -fb7a3b3b -00000456 -f1bae498 -00000216 -63522556 -0000014d -b3257dda -000000ad -c196c5c2 -00000042 -b6d3e879 -00000032 -79a2ed17 -0000001e -13f5bc90 -0000000d -a111f5fb -00000004 -d4652689 -00000003 -67ba7848 -00000001 -caa0a141 -00000000 -d42779f6 -47f439f3 -61eeac38 -73d58e1c -4671120e -36cdf8a1 -d26542ef -1ce262d6 -b6125e0d -f33335b6 -22dc73ac -e5498256 -e1594dc5 -ebb9c596 -cdc02ece -c12f694d -aa785c62 -32d1464e -24aa1735 -3dd1e044 -f517e383 -02e50777 -99edd4d2 -7b1ffc6a -84c955f2 -83b852d7 -70c61509 -d69f6b16 -ba6bc77d -b1b43d07 -14881edd -41d812cd -6111b4b6 -032fbce3 -92a38329 -9ffd6a18 -5a11cca6 -07bfc096 -8bcce7ce -f6a00758 -bb01ea76 -128ae84a -f6782942 -13284c79 -798c06ff -5b8349ce -a82cb2ce -08fb09a0 -236eba20 -7349dbc4 -482ea761 -21af214a -7219c1db -0f7a0443 -bfbd7d15 -11b41900 -47bc7549 -ead81dcd -3a782ebc -9da9b14d -4b1e943f -fa285a0d -6bba8d22 -e7a28cbd -bd0840fc -b45f51c3 -5bea8594 -8329c05b -3a8137ea -6be49ee7 -1891dd3d -6361b9f8 -0bf8670e -3fdf2348 -0711eb58 -952e1b8b -028dd9f4 -62dc08d6 -011e7a61 -c5cefdd8 -00c793f6 -2577c1ec -00736008 -a44f576a -0034106a -e286852c -001a83b3 -1dd377bf -00099a1f -c4ff64de -000700af -02cdf2af -0002f165 -1e34b3f1 -00016f3f -03e0d681 -0000b80f -45100358 -00004daa -65bd9acb -00002242 -0d650372 -00001aab -0023b682 -00000a12 -d8b9b45c -0000065b -902a174f -000003fd -3acb6266 -00000191 -154cd2aa -000000aa -a9964aef -00000079 -3bd03346 -00000026 -c7321cc0 -00000014 -30b17d0b -0000000f -d4ea65d0 -00000007 -9d95847e -00000002 -cb008853 -00000001 -965eda32 -00000000 -c7fde805 -aa01e126 -7443f200 -3591db10 -dab0001e -656224e9 -8901096d -30d268bd -dcf0c656 -d69f32e6 -b828fd34 -f38e735f -2d79e311 -74bc1570 -1a5928f7 -b918b7fa -6f6da856 -0282f24d -0880b668 -b8b00cb6 -e9e678bb -eb74f8bb -9c23bdb8 -859b4c3f -f83106c9 -0da5f55f -0e22c1e0 -f044106f -e41ba01b -8e73758e -8514f49d -fb566e3e -b3b2fa55 -63adcdbb -7d61ce76 -7825d0f4 -81b4d2d8 -c5f0a710 -9bfa3293 -2407e26d -e778555d -d9e0e7fe -4cae8b6c -b5c06c9d -dbc1f2b1 -d788d65b -36c35dc6 -36015d9b -a2465d2a -255c09e0 -cf4c7d09 -9e49c4a1 -49aae370 -1ac24829 -2752aa64 -17550d1c -40d0e5e8 -120ff957 -a0a1c6f0 -2f8d1335 -748ca591 -6056f5e8 -9fc745d1 -bd0070ae -a97cbf85 -62a12347 -1fe84ebd -c478ef2d -af8957f9 -07155a89 -c165f0f1 -c2cc1d38 -efadea82 -95a6bea9 -f7fcc18c -d216eea8 -f8d3e5f5 -fc9a02b1 -fc15b0f7 -0c20b9ee -feac3217 -06aec150 -ff5ba80c -37c4c6b9 -ff87984f -a311d81e -ffce1bbc -62ebf954 -ffef1d76 -0320df72 -fff3ae62 -79a6551f -fff81475 -d9716f2c -fffce9a5 -1e4e0fad -fffe5770 -e3d4dd27 -ffff4877 -b4c8839b -ffffb0b3 -54084572 -ffffdd0f -c099bc4c -ffffe1e2 -7dddcc72 -fffff4e3 -6dc3ccee -fffffb86 -d9adf5d6 -fffffdc4 -0d453cdf -fffffec3 -cb293ebd -ffffff3f -6ed26006 -ffffffb1 -8347ddf5 -ffffffd6 -fc6c3192 -ffffffef -7886e3eb -fffffff4 -e1832ab6 -fffffffb -596f5f89 -fffffffc -ca11073d -fffffffe -dc17ae6e -ffffffff -a85ab567 -9408ad7d -85d77c9b -53a27ee1 -56df45de -e356529c -ea37dc21 -041bbaab -31150919 -9267acb5 -91ed6c94 -12ea67e4 -4ec6f18c -ef8c60c0 -484641f6 -2fb5a758 -12e91176 -65835bdf -042d678a -53e1e6bc -b87ce2a6 -bbc9df37 -9651ee66 -9a592829 -7b8b7233 -725f3a8f -a3b633ac -5956b39d -81ed75e8 -437cbc41 -a0fbc248 -4b43ad85 -5c37849b -6c967b0e -c5b3e01c -0e24d9cc -35a7efc1 -a6faba7b -44115b05 -c86342c2 -72976012 -be5265f3 -e3356cc4 -85bf95c0 -fc7c6d0b -af334e15 -fc6113a4 -31d4ff08 -985a9ef1 -eb6992d5 -fb37bec9 -7a3209fe -0bd61d6d -fbd2570d -6f738905 -4a104e66 -afe08a14 -1dcacf74 -bd59213f -52b42eff -a6478a56 -e8d7a714 -b9e93d53 -754f9b96 -75697302 -ec325eec -955d1ce8 -ccadb61f -d7be0830 -1bd775c5 -e046ab61 -109ff475 -f14135a5 -090a96c9 -fba1a6cb -2a71a2ad -fc9e9033 -e5e290be -fe238b6b -1011eeb4 -ff7d8180 -458da5ef -ff832e3f -67a07b54 -ffc77cdc -51c5b8b2 -ffe22746 -8b7b5378 -fff20599 -58fa6e1c -fffbe2c6 -2c9f7296 -fffc39a2 -2daf94c1 -fffed06b -6a013380 -ffff5ea2 -c5ec6148 -ffff8647 -99ef1857 -ffffc823 -dae98554 -ffffedb9 -3d061437 -fffff576 -280b11fd -fffffadf -a7298c66 -fffffd7f -8c8a18b2 -fffffee4 -4d88450f -ffffff11 -0b54aa22 -ffffff8b -3d4806c2 -ffffffcd -4d984bff -ffffffe0 -acca7f0d -fffffff5 -5ae6a228 -fffffffb -bedc25e6 -fffffffc -53e8eb43 -fffffffe -cf84b683 -ffffffff -03cc0f27 -5ae10604 -00000000 -3d32d01e -00000000 -2de4eb20 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/packh-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/packh-01.reference_output deleted file mode 100644 index 2375e105b..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/packh-01.reference_output +++ /dev/null @@ -1,1052 +0,0 @@ -0000ffff -00000000 -00000404 -00000000 -000000b6 -00000000 -00000039 -00000000 -0000007f -00000000 -000000a3 -00000000 -0000003b -00000000 -0000003a -00000000 -00000038 -00000000 -000000f0 -00000000 -0000003a -00000000 -000000d8 -00000000 -000000ef -00000000 -00000000 -00000000 -000000ae -00000000 -00000060 -00000000 -000000e6 -00000000 -000000df -00000000 -00000049 -00000000 -0000001e -00000000 -0000004e -00000000 -000000d3 -00000000 -000000f5 -00000000 -00000017 -00000000 -000000d6 -00000000 -00000001 -00000000 -00000020 -00000000 -00000000 -00000000 -0000009f -00000000 -00000059 -00000000 -000000c9 -00000000 -0000003e -00000000 -000000fb -00000000 -000000a7 -00000000 -0000009f -00000000 -000000d7 -00000000 -00000047 -00000000 -000000c5 -00000000 -00000066 -00000000 -0000004b -00000000 -00000098 -00000000 -000000e2 -00000000 -000000eb -00000000 -000000ed -00000000 -00000030 -00000000 -00000028 -00000000 -000000cd -00000000 -00000092 -00000000 -00000050 -00000000 -000000b1 -00000000 -000000e8 -00000000 -000000ae -00000000 -000000d9 -00000000 -00000055 -00000000 -000000d7 -00000000 -00000033 -00000000 -000000c9 -00000000 -00000056 -00000000 -0000809d -00000000 -000040ae -00000000 -0000e01d -00000000 -000070fc -00000000 -00007807 -00000000 -0000fce9 -00000000 -00005ec0 -00000000 -00006d6e -00000000 -00003000 -00000000 -00007500 -00000000 -00007100 -00000000 -00006f00 -00000000 -0000ed00 -00000000 -0000ad00 -00000000 -0000c900 -00000000 -0000eb00 -00000000 -00002200 -00000000 -00005f00 -00000000 -00003f00 -00000000 -00008b00 -00000000 -00008d00 -00000000 -00006a00 -00000000 -0000f100 -00000000 -00008d00 -00000000 -00003f00 -00000000 -00008900 -00000000 -0000e700 -00000000 -0000f700 -00000000 -00008e00 -00000000 -0000b300 -00000000 -0000b200 -00000000 -0000c800 -00000000 -00000600 -00000000 -00007400 -00000000 -00006100 -00000000 -00008000 -00000000 -00008800 -00000000 -00006500 -00000000 -0000e200 -00000000 -00002800 -00000000 -00004900 -00000000 -0000b000 -00000000 -00007100 -00000000 -00008e00 -00000000 -0000b000 -00000000 -00001100 -00000000 -00005800 -00000000 -00005500 -00000000 -00005700 -00000000 -00007c00 -00000000 -0000f700 -00000000 -00001c00 -00000000 -00004800 -00000000 -0000e000 -00000000 -0000e800 -00000000 -0000ef00 -00000000 -00006000 -00000000 -00003d00 -00000000 -00007100 -00000000 -00001800 -00000000 -0000a700 -00000000 -0000d600 -00000000 -0000b100 -00000000 -00002700 -00000000 -00005d00 -00000000 -00000680 -00000000 -0000bc40 -00000000 -00002520 -00000000 -000024b0 -00000000 -0000abc8 -00000000 -00004134 -00000000 -000011e6 -00000000 -0000dbdf -00000000 -00006237 -00000000 -0000e5bc -00000000 -00008b81 -00000000 -0000a738 -00000000 -00008fee -00000000 -00009fd7 -00000000 -0000bf3d -00000000 -00007fa5 -00000000 -0000ff52 -00000000 -0000ffc2 -00000000 -0000ffd4 -00000000 -0000ff80 -00000000 -0000ffba -00000000 -0000ff57 -00000000 -0000ff91 -00000000 -0000ffd0 -00000000 -0000ffff -00000000 -0000ff02 -00000000 -0000ff75 -00000000 -0000ffb4 -00000000 -0000ff02 -00000000 -0000ffad -00000000 -0000ff10 -00000000 -0000ffc0 -00000000 -0000ff4d -00000000 -0000ff52 -00000000 -0000ff39 -00000000 -0000ffa4 -00000000 -0000ffad -00000000 -0000ff48 -00000000 -0000ffca -00000000 -0000ff47 -00000000 -0000ff79 -00000000 -0000ff21 -00000000 -0000ff0c -00000000 -0000ff76 -00000000 -0000ffe3 -00000000 -0000ff5c -00000000 -0000ffa3 -00000000 -0000ff83 -00000000 -0000ff70 -00000000 -0000ffcc -00000000 -0000fffa -00000000 -0000ffba -00000000 -0000fff9 -00000000 -0000ffbc -00000000 -0000ffce -00000000 -0000ff6b -00000000 -0000ffed -00000000 -0000ff09 -00000000 -0000ff42 -00000000 -0000ff09 -00000000 -0000ffbe -00000000 -0000ffb9 -00000000 -0000ff0b -00000000 -0000ffb4 -00000000 -0000ff9c -00000000 -0000ff04 -00000000 -0000ff54 -00000000 -0000ff6b -00000000 -0000ffb5 -00000000 -0000ffde -00000000 -0000ff80 -00000000 -0000ffbb -00000000 -0000ffb3 -00000000 -000042e0 -00000000 -0000a7cd -00000000 -00006d7b -00000000 -000061a7 -00000000 -000075cf -00000000 -0000a25f -00000000 -00005e3f -00000000 -0000727f -00000000 -000025ff -00000000 -00000eff -00000000 -000087ff -00000000 -000014ff -00000000 -0000baff -00000000 -0000a2ff -00000000 -000091ff -00000000 -0000c3ff -00000000 -000017ff -00000000 -00006aff -00000000 -000081ff -00000000 -0000d2ff -00000000 -00008aff -00000000 -0000e2ff -00000000 -000091ff -00000000 -000083ff -00000000 -0000f4ff -00000000 -0000a4ff -00000000 -0000a5ff -00000000 -000005ff -00000000 -000000ff -00000000 -00003cff -00000000 -000007ff -00000000 -000008ff -00000000 -000025ff -00000000 -00005fff -00000000 -0000b2ff -00000000 -00006cff -00000000 -00008fff -00000000 -00007eff -00000000 -000084ff -00000000 -0000e8ff -00000000 -0000bbff -00000000 -000065ff -00000000 -000023ff -00000000 -00000dff -00000000 -000072ff -00000000 -0000cbff -00000000 -000050ff -00000000 -0000f7ff -00000000 -00004dff -00000000 -00003aff -00000000 -00004aff -00000000 -00003dff -00000000 -000052ff -00000000 -000010ff -00000000 -0000ccff -00000000 -000099ff -00000000 -000081ff -00000000 -000020ff -00000000 -0000f6ff -00000000 -0000f0ff -00000000 -000018ff -00000000 -00004bff -00000000 -000010ff -00000000 -00008dff -00000000 -00009dff -00000000 -00009aee -00000000 -00004db5 -00000000 -0000a07d -00000000 -0000b6ff -00000000 -000093a2 -00000000 -0000e566 -00000000 -00003862 -00000000 -000006a6 -00000000 -0000a872 -00000000 -0000dda8 -00000000 -0000ba57 -00000000 -0000d2c4 -00000000 -0000547c -00000000 -0000120a -00000000 -000040c8 -00000000 -0000a1b7 -00000000 -00000274 -00000000 -00009ecb -00000000 -0000b79a -00000000 -0000e354 -00000000 -0000a37e -00000000 -0000b5da -00000000 -0000e690 -00000000 -00008b75 -00000000 -00002142 -00000000 -00004534 -00000000 -0000fc68 -00000000 -000097de -00000000 -00004e34 -00000000 -0000f1f7 -00000000 -00001d18 -00000000 -0000b635 -00000000 -00004622 -00000000 -00005e2f -00000000 -00006a3b -00000000 -000008fd -00000000 -00009c95 -00000000 -00006c5f -00000000 -0000b3ac -00000000 -00003734 -00000000 -0000cef8 -00000000 -0000a94d -00000000 -0000999e -00000000 -0000def9 -00000000 -0000c101 -00000000 -0000d3ac -00000000 -0000c309 -00000000 -000050de -00000000 -0000f19b -00000000 -00003203 -00000000 -0000dc7b -00000000 -0000d82e -00000000 -00005ec8 -00000000 -0000563b -00000000 -00001698 -00000000 -00004d56 -00000000 -0000adda -00000000 -000042c2 -00000000 -00003279 -00000000 -00001e17 -00000000 -00000d90 -00000000 -000004fb -00000000 -00000389 -00000000 -00000148 -00000000 -00000041 -00000000 -0000f3f6 -00000000 -00001c38 -00000000 -0000a10e -00000000 -0000d6ef -00000000 -0000b60d -00000000 -000056ac -00000000 -000096c5 -00000000 -00004dce -00000000 -00004e62 -00000000 -00004435 -00000000 -00007783 -00000000 -00006ad2 -00000000 -0000d7f2 -00000000 -00001609 -00000000 -0000077d -00000000 -0000cddd -00000000 -0000e3b6 -00000000 -00001829 -00000000 -000096a6 -00000000 -000058ce -00000000 -00004a76 -00000000 -00007942 -00000000 -0000ceff -00000000 -0000a0ce -00000000 -0000c420 -00000000 -00004a61 -00000000 -000043db -00000000 -00000015 -00000000 -0000cd49 -00000000 -00004dbc -00000000 -00000d3f -00000000 -0000bd22 -00000000 -0000c3fc -00000000 -00005b94 -00000000 -0000e7ea -00000000 -0000f83d -00000000 -0000480e -00000000 -00008b58 -00000000 -0000d6f4 -00000000 -0000d861 -00000000 -0000ecf6 -00000000 -00006a08 -00000000 -00002c6a -00000000 -0000bfb3 -00000000 -0000de1f -00000000 -0000afaf -00000000 -0000f165 -00000000 -0000813f -00000000 -0000580f -00000000 -0000cbaa -00000000 -00007242 -00000000 -000082ab -00000000 -00005c12 -00000000 -00004f5b -00000000 -000066fd -00000000 -0000aa91 -00000000 -0000efaa -00000000 -00004679 -00000000 -0000c026 -00000000 -00000b14 -00000000 -0000d00f -00000000 -00007e07 -00000000 -00005302 -00000000 -00003201 -00000000 -00000500 -00000000 -00000026 -00000000 -00001e10 -00000000 -00006de9 -00000000 -000056bd -00000000 -000034e6 -00000000 -0000115f -00000000 -0000f770 -00000000 -000056fa -00000000 -0000684d -00000000 -0000bbb6 -00000000 -0000b8bb -00000000 -0000c93f -00000000 -0000e05f -00000000 -00001b6f -00000000 -00009d8e -00000000 -0000553e -00000000 -000076bb -00000000 -0000d8f4 -00000000 -00009310 -00000000 -00005d6d -00000000 -00006cfe -00000000 -0000b19d -00000000 -0000c65b -00000000 -00002a9b -00000000 -000009e0 -00000000 -000070a1 -00000000 -00006429 -00000000 -0000e81c -00000000 -0000f057 -00000000 -00009135 -00000000 -0000d1e8 -00000000 -000085ae -00000000 -0000bd47 -00000000 -0000f92d -00000000 -0000f189 -00000000 -00008238 -00000000 -00008ca9 -00000000 -0000f5a8 -00000000 -0000f7b1 -00000000 -000017ee -00000000 -00000c50 -00000000 -00004fb9 -00000000 -0000bc1e -00000000 -00007654 -00000000 -00006272 -00000000 -0000751f -00000000 -0000a52c -00000000 -000070ad -00000000 -00007727 -00000000 -0000b39b -00000000 -00000f72 -00000000 -0000e24c -00000000 -0000e372 -00000000 -000086ee -00000000 -0000c4d6 -00000000 -0000c3df -00000000 -00003fbd -00000000 -0000b106 -00000000 -0000d6f5 -00000000 -0000ef92 -00000000 -0000f4eb -00000000 -0000fbb6 -00000000 -0000fc89 -00000000 -0000fe3d -00000000 -0000ff6e -00000000 -00007d67 -00000000 -0000e19b -00000000 -00009cde -00000000 -0000ab21 -00000000 -0000b519 -00000000 -0000e494 -00000000 -0000c08c -00000000 -000058f6 -00000000 -0000df76 -00000000 -0000bc8a -00000000 -000037a6 -00000000 -00002966 -00000000 -00008f33 -00000000 -00009dac -00000000 -000041e8 -00000000 -00008548 -00000000 -00000e9b -00000000 -0000cc1c -00000000 -00007bc1 -00000000 -0000c205 -00000000 -0000f312 -00000000 -0000c0c4 -00000000 -0000150b -00000000 -000008a4 -00000000 -0000d5f1 -00000000 -0000fec9 -00000000 -00000d6d -00000000 -00006605 -00000000 -00007414 -00000000 -0000ff3f -00000000 -00001456 -00000000 -00009653 -00000000 -0000ec02 -00000000 -00001fe8 -00000000 -0000c530 -00000000 -00007561 -00000000 -0000c9a5 -00000000 -0000adcb -00000000 -0000be33 -00000000 -0000b46b -00000000 -0000ef80 -00000000 -0000543f -00000000 -0000b2dc -00000000 -00007846 -00000000 -00001c99 -00000000 -000096c6 -00000000 -0000c1a2 -00000000 -0000806b -00000000 -000048a2 -00000000 -00005747 -00000000 -00005423 -00000000 -000037b9 -00000000 -0000fd76 -00000000 -000066df -00000000 -0000b27f -00000000 -00000fe4 -00000000 -00002211 -00000000 -0000c28b -00000000 -0000ffcd -00000000 -00000de0 -00000000 -000028f5 -00000000 -0000e6fb -00000000 -000043fc -00000000 -000083fe -00000000 -000027ff -00000000 -00000004 -00000000 -000000d8 -00000000 -00000047 -00000000 -00000085 -00000000 -00000000 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/packu-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/packu-01.reference_output deleted file mode 100644 index 105e64990..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/packu-01.reference_output +++ /dev/null @@ -1,1044 +0,0 @@ -ffffffff -ffffffff -00000000 -00000000 -6f061d6d -80000000 -d2eeeb1c -40000000 -485246bf -a0000000 -d50bd94a -30000000 -88627494 -38000000 -2405b307 -4c000000 -b1410cba -82000000 -de81bcad -69000000 -bf28804a -cc800000 -fd8bf412 -19400000 -063bf2da -20a00000 -811d9484 -5c500000 -8cb7ed4f -cd280000 -666fafe7 -eb240000 -fdb7038b -cfb60000 -a4e23852 -118f0000 -718e177d -3b0b8000 -42bea775 -3da84000 -e91ede43 -a742a000 -d2039372 -a3def000 -e8dec4b7 -3af37800 -eed7c61c -4d64cc00 -4eab740b -f37b4e00 -2466b460 -efe74900 -4256f18f -e0776780 -8533dc75 -fa56aa40 -ca355a09 -60c9f220 -22fed7db -af36f110 -b6de8bcf -03339908 -b9fbd369 -5c67c8fc -324c464b -c706e0c2 -70fd0c20 -efe091e3 -755cd0bf -cb7cdda3 -a31e74cf -51885e99 -300d9b71 -87503d9d -cb0acb58 -1ac7983c -fd5324a4 -1857bc0a -a46ee1f1 -b9545b91 -4bff93c1 -ffe1759c -e3ac0343 -d12c4a6d -75bd36c7 -4978c517 -ea894c29 -ec557c3c -46b7549d -7fab9b08 -7e107814 -af8fda61 -57e9f6c2 -707df5a4 -f3c9fbed -924d5d8c -1078e539 -200dc762 -57b0d4c1 -415dc3e7 -9812a134 -448e60ef -d367d9f1 -ad881be6 -1f8b62c2 -d3262066 -ab4a4d5c -955964c5 -5cbaf664 -0b66a666 -d497855d -610ea259 -97db1001 -c19961dd -d63ef4de -4c414415 -1baf44cf -fc44172c -eab762a9 -985875b0 -9b90f7ca -fcd87651 -cbd297d6 -443a809e -da53e667 -b914351d -77a061ba -922ec2bf -a6c87383 -0e1db424 -33439fc4 -7f8c74b1 -00000000 -1a323609 -80000000 -ed4eced7 -40000000 -29cb52af -20000000 -0ae5de17 -d0000000 -b725f591 -58000000 -d5f381d6 -fc000000 -56ffe58d -42000000 -699492c9 -77000000 -25f013ba -65800000 -48659245 -46c00000 -491f1b5a -56e00000 -8b57454a -56b00000 -2b9c75b6 -47380000 -045abe77 -35440000 -a9cc49b7 -09320000 -75cdcd80 -cd550000 -b2b64c4b -fd428000 -6eb5568b -8e8a4000 -5dd1ee29 -1370a000 -f19c9fda -1408b000 -74fb05dc -e87af800 -9f7c62bb -dba90400 -5d98418d -01d61e00 -b21e137c -6e905700 -afc08ace -2e84d280 -52d700ac -c70a28c0 -94a7a5ea -baa4f320 -4fe6a6f6 -5c106a30 -cadb5bec -230b9f88 -cc381e10 -8d60807c -903636cf -2d47691a -fae216dc -fabf0a7b -6aeb7dbd -11b6621f -6f6e71b7 -486e4b47 -440d8382 -60e99d0e -b1b0d8fe -f547af48 -855efa74 -9254a04d -0bc66a8a -adf58064 -29828207 -01dae235 -80904b4c -b1ff9d60 -27a16894 -179fafe7 -fbdb4de8 -fbcf7628 -805c2f63 -e9fd4b63 -577f8847 -42dc4354 -f29c5831 -ed4764dd -2e9115b6 -51b0f5ab -2ae568ba -a544ade7 -db04a838 -925c46cb -5e4945ed -1ae589fb -096ebec4 -1d2acd14 -387be8b8 -9c9d5a52 -0b21bbba -2b20055d -073465b8 -ae39ed63 -409bd305 -d7f893c3 -b0ab577a -19b3bff3 -42f5d75e -f09825a4 -f7ab62a8 -01555a45 -8a88c067 -532e2cc5 -f8a88518 -fb7523b0 -8248f803 -382cc710 -331b2fb3 -4c52cfc2 -e7edd867 -3dcbe162 -fa60dbd6 -fe4544f6 -7b87a9e2 -44dcda6a -248174e5 -33bfb0e8 -7af0702b -dedbf20a -ef6855ed -07020244 -b93ac7ee -a3a30485 -cc31d1dc -0368a583 -ef900fb8 -a0fa6a24 -7d572379 -1606f8cc -f5858bcc -81294a71 -ea7bd402 -9ca99acf -b95bf2e9 -0440ea57 -097ceae8 -6c456bfc -67212b9d -64ad8cd4 -9da9065d -757e5228 -bd7a5054 -c6592aad -6cb1be29 -7fb1ac68 -6f3b6fa6 -06e1dd67 -249808d0 -b8f66a4f -1a5b9ccd -c8738f37 -f4ee2270 -66a4e1f8 -8e2b5c7e -6673663c -355695e6 -7de7f426 -f4f31a2b -f17dc31d -28f20e42 -1b607a8d -5415a043 -04ef0623 -590c01c4 -853ed27f -004fb0b2 -eb9a5398 -03eb3f6c -d183808a -e30aa425 -1ff934cb -d756c0f0 -3bbc81ce -b5bb3b24 -8b898000 -e52fb081 -1ab5ffe4 -710733fe -19a55fa9 -cee6c948 -c0a83d81 -1e903ad2 -292268c6 -a6e915bd -36370fcc -be4349e3 -e820ba0f -3ea485f7 -4e0aa561 -c680322f -2c9aaa4c -9ef4ce9f -1c8073cf -83653ebf -cc11f70e -6ffd7d7f -0c9dc3ec -365ee0ff -8df80a8d -1ce551ff -e05474e1 -a10263ff -4b6ae0ab -4cc607ff -884a2af8 -00d36fff -1475d76c -7b40dfff -729d8fd2 -6a0f3fff -c407e2a9 -1fe47fff -5697ebd5 -dbeeffff -69f35da3 -9269ffff -9230a15a -93fbffff -e057776c -1ab7ffff -b9e861c8 -222fffff -17c5da8e -489fffff -b888d020 -5a3fffff -ee8eb1b1 -ea7fffff -0341ea23 -82ffffff -6d5c2871 -b1ffffff -9bae401e -c3ffffff -9241b7ed -87ffffff -3e610134 -8fffffff -39c88ec0 -9fffffff -a67ce511 -bfffffff -24b6b671 -7fffffff -6dae4547 -ffffffff -0168ef24 -220746cc -30d2ec9f -2dc04d35 -c42a14b6 -b6cf3de4 -27b2bdda -8964663c -2815a915 -7bea8a85 -fe0022c2 -da80ddef -424f6311 -54fad640 -4d0957fb -86bddb7c -448bfe11 -c8ea69a8 -67dfca77 -633f9e36 -c312e040 -1c029006 -9f440f98 -b36964f8 -5569dab7 -a09c74e3 -03fd3b8c -ddc89919 -0d5574b4 -07c8adbb -8ba43677 -42c1be6c -231d058c -4cace191 -8c0f5cbf -0d4c58ab -b7e7669e -9edfcc1b -4399ec2a -d24f0724 -7a9ac0a7 -5f249e4d -0143ac65 -ae7c7ae4 -e31f9713 -bd5a3c08 -cdbd527d -529d62b6 -59dde331 -4ba49966 -e05e8c5f -fd670591 -19835a0d -7dabb700 -636a75e3 -088b3e9e -280088db -4ed62428 -4a18738a -1ca7bd1f -fdd2cb40 -63c2504c -c61b1fbf -30bff192 -0bacfc76 -ebda5a4f -65cb60bd -1635b51a -a4053173 -6ce859bb -3e87b427 -499006c8 -6cc30f6f -3c5b3eee -25784f5f -d95fd86a -27b23dbf -e91014a0 -d5a2037f -01769a3c -e81fdcff -85a300e0 -ff7745ff -1f1baf6a -708903ff -86ce51bd -a4be27ff -b1f5d853 -31602fff -2ad60725 -ba4a1fff -5761a866 -7f103fff -09e4d1f4 -f8a77fff -9a7ef9e4 -da88ffff -a827f5a3 -2449ffff -59c05bb9 -6c9bffff -de14bff2 -6e27ffff -63c2a48f -31cfffff -5dcf019d -215fffff -90bb3480 -433fffff -47b7097b -857fffff -40d90a1e -acffffff -4b1634e1 -6dffffff -fcb627af -3bffffff -abb4da1c -67ffffff -41b79d35 -2fffffff -d38cadcd -dfffffff -fe339eca -bfffffff -07ac5fed -7fffffff -2ff7c0fc -ffffffff -a6ea1c0d -8138093c -f192d0d7 -bd21a956 -5d8a9ea9 -932d823f -2537437f -b3852a64 -17f8388b -567b159a -0de1b952 -9fbfcb0a -07571fe6 -7805ec94 -037adfd3 -2f5031f8 -01f2bae5 -c3e60e90 -00c42276 -421d9b0a -007fb916 -f088bed0 -0037193e -03f26964 -00172f2a -9ad8e8b1 -000fcb68 -d8219c9d -00070446 -6e19ce13 -0003db77 -6410ff87 -00013ef0 -764a44b4 -0000ac0b -946c61bc -000067a5 -fd846420 -000028a1 -1d6d2a93 -00001bf9 -9199165c -00000f99 -1b2e2cd7 -0000044e -d53c269b -00000213 -c21668aa -00000112 -5c7fb02d -000000a4 -aeb0a94c -00000075 -cc81f272 -0000002d -2041c033 -00000011 -f0f1d8db -00000008 -426e6ddf -00000006 -e715dfe5 -00000002 -db54e659 -00000001 -a3729599 -00000000 -6fd08d91 -00000000 -1ad9c6d8 -00000000 -05d54cb2 -00000000 -9e2e5be5 -00000000 -866534cd -00000000 -56f55245 -00000000 -44eb31e4 -00000000 -7db4d3b5 -00000000 -3372969f -00000000 -a38d0f39 -00000000 -b06670aa -00000000 -23f7d227 -00000000 -887aae6a -00000000 -106607dc -00000000 -c4aaf35a -00000000 -0981abb6 -00000000 -db14a009 -00000000 -eea93b6f -00000000 -fa342b15 -00000000 -b7b8b1a0 -00000000 -3473f51f -00000000 -57d53e43 -00000000 -2141c6d1 -00000000 -e7ff25b9 -00000000 -28c0d4ae -00000000 -0942c3fb -00000000 -418bfbb0 -00000000 -af3aeaa3 -00000000 -1d849e2b -00000000 -44339c10 -00000000 -746fe5b9 -00000000 -9064dbd9 -00000000 -880f73bb -9211a8d8 -60301309 -520235bc -2cfcc396 -d4b59c05 -1b4c0859 -735dc327 -086b6a04 -faf8dfcd -06720c54 -d945bbf3 -02d51bff -51054839 -01554174 -ea0a668a -00a746a4 -a2592b9d -005a6296 -53b3b0ff -00260fdd -5e320f4a -00159ecb -05b4d756 -000dc63d -07a04e64 -00066900 -8a8f7aef -0002b3db -94b953ed -0001bc44 -e13a0996 -0000f1b2 -9bdeb398 -00006766 -a98a372e -0000239d -dd0c8b94 -00001fa0 -ea3d9be7 -00000c1f -13446df8 -000006e3 -7b73ccf8 -000002fa -b372c56b -0000012b -ec7038c9 -000000aa -fb019df4 -0000004a -1799e728 -00000028 -0beddb07 -00000015 -44e9e4a5 -0000000e -ea3a0683 -00000006 -9d42f670 -00000002 -119b4fe5 -00000001 -98b20411 -00000000 -64409ddb -00000000 -f6724ba0 -00000000 -0c228266 -00000000 -e1d7300f -00000000 -b9b338eb -00000000 -a2f7647a -00000000 -12ca3f70 -00000000 -9c3ecb54 -00000000 -36971e1b -00000000 -93b3a3d9 -00000000 -050684bf -00000000 -65151c40 -00000000 -21870f0b -00000000 -0f552c94 -00000000 -2274ea18 -00000000 -f6cdb2f8 -00000000 -563e9bed -00000000 -6b77730f -00000000 -78511608 -00000000 -36a80bdf -00000000 -4a789cb3 -00000000 -c42b7170 -00000000 -834c687a -00000000 -b53302fc -00000000 -15c1d2df -00000000 -a3ea284d -00000000 -76c468ae -00000000 -e12b2b8f -00000000 -8743feb6 -00000000 -a66b0d38 -00000000 -2fa91425 -00000000 -309d6b79 -00000000 -7734d7c1 -2bb9daa6 -2dc86f6d -f01528ec -b2de7072 -74a8eaec -dabfc6d7 -fcc1650f -e3ff5ec4 -61d4c262 -f7fe676e -bee2ee6e -fbde6f8e -6d80feee -fd5d359f -efb5b593 -feb171e3 -ee412da7 -ff4f4d10 -09322235 -ffa80c91 -c9763989 -ffdb1391 -0c64d280 -ffe25182 -ac79fc27 -fff0ffc4 -513ee651 -fff8e49c -612faf5e -fffcd94d -36334245 -fffee5ce -2a9cc14f -ffff34a3 -279ee973 -ffffb7e9 -2dd60261 -ffffc1b6 -071c80a0 -ffffeb07 -76b4a3dd -fffff54d -1d95cdb0 -fffff905 -6b3d9c59 -fffffcc0 -891b8273 -fffffe5b -b68a272a -ffffff0f -ce80f7b1 -ffffff8d -897d9fc5 -ffffffdf -75f32b50 -ffffffee -239853f9 -fffffff3 -08d6920b -fffffffa -94038f33 -fffffffc -a9632e3d -fffffffe -1141b67f -ffffffff -faa97965 -ffffffff -d6ac851f -ffffffff -07f5e51d -ffffffff -9875bad1 -ffffffff -339863c4 -ffffffff -c988a7cc -ffffffff -5bc1c366 -ffffffff -132a7176 -ffffffff -498db88f -ffffffff -c313bc1f -ffffffff -b1834066 -ffffffff -aa467bbe -ffffffff -9b9aaad1 -ffffffff -e4367cca -ffffffff -3c2c0e92 -ffffffff -b264d045 -ffffffff -6baeea37 -ffffffff -e0f003e9 -ffffffff -f69b0ae6 -ffffffff -29ade05f -ffffffff -13e6d903 -ffffffff -0af2ee97 -ffffffff -2a5dc0a0 -ffffffff -e6a4d5ca -ffffffff -a422af66 -ffffffff -755961a9 -ffffffff -9aaacd63 -ffffffff -9c1f741f -ffffffff -5902a9db -ffffffff -1694bd33 -ffffffff -dd4ec4d8 -ffffffff -ef677106 -ffffffff -313971c0 -0cd5d8e2 -aec15274 -dec85b0d -d9157bee -93017690 -e9907c4b -647981b7 -f1ccaecf -fbdf8f97 -fab2993a -f37e27a3 -fc6f9f6b -0da64fcf -fe11d383 -3da82c98 -ff0d9d60 -9c3d087c -ffbe66b1 -a6c5e214 -ffd1f3aa -d6220b4f -ffeb78cc -fe0a9c6c -fff6f2fc -da70525a -fffa3d4f -b9fef1d6 -fffd1160 -67913217 -fffeb3be -81aa70ac -ffff2dd5 -c2680192 -ffffae62 -5916d281 -ffffc752 -3322358c -ffffe41c -a08b84f3 -fffff595 -8e368ce0 -fffff9e2 -b8f4169f -fffffc47 -ffec35fe -fffffe96 -6d3f408b -ffffff3f -c96efdc4 -ffffffa4 -242a809b -ffffffc5 -f65e7737 -ffffffe9 -e380a176 -fffffff1 -f65cf3f3 -fffffffb -9e7e1fc3 -fffffffd -85fcd601 -fffffffe -6c5e1578 -ffffffff -72745307 -ffffffff -7c2c966d -ffffffff -9bb4752d -ffffffff -0cf25923 -ffffffff -df3c45b4 -ffffffff -8f0846a2 -ffffffff -66b072b9 -ffffffff -2a933ad3 -ffffffff -8525e8a8 -ffffffff -9535971c -ffffffff -3e1c8521 -ffffffff -b66b3284 -ffffffff -53fbff6c -ffffffff -c70afc92 -ffffffff -dd68f201 -ffffffff -7213516d -ffffffff -18bb28e9 -ffffffff -265039f6 -ffffffff -14b91c79 -ffffffff -0973e89c -ffffffff -d798c9cf -ffffffff -95a4d257 -ffffffff -735c076b -ffffffff -894deab4 -ffffffff -953b00b0 -ffffffff -f829d29f -ffffffff -a96ec2b3 -ffffffff -432779ee -ffffffff -61b0ee09 -ffffffff -ff1e5bef -ffffffff -137a9777 -ffffffff -2904cdef -ffffffff -34c2da80 -5ba2c7dd -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/packuw-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/packuw-01.reference_output deleted file mode 100644 index 063e4e3aa..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/packuw-01.reference_output +++ /dev/null @@ -1,1052 +0,0 @@ -ffffffff -ffffffff -5ae15ae1 -00000000 -0000c386 -00000000 -00002af4 -00000000 -00002502 -00000000 -0000392e -00000000 -000080e4 -00000000 -0000cec7 -00000000 -00005d00 -00000000 -00000b81 -00000000 -000083e2 -00000000 -000046e4 -00000000 -0000242d -00000000 -0000d8d8 -00000000 -0000c1f3 -00000000 -0000d770 -00000000 -00000581 -00000000 -0000d8bc -00000000 -0000e812 -00000000 -00003d32 -00000000 -00002037 -00000000 -00008744 -00000000 -0000875e -00000000 -000017d8 -00000000 -000087f9 -00000000 -00000d42 -00000000 -00002de4 -00000000 -0000d630 -00000000 -00000000 -00000000 -00004e7b -00000000 -00000000 -00000000 -0000c8cd -00000000 -0000c062 -00000000 -00006449 -00000000 -80004f63 -ffffffff -c0001f3c -ffffffff -20003bb3 -00000000 -70002bed -00000000 -e8007c49 -ffffffff -2400a855 -00000000 -3a002450 -00000000 -fd006656 -ffffffff -02809929 -00000000 -4d40ff60 -00000000 -10a093c2 -00000000 -9890a1c1 -ffffffff -a8f8408b -ffffffff -db8caa8d -ffffffff -8c625c96 -ffffffff -526b7c28 -00000000 -282856f6 -00000000 -3aaf5710 -00000000 -ba453a81 -ffffffff -54c322fe -00000000 -9d41fcd2 -ffffffff -29458b08 -00000000 -b6c0072f -ffffffff -91100e72 -ffffffff -98df3b50 -ffffffff -3f6ad6cb -00000000 -8f82f66f -ffffffff -48b4aeb5 -00000000 -12916373 -00000000 -33ec4b1d -00000000 -323e0196 -00000000 -af5b8947 -ffffffff -e92a0000 -ffffffff -4bed0000 -00000000 -32060000 -00000000 -4ef40000 -00000000 -d2360000 -ffffffff -34800000 -00000000 -43600000 -00000000 -60e00000 -00000000 -522a0000 -00000000 -994a0000 -ffffffff -5d620000 -00000000 -cd070000 -ffffffff -4ea40000 -00000000 -bb750000 -ffffffff -709e0000 -00000000 -3ff70000 -00000000 -e7160000 -ffffffff -b03f0000 -ffffffff -5c3d0000 -00000000 -18cc0000 -00000000 -575d0000 -00000000 -7ce10000 -00000000 -6f9f0000 -00000000 -4f830000 -00000000 -244d0000 -00000000 -5b130000 -00000000 -64e70000 -00000000 -305e0000 -00000000 -61250000 -00000000 -07e80000 -00000000 -62910000 -00000000 -58f40000 -00000000 -0a090000 -00000000 -33448000 -00000000 -e2edc000 -ffffffff -00f16000 -00000000 -48f7f000 -00000000 -df889800 -ffffffff -bd23ec00 -ffffffff -86f97600 -ffffffff -80eb8b00 -ffffffff -1db6fb80 -00000000 -02352c40 -00000000 -cd26c220 -ffffffff -01b57b70 -00000000 -5d3b0cc8 -00000000 -fd1096fc -ffffffff -f570dde6 -ffffffff -7592d357 -00000000 -461647f9 -00000000 -8ccaf9c7 -ffffffff -6d5f7952 -00000000 -2ded1ce9 -00000000 -1d24e301 -00000000 -ddbaac86 -ffffffff -a9e1de16 -ffffffff -152906bf -00000000 -62730e07 -00000000 -6c57d295 -00000000 -a97b6ec1 -ffffffff -d19ef0f1 -ffffffff -56f5f0f5 -00000000 -253292d9 -00000000 -5fef058f -00000000 -598b797d -00000000 -77270aab -00000000 -b3aa8f64 -ffffffff -3d561d19 -00000000 -b5ff7d3a -ffffffff -14d58228 -00000000 -f81a963a -ffffffff -dd93740e -ffffffff -66eedfe4 -00000000 -8652af69 -ffffffff -09fcb2fe -00000000 -6409e10e -00000000 -d92f914a -ffffffff -30d0e881 -00000000 -e6370ae9 -ffffffff -f8dd0b72 -ffffffff -be5f303c -ffffffff -70c2832c -00000000 -d5810c99 -ffffffff -14933e0a -00000000 -8d376dd5 -ffffffff -cc6f1f89 -ffffffff -bddf6d64 -ffffffff -5cbf3161 -00000000 -3e7f6fb0 -00000000 -b4ffa1d0 -ffffffff -71ff6be0 -00000000 -b3ffdb0b -ffffffff -57ff5d11 -00000000 -2fff7a44 -00000000 -9fff9354 -ffffffff -3fff9949 -00000000 -7fff4e2e -00000000 -fffff719 -ffffffff -ffff15a0 -ffffffff -ffffb733 -ffffffff -ffff6aed -ffffffff -ffff6d2d -ffffffff -ffffbffb -ffffffff -ffff27b0 -ffffffff -ffff14a7 -ffffffff -ffff2f6a -ffffffff -ffff1121 -ffffffff -fffff96e -ffffffff -ffff8fbf -ffffffff -ffff2552 -ffffffff -ffff0f99 -ffffffff -ffffb68c -ffffffff -ffff13e5 -ffffffff -ffff47cd -ffffffff -ffff8364 -ffffffff -ffffd091 -ffffffff -ffff7642 -ffffffff -ffff2017 -ffffffff -ffff9738 -ffffffff -ffff5843 -ffffffff -ffff25fb -ffffffff -ffffbd94 -ffffffff -fffffe18 -ffffffff -ffff386e -ffffffff -ffff0274 -ffffffff -ffff180c -ffffffff -ffff41e5 -ffffffff -ffff275b -ffffffff -ffffae5f -ffffffff -ffffb0f9 -ffffffff -96c01a56 -ffffffff -8033d4d6 -ffffffff -602531a3 -00000000 -f54142ee -ffffffff -cd096a88 -ffffffff -f3d1efef -ffffffff -46b8883e -00000000 -00f0733f -00000000 -269e63dd -00000000 -ff034ef7 -ffffffff -0a71eb18 -00000000 -b74d2919 -ffffffff -cf1effe7 -ffffffff -4572ba18 -00000000 -ee845f67 -ffffffff -4c40f63c -00000000 -65849d02 -00000000 -e5c7d6f1 -ffffffff -64a10c03 -00000000 -cd415857 -ffffffff -ee8f16ef -ffffffff -de38e6df -ffffffff -8b9fe4bf -ffffffff -0c96f77f -00000000 -88f90aff -ffffffff -955295ff -ffffffff -5c6c23ff -00000000 -4a7a97ff -00000000 -37e0cfff -00000000 -0d771fff -00000000 -8dfc3fff -ffffffff -4e6e7fff -00000000 -998dffff -ffffffff -75eeffff -00000000 -59cfffff -00000000 -9793ffff -ffffffff -9687ffff -ffffffff -d2feffff -ffffffff -b6d7ffff -ffffffff -0929ffff -00000000 -784affff -00000000 -4f82ffff -00000000 -17b8ffff -00000000 -8b16ffff -ffffffff -39beffff -00000000 -91e4ffff -ffffffff -975affff -ffffffff -b432ffff -ffffffff -b76dffff -ffffffff -cd9cffff -ffffffff -eed7ffff -ffffffff -76b1ffff -00000000 -b398ffff -ffffffff -3c46ffff -00000000 -9b01ffff -ffffffff -5b33ffff -00000000 -2d37ffff -00000000 -bf97ffff -ffffffff -6df8ffff -00000000 -e084ffff -ffffffff -432fffff -00000000 -03b1ffff -00000000 -4b6effff -00000000 -bbe8ffff -ffffffff -2f8bffff -00000000 -41b266cc -00000000 -1d611ba9 -00000000 -c301fae6 -ffffffff -a8e63695 -ffffffff -3b6b4c82 -00000000 -02b6e717 -00000000 -cc1e4d3b -ffffffff -67deb8fe -00000000 -e94a6e80 -ffffffff -91d6c32c -ffffffff -e4a7a11f -ffffffff -1844cad7 -00000000 -2e6731f3 -00000000 -99d60a76 -ffffffff -6d2b5ac5 -00000000 -c3c453aa -ffffffff -226bae53 -00000000 -ed481862 -ffffffff -2c282874 -00000000 -25842f3d -00000000 -0995e7b4 -00000000 -cd877b69 -ffffffff -80b6af88 -ffffffff -b467a279 -ffffffff -e94ff7e7 -ffffffff -189791e4 -00000000 -671caf6a -00000000 -8b14b470 -ffffffff -18d6d508 -00000000 -50dd1690 -00000000 -3b8f58fc -00000000 -8795962e -ffffffff -e03088b4 -ffffffff -7b1be0f4 -00000000 -31b07fb2 -00000000 -1cdefa2f -00000000 -0bce6b66 -00000000 -06a179fe -00000000 -03212080 -00000000 -01e46776 -00000000 -00b01f36 -00000000 -00557f65 -00000000 -00218fc0 -00000000 -001ff2fb -00000000 -000bea7f -00000000 -00072c42 -00000000 -0003de17 -00000000 -00016be1 -00000000 -00001530 -00000000 -0000b7e0 -00000000 -0000ca71 -00000000 -0000167c -00000000 -0000ec9a -00000000 -0000fb7a -00000000 -0000f1ba -00000000 -00006352 -00000000 -0000b325 -00000000 -0000c196 -00000000 -0000b6d3 -00000000 -000079a2 -00000000 -000013f5 -00000000 -0000a111 -00000000 -0000d465 -00000000 -000067ba -00000000 -0000caa0 -00000000 -47f4d427 -00000000 -73d561ee -00000000 -36cd4671 -00000000 -1ce2d265 -00000000 -f333b612 -ffffffff -e54922dc -ffffffff -ebb9e159 -ffffffff -c12fcdc0 -ffffffff -32d1aa78 -00000000 -3dd124aa -00000000 -02e5f517 -00000000 -7b1f99ed -00000000 -83b884c9 -ffffffff -d69f70c6 -ffffffff -b1b4ba6b -ffffffff -41d81488 -00000000 -032f6111 -00000000 -9ffd92a3 -ffffffff -07bf5a11 -00000000 -f6a08bcc -ffffffff -128abb01 -00000000 -1328f678 -00000000 -5b83798c -00000000 -08fba82c -00000000 -7349236e -00000000 -21af482e -00000000 -0f7a7219 -00000000 -11b4bfbd -00000000 -ead847bc -ffffffff -9da93a78 -ffffffff -fa284b1e -ffffffff -e7a26bba -ffffffff -b45fbd08 -ffffffff -83295bea -ffffffff -6be43a81 -00000000 -63611891 -00000000 -3fdf0bf8 -00000000 -952e0711 -ffffffff -62dc028d -00000000 -c5ce011e -ffffffff -257700c7 -00000000 -a44f0073 -ffffffff -e2860034 -ffffffff -1dd3001a -00000000 -c4ff0009 -ffffffff -02cd0007 -00000000 -1e340002 -00000000 -03e00001 -00000000 -45100000 -00000000 -65bd0000 -00000000 -0d650000 -00000000 -00230000 -00000000 -d8b90000 -ffffffff -902a0000 -ffffffff -3acb0000 -00000000 -154c0000 -00000000 -a9960000 -ffffffff -3bd00000 -00000000 -c7320000 -ffffffff -30b10000 -00000000 -d4ea0000 -ffffffff -9d950000 -ffffffff -cb000000 -ffffffff -965e0000 -ffffffff -c7fd0000 -ffffffff -7443aa01 -00000000 -dab03591 -ffffffff -89016562 -ffffffff -dcf030d2 -ffffffff -b828d69f -ffffffff -2d79f38e -00000000 -1a5974bc -00000000 -6f6db918 -00000000 -08800282 -00000000 -e9e6b8b0 -ffffffff -9c23eb74 -ffffffff -f831859b -ffffffff -0e220da5 -00000000 -e41bf044 -ffffffff -85148e73 -ffffffff -b3b2fb56 -ffffffff -7d6163ad -00000000 -81b47825 -ffffffff -9bfac5f0 -ffffffff -e7782407 -ffffffff -4caed9e0 -00000000 -dbc1b5c0 -ffffffff -36c3d788 -00000000 -a2463601 -ffffffff -cf4c255c -ffffffff -49aa9e49 -00000000 -27521ac2 -00000000 -40d01755 -00000000 -a0a1120f -ffffffff -748c2f8d -00000000 -9fc76056 -ffffffff -a97cbd00 -ffffffff -1fe862a1 -00000000 -af89c478 -ffffffff -c1650715 -ffffffff -efadc2cc -ffffffff -f7fc95a6 -ffffffff -f8d3d216 -ffffffff -fc15fc9a -ffffffff -feac0c20 -ffffffff -ff5b06ae -ffffffff -ff8737c4 -ffffffff -ffcea311 -ffffffff -ffef62eb -ffffffff -fff30320 -ffffffff -fff879a6 -ffffffff -fffcd971 -ffffffff -fffe1e4e -ffffffff -ffffe3d4 -ffffffff -ffffb4c8 -ffffffff -ffff5408 -ffffffff -ffffc099 -ffffffff -ffff7ddd -ffffffff -ffff6dc3 -ffffffff -ffffd9ad -ffffffff -ffff0d45 -ffffffff -ffffcb29 -ffffffff -ffff6ed2 -ffffffff -ffff8347 -ffffffff -fffffc6c -ffffffff -ffff7886 -ffffffff -ffffe183 -ffffffff -ffff596f -ffffffff -ffffca11 -ffffffff -ffffdc17 -ffffffff -9408a85a -ffffffff -53a285d7 -00000000 -e35656df -ffffffff -041bea37 -00000000 -92673115 -ffffffff -12ea91ed -00000000 -ef8c4ec6 -ffffffff -2fb54846 -00000000 -658312e9 -00000000 -53e1042d -00000000 -bbc9b87c -ffffffff -9a599651 -ffffffff -725f7b8b -00000000 -5956a3b6 -00000000 -437c81ed -00000000 -4b43a0fb -00000000 -6c965c37 -00000000 -0e24c5b3 -00000000 -a6fa35a7 -ffffffff -c8634411 -ffffffff -be527297 -ffffffff -85bfe335 -ffffffff -af33fc7c -ffffffff -31d4fc61 -00000000 -eb69985a -ffffffff -7a32fb37 -00000000 -fbd20bd6 -ffffffff -4a106f73 -00000000 -1dcaafe0 -00000000 -52b4bd59 -00000000 -e8d7a647 -ffffffff -754fb9e9 -00000000 -ec327569 -ffffffff -ccad955d -ffffffff -1bd7d7be -00000000 -109fe046 -00000000 -090af141 -00000000 -2a71fba1 -00000000 -e5e2fc9e -ffffffff -1011fe23 -00000000 -458dff7d -00000000 -67a0ff83 -00000000 -51c5ffc7 -00000000 -8b7bffe2 -ffffffff -58fafff2 -00000000 -2c9ffffb -00000000 -2daffffc -00000000 -6a01fffe -00000000 -c5ecffff -ffffffff -99efffff -ffffffff -dae9ffff -ffffffff -3d06ffff -00000000 -280bffff -00000000 -a729ffff -ffffffff -8c8affff -ffffffff -4d88ffff -00000000 -0b54ffff -00000000 -3d48ffff -00000000 -4d98ffff -00000000 -accaffff -ffffffff -5ae6ffff -00000000 -bedcffff -ffffffff -53e8ffff -00000000 -cf84ffff -ffffffff -03ccffff -00000000 -00005ae1 -00000000 -0000392e -00000000 -0000ab72 -00000000 -0000d964 -00000000 -00000000 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/packw-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/packw-01.reference_output deleted file mode 100644 index bb5fa8083..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/packw-01.reference_output +++ /dev/null @@ -1,1052 +0,0 @@ -ffffffff -ffffffff -06040604 -00000000 -00000000 -00000000 -00002d39 -00000000 -0000307f -00000000 -00006fa3 -00000000 -0000d23b -00000000 -0000313a -00000000 -00003e38 -00000000 -00005ef0 -00000000 -0000ba3a -00000000 -0000abd8 -00000000 -00008cef -00000000 -0000dd47 -00000000 -00006fae -00000000 -00004260 -00000000 -000060e6 -00000000 -0000a4df -00000000 -00000000 -00000000 -0000d01e -00000000 -0000e34e -00000000 -000034d3 -00000000 -00009bf5 -00000000 -0000a217 -00000000 -000096d6 -00000000 -0000ea01 -00000000 -0000eb20 -00000000 -00008385 -00000000 -0000f99f -00000000 -00007359 -00000000 -000029c9 -00000000 -0000f63e -00000000 -000009fb -00000000 -000018a7 -00000000 -0000879f -00000000 -00001ad7 -00000000 -0000e347 -00000000 -0000cfc5 -00000000 -00006066 -00000000 -00002f4b -00000000 -00007198 -00000000 -0000b0e2 -00000000 -0000dfeb -00000000 -000036ed -00000000 -00002130 -00000000 -0000c528 -00000000 -000097cd -00000000 -0000c392 -00000000 -00002250 -00000000 -000090b1 -00000000 -800046e8 -ffffffff -4000b7ae -00000000 -20000bd9 -00000000 -7000b755 -00000000 -680020d7 -00000000 -44002833 -00000000 -06006ac9 -00000000 -7f004556 -00000000 -bd80c99d -ffffffff -4d40f3ae -00000000 -64e0a51d -00000000 -be7022fc -ffffffff -53785e07 -00000000 -d4fc37e9 -ffffffff -7f5ef0c0 -00000000 -c16d6e6e -ffffffff -61300000 -00000000 -29750000 -00000000 -b4710000 -ffffffff -3b6f0000 -00000000 -cded0000 -ffffffff -c0ad0000 -ffffffff -fec90000 -ffffffff -11eb0000 -00000000 -e8220000 -ffffffff -555f0000 -00000000 -953f0000 -ffffffff -888b0000 -ffffffff -788d0000 -00000000 -156a0000 -00000000 -60f10000 -00000000 -e48d0000 -ffffffff -713f0000 -00000000 -f4890000 -ffffffff -56e70000 -00000000 -d7f70000 -ffffffff -258e0000 -00000000 -f4b30000 -ffffffff -34b20000 -00000000 -2ec80000 -00000000 -92060000 -ffffffff -04740000 -00000000 -79610000 -00000000 -3f800000 -00000000 -08880000 -00000000 -bf650000 -ffffffff -f0e20000 -ffffffff -53280000 -00000000 -50490000 -00000000 -cbb00000 -ffffffff -89710000 -ffffffff -f68e0000 -ffffffff -1cb00000 -00000000 -0b110000 -00000000 -00580000 -00000000 -02550000 -00000000 -e5570000 -ffffffff -027c0000 -00000000 -90f70000 -ffffffff -ce1c0000 -ffffffff -67480000 -00000000 -bce00000 -ffffffff -32e80000 -00000000 -83ef0000 -ffffffff -32600000 -00000000 -e73d8000 -ffffffff -ec714000 -ffffffff -cd18a000 -ffffffff -b6a73000 -ffffffff -1ed6e800 -00000000 -d0b1ac00 -ffffffff -6e277a00 -00000000 -755d0d00 -00000000 -ed069180 -ffffffff -44bc5440 -00000000 -cc253320 -ffffffff -3224c6b0 -00000000 -47ab4bc8 -00000000 -9041be34 -ffffffff -e9117fe6 -ffffffff -88db76df -ffffffff -bd624e37 -ffffffff -58e5b9bc -00000000 -ac8bdf81 -ffffffff -09a7ed38 -00000000 -348f3aee -00000000 -1e9fb5d7 -00000000 -29bf023d -00000000 -f97fc7a5 -ffffffff -92ff8a52 -ffffffff -3dff4fc2 -00000000 -2bff43d4 -00000000 -97ffad80 -ffffffff -4fff30ba -00000000 -1fff5557 -00000000 -3fffbb91 -00000000 -7fffa1d0 -00000000 -ffffbaff -ffffffff -ffffc902 -ffffffff -ffffd875 -ffffffff -ffff4cb4 -ffffffff -ffff3d02 -ffffffff -ffffe7ad -ffffffff -ffffb010 -ffffffff -fffff1c0 -ffffffff -ffff2d4d -ffffffff -ffff7552 -ffffffff -ffffba39 -ffffffff -ffff39a4 -ffffffff -ffffc8ad -ffffffff -ffff7e48 -ffffffff -ffff02ca -ffffffff -ffff7447 -ffffffff -ffff2179 -ffffffff -ffff3321 -ffffffff -ffff640c -ffffffff -ffffe476 -ffffffff -ffffb9e3 -ffffffff -ffff6c5c -ffffffff -ffff12a3 -ffffffff -ffffdd83 -ffffffff -ffffa770 -ffffffff -ffff54cc -ffffffff -ffffaffa -ffffffff -fffff9ba -ffffffff -fffffbf9 -ffffffff -ffffd8bc -ffffffff -ffff8fce -ffffffff -ffffcf6b -ffffffff -ffff73ed -ffffffff -ffffa709 -ffffffff -ffff7142 -ffffffff -ffff7709 -ffffffff -ffff6dbe -ffffffff -ffffbfb9 -ffffffff -ffff990b -ffffffff -ffff16b4 -ffffffff -ffff509c -ffffffff -ffff3d04 -ffffffff -fffff954 -ffffffff -ffff846b -ffffffff -ffff5db5 -ffffffff -ffffa5de -ffffffff -ffffbf80 -ffffffff -ffffdcbb -ffffffff -ffff4bb3 -ffffffff -304232e0 -00000000 -ada786cd -ffffffff -666dcf7b -00000000 -ab619aa7 -ffffffff -e87577cf -ffffffff -07a2fc5f -00000000 -8c5ead3f -ffffffff -a572597f -ffffffff -19252cff -00000000 -170e3dff -00000000 -008773ff -00000000 -161417ff -00000000 -c7ba8fff -ffffffff -88a25fff -ffffffff -a991bfff -ffffffff -06c37fff -00000000 -4c17ffff -00000000 -946affff -ffffffff -4081ffff -00000000 -cad2ffff -ffffffff -948affff -ffffffff -d7e2ffff -ffffffff -8591ffff -ffffffff -a183ffff -ffffffff -31f4ffff -00000000 -35a4ffff -00000000 -32a5ffff -00000000 -5c05ffff -00000000 -de00ffff -ffffffff -0f3cffff -00000000 -2307ffff -00000000 -e408ffff -ffffffff -1525ffff -00000000 -935fffff -ffffffff -4bb2ffff -00000000 -3e6cffff -00000000 -f28fffff -ffffffff -2e7effff -00000000 -5e84ffff -00000000 -36e8ffff -00000000 -bebbffff -ffffffff -9b65ffff -ffffffff -b123ffff -ffffffff -bb0dffff -ffffffff -2172ffff -00000000 -2acbffff -00000000 -8550ffff -ffffffff -d4f7ffff -ffffffff -454dffff -00000000 -b03affff -ffffffff -a24affff -ffffffff -fd3dffff -ffffffff -8b52ffff -ffffffff -4110ffff -00000000 -f7ccffff -ffffffff -1999ffff -00000000 -de81ffff -ffffffff -e520ffff -ffffffff -ccf6ffff -ffffffff -09f0ffff -00000000 -f218ffff -ffffffff -d74bffff -ffffffff -a010ffff -ffffffff -f88dffff -ffffffff -9e9dffff -ffffffff -bb9a59ee -ffffffff -7a4da6b5 -00000000 -5fa0f67d -00000000 -1cb680ff -00000000 -609381a2 -00000000 -53e5a666 -00000000 -04388462 -00000000 -f00690a6 -ffffffff -e4a83472 -ffffffff -cedd4da8 -ffffffff -c5ba7657 -ffffffff -ebd264c4 -ffffffff -a854c57c -ffffffff -8912f50a -ffffffff -65401cc8 -00000000 -b8a1f3b7 -ffffffff -5502c374 -00000000 -d09e11cb -ffffffff -69b7799a -00000000 -9de3c554 -ffffffff -65a3b57e -00000000 -2ab52cda -00000000 -8be6e590 -ffffffff -fb8b2e75 -ffffffff -bd21a342 -ffffffff -2e45f834 -00000000 -82fc3e68 -ffffffff -2f9753de -00000000 -084eff34 -00000000 -1af1a1f7 -00000000 -801d0a18 -ffffffff -1cb65835 -00000000 -3f468922 -00000000 -da5e8d2f -ffffffff -f86ad83b -ffffffff -8a080afd -ffffffff -1a9cec95 -00000000 -096c0c5f -00000000 -1cb3f2ac -00000000 -8237fd34 -ffffffff -fbceddf8 -ffffffff -16a9d54d -00000000 -bf99819e -ffffffff -99dec7f9 -ffffffff -eec17301 -ffffffff -9dd3eeac -ffffffff -5bc3b009 -00000000 -db50fcde -ffffffff -c1f1959b -ffffffff -46326d03 -00000000 -3cdc067b -00000000 -1ad8d62e -00000000 -0e5e5dc8 -00000000 -04563b3b -00000000 -0216e498 -00000000 -014d2556 -00000000 -00ad7dda -00000000 -0042c5c2 -00000000 -0032e879 -00000000 -001eed17 -00000000 -000dbc90 -00000000 -0004f5fb -00000000 -00032689 -00000000 -00017848 -00000000 -0000a141 -00000000 -39f379f6 -00000000 -8e1cac38 -ffffffff -f8a1120e -ffffffff -62d642ef -00000000 -35b65e0d -00000000 -825673ac -ffffffff -c5964dc5 -ffffffff -694d2ece -00000000 -464e5c62 -00000000 -e0441735 -ffffffff -0777e383 -00000000 -fc6ad4d2 -ffffffff -52d755f2 -00000000 -6b161509 -00000000 -3d07c77d -00000000 -12cd1edd -00000000 -bce3b4b6 -ffffffff -6a188329 -00000000 -c096cca6 -ffffffff -0758e7ce -00000000 -e84aea76 -ffffffff -4c792942 -00000000 -49ce06ff -00000000 -09a0b2ce -00000000 -dbc4ba20 -ffffffff -214aa761 -00000000 -0443c1db -00000000 -19007d15 -00000000 -1dcd7549 -00000000 -b14d2ebc -ffffffff -5a0d943f -00000000 -8cbd8d22 -ffffffff -51c340fc -00000000 -c05b8594 -ffffffff -9ee737ea -ffffffff -b9f8dd3d -ffffffff -2348670e -00000000 -1b8beb58 -00000000 -08d6d9f4 -00000000 -fdd87a61 -ffffffff -c1ec93f6 -ffffffff -576a6008 -00000000 -852c106a -ffffffff -77bf83b3 -00000000 -64de9a1f -00000000 -f2af00af -ffffffff -b3f1f165 -ffffffff -d6816f3f -ffffffff -0358b80f -00000000 -9acb4daa -ffffffff -03722242 -00000000 -b6821aab -ffffffff -b45c0a12 -ffffffff -174f065b -00000000 -626603fd -00000000 -d2aa0191 -ffffffff -4aef00aa -00000000 -33460079 -00000000 -1cc00026 -00000000 -7d0b0014 -00000000 -65d0000f -00000000 -847e0007 -ffffffff -88530002 -ffffffff -da320001 -ffffffff -e8050000 -ffffffff -f200e126 -ffffffff -001edb10 -00000000 -096d24e9 -00000000 -c65668bd -ffffffff -fd3432e6 -ffffffff -e311735f -ffffffff -28f71570 -00000000 -a856b7fa -ffffffff -b668f24d -ffffffff -78bb0cb6 -00000000 -bdb8f8bb -ffffffff -06c94c3f -00000000 -c1e0f55f -ffffffff -a01b106f -ffffffff -f49d758e -ffffffff -fa556e3e -ffffffff -ce76cdbb -ffffffff -d2d8d0f4 -ffffffff -3293a710 -00000000 -555de26d -00000000 -8b6ce7fe -ffffffff -f2b16c9d -ffffffff -5dc6d65b -00000000 -5d2a5d9b -00000000 -7d0909e0 -00000000 -e370c4a1 -ffffffff -aa644829 -ffffffff -e5e80d1c -ffffffff -c6f0f957 -ffffffff -a5911335 -ffffffff -45d1f5e8 -00000000 -bf8570ae -ffffffff -4ebd2347 -00000000 -57f9ef2d -00000000 -f0f15a89 -ffffffff -ea821d38 -ffffffff -c18cbea9 -ffffffff -e5f5eea8 -ffffffff -b0f702b1 -ffffffff -3217b9ee -00000000 -a80cc150 -ffffffff -984fc6b9 -ffffffff -1bbcd81e -00000000 -1d76f954 -00000000 -ae62df72 -ffffffff -1475551f -00000000 -e9a56f2c -ffffffff -57700fad -00000000 -4877dd27 -00000000 -b0b3839b -ffffffff -dd0f4572 -ffffffff -e1e2bc4c -ffffffff -f4e3cc72 -ffffffff -fb86ccee -ffffffff -fdc4f5d6 -ffffffff -fec33cdf -ffffffff -ff3f3ebd -ffffffff -ffb16006 -ffffffff -ffd6ddf5 -ffffffff -ffef3192 -ffffffff -fff4e3eb -ffffffff -fffb2ab6 -ffffffff -fffc5f89 -ffffffff -fffe073d -ffffffff -ffffae6e -ffffffff -ad7db567 -ffffffff -7ee17c9b -00000000 -529c45de -00000000 -baabdc21 -ffffffff -acb50919 -ffffffff -67e46c94 -00000000 -60c0f18c -00000000 -a75841f6 -ffffffff -5bdf1176 -00000000 -e6bc678a -ffffffff -df37e2a6 -ffffffff -2829ee66 -00000000 -3a8f7233 -00000000 -b39d33ac -ffffffff -bc4175e8 -ffffffff -ad85c248 -ffffffff -7b0e849b -00000000 -d9cce01c -ffffffff -ba7befc1 -ffffffff -42c25b05 -00000000 -65f36012 -00000000 -95c06cc4 -ffffffff -4e156d0b -00000000 -ff0813a4 -ffffffff -92d59ef1 -ffffffff -09febec9 -00000000 -570d1d6d -00000000 -4e668905 -00000000 -cf748a14 -ffffffff -2eff213f -00000000 -a7148a56 -ffffffff -9b963d53 -ffffffff -5eec7302 -00000000 -b61f1ce8 -ffffffff -75c50830 -00000000 -f475ab61 -ffffffff -96c935a5 -ffffffff -a2ada6cb -ffffffff -90be9033 -ffffffff -eeb48b6b -ffffffff -a5ef8180 -ffffffff -7b542e3f -00000000 -b8b27cdc -ffffffff -53782746 -00000000 -6e1c0599 -00000000 -7296e2c6 -00000000 -94c139a2 -ffffffff -3380d06b -00000000 -61485ea2 -00000000 -18578647 -00000000 -8554c823 -ffffffff -1437edb9 -00000000 -11fdf576 -00000000 -8c66fadf -ffffffff -18b2fd7f -00000000 -450ffee4 -00000000 -aa22ff11 -ffffffff -06c2ff8b -00000000 -4bffffcd -00000000 -7f0dffe0 -00000000 -a228fff5 -ffffffff -25e6fffb -00000000 -eb43fffc -ffffffff -b683fffe -ffffffff -0f27ffff -00000000 -00000604 -00000000 -000071b6 -00000000 -0000abd8 -00000000 -0000dd49 -00000000 -00000000 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/rev.b-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/rev.b-01.reference_output deleted file mode 100644 index 581800011..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/rev.b-01.reference_output +++ /dev/null @@ -1,520 +0,0 @@ -ffffffff -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -01000000 -deadbeef -02000000 -deadbeef -04000000 -deadbeef -0b000000 -deadbeef -11000000 -deadbeef -28000000 -deadbeef -5c000000 -deadbeef -8f000000 -deadbeef -74010000 -deadbeef -eb030000 -deadbeef -a5070000 -deadbeef -f50f0000 -deadbeef -121f0000 -deadbeef -ee210000 -deadbeef -26520000 -deadbeef -38d60000 -deadbeef -372c0100 -deadbeef -697e0200 -deadbeef -b7930600 -deadbeef -94200c00 -deadbeef -46ad1b00 -deadbeef -69343800 -deadbeef -4fb46600 -deadbeef -5375b800 -deadbeef -9d3e3401 -deadbeef -5180ec02 -deadbeef -bfbf4406 -deadbeef -34deff0c -deadbeef -24d0e51c -deadbeef -55e68137 -deadbeef -0a053c5a -deadbeef -9ebe6efb -deadbeef -d0f0ed38 -deadbeef -77eb4592 -deadbeef -1d1065de -deadbeef -c64325e9 -deadbeef -2fc4aef4 -deadbeef -65ed04f8 -deadbeef -4843ccfd -deadbeef -baf380fe -deadbeef -8c136dff -deadbeef -3caa96ff -deadbeef -3c62c2ff -deadbeef -be15ebff -deadbeef -845ef3ff -deadbeef -a60afaff -deadbeef -d980fdff -deadbeef -aef9feff -deadbeef -021bffff -deadbeef -a1b3ffff -deadbeef -ccdbffff -deadbeef -b4ecffff -deadbeef -8ef1ffff -deadbeef -b5faffff -deadbeef -44fdffff -deadbeef -fdfeffff -deadbeef -31ffffff -deadbeef -8dffffff -deadbeef -dfffffff -deadbeef -e3ffffff -deadbeef -f3ffffff -deadbeef -f8ffffff -deadbeef -fcffffff -deadbeef -feffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -782ccd4f -deadbeef -43708fa6 -deadbeef -6fb34d9f -deadbeef -aa242a4f -deadbeef -68f2a828 -deadbeef -a208c09a -deadbeef -e3323e0b -deadbeef -85c4af40 -deadbeef -484d25a8 -deadbeef -a6bd5933 -deadbeef -5f1fb355 -deadbeef -1e8a6890 -deadbeef -97e02907 -deadbeef -ac0d50aa -deadbeef -00c46dc1 -deadbeef -1b97d268 -deadbeef -af422278 -deadbeef -464fb1d8 -deadbeef -1b9d2dba -deadbeef -66015948 -deadbeef -23d48e8e -deadbeef -885f5483 -deadbeef -927fa18d -deadbeef -5cd346e6 -deadbeef -0a6d80bf -deadbeef -adcc40bf -deadbeef -eb18badb -deadbeef -7fa7a5cd -deadbeef -ff66a651 -deadbeef -e2acf5b8 -deadbeef -aec8491c -deadbeef -9569520f -deadbeef -ff8f4454 -deadbeef -c6571472 -deadbeef -24a78a86 -deadbeef -e895b277 -deadbeef -1063a59d -deadbeef -602316f5 -deadbeef -c0cd7ea8 -deadbeef -80f75f9c -deadbeef -008dbe30 -deadbeef -007ebd2b -deadbeef -00c47fed -deadbeef -00e868a1 -deadbeef -00901116 -deadbeef -00a021fe -deadbeef -00c0eee9 -deadbeef -0080ba9d -deadbeef -0000e1ac -deadbeef -0000d616 -deadbeef -0000f414 -deadbeef -0000b802 -deadbeef -0000f064 -deadbeef -00002041 -deadbeef -0000c029 -deadbeef -0000802a -deadbeef -0000005f -deadbeef -000000c2 -deadbeef -0000009c -deadbeef -000000c8 -deadbeef -00000070 -deadbeef -00000060 -deadbeef -00000040 -deadbeef -00000080 -deadbeef -b4f52943 -deadbeef -7920e2e0 -deadbeef -624a6f74 -deadbeef -7ceb67e6 -deadbeef -5680cc81 -deadbeef -7617428e -deadbeef -4f398875 -deadbeef -73ad60ef -deadbeef -54690bd6 -deadbeef -18dd1457 -deadbeef -63110010 -deadbeef -3817d0c8 -deadbeef -99f7181a -deadbeef -fa93d7a5 -deadbeef -896c1a30 -deadbeef -648a6f1c -deadbeef -5b97a1aa -deadbeef -1149c6f3 -deadbeef -15d651f6 -deadbeef -8be6cadc -deadbeef -fe8416c4 -deadbeef -90ce17b9 -deadbeef -968d3b03 -deadbeef -9cd615dc -deadbeef -14d0887f -deadbeef -1b28ab6e -deadbeef -a9254b1a -deadbeef -08c5ae9a -deadbeef -f6f99d19 -deadbeef -315118cd -deadbeef -0a5ea486 -deadbeef -a70f0cfe -deadbeef -baddedf3 -deadbeef -b111a208 -deadbeef -0ba7618a -deadbeef -47326040 -deadbeef -8f904310 -deadbeef -df2a55c4 -deadbeef -bf403f89 -deadbeef -7f944b05 -deadbeef -fffef67a -deadbeef -ff89208b -deadbeef -ff53dbd0 -deadbeef -ff77432d -deadbeef -ff2f79fa -deadbeef -ff5f4777 -deadbeef -ff3ffe70 -deadbeef -ff7f2c08 -deadbeef -ffff7650 -deadbeef -ffffcd54 -deadbeef -ffffc321 -deadbeef -ffff37b8 -deadbeef -ffffcf0f -deadbeef -ffffdfc8 -deadbeef -ffff3f8c -deadbeef -ffff7f22 -deadbeef -ffffff1a -deadbeef -ffffff0d -deadbeef -ffffff63 -deadbeef -ffffff17 -deadbeef -ffffff4f -deadbeef -ffffff9f -deadbeef -ffffffbf -deadbeef -ffffff7f -deadbeef -00000000 -deadbeef -00000000 -deadbeef diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/rev8-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/rev8-01.reference_output deleted file mode 100644 index 581800011..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/rev8-01.reference_output +++ /dev/null @@ -1,520 +0,0 @@ -ffffffff -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -01000000 -deadbeef -02000000 -deadbeef -04000000 -deadbeef -0b000000 -deadbeef -11000000 -deadbeef -28000000 -deadbeef -5c000000 -deadbeef -8f000000 -deadbeef -74010000 -deadbeef -eb030000 -deadbeef -a5070000 -deadbeef -f50f0000 -deadbeef -121f0000 -deadbeef -ee210000 -deadbeef -26520000 -deadbeef -38d60000 -deadbeef -372c0100 -deadbeef -697e0200 -deadbeef -b7930600 -deadbeef -94200c00 -deadbeef -46ad1b00 -deadbeef -69343800 -deadbeef -4fb46600 -deadbeef -5375b800 -deadbeef -9d3e3401 -deadbeef -5180ec02 -deadbeef -bfbf4406 -deadbeef -34deff0c -deadbeef -24d0e51c -deadbeef -55e68137 -deadbeef -0a053c5a -deadbeef -9ebe6efb -deadbeef -d0f0ed38 -deadbeef -77eb4592 -deadbeef -1d1065de -deadbeef -c64325e9 -deadbeef -2fc4aef4 -deadbeef -65ed04f8 -deadbeef -4843ccfd -deadbeef -baf380fe -deadbeef -8c136dff -deadbeef -3caa96ff -deadbeef -3c62c2ff -deadbeef -be15ebff -deadbeef -845ef3ff -deadbeef -a60afaff -deadbeef -d980fdff -deadbeef -aef9feff -deadbeef -021bffff -deadbeef -a1b3ffff -deadbeef -ccdbffff -deadbeef -b4ecffff -deadbeef -8ef1ffff -deadbeef -b5faffff -deadbeef -44fdffff -deadbeef -fdfeffff -deadbeef -31ffffff -deadbeef -8dffffff -deadbeef -dfffffff -deadbeef -e3ffffff -deadbeef -f3ffffff -deadbeef -f8ffffff -deadbeef -fcffffff -deadbeef -feffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -782ccd4f -deadbeef -43708fa6 -deadbeef -6fb34d9f -deadbeef -aa242a4f -deadbeef -68f2a828 -deadbeef -a208c09a -deadbeef -e3323e0b -deadbeef -85c4af40 -deadbeef -484d25a8 -deadbeef -a6bd5933 -deadbeef -5f1fb355 -deadbeef -1e8a6890 -deadbeef -97e02907 -deadbeef -ac0d50aa -deadbeef -00c46dc1 -deadbeef -1b97d268 -deadbeef -af422278 -deadbeef -464fb1d8 -deadbeef -1b9d2dba -deadbeef -66015948 -deadbeef -23d48e8e -deadbeef -885f5483 -deadbeef -927fa18d -deadbeef -5cd346e6 -deadbeef -0a6d80bf -deadbeef -adcc40bf -deadbeef -eb18badb -deadbeef -7fa7a5cd -deadbeef -ff66a651 -deadbeef -e2acf5b8 -deadbeef -aec8491c -deadbeef -9569520f -deadbeef -ff8f4454 -deadbeef -c6571472 -deadbeef -24a78a86 -deadbeef -e895b277 -deadbeef -1063a59d -deadbeef -602316f5 -deadbeef -c0cd7ea8 -deadbeef -80f75f9c -deadbeef -008dbe30 -deadbeef -007ebd2b -deadbeef -00c47fed -deadbeef -00e868a1 -deadbeef -00901116 -deadbeef -00a021fe -deadbeef -00c0eee9 -deadbeef -0080ba9d -deadbeef -0000e1ac -deadbeef -0000d616 -deadbeef -0000f414 -deadbeef -0000b802 -deadbeef -0000f064 -deadbeef -00002041 -deadbeef -0000c029 -deadbeef -0000802a -deadbeef -0000005f -deadbeef -000000c2 -deadbeef -0000009c -deadbeef -000000c8 -deadbeef -00000070 -deadbeef -00000060 -deadbeef -00000040 -deadbeef -00000080 -deadbeef -b4f52943 -deadbeef -7920e2e0 -deadbeef -624a6f74 -deadbeef -7ceb67e6 -deadbeef -5680cc81 -deadbeef -7617428e -deadbeef -4f398875 -deadbeef -73ad60ef -deadbeef -54690bd6 -deadbeef -18dd1457 -deadbeef -63110010 -deadbeef -3817d0c8 -deadbeef -99f7181a -deadbeef -fa93d7a5 -deadbeef -896c1a30 -deadbeef -648a6f1c -deadbeef -5b97a1aa -deadbeef -1149c6f3 -deadbeef -15d651f6 -deadbeef -8be6cadc -deadbeef -fe8416c4 -deadbeef -90ce17b9 -deadbeef -968d3b03 -deadbeef -9cd615dc -deadbeef -14d0887f -deadbeef -1b28ab6e -deadbeef -a9254b1a -deadbeef -08c5ae9a -deadbeef -f6f99d19 -deadbeef -315118cd -deadbeef -0a5ea486 -deadbeef -a70f0cfe -deadbeef -baddedf3 -deadbeef -b111a208 -deadbeef -0ba7618a -deadbeef -47326040 -deadbeef -8f904310 -deadbeef -df2a55c4 -deadbeef -bf403f89 -deadbeef -7f944b05 -deadbeef -fffef67a -deadbeef -ff89208b -deadbeef -ff53dbd0 -deadbeef -ff77432d -deadbeef -ff2f79fa -deadbeef -ff5f4777 -deadbeef -ff3ffe70 -deadbeef -ff7f2c08 -deadbeef -ffff7650 -deadbeef -ffffcd54 -deadbeef -ffffc321 -deadbeef -ffff37b8 -deadbeef -ffffcf0f -deadbeef -ffffdfc8 -deadbeef -ffff3f8c -deadbeef -ffff7f22 -deadbeef -ffffff1a -deadbeef -ffffff0d -deadbeef -ffffff63 -deadbeef -ffffff17 -deadbeef -ffffff4f -deadbeef -ffffff9f -deadbeef -ffffffbf -deadbeef -ffffff7f -deadbeef -00000000 -deadbeef -00000000 -deadbeef diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/rev8.w-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/rev8.w-01.reference_output deleted file mode 100644 index 581800011..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/rev8.w-01.reference_output +++ /dev/null @@ -1,520 +0,0 @@ -ffffffff -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -01000000 -deadbeef -02000000 -deadbeef -04000000 -deadbeef -0b000000 -deadbeef -11000000 -deadbeef -28000000 -deadbeef -5c000000 -deadbeef -8f000000 -deadbeef -74010000 -deadbeef -eb030000 -deadbeef -a5070000 -deadbeef -f50f0000 -deadbeef -121f0000 -deadbeef -ee210000 -deadbeef -26520000 -deadbeef -38d60000 -deadbeef -372c0100 -deadbeef -697e0200 -deadbeef -b7930600 -deadbeef -94200c00 -deadbeef -46ad1b00 -deadbeef -69343800 -deadbeef -4fb46600 -deadbeef -5375b800 -deadbeef -9d3e3401 -deadbeef -5180ec02 -deadbeef -bfbf4406 -deadbeef -34deff0c -deadbeef -24d0e51c -deadbeef -55e68137 -deadbeef -0a053c5a -deadbeef -9ebe6efb -deadbeef -d0f0ed38 -deadbeef -77eb4592 -deadbeef -1d1065de -deadbeef -c64325e9 -deadbeef -2fc4aef4 -deadbeef -65ed04f8 -deadbeef -4843ccfd -deadbeef -baf380fe -deadbeef -8c136dff -deadbeef -3caa96ff -deadbeef -3c62c2ff -deadbeef -be15ebff -deadbeef -845ef3ff -deadbeef -a60afaff -deadbeef -d980fdff -deadbeef -aef9feff -deadbeef -021bffff -deadbeef -a1b3ffff -deadbeef -ccdbffff -deadbeef -b4ecffff -deadbeef -8ef1ffff -deadbeef -b5faffff -deadbeef -44fdffff -deadbeef -fdfeffff -deadbeef -31ffffff -deadbeef -8dffffff -deadbeef -dfffffff -deadbeef -e3ffffff -deadbeef -f3ffffff -deadbeef -f8ffffff -deadbeef -fcffffff -deadbeef -feffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -782ccd4f -deadbeef -43708fa6 -deadbeef -6fb34d9f -deadbeef -aa242a4f -deadbeef -68f2a828 -deadbeef -a208c09a -deadbeef -e3323e0b -deadbeef -85c4af40 -deadbeef -484d25a8 -deadbeef -a6bd5933 -deadbeef -5f1fb355 -deadbeef -1e8a6890 -deadbeef -97e02907 -deadbeef -ac0d50aa -deadbeef -00c46dc1 -deadbeef -1b97d268 -deadbeef -af422278 -deadbeef -464fb1d8 -deadbeef -1b9d2dba -deadbeef -66015948 -deadbeef -23d48e8e -deadbeef -885f5483 -deadbeef -927fa18d -deadbeef -5cd346e6 -deadbeef -0a6d80bf -deadbeef -adcc40bf -deadbeef -eb18badb -deadbeef -7fa7a5cd -deadbeef -ff66a651 -deadbeef -e2acf5b8 -deadbeef -aec8491c -deadbeef -9569520f -deadbeef -ff8f4454 -deadbeef -c6571472 -deadbeef -24a78a86 -deadbeef -e895b277 -deadbeef -1063a59d -deadbeef -602316f5 -deadbeef -c0cd7ea8 -deadbeef -80f75f9c -deadbeef -008dbe30 -deadbeef -007ebd2b -deadbeef -00c47fed -deadbeef -00e868a1 -deadbeef -00901116 -deadbeef -00a021fe -deadbeef -00c0eee9 -deadbeef -0080ba9d -deadbeef -0000e1ac -deadbeef -0000d616 -deadbeef -0000f414 -deadbeef -0000b802 -deadbeef -0000f064 -deadbeef -00002041 -deadbeef -0000c029 -deadbeef -0000802a -deadbeef -0000005f -deadbeef -000000c2 -deadbeef -0000009c -deadbeef -000000c8 -deadbeef -00000070 -deadbeef -00000060 -deadbeef -00000040 -deadbeef -00000080 -deadbeef -b4f52943 -deadbeef -7920e2e0 -deadbeef -624a6f74 -deadbeef -7ceb67e6 -deadbeef -5680cc81 -deadbeef -7617428e -deadbeef -4f398875 -deadbeef -73ad60ef -deadbeef -54690bd6 -deadbeef -18dd1457 -deadbeef -63110010 -deadbeef -3817d0c8 -deadbeef -99f7181a -deadbeef -fa93d7a5 -deadbeef -896c1a30 -deadbeef -648a6f1c -deadbeef -5b97a1aa -deadbeef -1149c6f3 -deadbeef -15d651f6 -deadbeef -8be6cadc -deadbeef -fe8416c4 -deadbeef -90ce17b9 -deadbeef -968d3b03 -deadbeef -9cd615dc -deadbeef -14d0887f -deadbeef -1b28ab6e -deadbeef -a9254b1a -deadbeef -08c5ae9a -deadbeef -f6f99d19 -deadbeef -315118cd -deadbeef -0a5ea486 -deadbeef -a70f0cfe -deadbeef -baddedf3 -deadbeef -b111a208 -deadbeef -0ba7618a -deadbeef -47326040 -deadbeef -8f904310 -deadbeef -df2a55c4 -deadbeef -bf403f89 -deadbeef -7f944b05 -deadbeef -fffef67a -deadbeef -ff89208b -deadbeef -ff53dbd0 -deadbeef -ff77432d -deadbeef -ff2f79fa -deadbeef -ff5f4777 -deadbeef -ff3ffe70 -deadbeef -ff7f2c08 -deadbeef -ffff7650 -deadbeef -ffffcd54 -deadbeef -ffffc321 -deadbeef -ffff37b8 -deadbeef -ffffcf0f -deadbeef -ffffdfc8 -deadbeef -ffff3f8c -deadbeef -ffff7f22 -deadbeef -ffffff1a -deadbeef -ffffff0d -deadbeef -ffffff63 -deadbeef -ffffff17 -deadbeef -ffffff4f -deadbeef -ffffff9f -deadbeef -ffffffbf -deadbeef -ffffff7f -deadbeef -00000000 -deadbeef -00000000 -deadbeef diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/rol-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/rol-01.reference_output deleted file mode 100644 index 62d256c9d..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/rol-01.reference_output +++ /dev/null @@ -1,1052 +0,0 @@ -ffffffff -ffffffff -ae106045 -ba2c7dd5 -c38671b6 -6f061d6d -2af42d39 -d2eeeb1c -2502307f -485246bf -392e6fa3 -d50bd94a -80e4d23b -88627494 -cec7313a -2405b307 -00000000 -00000000 -0b815ef0 -de81bcad -83e2ba3a -bf28804a -46e4abd8 -fd8bf412 -242d8cef -063bf2da -d8d8dd47 -811d9484 -c1f36fae -8cb7ed4f -d7704260 -666fafe7 -058160e6 -fdb7038b -d8bca4df -a4e23852 -e812dd49 -718e177d -3d32d01e -42bea775 -2037e34e -e91ede43 -874434d3 -d2039372 -875e9bf5 -e8dec4b7 -17d8a217 -eed7c61c -00000000 -00000000 -0d42ea01 -2466b460 -2de4eb20 -4256f18f -d6308385 -8533dc75 -ab72f99f -ca355a09 -4e7b7359 -22fed7db -d96429c9 -b6de8bcf -c8cdf63e -b9fbd369 -c06209fb -324c464b -644918a7 -70fd0c20 -4f63879f -755cd0bf -1f3c1ad7 -a31e74cf -3bb3e347 -300d9b71 -2bedcfc5 -cb0acb58 -7c496066 -fd5324a4 -a8552f4b -a46ee1f1 -24507198 -4bff93c1 -6656b0e2 -e3ac0343 -9929dfeb -75bd36c7 -ff6036ed -ea894c29 -93c22130 -46b7549d -a1c1c528 -7e107814 -408b97cd -57e9f6c2 -aa8dc392 -f3c9fbed -5c962250 -1078e539 -7c2890b1 -57b0d4c1 -56f646e8 -9812a134 -5710b7ae -d367d9f1 -3a810bd9 -1f8b62c2 -22feb755 -ab4a4d5c -fcd220d7 -5cbaf664 -8b082833 -d497855d -072f6ac9 -97db1001 -0e724556 -d63ef4de -3b50c99d -1baf44cf -d6cbf3ae -eab762a9 -9b90f7ca -f66fa51d -97d6aeb5 -22fccbd2 -6763735e -07da53e6 -a4b1d37e -977a061b -29b21ce0 -c065bc30 -73f89128 -edcdc668 -00000000 -00000000 -00000000 -00100000 -00000000 -00008000 -00000000 -00001000 -00000000 -00001a00 -00000000 -00000b00 -000001f8 -00000000 -00000000 -00000210 -dc000000 -00000001 -32c00000 -00000000 -00000000 -23600000 -000002b7 -00000000 -00000ad6 -00000000 -e0000000 -0000011c -00000000 -00006a88 -00000126 -40000000 -00000000 -66aa8000 -000001fa -85000000 -45200000 -00000047 -00000000 -0009b850 -00000502 -2c000000 -c0000000 -000743d7 -10000000 -00036ea4 -00000001 -d61e0000 -0000001b -a415c000 -28000000 -0002e84d -8e145180 -00000001 -00000000 -baa4f320 -0000005c -106a3000 -6173f100 -00000004 -358201f0 -00000002 -47691a00 -0000002d -000001f5 -7e14f600 -621f8000 -000011b6 -968f8000 -000090dc -0000183a -67439800 -af48f000 -0000f547 -000124a9 -409b3000 -00adf580 -64ec0000 -00003b5c -46aec000 -0058ffce -b0458000 -7fb80000 -0179fafe -14162000 -007de7bb -0e9fd4b6 -3c220000 -70000042 -dc43547b -ed4764dd -0cc80000 -b0f5ab96 -fc000051 -56f3eef3 -000052a2 -925c46cb -d3570000 -68ff3000 -035cb13f -9a29f38e -80003a55 -009c9d5a -527952a0 -9002ae8e -74980015 -002b8e7b -58f8c07a -2787590d -5801aff1 -d9dff9ef -0b3d000c -1e1304b4 -80d7e1a0 -81e46000 -55569143 -5d295544 -0532e2cc -6ea4760d -d826641f -82cc710f -0f1c6b03 -967e1787 -aa5e4262 -25b37c68 -7b97c2c5 -ffcdfc8a -89ec0b1e -fa26e6d3 -53cbebb6 -cefec3a0 -2aad38dc -db7e4151 -ec97379b -cefc0838 -101220e8 -d18242be -9d769c51 -1d7701b4 -52c1c114 -d07d3512 -4b1d5aeb -3a07011e -8b037c66 -eff263d2 -c094a538 -d7b4c529 -4e54cd67 -d97f27e1 -0220752b -708721ea -3622b5fe -48a556c0 -3256c66a -7440985d -3abf2914 -8574aaab -e32c9556 -05b95dc8 -bfd8d634 -981e50e8 -0370eeb3 -c1965d7f -dc7b3527 -864ce481 -6439c79b -1f056c3a -b35270fc -36eaa65a -3339b31e -0fc49e81 -3ef3fa13 -b6b273d6 -f8bee18e -98b0d808 -0db03d46 -b7d878e0 -02778311 -d0e816a6 -c29f693f -35f03aa9 -75cd29cc -6d85dd1c -e8c1c045 -ae889cd2 -0ffc9a65 -3d226456 -9dde40e7 -49aa3f24 -45c4c000 -4ca48165 -0d5afff2 -a7173a23 -8cd2afd4 -fb8c90bc -e0541ec0 -0ad01990 -94913463 -5b99b206 -1b1b87e6 -b576f23b -74105d07 -b696dcf1 -a70552b0 -5ffdb62e -164d5526 -93d80951 -8e4039e7 -0a53eec1 -e608fb87 -17b553b8 -064ee1f6 -8890aa66 -46fc0546 -fcb757fd -702a3a70 -c7dffcdd -25b57055 -12a97dfc -c425157c -07ccec5e -0a3aebb6 -5b4647e7 -394ec7e9 -89f2e7b5 -e203f154 -a3e6b9f6 -ab4bf5ea -c1b25384 -b4f9aed1 -6848b8a1 -491850ad -3b213b84 -f02bbbb6 -100bb6df -5cf430e4 -4b9c5fdc -8be2ed47 -2c21cc85 -dc446810 -92fd8b5a -774758d8 -deca284e -01a0f511 -ff0c1e82 -36ae1438 -1c377caa -4dd7200f -813a4235 -c920dbf6 -0c062eda -9f30809a -20f2d2ef -1ce44760 -93addfc0 -533e7288 -d72fee5d -925b5b38 -d87ca5d9 -b6d722a3 -6958cb80 -05a3bc90 -69764fea -6b436698 -4296c634 -79ef7885 -4f657bb4 -85dd354e -22ad510e -f9e502b5 -f8008b0b -bfbff17f -d093d8c4 -620fab4f -5fedccfd -65fd3425 -917fc22c -7ba59fe8 -cf7fd9f7 -f29dd3bd -8c39ffe1 -89702075 -7ff9f440 -f9829191 -dfff9e3f -fd55a76a -0ff4ee32 -e8617ffc -7ffe1aaa -e968becf -b1e3fffc -5d21b3bf -ff918e82 -c64e817f -3d72ff5b -c7fffe30 -1807ffff -6fcecd3c -fffd0e67 -b0a9615f -bffffdea -6b029c5b -050eb197 -9b7ffffc -ffffc63f -2e27c97f -bbfffffe -6dea93ef -3310afff -fff59dde -05e8c5f9 -5ffffffe -306b41a4 -7fffffe3 -ffffffec -6d4ebc72 -cfffffff -280088db -a1ffffff -f4a18738 -fffffffe -e965a01f -ffffffc6 -1b1fbf7f -759f8edf -ffffffe1 -b2e5b05e -ffffffff -c5cfffff -fffe9014 -7b427fff -fffff3e8 -ffffb661 -87b7ffff -ffffffff -c95e13d7 -fffffff2 -7b23dbff -a2037fff -ffffffd5 -ffffffff -ff40fee7 -eee8bfff -ffffffff -84481fff -fffffffb -fffff497 -c4ffffff -bfffffff -fffcc580 -fffffdd2 -50ffffff -ffff7f10 -3fffffff -ffffffff -fffc53bf -fffffb51 -1fffffff -ffffffff -fc9127ff -fffffdb2 -6fffffff -ffffffff -edc4ffff -fffcc73f -ffffffff -ffff215f -ffffffff -fffff433 -ffffffff -ff0affff -ffffffff -ffffffff -59ffffff -6dffffff -ffffffff -ffffffff -ffceffff -ffffffff -ffff67ff -ff2fffff -ffffffff -fffffeff -ffffffff -ffffbfff -ffffffff -ffffefff -ffffffff -ffffffff -ffffffff -ba04e024 -f19b3167 -34d6b7a4 -352ac375 -932d823f -fae6f67d -990da560 -3fece14a -0d12b3d8 -acd26414 -f7f9615c -e2f4ccd3 -944d3b84 -627805ec -3fa4298b -d40c7e2e -e60e906e -803472c3 -0843b361 -586589b5 -42847dd9 -5fc222fb -93100fc9 -a5932b5d -57c9ad8e -8b131f3c -d42b6086 -727429db -5ac51cc8 -6e19ce13 -c821ff0e -a755e76e -b94f0dd1 -d92912d2 -e51b186f -06188472 -10143a3c -cd7ec232 -eb695499 -79ee2aa0 -8cc8b2e7 -3da5abf4 -9aef6d25 -9b4365c5 -4f09a6eb -e2396435 -c973ae10 -b3455513 -b8ff605b -efcf4684 -3c9f0695 -d6152992 -2af6a3e6 -8cc81f27 -ef1020e0 -19da3829 -3fcd3c3c -7636f542 -dbbe2d21 -43ee84dc -1ce2bbfc -ab1f8143 -96658b96 -0d76d539 -2d2248a8 -dca56662 -dbf42364 -783d234b -671b61fe -cb60ec6b -2f0afd05 -d54cb2fa -59e2e5be -56b66ec9 -534cd79f -e0c5f866 -92290407 -9562b7aa -f233bb7e -9a227598 -b77e1f6d -34ed47cd -e52d3efe -cbaa9a66 -3d471a1e -731f8103 -6c199c2a -bcbef1fe -d4fee602 -47efa44f -756443d5 -73516217 -f0bd8048 -83303ee6 -fcdec4aa -f35a6be1 -576c2a61 -2b361303 -8026df81 -b40f6c52 -beea93b6 -fca71067 -2efa342b -15167cd6 -2dee2c68 -3b269772 -cecd1cfd -47fede8e -2615f54f -90fc6eb9 -44aac428 -38da2c6a -e4b73664 -afbb5cff -065b1708 -a30352bb -0feedb4f -a1e4250b -d062feec -1e68bb45 -b79215e7 -5d54627e -111f5fb1 -d849e2ba -a329344a -219ce086 -cf74f090 -e8dfcb72 -caa0a141 -9064dbd9 -9ddea13b -cfb4407b -86030130 -961eeac3 -59f9872c -8ce2241c -bbc6d302 -16749950 -812d8497 -83421ada -eb019c83 -1508b71c -7140b546 -fff85653 -05d9c02a -a82e99b8 -17188029 -d1a92a9e -4aa17350 -05a62962 -eefa8bf1 -c1801307 -567b2e67 -b7534800 -f90006e3 -1ec264aa -4240019a -401c3185 -35e3be80 -0159eddd -03dba000 -37888291 -00078d93 -088da5b0 -29000067 -6692a383 -29800008 -e7568473 -ce00001f -a08bcce7 -07a9d800 -00307eec -c7ecf052 -8400000d -01bfc000 -00be9e63 -0000012b -a82cb2ce -36eba200 -00000aa2 -ba9d8400 -00012920 -90ce0ed8 -00000143 -bfbd7d15 -00000015 -8ea92000 -0001c8f7 -05d78000 -0000c74f -d287e000 -00004963 -2d7751a4 -40000000 -e84207e0 -00000005 -a0000000 -02df542c -0000001d -409bf500 -001891dd -3d000000 -f8670e00 -0000000b -8f5ac000 -00000038 -7d000000 -0000a376 -61000000 -00011e7a -0000000c -793f6000 -00000001 -cd802000 -00000003 -4106a000 -000d41d9 -80000000 -c0000000 -00026687 -00000003 -80578000 -00000005 -e2ca0000 -0002de7e -00000000 -0f000000 -000000b8 -026d5000 -00000000 -00000000 -89080000 -00006aac -00000000 -20000000 -000000a1 -032d8000 -00000000 -00000000 -0000ff40 -00000000 -00064400 -00000000 -00550000 -00001e40 -00000000 -00000026 -00000000 -0000a000 -00000000 -000f0000 -00000000 -00000001 -c0000000 -00100000 -00000000 -00000000 -00040000 -00000000 -00000000 -aa01e126 -2bb9daa6 -3c054a3b -0d6476c4 -1d5d8cac -449d2e95 -2f7f3059 -43cc349a -262d69f3 -2e661d4c -e6bf7dc5 -dcdde71c -773a5e0a -b836c07f -febbed6d -64ee462d -412da702 -82f24dee -adc58065 -b0499111 -89eb74f8 -bbc97639 -36987e18 -c9a5010b -ac79fc27 -0da5f55f -7a89f732 -8f822083 -cc25f5eb -d1ce6eb1 -c7c6c668 -48bf6acd -53d8eb73 -6ecaa730 -f4279ee9 -737825d0 -38816eb0 -130e2f85 -a0e39014 -0480fc4d -4a3ddd9e -0e7fe76b -9b616b80 -d93a3b2b -e23596da -cf671675 -6e09ccd8 -05766e24 -b813c16d -144e544a -f7b19e49 -c4a1ce80 -97d9fc51 -ac248298 -f32b5017 -550d1c75 -53f9120f -f9572398 -266a11ad -24165f1a -ebd12807 -1e66c0ad -a00e15d5 -2c65c7b7 -ec542468 -e22836cf -cb88f1de -5bf552f2 -0a3e0e2a -b513ad59 -0b3074e0 -1fd79477 -6bea9987 -5bad195a -789a42dd -d506730c -e67e4d01 -58e4c453 -f72de0e1 -b306105c -ec150132 -a717606a -635ca4c6 -dc479be2 -fa311d81 -ec313bc1 -1998bafe -552c60d0 -a919eef8 -0c837dca -5a2f34ca -a3f37355 -86cf995b -2e2de59c -0e921e4e -0fad3c2c -22f1ea6e -93d93268 -51bda644 -1cdb5d77 -22b97078 -01f4aa04 -da6c2b9b -0266f133 -4d6f02fb -eeee6391 -70f33b84 -f9b640db -9adf5d60 -af2ee97d -6a29e6f9 -52ee0500 -65949f5e -f3526ae5 -5eccdda4 -c00d4845 -7d5d5658 -6a60d1f7 -66b1fe36 -18c94d55 -41f7886e -3eb9c1f7 -df0c1955 -b2c8154e -3596f5f8 -91694bd3 -328441cf -7753b136 -6e0bd737 -77b3b883 -150b56ac -e6272e38 -5d82a4e9 -0baef937 -ed9157be -e56df45d -83e25f51 -bee10f4c -d9e622a1 -233e3995 -ab2993a9 -1ed6c94f -4ec6f18c -fc6f9f6b -f6fe11d3 -83484641 -7f86ceb0 -097488bb -1042d678 -affbe66b -d55c3e71 -537fe8f9 -d6f1992c -a3dccdff -b919fffb -797e3dc5 -9fff47a9 -f476c675 -03daebd1 -fffa22c1 -1f78491f -ffd677d4 -e126ffff -cb75570d -3e01cfff -fae62c5b -91ad3f7e -0ffffe3a -10456c17 -ffff9071 -acab94bb -0097ffff -e3356cc4 -fffff9e2 -a17fffff -88ff8f8d -6113a4ff -fffe96fc -de3fffff -e7f30b53 -3ecdefb2 -7fffffe9 -c3adbfff -fff8a17a -fffffa5b -dce2417f -ff1afe08 -a14fffff -deac909f -fffffffd -a56fffff -ffda6478 -54ffffff -ffae7a4f -fffff756 -97302fff -7fffffff -caae8e74 -f7c1061f -fffffffa -fffc08d5 -6c3fffff -826b4bff -ffffffe2 -ffffff74 -34d97fff -ff27a40c -ffffffff -ffffe238 -b6bfffff -ffffffbe -c0c07fff -e3ffffff -fffff832 -ffffff1d -f373ffff -ffffe227 -46ffffff -9fffffff -ffff2059 -b1bfffff -fffffef8 -fff87345 -ffffffff -fffed06b -ffffffff -ff5ea2ff -ffffffff -23ffffff -ffffffc3 -823fffff -fffffffc -fffffff6 -dcffffff -fffffeae -dfffffff -ffffffff -fffeb7ff -ffffffff -f5ffffff -ff727fff -ffffffff -ffffffff -fffffc47 -fffffe2f -ffffffff -ffffffe6 -ffffffff -fffc1fff -ffffffff -ffffffff -fffff5ff -ffffffff -fffffeff -ffffffe7 -ffffffff -fffffff7 -ffffffff -ffffffff -ffffffff -5ae10604 -5ba2c7dd -cec7313a -2405b307 -5d003e38 -b1410cba -87f996d6 -4eab740b -00000000 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/rolw-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/rolw-01.reference_output deleted file mode 100644 index f796fc875..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/rolw-01.reference_output +++ /dev/null @@ -1,1052 +0,0 @@ -ffffffff -ffffffff -ae106045 -ffffffff -c38671b6 -ffffffff -2af42d39 -00000000 -2502307f -00000000 -392e6fa3 -00000000 -80e4d23b -ffffffff -cec7313a -ffffffff -5d003e38 -00000000 -0b815ef0 -00000000 -83e2ba3a -ffffffff -00000000 -00000000 -242d8cef -00000000 -d8d8dd47 -ffffffff -c1f36fae -ffffffff -d7704260 -ffffffff -058160e6 -00000000 -d8bca4df -ffffffff -e812dd49 -ffffffff -3d32d01e -00000000 -2037e34e -00000000 -874434d3 -ffffffff -875e9bf5 -ffffffff -00000000 -00000000 -87f996d6 -ffffffff -0d42ea01 -00000000 -2de4eb20 -00000000 -d6308385 -ffffffff -ab72f99f -ffffffff -4e7b7359 -00000000 -d96429c9 -ffffffff -c8cdf63e -ffffffff -c06209fb -ffffffff -644918a7 -00000000 -4f63879f -00000000 -1f3c1ad7 -00000000 -3bb3e347 -00000000 -2bedcfc5 -00000000 -7c496066 -00000000 -a8552f4b -ffffffff -24507198 -00000000 -6656b0e2 -00000000 -9929dfeb -ffffffff -ff6036ed -ffffffff -93c22130 -ffffffff -a1c1c528 -ffffffff -408b97cd -00000000 -aa8dc392 -ffffffff -5c962250 -00000000 -7c2890b1 -00000000 -56f646e8 -00000000 -5710b7ae -00000000 -3a810bd9 -00000000 -22feb755 -00000000 -fcd220d7 -ffffffff -8b082833 -ffffffff -072f6ac9 -00000000 -0e724556 -00000000 -3b50c99d -00000000 -d6cbf3ae -ffffffff -f66fa51d -ffffffff -22fcaeb5 -00000000 -0763735e -00000000 -94b1d37e -ffffffff -0065bc30 -00000000 -edcdd128 -ffffffff -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00008000 -00000000 -00018000 -00000000 -00001800 -00000000 -0000f000 -00000000 -00013000 -00000000 -00ec0000 -00000000 -000ec000 -00000000 -00458000 -00000000 -0fb80000 -00000000 -00162000 -00000000 -0c220000 -00000000 -7000007b -00000000 -0cc80000 -00000000 -fc000096 -ffffffff -00006ef3 -00000000 -d3570000 -ffffffff -08ff3000 -00000000 -8001f38e -ffffffff -007952a0 -00000000 -7498000e -00000000 -0038c07a -00000000 -5801590d -00000000 -0b3d006f -00000000 -00d7e1a0 -00000000 -81e46003 -ffffffff -0d295544 -00000000 -d826640d -ffffffff -0f1c6b0f -00000000 -aa5e4787 -ffffffff -25b37c69 -00000000 -ffcc0b1e -ffffffff -fbcbebb6 -ffffffff -2aad38dc -00000000 -ec973791 -ffffffff -cefc08e8 -ffffffff -9d769c3e -ffffffff -1d774114 -00000000 -cb1d5aeb -ffffffff -ba07011e -ffffffff -eff263d2 -ffffffff -57b4c529 -00000000 -597f27e1 -00000000 -708721ea -00000000 -48a556c0 -00000000 -7440985d -00000000 -8574aaab -ffffffff -85b95dc8 -ffffffff -181e50e8 -00000000 -c1965d7f -ffffffff -064ce481 -00000000 -9f056c3a -ffffffff -36eaa65a -00000000 -0fc49e81 -00000000 -b6b273d6 -ffffffff -18b0d808 -00000000 -37d878e0 -00000000 -d0e816a6 -ffffffff -35f03aa9 -00000000 -ed85dd1c -ffffffff -2e889cd2 -00000000 -bd226456 -ffffffff -49aa3f24 -00000000 -4ca48165 -00000000 -a7173a23 -ffffffff -fb8c90bc -ffffffff -8ad01990 -ffffffff -5b99b206 -00000000 -3576f23b -00000000 -b696dcf1 -ffffffff -5ffdb62e -00000000 -93d80951 -ffffffff -8a53eec1 -ffffffff -17b553b8 -00000000 -0890aa66 -00000000 -7cb757fd -00000000 -47dffcdd -00000000 -92a97dfc -ffffffff -07ccec5e -00000000 -5b4647e7 -00000000 -89f2e7b5 -ffffffff -a3e6b9f6 -ffffffff -c1b25384 -ffffffff -6848b8a1 -00000000 -bb213b84 -ffffffff -100bb6df -00000000 -cb9c5fdc -ffffffff -ac21cc85 -ffffffff -12fd8b5a -00000000 -5eca284e -00000000 -7f0c1e82 -00000000 -1c377caa -00000000 -813a4235 -ffffffff -8c062eda -ffffffff -20f2d2ef -00000000 -13addfc0 -00000000 -d72fee5d -ffffffff -d87ca5d9 -ffffffff -6958cb80 -00000000 -6b4366ea -00000000 -79ef6634 -00000000 -85dd354e -ffffffff -f9ed510e -ffffffff -bfbff17f -ffffffff -e20fab4f -ffffffff -65fdccfd -00000000 -7ba59fec -00000000 -cf7fd3bd -ffffffff -8c39fff5 -ffffffff -7ff29191 -00000000 -ffff9e3f -ffffffff -e8617ffe -ffffffff -7ffebecf -00000000 -b1e3ffff -ffffffff -ffce817f -ffffffff -c7ffff5b -ffffffff -1807fffe -00000000 -fffd615f -ffffffff -bffffc5b -ffffffff -9b7fffff -ffffffff -ffffc97f -ffffffff -bbffffff -ffffffff -fff0afff -ffffffff -5ffffff9 -00000000 -7fffffe4 -00000000 -fffffff2 -ffffffff -cfffffff -ffffffff -f1ffffff -ffffffff -ffffff9f -ffffffff -ffffff7f -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -b99b3167 -ffffffff -34d6a375 -00000000 -fae6f67d -ffffffff -3fcda560 -00000000 -0d126414 -00000000 -e2f4ccdc -ffffffff -624d3b84 -00000000 -3fa429ae -00000000 -8034726e -ffffffff -186589b5 -00000000 -5e847dd9 -00000000 -93132b5d -ffffffff -57c31f3c -00000000 -d42829db -ffffffff -5ac51cc8 -00000000 -a755e76e -ffffffff -b94f0dd2 -ffffffff -c6188472 -ffffffff -cd143a3c -ffffffff -79ee2aa1 -00000000 -3da5abf7 -00000000 -9b4f6d25 -ffffffff -e239642b -ffffffff -c973ad13 -ffffffff -efcf4685 -ffffffff -3c9f0692 -00000000 -8af6a3e6 -ffffffff -ef5a3829 -ffffffff -3fcd3542 -00000000 -43ee2d21 -00000000 -0b1f8143 -00000000 -0d658b96 -00000000 -2d2248a2 -00000000 -f83d234b -ffffffff -cb60edfe -ffffffff -2f0afdfa -00000000 -56b66ec9 -00000000 -e0c5f79f -ffffffff -95610407 -ffffffff -9a33bb7e -ffffffff -b77e07cd -ffffffff -cbaa9afe -ffffffff -3d1f8103 -00000000 -7cbef1fe -00000000 -d4fee603 -ffffffff -75616217 -00000000 -f0bd804e -ffffffff -fcde6be1 -ffffffff -2b362a61 -00000000 -b40edf81 -ffffffff -bca71067 -ffffffff -2e167cd6 -00000000 -3b269772 -00000000 -cefede8e -ffffffff -263c6eb9 -00000000 -44aacc6a -00000000 -afbb5664 -ffffffff -065b170b -00000000 -a1e6db4f -ffffffff -de68bb45 -ffffffff -b792027e -ffffffff -111f5fba -00000000 -a329344e -ffffffff -cf74f090 -ffffffff -caa0a141 -ffffffff -cfb6a13b -ffffffff -861eeac3 -ffffffff -8ce2241c -ffffffff -bbf49950 -ffffffff -836d8497 -ffffffff -eb08b71c -ffffffff -71785653 -00000000 -05d9d9b8 -00000000 -1718aa9e -00000000 -4aa17352 -00000000 -c1fa8bf1 -ffffffff -b7534a67 -ffffffff -f94264aa -ffffffff -425c3185 -00000000 -35e3bedd -00000000 -03dba291 -00000000 -088da5b3 -00000000 -2992a383 -00000000 -29968473 -00000000 -ce8bcce7 -ffffffff -07a9daec -00000000 -85ecf052 -ffffffff -01bfde63 -00000000 -a82cb2ce -ffffffff -36eba202 -00000000 -ba9d8520 -ffffffff -90ce0edb -ffffffff -bfbd7d15 -ffffffff -8ea928f7 -ffffffff -05d7874f -00000000 -d287e963 -ffffffff -4d7751a4 -00000000 -e84207e5 -ffffffff -a2df542c -ffffffff -409bf51d -00000000 -3d1891dd -00000000 -f8670e0b -ffffffff -8f5ac038 -ffffffff -7d00a376 -00000000 -61011e7a -00000000 -793f600c -00000000 -cd802001 -ffffffff -4106a003 -00000000 -800d41d9 -ffffffff -c0026687 -ffffffff -80578003 -ffffffff -e2ca0005 -ffffffff -0002de7e -00000000 -0f0000b8 -00000000 -026d5000 -00000000 -89080000 -ffffffff -00006aac -00000000 -200000a1 -00000000 -032d8000 -00000000 -0000ff40 -00000000 -00064400 -00000000 -00550000 -00000000 -00001e40 -00000000 -00000026 -00000000 -0000a000 -00000000 -000f0000 -00000000 -c0000001 -ffffffff -00100000 -00000000 -00040000 -00000000 -00000000 -00000000 -aa01e126 -ffffffff -0d6476c4 -00000000 -449d2cac -00000000 -2f4c349a -00000000 -2e6d69f3 -00000000 -e6bfe71c -ffffffff -b83a5e0a -ffffffff -feae462d -ffffffff -82f24d02 -ffffffff -b5c58065 -ffffffff -bbeb74f8 -ffffffff -36987f0b -00000000 -0da5f55f -00000000 -7f822083 -00000000 -d1ce6eb1 -ffffffff -c7df6acd -ffffffff -6ed8eb73 -00000000 -f47825d0 -ffffffff -38862f85 -00000000 -a480fc4d -ffffffff -0e7fed9e -00000000 -d93b6b80 -ffffffff -e23596f5 -ffffffff -05766cd8 -00000000 -b813c04a -ffffffff -c4a19e49 -ffffffff -ac248291 -ffffffff -550d1c17 -00000000 -f957120f -ffffffff -266a5f1a -00000000 -ebd0c0ad -ffffffff -a00e15d7 -ffffffff -ec542468 -ffffffff -5b88f1de -00000000 -b5120e2a -ffffffff -0b3074e3 -00000000 -6bea995a -00000000 -d51a42dd -ffffffff -58fe4d01 -00000000 -f706105c -ffffffff -ec15006a -ffffffff -635c9be2 -00000000 -ea311d81 -ffffffff -5518bafe -00000000 -0c837dc8 -00000000 -a3ef34ca -ffffffff -2e2de59b -00000000 -0fad1e4e -00000000 -93f1ea6e -ffffffff -1cdda644 -00000000 -22b92a04 -00000000 -0266f133 -00000000 -eeee6393 -ffffffff -70f33b9b -00000000 -9adf5d6d -ffffffff -6a29e6f8 -00000000 -e5949f5e -ffffffff -c00cdda4 -ffffffff -7d60d1f7 -00000000 -18c97e36 -00000000 -3eb7886e -00000000 -b70c1955 -ffffffff -9596f5f8 -ffffffff -728441cf -00000000 -6e0bd737 -00000000 -f50b56ac -ffffffff -0baef937 -00000000 -e56df45d -ffffffff -bee10f51 -ffffffff -232622a1 -00000000 -1ed6c949 -00000000 -4ec6f18c -00000000 -f6484641 -ffffffff -097488bb -00000000 -a042d678 -ffffffff -535c3e71 -00000000 -a3dccd2c -ffffffff -b919bdc5 -ffffffff -9476c675 -ffffffff -03daebd1 -00000000 -1f784914 -00000000 -e126d70d -ffffffff -3e01cc5b -00000000 -09ad3f7e -00000000 -10456c15 -00000000 -009394bb -00000000 -e3356cc4 -ffffffff -a17f8f8d -ffffffff -6113a4fc -00000000 -de330b53 -ffffffff -7ecdefb2 -00000000 -c3ada17a -ffffffff -dce2415b -ffffffff -a14afe08 -ffffffff -deac909f -ffffffff -a56a6478 -ffffffff -54ee7a4f -00000000 -97302756 -ffffffff -4aae8e74 -00000000 -f7c1061a -ffffffff -6c3c08d5 -00000000 -826b4be2 -ffffffff -34d97f74 -00000000 -ff27a40c -ffffffff -b6bfe238 -ffffffff -c0c07fbe -ffffffff -e3fff832 -ffffffff -f373ff1d -ffffffff -46ffe227 -00000000 -9fff2059 -ffffffff -b1bffef8 -ffffffff -fff87345 -ffffffff -fffed06b -ffffffff -ff5ea2ff -ffffffff -23ffffc3 -00000000 -823ffffc -ffffffff -dcfffff6 -ffffffff -dffffeae -ffffffff -fffeb7ff -ffffffff -f5ffffff -ffffffff -ff727fff -ffffffff -fffffc47 -ffffffff -fffffe2f -ffffffff -ffffffe6 -ffffffff -fffc1fff -ffffffff -fffff5ff -ffffffff -fffffeff -ffffffff -ffffffe7 -ffffffff -fffffff7 -ffffffff -ffffffff -ffffffff -5ae10604 -00000000 -46e4abd8 -00000000 -e812dd49 -ffffffff -17d8a217 -00000000 -00000000 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/ror-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/ror-01.reference_output deleted file mode 100644 index b63dbc46f..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/ror-01.reference_output +++ /dev/null @@ -1,1052 +0,0 @@ -ffffffff -ffffffff -d5ae1060 -45ba2c7d -00000000 -00000000 -2af42d39 -d2eeeb1c -2502307f -485246bf -392e6fa3 -d50bd94a -80e4d23b -88627494 -cec7313a -2405b307 -5d003e38 -b1410cba -0b815ef0 -de81bcad -83e2ba3a -bf28804a -46e4abd8 -fd8bf412 -242d8cef -063bf2da -d8d8dd47 -811d9484 -c1f36fae -8cb7ed4f -d7704260 -666fafe7 -058160e6 -fdb7038b -d8bca4df -a4e23852 -e812dd49 -718e177d -3d32d01e -42bea775 -2037e34e -e91ede43 -00000000 -00000000 -875e9bf5 -e8dec4b7 -17d8a217 -eed7c61c -87f996d6 -4eab740b -0d42ea01 -2466b460 -2de4eb20 -4256f18f -d6308385 -8533dc75 -ab72f99f -ca355a09 -4e7b7359 -22fed7db -d96429c9 -b6de8bcf -c8cdf63e -b9fbd369 -c06209fb -324c464b -644918a7 -70fd0c20 -4f63879f -755cd0bf -1f3c1ad7 -a31e74cf -3bb3e347 -300d9b71 -2bedcfc5 -cb0acb58 -7c496066 -fd5324a4 -a8552f4b -a46ee1f1 -24507198 -4bff93c1 -6656b0e2 -e3ac0343 -9929dfeb -75bd36c7 -ff6036ed -ea894c29 -93c22130 -46b7549d -a1c1c528 -7e107814 -408b97cd -57e9f6c2 -aa8dc392 -f3c9fbed -5c962250 -1078e539 -7c2890b1 -57b0d4c1 -56f646e8 -9812a134 -5710b7ae -d367d9f1 -3a810bd9 -1f8b62c2 -22feb755 -ab4a4d5c -fcd220d7 -5cbaf664 -8b082833 -d497855d -072f6ac9 -97db1001 -0e724556 -d63ef4de -3b50c99d -1baf44cf -d6cbf3ae -eab762a9 -9b90f7ca -f66fa51d -22fccbd2 -97d6aeb5 -735e07da -53e66763 -b1d37e97 -7a061ba4 -9b21ce0c -065bc302 -73719a1c -fe244a3b -00000000 -00000000 -00000400 -00000000 -00002000 -00000000 -00004000 -00000000 -00068000 -00000000 -0002c000 -00000000 -00000000 -007e0000 -00084000 -00000000 -1dc00000 -00000000 -cb000000 -00000000 -00000000 -8d800000 -00000000 -000adc00 -00000000 -0002b580 -0011ce00 -00000000 -00001aa2 -00000000 -00000000 -00004990 -00000001 -9aaa0000 -00000000 -007ea140 -011d1480 -00000000 -00000026 -e1400000 -c0000000 -00005022 -00001d0f -5f000000 -000036ea -41000000 -00000000 -0001d61e -00000000 -01ba415c -000002e8 -4d280000 -63851460 -00000000 -00000000 -baa4f320 -30000000 -005c106a -01185cfc -40000000 -2358201f -00000000 -002d4769 -1a000000 -3d800000 -007d5f85 -000011b6 -621f8000 -00002437 -25a3e000 -74398000 -000183a6 -0000f547 -af48f000 -5026cc00 -0000492a -f58064ec -000000ad -d711abb0 -0000000e -ff3ac116 -00000163 -b8000001 -79fafe7f -800001f7 -9eec5058 -9fd4b63c -2200000e -547b7000 -0042dc43 -ed4764dd -0cc80000 -0051b0f5 -ab96fc00 -00014a89 -5bcfbbcc -925c46cb -d3570000 -3fcc0000 -d72c4fda -a0000e95 -668a7ce3 -9d5a5279 -52a0009c -0056400a -ba39d260 -e7b58f8c -07a002b8 -56006bfc -49e1d643 -0033677f -e7bc2cf4 -84c12d20 -35f86807 -14381e46 -00055569 -29554405 -32e2cc5d -07dba91d -83760999 -0382cc71 -0f0f1c6b -79098a59 -f85e1ea9 -496cdf1a -1ee5f0b1 -a27b02c7 -bff37f22 -9b9b4d4f -2faedbe8 -ccefec3a -02aad38d -e6f6df90 -547b25cd -4883a33b -f020e040 -71474609 -0afa75da -4b070450 -75dc06d1 -41f4d449 -2c756baf -e81c047a -2c0df198 -bfc98f4b -025294e3 -5ed314a5 -3953359f -65fc9f84 -0881d4af -c21c87a8 -d88ad7f9 -22955b00 -c95b19a9 -d1026174 -eafca451 -15d2aaaf -8cb2555a -16e57722 -ff6358d0 -607943a0 -0dc3bace -065975ff -71ecd49f -19339205 -90e71e6e -7c15b0ea -cd49c3f0 -dbaa9968 -cce6cc78 -3f127a04 -fbcfe84c -dac9cf5b -e2fb863a -62c36020 -36c0f51a -df61e380 -09de0c46 -43a05a9b -0a7da4ff -d7c0eaa5 -d734a730 -b6177473 -a3070115 -ba227348 -3ff26996 -f489915a -7779039c -26a8fc91 -17130001 -32920594 -356bffc9 -9c5ce88e -334abf52 -ee3242f3 -81507b03 -2b406642 -5244d18c -6e66c818 -6c6e1f99 -d5dbc8ed -d041741e -da5b73c6 -9c154ac2 -7ff6d8b8 -59355499 -4f602546 -3900e79e -294fbb07 -9823ee1c -5ed54ee0 -193b87d8 -2242a999 -1bf0151a -f2dd5ff5 -c0a8e9c3 -1f7ff374 -96d5c157 -4aa5f7f3 -109455f0 -1f33b178 -28ebaed8 -6d191f9c -e53b1fa5 -27cb9ed7 -880fc552 -8f9ae7da -ad2fd7aa -06c94e12 -d3e6bb47 -a122e285 -246142b5 -ec84ee13 -c0aeeed8 -402edb7d -73d0c390 -2e717f72 -2f8bb51d -b0873217 -7111a040 -4bf62d69 -dd1d6362 -7b28a138 -0683d447 -fc307a08 -dab850e3 -70ddf2a9 -375c803c -04e908d7 -24836fda -3018bb6a -7cc20268 -83cb4bbc -73911d80 -4eb77f01 -4cf9ca22 -5cbfb976 -496d6ce3 -61f29766 -db5c8a8f -06958cb8 -005a3bc9 -9a61a5d9 -3fa9ad0d -7bde2150 -a5b18d1e -93d95eed -21774d53 -43be7940 -ad48ab54 -ff8008b0 -bbfbff17 -093d8c46 -20fab4fd -d65fd342 -55fedccf -fa245ff0 -8b1ee967 -29dd3bdc -f7fd9f7f -81d630e7 -ff8625c0 -40f98291 -917ff9f4 -f9e3ffd5 -5a76adff -c0ff4ee3 -2e8617ff -ba5a2fb3 -dfff86aa -fec78fff -f17486ce -3a0b193a -05fffe46 -ffe303d7 -2ff5bc7f -0601ffff -dbf3b34f -7b0a9615 -ffffd0e6 -29c5bbff -ffdea6b0 -c050eb19 -79b7ffff -cb89f25f -fffff18f -beefffff -f9b7aa4f -fffff59d -de3310af -fe05e8c5 -f95fffff -f8cc1ad0 -691fffff -1cbfffff -fb1b53af -cfffffff -280088db -fffffff4 -a18738a1 -807fffff -fffba596 -bf7fffff -ffc61b1f -f85d67e3 -b7ffffff -cb96c17b -fffffffe -ffffe901 -4c5cffff -fff3e87b -427fffff -1edfffff -fffed986 -fffffffc -95e13d7f -ffffffff -f27b23db -ffd5a203 -7fffffff -fffffffd -03fb9fff -fffbba2f -ffffffff -ee11207f -ffffffff -3fffffff -fffd25f1 -ffffcc58 -0bffffff -ffffffff -fff74943 -3fffffff -ffff7f10 -fffffff1 -4effffff -ffffffff -fffed447 -ffffffc9 -127fffff -ffffffff -ffdb26ff -fffffffb -713fffff -ffffffff -ffffcc73 -ffffffff -ffff215f -ffffffff -fff433ff -bfffffff -ffffffc2 -ffffffff -d67fffff -6dffffff -ffffffff -fffffcef -ffffffff -ffff67ff -ffffffff -ffffffff -ffffff2f -ffffffff -fffbffff -ffffffff -ffffbfff -ffffffff -fffbffff -ffffffff -ffffffff -4e024f19 -b3167ba0 -4ab0dd4d -35ade90d -932d823f -fae6f67d -5603fece -14a990da -62b34990 -50344acf -34fdfe58 -5738bd33 -3b846278 -05ec944d -e2e3fa42 -98bd40c7 -72c3e60e -906e8034 -10ecd856 -19626d42 -47dd95fc -222fb428 -9a5932b5 -d93100fc -8e8b131f -3c57c9ad -6727429d -bd42b608 -5ac51cc8 -6e19ce13 -b2087fc3 -a9d579db -2b94f0dd -1d92912d -51b186f0 -6188472e -e8f335fb -08c84050 -83ada552 -65e7b8aa -d23322cb -9cf696af -4966d0d9 -7166bbdb -4354f09a -6ebe2396 -15544f25 -ceb842cd -2e3fd816 -fbf3d1a1 -648f27c1 -a575854a -f6a3e68c -c81f272a -83806768 -e0a7bc40 -636f5423 -fcd3c3c7 -50fba137 -36ef8b48 -38aeff2a -c7e050c7 -b960d76d -53996658 -6622d224 -8a8dca56 -bf423647 -83d234bd -0ec6b671 -b61fecb6 -b2fa2f0a -fd05d54c -e2e5be56 -b66ec959 -c5f86653 -4cd79fe0 -1e558ade -aa48a410 -edfa6889 -d663c8ce -4ed47cdb -77e1f6d3 -a699b94b -4fbfb2ea -c6879cc7 -e040cf51 -c199c2ab -cbef1fe6 -f53fb980 -91fbe913 -55cd4588 -5dd5910f -9bc2f601 -220cc0fb -f35a6be1 -fcdec4aa -4acd84c0 -d5db0a98 -1b40f6c5 -28026df8 -ea93b6fc -a71067be -342b1516 -7cd62efa -dee2c683 -b2697722 -cfd47fed -e8ececd1 -54f90fc6 -eb92615f -368b1a91 -2ab10a0e -eed73ff9 -2dcd992b -b065b170 -8a30352b -fa1e4250 -b0feedb4 -062feec1 -e68bb45d -55189fad -e48579d7 -ba111f5f -b1d849e2 -1a8ca4d1 -28867382 -b3dd3c24 -3a37f2dc -caa0a141 -9064dbd9 -ef3ed101 -ee777a84 -03013096 -1eeac386 -167e61cb -23388907 -30216749 -950bbc6d -49783421 -ada812d8 -c831508b -71ceb019 -546fff85 -6537140b -0ba66e01 -76700aaa -1a92a9e1 -7188029d -624aa173 -5005a629 -2fc70600 -4c1fbbea -34800567 -b2e67b75 -1b8c7b09 -92abe400 -19a401c3 -18542400 -b774d78e -fa000567 -e220a440 -f6e8000d -c0001e36 -4c223696 -00676692 -a3832900 -008e7568 -47329800 -001fa08b -cce7ce00 -07eec07a -9d800003 -3c14a100 -000371fb -0be9e630 -1bfc0000 -0000012b -a82cb2ce -a236eba2 -0000000a -12920ba9 -d8400000 -0e43383b -60000005 -bfbd7d15 -00000015 -00723de3 -aa480000 -0031d3c1 -75e00000 -001258f4 -a1f80000 -5dd46910 -0000000b -17a1081f -80000000 -0000000b -7d50b280 -d4000000 -0075026f -91dd3d00 -00000018 -000bf867 -0e000000 -0000e23d -6b000000 -0000000a -3767d000 -00000001 -1e7a6100 -3f600000 -00000c79 -02000000 -00001cd8 -06a00000 -00000341 -00350766 -00000000 -00000000 -0026687c -015e0000 -0000000e -78b28000 -00000001 -0000b79f -80000000 -00000000 -00b80f00 -00000009 -b5400000 -08908000 -00000000 -000006aa -c0000000 -00000000 -0000a120 -00000000 -0cb60000 -f4000000 -0000000f -64400000 -00000000 -01540000 -00000000 -00000001 -e4000000 -00000026 -00000000 -00000000 -02800000 -00000000 -000f0000 -0000001c -00000000 -00000000 -00004000 -00004000 -00000000 -00000000 -00000000 -aa01e126 -2bb9daa6 -c054a3b0 -d6476c43 -274ba547 -57632b11 -05943cc3 -49a2f7f3 -f32e661d -4c262d69 -773779c7 -39afdf71 -782ae0db -01fddce9 -d6d64ee4 -62dfebbe -4dee412d -a70282f2 -160196c1 -264446b7 -74f8bbc9 -763989eb -4042cda6 -1f863269 -ac79fc27 -0da5f55f -27dcca3e -08820dea -097d7af4 -739bac73 -9a122fda -b371f1b1 -b736ecaa -73053d8e -9ee97378 -25d0f427 -c04c38be -14e205ba -38e40501 -203f1368 -7fe76b4a -3ddd9e0e -364e8eca -e6d85ae0 -675e2359 -6dacf671 -66e246e0 -9ccd8057 -9512ae04 -f05b4513 -c4a1ce80 -f7b19e49 -9897d9fc -51ac2482 -1c75f32b -5017550d -f9572398 -53f9120f -490597c6 -899a846b -c799b02b -7af44a01 -ede80385 -754b1971 -15091a38 -8a0db3fb -3c7796fd -54bcb2e2 -ad44eb56 -428f838a -70b3074e -01fd7947 -ad195a6b -ea99875b -b775419c -c31e2690 -34056393 -114f99f9 -8386cc18 -4173dcb7 -17606aec -150132a7 -711e6f89 -8d72931b -311d81ec -313bc1fa -afe552c6 -0d01998b -aa919eef -80c837dc -32a8fcdc -d5568bcd -6721b3e6 -56cb8b79 -0fad3c2c -0e921e4e -a9ba4f64 -c9a08bc7 -10736d75 -dd46f699 -07d2a810 -8ae5c1e0 -3da6c2b9 -b0266f13 -4535bc0b -efbbb98e -0db70f33 -b84f9b64 -7d9adf5d -60af2ee9 -01a8a79b -e54bb814 -96527d7b -cd49ab95 -30035211 -57b33769 -6586a60d -1f77d5d5 -63253555 -9ac7f8d8 -6e3eb9c1 -f741f788 -306556cb -20553b7c -96f5f891 -694bd335 -28441cf7 -753b1363 -b82f5cdd -decee20d -42d5ab39 -89cb8e05 -d760a93a -42ebbe4d -9157bee5 -6df45ded -843d320f -897d46fb -a848cf8e -65767988 -4fab2993 -a91ed6c9 -4ec6f18c -fc6f9f6b -11d38348 -4641f6fe -fe1b3ac0 -25d222ed -42d678af -fbe66b10 -f9c54dff -a3e75570 -337ff5bc -664b28f7 -e5f8f716 -e467ffed -ffd1ea7d -1db19d67 -40f6baf4 -7ffe88b0 -f507de12 -47fff59d -b75570de -126ffffc -e62c5b3e -01cffffa -b4fdf83f -fff8ea46 -110456c1 -7ffff907 -ec025fff -feb2ae52 -e3356cc4 -fffff9e2 -ffe23fe3 -e3685fff -96fc6113 -a4fffffe -fff9fcc2 -d4f78fff -ecdefb27 -fffffe93 -fe285eb0 -eb6fffff -17ffffff -a5bdce24 -08a14fff -ffff1afe -7ab2427f -fffffff7 -ffffda64 -78a56fff -fffffae7 -a4f54fff -302fffff -fff75697 -ffffffff -2aba39d1 -febdf041 -87ffffff -355b0fff -ffffff02 -fff8a09a -d2ffffff -365fffff -ffffdd0d -f27a40cf -ffffffff -38b6bfff -ffffffe2 -0301ffff -fffffefb -fffffff8 -32e3ffff -df373fff -fffffff1 -e22746ff -ffffffff -ffffffff -ff20599f -ffffffff -ef8b1bff -fffe1cd1 -7fffffff -fffed06b -ffffffff -ffffff5e -a2ffffff -ffffffff -ff0c8fff -ffffffff -fc823fff -ffdb73ff -ffffffff -ffffabb7 -ffffffff -7fffffff -ffffffeb -ff5fffff -ffffffff -ffffffff -fdc9ffff -7fffffff -ffffffc4 -ffffffe2 -ffffffff -ffffff9b -ffffffff -ffffffff -ff07ffff -f5ffffff -ffffffff -efffffff -ffffffff -ffffffff -9fffffff -ffffffff -dfffffff -ffffffff -ffffffff -5ae10604 -5ba2c7dd -c38671b6 -6f061d6d -3d32d01e -42bea775 -874434d3 -d2039372 -00000000 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/rori-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/rori-01.reference_output deleted file mode 100644 index a5072a9c1..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/rori-01.reference_output +++ /dev/null @@ -1,580 +0,0 @@ -ffffffff -ffffffff -00000000 -00000000 -e9173332 -12af8f73 -1e1007e8 -bf65cc38 -e216dc58 -f45328fa -6a56ae61 -7c67895e -5abadf6f -42825412 -9b077dc6 -2a2fb226 -00000000 -00000000 -20000000 -00000000 -00000000 -0000c000 -00000000 -60000000 -f0000000 -00000000 -00000000 -00000003 -00000044 -00000000 -00000000 -01f00000 -00000000 -00000350 -0000006f -80000000 -00027600 -00000000 -00000000 -f1000000 -c8800000 -00000000 -02490000 -00000000 -005fc200 -00000000 -c0000000 -00001822 -000358c4 -00000000 -2f650000 -00000000 -00000000 -4ab42000 -001160cc -00000000 -00000000 -b93df000 -8adb8000 -00000008 -00038603 -90000000 -5bf00000 -000006ae -00000005 -21c11800 -0b9be488 -00000000 -0001cb57 -4e800000 -80000000 -03c8492e -12dd7d8a -00000000 -0d94a779 -00000000 -35ff31c0 -00000000 -4ad00000 -000459c7 -c86eeec0 -00000002 -00000271 -bfff7200 -c8000000 -1042fff7 -000000c1 -cd196e40 -40ac8040 -000003d7 -00108137 -a60e0000 -c603d000 -0003dac7 -00007add -bad0b300 -0002a96c -e5c0e400 -073dead8 -aa400000 -8c069000 -002de8a8 -000014f7 -a0d7bdb0 -fb00000d -d8ab0bce -400007d1 -d9a21930 -1e554100 -002fc18e -29e7e800 -01f527cf -48a1c0f2 -30000aab -2a4b9ae5 -c000512f -f25bc8d1 -00012790 -a880025c -598ba52a -a51cd1d4 -d2b5000f -4c3405d0 -01d78730 -57394d80 -800a6697 -401d8266 -04c66778 -66388787 -8e358041 -a8f56531 -4b3f201e -eb8053b7 -24fd306d -663c772c -58380369 -a2d78e58 -65570e86 -5009ba09 -6cdf188c -e4544fa3 -fdfd223f -248174e7 -61b339ff -6df44dcd -a6a797d7 -27c3726f -2bf8620b -2c7e01a1 -106b4676 -4ebc734d -b4b62c6d -0111b66f -c1bc0050 -7a3e1aee -1e78394f -aa6d71b0 -c784a098 -8c363f7e -9cddc811 -988c7299 -9610af0c -6becb96c -182ebdd2 -bb09c161 -626ce859 -7c7a4053 -175342f5 -4cf9bd26 -401b225e -8bbb0b94 -b60c943f -b30c3dc9 -08c0acfd -e3b7e4ed -9c8e8ff5 -92bc27a7 -de83047f -a391b604 -c85ff805 -d4beb1bf -fcc7eb77 -d91ef28e -467dffea -7b22fff7 -f1e7f862 -ffd475b5 -b6805da7 -fda04bff -fd5a2038 -fffde12a -faefc0ed -7df40f7f -ffa26cc4 -fda1d651 -387c67ff -fffeee8d -ca40c7ff -a527ffff -17b8b123 -ffee1120 -4d1f11ff -6119ffff -f6ddc74e -f10b9735 -fffff9cd -9160a9ff -ffff264c -9a6c802e -ffffff4b -fff2a824 -81cb3fff -293fffff -fb3a8d61 -febfffff -fcf01bc9 -e20e3d95 -ffffffef -e29d545b -7fffffff -a2a6dfff -ffffdbb6 -ffff6929 -4e7affff -fffc28cb -594fffff -69da8a2d -ffffffff -27003fff -fffff40f -ffffffb2 -b8af97ff -fffffffe -4892dfdf -ffffffff -fef0a5fe -fffffc02 -3bbcffff -ffffffed -c5ae0fff -00ffffff -ffff5dcf -5569ffff -ffffff3c -f6a34fff -fffffffd -07ffffff -ffffe3a7 -f3603dff -ffffffff -ffffffd7 -c047ffff -fff96f6d -ffffffff -f969bbff -ffffffff -ffffffad -44ffffff -ffffffff -ffffb964 -e8e9ffff -ffffffff -ffffffff -fffea0af -fffffeba -5fffffff -ffffff97 -7fffffff -cdffffff -fffffffe -237fffff -ffffffff -fffffee5 -ffffffff -eeffffff -ffffffff -ffffffff -ffffd0ff -ffffffff -93ffffff -ffffffff -e9ffffff -ffffffff -ffffffe3 -ffffffff -fffffe7f -ffffffff -ffffdfff -ffffffff -ffffffff -7e46b2e3 -649e6c7a -d4ec05a3 -def7e905 -210e4338 -3b47f855 -0043e3ef -511b4190 -fab60773 -7a8e81a0 -4ea17b38 -097d6c01 -b869135c -fa285a0d -8e55d12c -7a50fe14 -072621bd -aeea3485 -103f0f59 -5a4ecf42 -19e80319 -1bea8594 -13335f24 -f7406114 -ab3875cc -0401e18b -c39a019e -0d3fd7ee -8253cade -a5755880 -6c6c8b9b -338ec009 -00eeaa0b -d11cea60 -aa006ad3 -2341263d -2e828bbb -a940aa00 -8cfeea8a -bf4f0007 -048c7d40 -002eccd1 -c9ffc240 -00cb01d7 -ce1c0003 -79ce07f0 -00013716 -6adf17a4 -8a425947 -ee20000a -ecfa0000 -18486a46 -72800007 -76009ce1 -00000411 -1b4b8f0e -011102b1 -e4fd8000 -3d5feef1 -6ea00000 -46bcc000 -0041cd7c -3fdda78e -0000002b -28000001 -d9144522 -fd74106a -0000002d -9bbe0000 -000080ee -58470000 -000535a9 -0004fc3b -66fb0000 -00000272 -8a6fd000 -000001ae -9ca08c00 -00000330 -26687c00 -59be5600 -00000008 -0002274e -a1900000 -0000241d -e2ca0000 -454f2000 -000000d2 -dc000000 -000c7d37 -00000000 -00d31f34 -00000000 -bbb98800 -45824000 -00000034 -0001a02f -80000000 -00294b16 -00000000 -0004a346 -c0000000 -90000000 -000044d0 -0000002e -92d80000 -30000000 -00003a2c -fd000000 -00000102 -00000029 -acc00000 -00000000 -00000a47 -00000008 -8a800000 -08000000 -0000008b -00000000 -0006dc80 -60800000 -00000002 -00000072 -00000000 -00000000 -0001d400 -00000000 -a7000000 -00000000 -00079000 -000b0000 -00000000 -00000000 -e8000000 -30000000 -00000000 -00000000 -00000c00 -00000030 -00000000 -00000000 -00000100 -00000000 -00000000 -c7c6d0a3 -52c006ff -673976ad -220146a3 -4a53b9f8 -c2274662 -46413fc4 -8550136f -a104e66e -380a1764 -51545022 -8382f61b -10d836f1 -5fc11426 -9f9e613c -d9deac90 -0c06ed8b -c2af3282 -77dfc2f2 -7a8c8439 -74f49ea9 -2beef078 -2623f478 -2471a0e3 -524901f2 -d2e60247 -557473a3 -f0833873 -ba90bb7f -b5dd7149 -f4619e4b -249fe03b -0a7046ab -61ff912f -d43db43f -ffca96c9 -09ad2fff -5a5a48ca -a63fa4ff -f1a2adb3 -279855b3 -ffe0c1ba -476fffda -6ca22c13 -d2067fff -c0769593 -4047bad7 -fffceb4c -0a4bd153 -ffff21e9 -fffff5b9 -af1fe178 -ffff9fda -b183815f -c7fb0301 -ffffe250 -ffb5472b -3cb0cfff -7ffffec6 -9f0e4291 -dcfffffe -8f54e77c -245bda9b -cffffff8 -6f4930c9 -ffffff85 -33ffffff -ee62ecba -3857e49f -ffffff2e -ffffdaa4 -45957fff -ffffcba5 -5851cfff -bfffffff -375a3c80 -fffff892 -f52087ff -ffffffff -e7dafccc -38e7efff -ffffffdc -38235dff -ffffffa5 -ffffffe1 -09799aff -ffff4e80 -b13fffff -ffffff36 -fd4c5fff -ec71ffff -fffff8a3 -ffffa498 -f3ffffff -ffff90b4 -11ffffff -fff86143 -8fffffff -8c9d0fff -fffffffd -fffffffe -4d576fff -33ffffff -fffff8c6 -fffffbb9 -98ffffff -fe12b0ff -ffffffff -ffffffff -fffbaad7 -47ffffff -fffffc19 -ffffffff -ff90e4ff -ffffca23 -ffffffff -e2a0ffff -ffffffff -ffffffff -ffffcb33 -ffffffff -fd5a7fff -bbffffff -fffffff3 -7fffffff -ffffff02 -ff2affff -ffffffff -ffffffff -ffceffff -ff1fffff -ffffffff -ffffffff -ffffffc9 -ffffffcb -ffffffff -ffffffff -ffff8fff -fffffff7 -ffffffff -ffffffff -7fffffff -61250888 -cadb5bec -00000000 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/roriw-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/roriw-01.reference_output deleted file mode 100644 index 5b6a95ecc..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/roriw-01.reference_output +++ /dev/null @@ -1,572 +0,0 @@ -ffffffff -ffffffff -12af8f73 -00000000 -bf6507e8 -ffffffff -f4532858 -ffffffff -89517c67 -ffffffff -54124282 -00000000 -8bdf718a -ffffffff -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000010 -00000000 -20000000 -00000000 -00000004 -00000000 -00020000 -00000000 -000001c0 -00000000 -01e80000 -00000000 -00000066 -00000000 -00000072 -00000000 -00005480 -00000000 -00d20000 -00000000 -6000007b -00000000 -bec00003 -ffffffff -82000009 -ffffffff -02a82000 -00000000 -0f3f4000 -00000000 -0003c8c0 -00000000 -0035cb80 -00000000 -01e46880 -00000000 -55440009 -00000000 -400134ad -00000000 -03405d00 -00000000 -06536020 -00000000 -de100199 -ffffffff -b000f1c6 -ffffffff -e4062967 -ffffffff -6deb8130 -00000000 -706e58b0 -00000000 -874032ab -ffffffff -8a013741 -ffffffff -f22a27d3 -ffffffff -4902e9ce -00000000 -f5db7de5 -ffffffff -963f00d0 -ffffffff -d8cd36d2 -ffffffff -00111b65 -00000000 -781aee1e -00000000 -a098c784 -ffffffff -8c363f7f -ffffffff -846394cc -ffffffff -0b2e5b06 -00000000 -859bb6ce -ffffffff -bd5f1cd0 -ffffffff -f267cdf2 -ffffffff -943eb60c -ffffffff -567e8460 -00000000 -a3fb6723 -ffffffff -08ffbd06 -00000000 -7fd81321 -00000000 -d2fac6ff -ffffffff -bff9c8cf -ffffffff -9ec8bffc -ffffffff -b4fff80b -ffffffff -f6812fff -ffffffff -76ffffe0 -00000000 -fe81efff -ffffffff -3fffe3e3 -00000000 -7fffe40c -00000000 -a527ffff -ffffffff -7fffffc4 -00000000 -c467ffff -ffffffff -fff9afff -ffffffff -fe54ffff -ffffffff -fff2efff -ffffffff -fffffacf -ffffffff -e4ffffff -ffffffff -f5ffffff -ffffffff -fffd7fff -ffffffff -ffffbfff -ffffffff -ffbfffff -ffffffff -fffffeff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -bdefcb47 -ffffffff -0769c867 -00000000 -5043e3ef -00000000 -bd5b03b9 -ffffffff -4ea17b38 -00000000 -b869135c -ffffffff -87e963d2 -ffffffff -839310de -ffffffff -84207e1e -ffffffff -85941bea -ffffffff -a1af927b -ffffffff -870eb980 -ffffffff -dd8734af -ffffffff -ab1bd4ae -ffffffff -3b2e6cce -00000000 -ea61d11c -ffffffff -63dab412 -00000000 -0abbba94 -00000000 -9ed5157e -ffffffff -82463ea0 -ffffffff -f93ff84a -ffffffff -f0ce1c07 -ffffffff -17a46adf -00000000 -889651fb -ffffffff -8dd9f4d4 -ffffffff -9c2e5013 -ffffffff -1e1c3697 -00000000 -fb0563c9 -ffffffff -abfbbc5b -ffffffff -f88d799a -ffffffff -7fbb4f1c -00000000 -291148a2 -00000000 -fd74106a -ffffffff -74ddf007 -00000000 -52b08e6b -00000000 -fbfc3b66 -ffffffff -fd0728a6 -ffffffff -08cae9ca -00000000 -43f98133 -00000000 -166f9582 -00000000 -6489d3a8 -00000000 -ca241de2 -ffffffff -49153c83 -00000000 -d37dc0c7 -ffffffff -3e6801a6 -00000000 -31001777 -00000000 -688b0480 -00000000 -000d017c -00000000 -00294b16 -00000000 -8009468d -ffffffff -26848002 -00000000 -6c001749 -00000000 -e8b0c000 -ffffffff -102fd000 -00000000 -98000535 -ffffffff -291c0000 -00000000 -50000111 -00000000 -04584000 -00000000 -db900000 -ffffffff -004c1000 -00000000 -000001c8 -00000000 -1d400000 -00000000 -7000000a -00000000 -1e400000 -00000000 -00001600 -00000000 -40000007 -00000000 -00018000 -00000000 -00c00000 -00000000 -0000000c -00000000 -00100000 -00000000 -00000000 -00000000 -cc51a8d9 -ffffffff -529dc312 -00000000 -8c827f9e -ffffffff -50827332 -00000000 -51545023 -00000000 -10d836f0 -00000000 -9213fbd5 -ffffffff -bcb62f0a -ffffffff -2efbf85f -00000000 -e0f057dd -ffffffff -64c47e8c -00000000 -75249004 -00000000 -aaba39d1 -ffffffff -37521769 -00000000 -206792c9 -00000000 -17046ab6 -00000000 -d43db43f -ffffffff -504d6946 -00000000 -3a63fa4b -00000000 -13cc2ad9 -00000000 -04d1d88b -00000000 -4f4819d6 -00000000 -2023dd6a -00000000 -0a4bd153 -00000000 -c2f1de3f -ffffffff -c0af58c1 -ffffffff -c7fb0300 -ffffffff -c31cacf2 -ffffffff -85223e1c -ffffffff -77cdc54e -00000000 -62ded4de -00000000 -6f4930c9 -00000000 -97467c5d -ffffffff -1c2bf24f -00000000 -abf5222c -ffffffff -8e5d2ac2 -ffffffff -79016eb4 -00000000 -042497a9 -00000000 -f3339f6b -ffffffff -871cfdfb -ffffffff -538235da -00000000 -99ae1097 -ffffffff -4fd3a02c -00000000 -317cdbf5 -00000000 -a3ec71f8 -ffffffff -7ff4931e -00000000 -3ff21682 -00000000 -3fe1850e -00000000 -f632743f -ffffffff -5dbff935 -00000000 -18c67fff -00000000 -8fffbb99 -ffffffff -ffc2561f -ffffffff -d56bfffd -ffffffff -e0ca3fff -ffffffff -0e4ffff9 -00000000 -ffffca23 -ffffffff -ffe2a0ff -ffffffff -e599ffff -ffffffff -b4fffffa -ffffffff -ff9ddfff -ffffffff -fe04ffff -ffffffff -ffff2aff -ffffffff -9dffffff -ffffffff -ffff8fff -ffffffff -ffc9ffff -ffffffff -ffffffe5 -ffffffff -fe3fffff -ffffffff -fffffffb -ffffffff -fffffffe -ffffffff -00000000 -00000000 -00000000 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/rorw-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/rorw-01.reference_output deleted file mode 100644 index ddace7061..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/rorw-01.reference_output +++ /dev/null @@ -1,1052 +0,0 @@ -ffffffff -ffffffff -45ae1060 -00000000 -c38671b6 -ffffffff -2af42d39 -00000000 -2502307f -00000000 -392e6fa3 -00000000 -80e4d23b -ffffffff -cec7313a -ffffffff -5d003e38 -00000000 -0b815ef0 -00000000 -83e2ba3a -ffffffff -46e4abd8 -00000000 -242d8cef -00000000 -d8d8dd47 -ffffffff -c1f36fae -ffffffff -d7704260 -ffffffff -00000000 -00000000 -d8bca4df -ffffffff -e812dd49 -ffffffff -3d32d01e -00000000 -2037e34e -00000000 -874434d3 -ffffffff -875e9bf5 -ffffffff -17d8a217 -00000000 -87f996d6 -ffffffff -0d42ea01 -00000000 -2de4eb20 -00000000 -00000000 -00000000 -ab72f99f -ffffffff -4e7b7359 -00000000 -d96429c9 -ffffffff -c8cdf63e -ffffffff -c06209fb -ffffffff -644918a7 -00000000 -4f63879f -00000000 -1f3c1ad7 -00000000 -3bb3e347 -00000000 -2bedcfc5 -00000000 -7c496066 -00000000 -a8552f4b -ffffffff -24507198 -00000000 -6656b0e2 -00000000 -9929dfeb -ffffffff -ff6036ed -ffffffff -93c22130 -ffffffff -a1c1c528 -ffffffff -408b97cd -00000000 -aa8dc392 -ffffffff -5c962250 -00000000 -7c2890b1 -00000000 -56f646e8 -00000000 -5710b7ae -00000000 -3a810bd9 -00000000 -22feb755 -00000000 -fcd220d7 -ffffffff -8b082833 -ffffffff -072f6ac9 -00000000 -0e724556 -00000000 -3b50c99d -00000000 -d6cbf3ae -ffffffff -f66fa51d -ffffffff -22fcaeb5 -00000000 -735e0763 -00000000 -b1d37e94 -ffffffff -065bc300 -00000000 -73744a3b -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00008000 -00000000 -00006000 -00000000 -00018000 -00000000 -0000f000 -00000000 -00004c00 -00000000 -000000ec -00000000 -000003b0 -00000000 -00000116 -00000000 -b800000f -ffffffff -80000058 -ffffffff -2200000c -00000000 -007b7000 -00000000 -0cc80000 -00000000 -0096fc00 -00000000 -0001bbcc -00000000 -d3570000 -ffffffff -3fcc0002 -00000000 -a0007ce3 -ffffffff -52a00079 -00000000 -0039d260 -00000000 -07a0038c -00000000 -56005643 -00000000 -01bc2cf4 -00000000 -35f86800 -00000000 -00381e46 -00000000 -2955440d -00000000 -03760999 -00000000 -0f0f1c6b -00000000 -791e1ea9 -00000000 -496cdf1a -00000000 -bff302c7 -ffffffff -2faedbef -00000000 -c2aad38d -ffffffff -e47b25cd -ffffffff -f023a33b -ffffffff -70fa75da -00000000 -75dd0450 -00000000 -2c756baf -00000000 -e81c047a -ffffffff -bfc98f4b -ffffffff -5ed314a5 -00000000 -65fc9f85 -00000000 -c21c87a9 -ffffffff -22955b01 -00000000 -d1026175 -ffffffff -15d2aaae -00000000 -16e57722 -00000000 -607943a0 -00000000 -065975ff -00000000 -19339204 -00000000 -7c15b0ea -00000000 -dbaa9968 -ffffffff -3f127a04 -00000000 -dac9cf5a -ffffffff -62c36020 -00000000 -df61e380 -ffffffff -43a05a9b -00000000 -d7c0eaa4 -ffffffff -b6177473 -ffffffff -ba227348 -ffffffff -f489915a -ffffffff -26a8fc91 -00000000 -32920595 -00000000 -9c5ce88e -ffffffff -ee3242f3 -ffffffff -2b406642 -00000000 -6e66c819 -00000000 -d5dbc8ec -ffffffff -da5b73c6 -ffffffff -7ff6d8b9 -00000000 -4f602546 -00000000 -294fbb06 -00000000 -5ed54ee0 -00000000 -2242a998 -00000000 -f2dd5ff5 -ffffffff -1f7ff375 -00000000 -4aa5f7f2 -00000000 -1f33b178 -00000000 -6d191f9d -00000000 -27cb9ed6 -00000000 -8f9ae7da -ffffffff -06c94e13 -00000000 -a122e285 -ffffffff -ec84ee12 -ffffffff -402edb7c -00000000 -2e717f73 -00000000 -b0873216 -ffffffff -4bf62d68 -00000000 -7b28a139 -00000000 -fc307a09 -ffffffff -70ddf2a8 -00000000 -04e908d6 -00000000 -3018bb6a -00000000 -83cb4bbc -ffffffff -4eb77f00 -00000000 -5cbfb977 -00000000 -61f29767 -00000000 -06958cb8 -00000000 -9ba9ad0d -ffffffff -7bd98d1e -00000000 -a1774d53 -ffffffff -43be7b54 -00000000 -fbfbff17 -ffffffff -20fab4fe -00000000 -d65fdccf -ffffffff -fb1ee967 -ffffffff -f7fd3bdc -ffffffff -ffd630e7 -ffffffff -917ff291 -ffffffff -f9e3ffff -ffffffff -ee8617ff -ffffffff -dfffafb3 -ffffffff -fec78fff -ffffffff -05ffff3a -00000000 -fff5bc7f -ffffffff -8601ffff -ffffffff -ffffd615 -ffffffff -ffc5bbff -ffffffff -f9b7ffff -ffffffff -fffff25f -ffffffff -feefffff -ffffffff -fffff0af -ffffffff -f95fffff -ffffffff -f91fffff -ffffffff -fcbfffff -ffffffff -cfffffff -ffffffff -fffffff1 -ffffffff -fe7fffff -ffffffff -ff7fffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -b3167b99 -ffffffff -35a8dd4d -00000000 -fae6f67d -ffffffff -5603fcda -00000000 -50344990 -00000000 -3738bd33 -00000000 -3b84624d -00000000 -9ae3fa42 -ffffffff -726e8034 -00000000 -19626d46 -00000000 -47dd95e8 -00000000 -d93132b5 -ffffffff -3c57c31f -00000000 -bd42829d -ffffffff -5ac51cc8 -00000000 -a9d579db -ffffffff -2b94f0dd -00000000 -6188472c -00000000 -e8f33450 -ffffffff -85e7b8aa -ffffffff -dcf696af -ffffffff -4966d3db -00000000 -42be2396 -00000000 -ceb44f25 -ffffffff -7bf3d1a1 -00000000 -a48f27c1 -ffffffff -f6a3e68a -ffffffff -e0a7bd68 -ffffffff -fcd35423 -ffffffff -50fb8b48 -00000000 -c7e050c2 -ffffffff -b960d658 -ffffffff -8a22d224 -ffffffff -83d234bf -ffffffff -0edfecb6 -00000000 -fdfa2f0a -ffffffff -b66ec956 -ffffffff -c5f79fe0 -ffffffff -1e558410 -00000000 -edfa68ce -ffffffff -77e07cdb -00000000 -a6bfb2ea -ffffffff -e040cf47 -ffffffff -cbef1fe7 -ffffffff -f53fb980 -ffffffff -5dd58588 -00000000 -3bc2f601 -00000000 -fcde6be1 -ffffffff -4acd8a98 -00000000 -1b40edf8 -00000000 -a71067bc -ffffffff -7cd62e16 -00000000 -b2697723 -ffffffff -e8ecefed -ffffffff -eb9263c6 -ffffffff -2ab31a91 -00000000 -eed5992b -ffffffff -b065b170 -ffffffff -fa1e6db4 -ffffffff -e68bb45d -ffffffff -e4809fad -ffffffff -ba111f5f -ffffffff -3a8ca4d1 -00000000 -33dd3c24 -00000000 -caa0a141 -ffffffff -ef3eda84 -ffffffff -1eeac386 -00000000 -23388907 -00000000 -950bbf49 -ffffffff -497836d8 -00000000 -71ceb08b -00000000 -65371785 -00000000 -76766e01 -00000000 -718aa9e1 -00000000 -524aa173 -00000000 -2fc707ea -00000000 -34a67b75 -00000000 -92abe509 -ffffffff -185425c3 -00000000 -fb74d78e -ffffffff -f6e8a440 -ffffffff -cc223696 -ffffffff -a3832992 -ffffffff -47329968 -00000000 -cce7ce8b -ffffffff -9daec07a -ffffffff -3c14a17b -00000000 -1bfde630 -00000000 -a82cb2ce -ffffffff -0236eba2 -00000000 -d8520ba9 -ffffffff -6e43383b -00000000 -bfbd7d15 -ffffffff -aa4a3de3 -ffffffff -75e1d3c1 -00000000 -a1fa58f4 -ffffffff -5dd46913 -00000000 -97a1081f -ffffffff -7d50b28b -00000000 -d475026f -ffffffff -91dd3d18 -ffffffff -0e0bf867 -00000000 -6b00e23d -00000000 -3767d00a -00000000 -1e7a6101 -00000000 -3f600c79 -00000000 -02001cd8 -00000000 -06a00341 -00000000 -00350766 -00000000 -0026687c -00000000 -015e000e -00000000 -78b28001 -00000000 -8000b79f -ffffffff -00b80f00 -00000000 -b5400009 -ffffffff -08908000 -00000000 -c00006aa -ffffffff -0000a120 -00000000 -0cb60000 -00000000 -f400000f -ffffffff -64400000 -00000000 -01540000 -00000000 -e4000001 -ffffffff -00000026 -00000000 -02800000 -00000000 -000f0000 -00000000 -0000001c -00000000 -00004000 -00000000 -00004000 -00000000 -00000000 -00000000 -aa01e126 -ffffffff -d6476c40 -ffffffff -274b2b11 -00000000 -49a2f4c3 -00000000 -f32e6d69 -ffffffff -39aff9c7 -00000000 -782ae0e9 -00000000 -62dfeae4 -00000000 -4d0282f2 -00000000 -160196d7 -00000000 -74f8bbeb -00000000 -1fc2cda6 -00000000 -0da5f55f -00000000 -08820dfe -00000000 -739bac74 -00000000 -b371f7da -ffffffff -b736ed8e -ffffffff -25d0f478 -00000000 -14e218be -00000000 -203f1369 -00000000 -7fed9e0e -00000000 -364edae0 -00000000 -6f5e2359 -00000000 -66cd8057 -00000000 -f012ae04 -ffffffff -c4a19e49 -ffffffff -91ac2482 -ffffffff -1c17550d -00000000 -f957120f -ffffffff -899a97c6 -ffffffff -7af4302b -00000000 -75e80385 -00000000 -15091a3b -00000000 -3c7796e2 -00000000 -ad44838a -ffffffff -30b3074e -00000000 -ea995a6b -ffffffff -b7754690 -ffffffff -340563f9 -00000000 -4173dc18 -00000000 -15006aec -00000000 -8d726f89 -ffffffff -311d81ea -00000000 -afe5518b -ffffffff -80c837dc -ffffffff -32a8fbcd -00000000 -66cb8b79 -00000000 -0fad1e4e -00000000 -a9ba4fc7 -ffffffff -10737699 -00000000 -8ae4a810 -ffffffff -30266f13 -00000000 -4fbbb98e -00000000 -b9b70f33 -ffffffff -6d9adf5d -00000000 -e1a8a79b -ffffffff -96527d7b -ffffffff -30033769 -00000000 -1f77d60d -00000000 -6325f8d8 -00000000 -6e3eb788 -00000000 -306556dc -00000000 -96f5f895 -ffffffff -28441cf7 -00000000 -b82f5cdd -ffffffff -42d5ab3d -00000000 -c2ebbe4d -ffffffff -6df45de5 -00000000 -843d46fb -ffffffff -a848c988 -ffffffff -491ed6c9 -00000000 -4ec6f18c -00000000 -4641f648 -00000000 -25d222ec -00000000 -42d678a0 -00000000 -f9c54d70 -ffffffff -334b28f7 -00000000 -e466f716 -ffffffff -1db19d65 -00000000 -40f6baf4 -00000000 -4507de12 -00000000 -126d70de -00000000 -01cc5b3e -00000000 -b4fdf826 -ffffffff -510456c1 -00000000 -ec024e52 -ffffffff -e3356cc4 -ffffffff -e3685fe3 -ffffffff -a4fc6113 -ffffffff -d4f78cc2 -ffffffff -ecdefb27 -ffffffff -eb685eb0 -ffffffff -15bdce24 -00000000 -08a14afe -00000000 -7ab2427f -00000000 -78a56a64 -00000000 -a4f54ee7 -ffffffff -30275697 -00000000 -2aba39d1 -00000000 -86bdf041 -ffffffff -355b0f02 -00000000 -d2f8a09a -ffffffff -365fdd0d -00000000 -f27a40cf -ffffffff -38b6bfe2 -00000000 -0301fefb -00000000 -32e3fff8 -00000000 -df373ff1 -ffffffff -e22746ff -ffffffff -ff20599f -ffffffff -ef8b1bff -ffffffff -7ffe1cd1 -00000000 -fffed06b -ffffffff -a2ffff5e -ffffffff -ff0c8fff -ffffffff -fc823fff -ffffffff -ffdb73ff -ffffffff -ffffabb7 -ffffffff -7fffffeb -00000000 -ff5fffff -ffffffff -fdc9ffff -ffffffff -7fffffc4 -00000000 -ffffffe2 -ffffffff -ffffff9b -ffffffff -ff07ffff -ffffffff -f5ffffff -ffffffff -efffffff -ffffffff -9fffffff -ffffffff -dfffffff -ffffffff -ffffffff -ffffffff -5ae10604 -00000000 -cec7313a -ffffffff -058160e6 -00000000 -d6308385 -ffffffff -00000000 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha256sig0-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha256sig0-01.reference_output deleted file mode 100644 index 7326a122d..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha256sig0-01.reference_output +++ /dev/null @@ -1,300 +0,0 @@ -87c70ee9 -deadbeef -1fffffff -deadbeef -1fffffff -deadbeef -1fffffff -deadbeef -1fffffff -deadbeef -1fffffff -deadbeef -1fffffff -deadbeef -1fffffff -deadbeef -1fffffff -deadbeef -1fffffff -deadbeef -00000000 -deadbeef -1fffffff -deadbeef -1fffffff -deadbeef -1fffffff -deadbeef -1fffffff -deadbeef -1fffffff -deadbeef -1fffffff -deadbeef -1fffffff -deadbeef -1fffffff -deadbeef -1fffffff -deadbeef -1fffffff -deadbeef -1fffffff -deadbeef -1fffffff -deadbeef -1fffffff -deadbeef -1fffffff -deadbeef -1fffffff -deadbeef -1fffffff -deadbeef -1fffffff -deadbeef -1fffffff -deadbeef -1fffffff -deadbeef -1fffffff -deadbeef -00000000 -deadbeef -1fffffff -deadbeef -0effdfff -deadbeef -177fefff -deadbeef -1bbff7ff -deadbeef -1ddffbff -deadbeef -1eeffdff -deadbeef -1f77feff -deadbeef -1fbbff7f -deadbeef -1fddffbf -deadbeef -1feeffdf -deadbeef -1ff77fef -deadbeef -1ffbbff7 -deadbeef -1ffddffb -deadbeef -1ffeeffd -deadbeef -1fff77fe -deadbeef -9fffbbff -deadbeef -5fffddff -deadbeef -3fffeeff -deadbeef -0ffff77f -deadbeef -17fffbbf -deadbeef -1bfffddf -deadbeef -1dfffeef -deadbeef -1effff77 -deadbeef -1f7fffbb -deadbeef -1fbfffdd -deadbeef -1fdfffee -deadbeef -9feffff7 -deadbeef -5ff7fffb -deadbeef -3ffbfffd -deadbeef -0ffdfffe -deadbeef -17feffff -deadbeef -1bff7fff -deadbeef -1dffbfff -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -02004000 -deadbeef -939dab8b -deadbeef -a948bfa5 -deadbeef -994bc4a4 -deadbeef -4cd02353 -deadbeef -b731081a -deadbeef -d4fc26a7 -deadbeef -b4b54d93 -deadbeef -c31b1d2e -deadbeef -e7f87002 -deadbeef -4e6ae522 -deadbeef -0fb0ebca -deadbeef -0e02b181 -deadbeef -845823ff -deadbeef -c60e7ba1 -deadbeef -add556da -deadbeef -9a8c5240 -deadbeef -6ab9ad7d -deadbeef -37dfb743 -deadbeef -0ccf43cc -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -11002000 -deadbeef -08801000 -deadbeef -04400800 -deadbeef -02200400 -deadbeef -01100200 -deadbeef -00880100 -deadbeef -00440080 -deadbeef -00220040 -deadbeef -00110020 -deadbeef -00088010 -deadbeef -00044008 -deadbeef -00022004 -deadbeef -00011002 -deadbeef -00008801 -deadbeef -80004400 -deadbeef -40002200 -deadbeef -20001100 -deadbeef -10000880 -deadbeef -08000440 -deadbeef -04000220 -deadbeef -02000110 -deadbeef -01000088 -deadbeef -00800044 -deadbeef -00400022 -deadbeef -00200011 -deadbeef -80100008 -deadbeef -40080004 -deadbeef -20040002 -deadbeef -10020001 -deadbeef -08010000 -deadbeef -04008000 -deadbeef -1fffffff -deadbeef -1fffffff -deadbeef diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha256sig0-rwp1.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha256sig0-rwp1.reference_output deleted file mode 100644 index 2ca8175ea..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha256sig0-rwp1.reference_output +++ /dev/null @@ -1,488 +0,0 @@ -e9ce59bf -9baab409 -f485adf7 -ffffffff -8f0c849b -6c023547 -8476d693 -6c023547 -8222d662 -ffffffff -7ddd299d -00000000 -0dd09a3f -9c55496a -592e7107 -00000000 -d4b79a73 -93fdcab8 -acf6b0ac -4f0e7329 -e0ec1049 -ffffffff -1ff24ba6 -a38b1ba1 -00e1a410 -a38b1ba1 -4919f7f2 -00000000 -b6e6080d -ffffffff -53074732 -6fef7bd6 -bf0a72a9 -ffffffff -be28ce98 -5c74e45e -85d9f49f -f3461900 -52976c0c -00000000 -fbf9aebf -5cd2875e -56913d4c -a32d78a1 -dd2c1077 -ffffffff -22d3ef88 -00000000 -d625f8df -0c6725bc -db5f0163 -ffffffff -84cdc416 -5cd2875e -1515b62e -d5a6539a -330318ec -00000000 -d6f32892 -3d7c95f9 -1a0fcf81 -c2836a06 -f295a0ec -ffffffff -0d6a5f13 -00000000 -d6d5b6ce -26575c5d -eac4a801 -ffffffff -d0b4d87f -3d7c95f9 -b1a509ca -bd7bb672 -c1254743 -ffffffff -a8949bfc -c2f9ebc8 -964e2340 -c2f9ebc8 -1b357dbd -00000000 -e4ca8242 -ffffffff -41c6b234 -bd83b67d -cc364b53 -ffffffff -35e82812 -3d061437 -c4490a21 -3441a740 -1989c242 -00000000 -b7c1fbe3 -4652f62d -51b7c65e -b9ad09d2 -4702032a -00000000 -b8fdfcd5 -ffffffff -18496d21 -b866479b -1a71f96c -00000000 -c8ba330d -4652f62d -ee915c98 -58d5d905 -7b29328e -00000000 -cd42000a -0b2e2669 -4994cd7b -f4d1d996 -ccff6250 -ffffffff -33009daf -00000000 -0f65a0a0 -5f2a25d6 -29da7c8c -00000000 -e045af10 -0b2e2669 -81fd5f28 -f909502b -16f67124 -00000000 -690e53c9 -1011eeb4 -8007dd12 -efee114b -c2445419 -ffffffff -3dbbabe6 -00000000 -7dfda0b2 -f92aad54 -0368d028 -00000000 -8360f315 -1011eeb4 -f261884d -c35a255f -e7bb8e81 -ffffffff -68b3c823 -8f03e503 -70f7b95d -8f03e503 -5aa84464 -00000000 -a557bb9b -ffffffff -0c721591 -24a25aa0 -a6f2e585 -ffffffff -35fb2c27 -70fc1afc -121290f0 -bed9e518 -465a73bb -00000000 -aa682d57 -72745307 -13cda113 -8d8bacf8 -4c1aeb93 -00000000 -b3e5146c -ffffffff -ea532d08 -3f220927 -c7dcf96f -ffffffff -b40f585b -72745307 -d235139a -6e5e995f -6b047cd9 -00000000 -6d647b4b -cebe24d9 -f99ff86d -3141db26 -3adbbe9a -00000000 -c5244165 -ffffffff -dab51b9a -6f9ee25f -68057fe9 -00000000 -6e65877b -cebe24d9 -d295e997 -7a9113e5 -4f926244 -00000000 -6630351b -ab8534c1 -d65da8a0 -547acb3e -314f3bd2 -00000000 -ceb0c42d -ffffffff -24da1627 -7c995be6 -cf5b3fde -ffffffff -f8fd973d -ab8534c0 -e49adff7 -990c7a8f -44a79767 -00000000 -e42c1394 -01fbbe93 -5f747b0c -fe04416c -0d93704a -00000000 -f26c8fb5 -ffffffff -e49cdff7 -9af382af -c4a75b66 -ffffffff -6532e059 -01fbbe93 -52135d56 -2de37f54 -71b3d994 -00000000 -2d845d0e -74f5add5 -a3c87b65 -8b0a522a -c1e7f768 -ffffffff -3e180897 -00000000 -6a5c5e66 -ce0c8056 -d606a9e7 -ffffffff -323e2e81 -74f5add5 -c3e3c21c -d0bc9a3a -d17c8f3f -ffffffff -ab61bcf5 -69ae119a -85e2cc35 -69ae119a -c8bafd66 -ffffffff -37450299 -00000000 -341c25a0 -dd3f62c5 -4f83b1f8 -00000000 -c9a0e5c2 -9651ee65 -2dc51a2a -072cdbff -1769a200 -00000000 -5f2fe3f5 -9b11d383 -b7b9be0a -64ee2c7c -6c1ae953 -00000000 -93e516ac -ffffffff -adc99dd4 -374edbff -db978bf3 -ffffffff -23ddcde8 -9b11d383 -74bd2e93 -971acc3b -63da02a0 -00000000 -808c503c -93017690 -1ca9ad63 -6cfe896f -aef4a1dc -ffffffff -510b5e23 -00000000 -7b41ceab -971d313c -2a346498 -00000000 -0d8ab734 -93017691 -f7f576a7 -2ab7ea92 -0cb8b9c4 -00000000 -275a610d -c5d09b94 -d41d2736 -3a2f646b -3ee62baf -00000000 -c119d450 -ffffffff -07fa8737 -b5380c9b -cf3d6416 -ffffffff -fb203cdf -c5d09b93 -b287d885 -6d8e7a4d -eb149800 -ffffffff -dad49d70 -e728e41b -ce3ffa8f -e728e41b -f8f8732b -ffffffff -07078cd4 -00000000 -b507e365 -8e307d8d -25139eeb -00000000 -56d3a45b -18d71be4 -51704b2a -a57f8862 -4c467daf -00000000 -41034170 -2a5dc0a0 -f2bac320 -d5a23f5f -ef7a114c -ffffffff -1085eeb3 -00000000 -697ab4d4 -b9800962 -08c8b9ad -00000000 -160df68c -2a5dc0a0 -9b07ed10 -afb2f00c -c912d4b9 -ffffffff -917ac4e2 -3d8ec31d -a797efa4 -3d8ec31d -a654fbce -ffffffff -59ab0431 -00000000 -1bd80da6 -303509d1 -4c253759 -00000000 -a48d47b4 -c2713ce2 -5ce4e7ad -7a9113c2 -68ce0203 -00000000 -ed5b8a82 -9ea76f08 -7a6a777e -615890f7 -6e66049b -00000000 -9199fb64 -ffffffff -5f06f7ad -82ddebd3 -ecb584db -ffffffff -724b0d5c -9ea76f08 -939e1ac3 -24eeb7cf -13e41b8a -00000000 -154adada -132a7176 -f9513eaf -ecd58e89 -0f737bfc -00000000 -f08c8403 -ffffffff -9bdf9ce3 -4aef382f -3374aa52 -00000000 -3a236ba2 -132a7176 -f9da381e -374b8630 -accf4d05 -ffffffff -7ed9a3ad -cc679c3b -2de91157 -cc679c3b -efb33b72 -ffffffff -104cc48d -00000000 -fde3c55e -386c49b8 -53100059 -00000000 -2526ef01 -339863c5 -fdbc23ec -fb24d57d -ceb7c355 -ffffffff -341eba30 -d277af9d -0556869a -d277af9d -9506fc8b -ffffffff -6af90374 -00000000 -01bed3ee -0434d582 -68cf27b5 -00000000 -6378a11a -2d885063 -01be696c -3edc9bee -426fb190 -00000000 -4fede954 -b3e73cbb -f27da73b -4c18c344 -0065b336 -00000000 -ff9a4cc9 -ffffffff -19be8a6c -4122e410 -799faa36 -00000000 -872202fa -b3e73cbb -52df1cb0 -0e8b61f7 -add24918 -ffffffff -ed02acff -d2eccdf1 -bf2f1a18 -d2eccdf1 -e01d92bc -ffffffff -1fe26d43 -00000000 -52e0df3e -50ab8607 -41364ee1 -00000000 -820734c8 -2d13320e -00000000 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha256sig0-rwp2.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha256sig0-rwp2.reference_output deleted file mode 100644 index 1f178b37f..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha256sig0-rwp2.reference_output +++ /dev/null @@ -1,112 +0,0 @@ -924770d3 -08577eb1 -6958846a -00000000 -7b89296c -93fdcab8 -9ddd299d -ffffffff -7dc59a3a -d2d6b877 -1dcda702 -00000000 -a749f9c5 -cf84b683 -e1d6c519 -ffffffff -08ceac39 -854a9657 -d8060aec -ffffffff -53e8eb43 -137a9777 -b60a1844 -ffffffff -ff1e5bef -5c74e45e -56e6080d -00000000 -6b9f15c4 -dc338383 -40d5c674 -00000000 -9a6ab329 -5ae6a228 -ecb3e599 -ffffffff -acca7f0d -432779ee -9103b02d -ffffffff -2cb7362c -af949e5e -90448384 -ffffffff -a96ec2b3 -5cd2875e -c2d3ef88 -ffffffff -708cc1b6 -9d02fc90 -529d1d96 -00000000 -0b54aa22 -953b00b0 -6ff4bec5 -00000000 -3c53d0e3 -224c0601 -35ca12a9 -00000000 -f0e58650 -e8dac663 -de6947ff -ffffffff -e5f0307e -3d7c95f9 -ed6a5f13 -ffffffff -aaac3142 -8c8a18b2 -9c5074e1 -ffffffff -6f9fb997 -785036de -cd4913a6 -ffffffff -a7298c66 -95a4d257 -bab2cb5e -ffffffff -d814d575 -807da245 -c5efc501 -ffffffff -69b1dcbf -3d061437 -04ca8242 -00000000 -08208d09 -7f216822 -305612b3 -00000000 -dae98554 -14b91c79 -d3bdd51a -ffffffff -c6880007 -c5ec6148 -175de1a2 -00000000 -6a013380 -7213516d -41743e97 -00000000 -ae4839a1 -4652f62d -58fdfcd5 -00000000 -9e044706 -85986adb -0f3d27ef -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha256sig1-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha256sig1-01.reference_output deleted file mode 100644 index 9c038c789..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha256sig1-01.reference_output +++ /dev/null @@ -1,300 +0,0 @@ -18d2a4a9 -deadbeef -003fffff -deadbeef -003fffff -deadbeef -003fffff -deadbeef -003fffff -deadbeef -003fffff -deadbeef -003fffff -deadbeef -003fffff -deadbeef -003fffff -deadbeef -003fffff -deadbeef -003fffff -deadbeef -003fffff -deadbeef -003fffff -deadbeef -003fffff -deadbeef -003fffff -deadbeef -003fffff -deadbeef -00000000 -deadbeef -003fffff -deadbeef -003fffff -deadbeef -003fffff -deadbeef -003fffff -deadbeef -003fffff -deadbeef -003fffff -deadbeef -003fffff -deadbeef -003fffff -deadbeef -003fffff -deadbeef -003fffff -deadbeef -003fffff -deadbeef -003fffff -deadbeef -003fffff -deadbeef -00000000 -deadbeef -003fffff -deadbeef -003fffff -deadbeef -001fafff -deadbeef -002fd7ff -deadbeef -0037ebff -deadbeef -003bf5ff -deadbeef -003dfaff -deadbeef -003efd7f -deadbeef -003f7ebf -deadbeef -003fbf5f -deadbeef -003fdfaf -deadbeef -003fefd7 -deadbeef -003ff7eb -deadbeef -003ffbf5 -deadbeef -003ffdfa -deadbeef -803ffefd -deadbeef -403fff7e -deadbeef -a03fffbf -deadbeef -503fffdf -deadbeef -283fffef -deadbeef -143ffff7 -deadbeef -0a3ffffb -deadbeef -053ffffd -deadbeef -02bffffe -deadbeef -017fffff -deadbeef -009fffff -deadbeef -006fffff -deadbeef -0017ffff -deadbeef -002bffff -deadbeef -0035ffff -deadbeef -003affff -deadbeef -003d7fff -deadbeef -003ebfff -deadbeef -003f5fff -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -0000a000 -deadbeef -48cd3135 -deadbeef -41c09451 -deadbeef -b10a70f6 -deadbeef -557e7c6c -deadbeef -0b6b329a -deadbeef -95116065 -deadbeef -2df24187 -deadbeef -c4f43ceb -deadbeef -d6e1d9a0 -deadbeef -4d2ba948 -deadbeef -5fe2d4ab -deadbeef -95da2369 -deadbeef -beeb6b90 -deadbeef -18f30fdb -deadbeef -277e7afe -deadbeef -f1d7bde8 -deadbeef -ac937b9a -deadbeef -748e7afc -deadbeef -9a2a2f54 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00205000 -deadbeef -00102800 -deadbeef -00081400 -deadbeef -00040a00 -deadbeef -00020500 -deadbeef -00010280 -deadbeef -00008140 -deadbeef -000040a0 -deadbeef -00002050 -deadbeef -00001028 -deadbeef -00000814 -deadbeef -0000040a -deadbeef -00000205 -deadbeef -80000102 -deadbeef -40000081 -deadbeef -a0000040 -deadbeef -50000020 -deadbeef -28000010 -deadbeef -14000008 -deadbeef -0a000004 -deadbeef -05000002 -deadbeef -02800001 -deadbeef -01400000 -deadbeef -00a00000 -deadbeef -00500000 -deadbeef -00280000 -deadbeef -00140000 -deadbeef -000a0000 -deadbeef -00050000 -deadbeef -00028000 -deadbeef -00014000 -deadbeef -003fffff -deadbeef -003fffff -deadbeef diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha256sig1-rwp1.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha256sig1-rwp1.reference_output deleted file mode 100644 index 98bfc93f2..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha256sig1-rwp1.reference_output +++ /dev/null @@ -1,488 +0,0 @@ -e9ce59bf -9baab409 -e7d27a48 -ffffffff -9c5b5324 -6c023547 -8476d693 -6c023547 -b1baaf00 -ffffffff -4e4550ff -00000000 -0dd09a3f -9c55496a -5e5b1374 -00000000 -d9e43ce0 -93fdcab8 -acf6b0ac -4f0e7329 -8e68fe49 -ffffffff -7176a5a6 -a38b1ba1 -00e1a410 -a38b1ba1 -e68a3805 -ffffffff -1975c7fa -00000000 -53074732 -6fef7bd6 -4b6ba232 -00000000 -4a89fe21 -5c74e45f -85d9f49f -f3461900 -c4fd442a -ffffffff -6d938699 -a32d78a1 -56913d4c -a32d78a1 -b91a05d5 -ffffffff -46e5fa2a -00000000 -d625f8df -0c6725bc -434198a8 -00000000 -ecb05b5b -5cd2875e -1515b62e -d5a6539a -6dd78d45 -00000000 -8827bd3b -3d7c95f9 -1a0fcf81 -c2836a06 -1e362db5 -00000000 -e1c9d24a -ffffffff -d6d5b6ce -26575c5d -6d8b04dd -00000000 -537b355b -3d7c95fa -b1a509ca -bd7bb672 -25f067a4 -00000000 -4c41bb1b -3d061437 -964e2340 -c2f9ebc8 -d5edca66 -ffffffff -2a123599 -00000000 -41c6b234 -bd83b67d -8f4cd977 -ffffffff -f8feb636 -3d061436 -c4490a21 -3441a740 -a465c8ef -ffffffff -0a2df14e -b9ad09d2 -51b7c65e -b9ad09d2 -1bf08f1c -00000000 -e40f70e3 -ffffffff -18496d21 -b866479b -9b32bd76 -ffffffff -497af717 -4652f62d -ee915c98 -58d5d905 -85e4cecd -ffffffff -338ffc49 -f4d1d996 -4994cd7b -f4d1d996 -ff00a8cb -ffffffff -00ff5734 -00000000 -0f65a0a0 -5f2a25d6 -6447df36 -00000000 -1ab311ba -0b2e266a -81fd5f28 -f909502b -04512f96 -00000000 -7ba90d7b -1011eeb4 -8007dd12 -efee114b -150b11f4 -00000000 -eaf4ee0b -ffffffff -7dfda0b2 -f92aad54 -64500e29 -00000000 -e4483116 -1011eeb4 -f261884d -c35a255f -f513df1e -ffffffff -7a1b99bc -8f03e503 -70f7b95d -8f03e503 -2b992b8b -00000000 -d466d474 -ffffffff -0c721591 -24a25aa0 -4879bb32 -00000000 -d78201d4 -70fc1afc -121290f0 -bed9e518 -1a628fef -00000000 -f650d103 -72745307 -13cda113 -8d8bacf8 -64af18f7 -00000000 -9b50e708 -ffffffff -ea532d08 -3f220927 -f31ffca8 -ffffffff -df525b94 -72745307 -d235139a -6e5e995f -2b8abe18 -00000000 -2deab98a -cebe24d9 -f99ff86d -3141db26 -03052402 -00000000 -fcfadbfd -ffffffff -dab51b9a -6f9ee25f -2e889b4a -00000000 -34e8a2dc -cebe24d9 -d295e997 -7a9113e5 -49cdb662 -00000000 -606fe13d -ab8534c1 -d65da8a0 -547acb3e -6171e68f -00000000 -9e8e1970 -ffffffff -24da1627 -7c995be6 -49de4073 -00000000 -738097d2 -ab8534c1 -e49adff7 -990c7a8f -343c2869 -00000000 -94b7ac9a -01fbbe93 -5f747b0c -fe04416c -b2f0794a -ffffffff -4d0f86b5 -00000000 -e49cdff7 -9af382af -f43c29ea -ffffffff -94c7aedd -01fbbe93 -52135d56 -2de37f54 -c515679c -ffffffff -9922e306 -8b0a522a -a3c87b65 -8b0a522a -32f69783 -00000000 -cd09687c -ffffffff -6a5c5e66 -ce0c8056 -a4e56f72 -ffffffff -011cf40c -74f5add5 -c3e3c21c -d0bc9a3a -997d017d -ffffffff -e36032b7 -69ae119a -85e2cc35 -69ae119a -3fbd0afe -00000000 -c042f501 -ffffffff -341c25a0 -dd3f62c5 -96691b84 -ffffffff -10864f4e -9651ee65 -2dc51a2a -072cdbff -2e5b221c -00000000 -661d63e9 -9b11d383 -b7b9be0a -64ee2c7c -e8e9e344 -ffffffff -17161cbb -00000000 -adc99dd4 -374edbff -fd7bb13a -ffffffff -45c1f32f -9b11d383 -74bd2e93 -971acc3b -3286fb82 -00000000 -d1d0a91e -93017690 -1ca9ad63 -6cfe896f -e31ac7aa -ffffffff -1ce53855 -00000000 -7b41ceab -971d313c -de9e02bb -ffffffff -c1f45557 -93017690 -f7f576a7 -2ab7ea92 -15baf859 -00000000 -3e582090 -c5d09b94 -d41d2736 -3a2f646b -3748b7c4 -00000000 -c8b7483b -ffffffff -07fa8737 -b5380c9b -137c9da3 -00000000 -3f5f766c -c5d09b94 -b287d885 -6d8e7a4d -177ecee5 -00000000 -26becb95 -18d71be4 -ce3ffa8f -e728e41b -02259126 -00000000 -fdda6ed9 -ffffffff -b507e365 -8e307d8d -0df32ddb -00000000 -3fb3334b -18d71be4 -51704b2a -a57f8862 -2ce43e84 -00000000 -21a1025b -2a5dc0a0 -f2bac320 -d5a23f5f -39c8c9ba -00000000 -c6373645 -ffffffff -697ab4d4 -b9800962 -0ceae73f -00000000 -1a30241e -2a5dc0a0 -9b07ed10 -afb2f00c -0b0c9f18 -00000000 -53648f43 -c2713ce2 -a797efa4 -3d8ec31d -0a0f22c2 -00000000 -f5f0dd3d -ffffffff -1bd80da6 -303509d1 -07613894 -00000000 -5fc948ef -c2713ce2 -5ce4e7ad -7a9113c2 -ef343cd7 -ffffffff -6aa1b456 -615890f7 -7a6a777e -615890f7 -754e68e5 -00000000 -8ab1971a -ffffffff -5f06f7ad -82ddebd3 -a534c5de -ffffffff -2aca4e5f -9ea76f08 -939e1ac3 -24eeb7cf -ce1d5c3a -ffffffff -c8b39d6a -ecd58e89 -f9513eaf -ecd58e89 -b8bc57cd -ffffffff -4743a832 -00000000 -9bdf9ce3 -4aef382f -3dcb4973 -00000000 -447a0ac3 -132a7176 -f9da381e -374b8630 -5b32d558 -00000000 -89243bf0 -339863c4 -2de91157 -cc679c3b -aa8a090d -ffffffff -5575f6f2 -00000000 -fde3c55e -386c49b8 -9a3bd9bc -ffffffff -6c52c864 -339863c4 -fdbc23ec -fb24d57d -95b48e61 -ffffffff -6f1df704 -d277af9d -0556869a -d277af9d -939f17a0 -ffffffff -6c60e85f -00000000 -01bed3ee -0434d582 -b38aaf5c -ffffffff -ae3428c1 -2d885062 -01be696c -3edc9bee -f99bef72 -ffffffff -f419b7b6 -4c18c344 -f27da73b -4c18c344 -67461818 -00000000 -98b9e7e7 -ffffffff -19be8a6c -4122e410 -947de04a -ffffffff -a200390e -b3e73cba -52df1cb0 -0e8b61f7 -6dda94f3 -00000000 -2d0a7114 -2d13320e -bf2f1a18 -d2eccdf1 -6e6083b4 -00000000 -919f7c4b -ffffffff -52e0df3e -50ab8607 -746c5b1b -00000000 -b53d4102 -2d13320e -00000000 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha256sig1-rwp2.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha256sig1-rwp2.reference_output deleted file mode 100644 index 7d2ddf8c9..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha256sig1-rwp2.reference_output +++ /dev/null @@ -1,112 +0,0 @@ -924770d3 -08577eb1 -56572ab7 -00000000 -7b89296c -93fdcab8 -b18550ff -ffffffff -7dc59a3a -d2d6b877 -7e45003c -00000000 -a749f9c5 -cf84b683 -c3f3b533 -ffffffff -08ceac39 -854a9657 -839996d5 -ffffffff -53e8eb43 -137a9777 -68dd39b3 -00000000 -ff1e5bef -5c74e45e -e6b5c7fa -ffffffff -6b9f15c4 -dc338383 -68405f79 -00000000 -9a6ab329 -5ae6a228 -0fd764d4 -00000000 -acca7f0d -432779ee -704c5163 -00000000 -2cb7362c -af949e5e -7dd8be00 -00000000 -a96ec2b3 -5cd2875e -b925fa2a -ffffffff -708cc1b6 -9d02fc90 -f8f1d567 -ffffffff -0b54aa22 -953b00b0 -c05791ea -ffffffff -3c53d0e3 -224c0601 -9262ed57 -ffffffff -f0e58650 -e8dac663 -73de5f0f -00000000 -e5f0307e -3d7c95f9 -1e09d24a -00000000 -aaac3142 -8c8a18b2 -9ea3ab0f -ffffffff -6f9fb997 -785036de -2be2bdd2 -00000000 -a7298c66 -95a4d257 -f7964d12 -ffffffff -d814d575 -807da245 -f022523d -ffffffff -69b1dcbf -3d061437 -d5d23599 -ffffffff -08208d09 -7f216822 -5727ad37 -00000000 -dae98554 -14b91c79 -f2364c48 -ffffffff -c6880007 -c5ec6148 -0032b995 -00000000 -6a013380 -7213516d -bfaab80c -ffffffff -ae4839a1 -4652f62d -1bcf70e3 -00000000 -9e044706 -85986adb -ab441dd3 -ffffffff diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha256sum0-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha256sum0-01.reference_output deleted file mode 100644 index c7e52f2b4..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha256sum0-01.reference_output +++ /dev/null @@ -1,300 +0,0 @@ -4799c3e5 -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -00000000 -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -00000000 -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -dffbfdff -deadbeef -effdfeff -deadbeef -f7feff7f -deadbeef -fbff7fbf -deadbeef -fdffbfdf -deadbeef -feffdfef -deadbeef -ff7feff7 -deadbeef -ffbff7fb -deadbeef -ffdffbfd -deadbeef -ffeffdfe -deadbeef -7ff7feff -deadbeef -bffbff7f -deadbeef -dffdffbf -deadbeef -effeffdf -deadbeef -f7ff7fef -deadbeef -fbffbff7 -deadbeef -fdffdffb -deadbeef -feffeffd -deadbeef -ff7ff7fe -deadbeef -7fbffbff -deadbeef -bfdffdff -deadbeef -dfeffeff -deadbeef -eff7ff7f -deadbeef -f7fbffbf -deadbeef -fbfdffdf -deadbeef -fdfeffef -deadbeef -feff7ff7 -deadbeef -ff7fbffb -deadbeef -ffbfdffd -deadbeef -ffdfeffe -deadbeef -7feff7ff -deadbeef -bff7fbff -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -40080400 -deadbeef -7d6edd03 -deadbeef -77524e08 -deadbeef -781c6e4c -deadbeef -18c5683c -deadbeef -f489e912 -deadbeef -315e1351 -deadbeef -6bcffcb7 -deadbeef -a1770abd -deadbeef -b5a467d3 -deadbeef -b1817121 -deadbeef -d739557c -deadbeef -754a8c38 -deadbeef -0066c1ab -deadbeef -1fd61299 -deadbeef -86890c81 -deadbeef -30a07e62 -deadbeef -502a4d47 -deadbeef -ca6f8fb5 -deadbeef -d872ab8c -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -20040200 -deadbeef -10020100 -deadbeef -08010080 -deadbeef -04008040 -deadbeef -02004020 -deadbeef -01002010 -deadbeef -00801008 -deadbeef -00400804 -deadbeef -00200402 -deadbeef -00100201 -deadbeef -80080100 -deadbeef -40040080 -deadbeef -20020040 -deadbeef -10010020 -deadbeef -08008010 -deadbeef -04004008 -deadbeef -02002004 -deadbeef -01001002 -deadbeef -00800801 -deadbeef -80400400 -deadbeef -40200200 -deadbeef -20100100 -deadbeef -10080080 -deadbeef -08040040 -deadbeef -04020020 -deadbeef -02010010 -deadbeef -01008008 -deadbeef -00804004 -deadbeef -00402002 -deadbeef -00201001 -deadbeef -80100800 -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha256sum0-rwp1.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha256sum0-rwp1.reference_output deleted file mode 100644 index 043c39c29..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha256sum0-rwp1.reference_output +++ /dev/null @@ -1,488 +0,0 @@ -e9ce59bf -9baab409 -0eea27ba -00000000 -75630ed6 -93fdcab8 -8476d693 -6c023547 -8edbd803 -ffffffff -712427fc -00000000 -0dd09a3f -9c55496a -50e4b43c -00000000 -cc6ddda8 -93fdcab8 -acf6b0ac -4f0e7329 -749a792d -00000000 -8b8422c2 -5c74e45e -00e1a410 -a38b1ba1 -a6282e0a -ffffffff -59d7d1f5 -00000000 -53074732 -6fef7bd6 -b04f80ba -ffffffff -af6ddca9 -5c74e45e -85d9f49f -f3461900 -22582dff -00000000 -8b36ef4c -5cd2875e -56913d4c -a32d78a1 -bb33ca80 -ffffffff -44cc357f -00000000 -d625f8df -0c6725bc -a494b040 -ffffffff -4e0372f3 -5cd2875e -1515b62e -d5a6539a -62ed7d72 -00000000 -871d4d0c -3d7c95f9 -1a0fcf81 -c2836a06 -05b527f6 -00000000 -fa4ad809 -ffffffff -d6d5b6ce -26575c5d -5518e045 -00000000 -3b0910c3 -3d7c95fa -b1a509ca -bd7bb672 -761be59c -00000000 -1faa3923 -3d061437 -964e2340 -c2f9ebc8 -071a38f8 -00000000 -f8e5c707 -ffffffff -41c6b234 -bd83b67d -9b1b73bf -ffffffff -04cd507e -3d061437 -c4490a21 -3441a740 -0434e7d1 -00000000 -aa7cde70 -4652f62d -51b7c65e -b9ad09d2 -7986056f -00000000 -8679fa90 -ffffffff -18496d21 -b866479b -0aae1d62 -00000000 -b8f65703 -4652f62d -ee915c98 -58d5d905 -9a114016 -ffffffff -2c7a7292 -f4d1d996 -4994cd7b -f4d1d996 -ea8a92de -ffffffff -15756d21 -00000000 -0f65a0a0 -5f2a25d6 -905b9338 -ffffffff -46c6c5bc -0b2e2669 -81fd5f28 -f909502b -2c47fa27 -00000000 -53bfd8ca -1011eeb4 -8007dd12 -efee114b -57e1bd7a -00000000 -a81e4285 -ffffffff -7dfda0b2 -f92aad54 -6c6e4e36 -00000000 -ec667123 -1011eeb4 -f261884d -c35a255f -b8d6c6d6 -ffffffff -37de8074 -8f03e503 -70f7b95d -8f03e503 -48331c29 -00000000 -b7cce3d6 -ffffffff -0c721591 -24a25aa0 -27c2a2c5 -00000000 -b6cae967 -70fc1afc -121290f0 -bed9e518 -c947f4e0 -ffffffff -2575aa0c -8d8bacf8 -13cda113 -8d8bacf8 -faefba66 -ffffffff -05104599 -00000000 -ea532d08 -3f220927 -1e67ba72 -00000000 -0a9a195e -72745308 -d235139a -6e5e995f -fc15be06 -ffffffff -fa75b994 -3141db26 -f99ff86d -3141db26 -c2e98502 -ffffffff -3d167afd -00000000 -dab51b9a -6f9ee25f -be15f824 -ffffffff -c475ffb6 -cebe24d8 -d295e997 -7a9113e5 -efbdb180 -ffffffff -c61fe6df -547acb3e -d65da8a0 -547acb3e -06335b9c -00000000 -f9cca463 -ffffffff -24da1627 -7c995be6 -10573fca -00000000 -39f99729 -ab8534c1 -e49adff7 -990c7a8f -6de64cb9 -00000000 -cd6dc84a -01fbbe93 -5f747b0c -fe04416c -1e53d41d -00000000 -e1ac2be2 -ffffffff -e49cdff7 -9af382af -75e7cc89 -00000000 -1673517c -01fbbe94 -52135d56 -2de37f54 -33431e87 -00000000 -6f749a1d -74f5add5 -a3c87b65 -8b0a522a -92329615 -ffffffff -6dcd69ea -00000000 -6a5c5e66 -ce0c8056 -18dddcd2 -00000000 -7515616c -74f5add5 -c3e3c21c -d0bc9a3a -af169c96 -ffffffff -d50baf5c -69ae119a -85e2cc35 -69ae119a -8be44a0c -ffffffff -741bb5f3 -00000000 -341c25a0 -dd3f62c5 -50902959 -00000000 -caad5d23 -9651ee65 -2dc51a2a -072cdbff -4e488015 -00000000 -060ec1e0 -9b11d383 -b7b9be0a -64ee2c7c -bb43f891 -ffffffff -44bc076e -00000000 -adc99dd4 -374edbff -e3a05b8e -ffffffff -2be69d83 -9b11d383 -74bd2e93 -971acc3b -5d0ea39f -00000000 -be58f103 -93017690 -1ca9ad63 -6cfe896f -0a870267 -00000000 -f578fd98 -ffffffff -7b41ceab -971d313c -acb10449 -ffffffff -900756e5 -93017690 -f7f576a7 -2ab7ea92 -9d187ddd -ffffffff -b6faa514 -3a2f646b -d41d2736 -3a2f646b -f82d3274 -ffffffff -07d2cd8b -00000000 -07fa8737 -b5380c9b -125a4206 -00000000 -3e3d1acf -c5d09b94 -b287d885 -6d8e7a4d -b7ee74d5 -ffffffff -862e71a5 -e728e41b -ce3ffa8f -e728e41b -d81bb064 -ffffffff -27e44f9b -00000000 -b507e365 -8e307d8d -69e1c632 -00000000 -9ba1cba2 -18d71be4 -51704b2a -a57f8862 -0c22300d -00000000 -01670cd2 -2a5dc0a0 -f2bac320 -d5a23f5f -cea5a6d4 -ffffffff -315a592b -00000000 -697ab4d4 -b9800962 -562eb745 -00000000 -6373f424 -2a5dc0a0 -9b07ed10 -afb2f00c -51f16117 -00000000 -0999714c -c2713ce2 -a797efa4 -3d8ec31d -0b7e55c8 -00000000 -f481aa37 -ffffffff -1bd80da6 -303509d1 -8bf045c6 -ffffffff -e4585621 -c2713ce1 -5ce4e7ad -7a9113c2 -f9cd6bbf -ffffffff -7c58e33e -615890f7 -7a6a777e -615890f7 -8cb4b765 -ffffffff -734b489a -00000000 -5f06f7ad -82ddebd3 -f175f0a0 -ffffffff -770b7921 -9ea76f08 -939e1ac3 -24eeb7cf -4a90140e -00000000 -4c3ed55e -132a7176 -f9513eaf -ecd58e89 -4fd13ac7 -00000000 -b02ec538 -ffffffff -9bdf9ce3 -4aef382f -7f98b7ab -00000000 -864778fb -132a7176 -f9da381e -374b8630 -16613b31 -00000000 -c477d599 -339863c4 -2de91157 -cc679c3b -e58677aa -ffffffff -1a798855 -00000000 -fde3c55e -386c49b8 -1a9a65be -00000000 -ecb15466 -339863c4 -fdbc23ec -fb24d57d -d08756ec -ffffffff -2a2e2f89 -d277af9d -0556869a -d277af9d -ef9fe307 -ffffffff -10601cf8 -00000000 -01bed3ee -0434d582 -e450010b -ffffffff -def97a70 -2d885062 -01be696c -3edc9bee -b2aa27ae -ffffffff -bf287f6a -4c18c344 -f27da73b -4c18c344 -33dc15ea -00000000 -cc23ea15 -ffffffff -19be8a6c -4122e410 -af26df09 -ffffffff -bca937cd -b3e73cba -52df1cb0 -0e8b61f7 -8d47909f -ffffffff -cd977578 -d2eccdf1 -bf2f1a18 -d2eccdf1 -43665d02 -00000000 -bc99a2fd -ffffffff -52e0df3e -50ab8607 -ee365982 -ffffffff -2f073f69 -2d13320e -00000000 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha256sum0-rwp2.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha256sum0-rwp2.reference_output deleted file mode 100644 index 60e9716be..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha256sum0-rwp2.reference_output +++ /dev/null @@ -1,112 +0,0 @@ -924770d3 -08577eb1 -7fce0046 -00000000 -7b89296c -93fdcab8 -712427fc -00000000 -7dc59a3a -d2d6b877 -58ca6155 -00000000 -a749f9c5 -cf84b683 -801852a3 -ffffffff -08ceac39 -854a9657 -194b0958 -00000000 -53e8eb43 -137a9777 -2d4da8d8 -00000000 -ff1e5bef -5c74e45e -59d7d1f5 -00000000 -6b9f15c4 -dc338383 -c8938827 -ffffffff -9a6ab329 -5ae6a228 -551ad9f6 -00000000 -acca7f0d -432779ee -baa3cf23 -ffffffff -2cb7362c -af949e5e -66941880 -00000000 -a96ec2b3 -5cd2875e -44cc357f -00000000 -708cc1b6 -9d02fc90 -a2966dc9 -ffffffff -0b54aa22 -953b00b0 -816df800 -ffffffff -3c53d0e3 -224c0601 -074e9a57 -00000000 -f0e58650 -e8dac663 -98a7a57b -ffffffff -e5f0307e -3d7c95f9 -fa4ad809 -ffffffff -aaac3142 -8c8a18b2 -907b539b -ffffffff -6f9fb997 -785036de -69bacf26 -00000000 -a7298c66 -95a4d257 -6ccec0c9 -00000000 -d814d575 -807da245 -8efe229b -ffffffff -69b1dcbf -3d061437 -f8e5c707 -ffffffff -08208d09 -7f216822 -a8744666 -ffffffff -dae98554 -14b91c79 -ba09e572 -ffffffff -c6880007 -c5ec6148 -d19c2b5b -ffffffff -6a013380 -7213516d -824d1d41 -ffffffff -ae4839a1 -4652f62d -8679fa90 -ffffffff -9e044706 -85986adb -8ea9fb9b -ffffffff diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha256sum1-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha256sum1-01.reference_output deleted file mode 100644 index 31bfb75d1..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha256sum1-01.reference_output +++ /dev/null @@ -1,300 +0,0 @@ -7bbbca92 -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -00000000 -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -00000000 -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -fdefffbf -deadbeef -fef7ffdf -deadbeef -ff7bffef -deadbeef -ffbdfff7 -deadbeef -ffdefffb -deadbeef -ffef7ffd -deadbeef -fff7bffe -deadbeef -7ffbdfff -deadbeef -bffdefff -deadbeef -dffef7ff -deadbeef -efff7bff -deadbeef -f7ffbdff -deadbeef -fbffdeff -deadbeef -fdffef7f -deadbeef -fefff7bf -deadbeef -ff7ffbdf -deadbeef -ffbffdef -deadbeef -ffdffef7 -deadbeef -ffefff7b -deadbeef -fff7ffbd -deadbeef -fffbffde -deadbeef -7ffdffef -deadbeef -bffefff7 -deadbeef -dfff7ffb -deadbeef -efffbffd -deadbeef -f7ffdffe -deadbeef -7bffefff -deadbeef -bdfff7ff -deadbeef -defffbff -deadbeef -ef7ffdff -deadbeef -f7bffeff -deadbeef -fbdfff7f -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -04200080 -deadbeef -e42596b4 -deadbeef -b905e605 -deadbeef -4a7fcb7d -deadbeef -717ad44b -deadbeef -eeb93641 -deadbeef -80d5bee4 -deadbeef -252ab1e6 -deadbeef -5f1f866d -deadbeef -da340807 -deadbeef -672346d3 -deadbeef -ef836ec6 -deadbeef -1c4ac5f3 -deadbeef -ea2343b0 -deadbeef -7027dbe6 -deadbeef -a250576c -deadbeef -ea01cd21 -deadbeef -838da6de -deadbeef -915337db -deadbeef -b8124394 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -02100040 -deadbeef -01080020 -deadbeef -00840010 -deadbeef -00420008 -deadbeef -00210004 -deadbeef -00108002 -deadbeef -00084001 -deadbeef -80042000 -deadbeef -40021000 -deadbeef -20010800 -deadbeef -10008400 -deadbeef -08004200 -deadbeef -04002100 -deadbeef -02001080 -deadbeef -01000840 -deadbeef -00800420 -deadbeef -00400210 -deadbeef -00200108 -deadbeef -00100084 -deadbeef -00080042 -deadbeef -00040021 -deadbeef -80020010 -deadbeef -40010008 -deadbeef -20008004 -deadbeef -10004002 -deadbeef -08002001 -deadbeef -84001000 -deadbeef -42000800 -deadbeef -21000400 -deadbeef -10800200 -deadbeef -08400100 -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha256sum1-rwp1.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha256sum1-rwp1.reference_output deleted file mode 100644 index bdfc4ed37..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha256sum1-rwp1.reference_output +++ /dev/null @@ -1,488 +0,0 @@ -e9ce59bf -9baab409 -2f76df59 -00000000 -54fff635 -93fdcab8 -8476d693 -6c023547 -a70a1c42 -ffffffff -58f5e3bd -00000000 -0dd09a3f -9c55496a -539be7fd -00000000 -cf251169 -93fdcab8 -acf6b0ac -4f0e7329 -dc7e1242 -ffffffff -236049ad -a38b1ba1 -00e1a410 -a38b1ba1 -b2d192a4 -ffffffff -4d2e6d5b -00000000 -53074732 -6fef7bd6 -aca5e4dd -ffffffff -abc440cc -5c74e45e -85d9f49f -f3461900 -011d932e -00000000 -a873519d -5cd2875e -56913d4c -a32d78a1 -d04e30f9 -ffffffff -2fb1cf06 -00000000 -d625f8df -0c6725bc -765e3cb7 -00000000 -1fccff6a -5cd2875f -1515b62e -d5a6539a -f74de364 -ffffffff -12bdd31a -c2836a06 -1a0fcf81 -c2836a06 -f3acbe4a -ffffffff -0c5341b5 -00000000 -d6d5b6ce -26575c5d -885aeb06 -ffffffff -6e4b1b84 -3d7c95f9 -b1a509ca -bd7bb672 -c11445de -ffffffff -a8a59961 -c2f9ebc8 -964e2340 -c2f9ebc8 -4d5a5102 -00000000 -b2a5aefd -ffffffff -41c6b234 -bd83b67d -74d6383e -00000000 -de8814fd -3d061437 -c4490a21 -3441a740 -e7acbdeb -ffffffff -49e4844a -b9ad09d2 -51b7c65e -b9ad09d2 -696fc6c9 -00000000 -96903936 -ffffffff -18496d21 -b866479b -04f4bc15 -00000000 -b33cf5b6 -4652f62d -ee915c98 -58d5d905 -b809db2e -ffffffff -0e62e9aa -f4d1d996 -4994cd7b -f4d1d996 -8829dc08 -ffffffff -77d623f7 -00000000 -0f65a0a0 -5f2a25d6 -26ec2a31 -00000000 -dd575cb5 -0b2e2669 -81fd5f28 -f909502b -b9b85e97 -ffffffff -c6407c7a -efee114b -8007dd12 -efee114b -ebbe96cf -ffffffff -14416930 -00000000 -7dfda0b2 -f92aad54 -21681008 -00000000 -a16032f5 -1011eeb4 -f261884d -c35a255f -0eb3ece9 -00000000 -81bbaa4b -70fc1afc -70f7b95d -8f03e503 -25b16eaa -00000000 -da4e9155 -ffffffff -0c721591 -24a25aa0 -cf1a8e92 -ffffffff -5e22d534 -70fc1afc -121290f0 -bed9e518 -d7027018 -ffffffff -3b302ef4 -8d8bacf8 -13cda113 -8d8bacf8 -88fdc6b9 -ffffffff -77023946 -00000000 -ea532d08 -3f220927 -ab2282a4 -ffffffff -9754e190 -72745307 -d235139a -6e5e995f -029b5f85 -00000000 -04fb5817 -cebe24d9 -f99ff86d -3141db26 -75a57ae2 -00000000 -8a5a851d -ffffffff -dab51b9a -6f9ee25f -42bc4fa0 -00000000 -491c5732 -cebe24d9 -d295e997 -7a9113e5 -2744cef2 -00000000 -0ee699ad -ab8534c1 -d65da8a0 -547acb3e -b997ed7c -ffffffff -46681283 -00000000 -24da1627 -7c995be6 -357ce088 -00000000 -5f1f37e7 -ab8534c1 -e49adff7 -990c7a8f -6c0103d6 -00000000 -cc8a8725 -01fbbe93 -5f747b0c -fe04416c -eacbb94c -ffffffff -153446b3 -00000000 -e49cdff7 -9af382af -6f011b16 -00000000 -0f8ca009 -01fbbe94 -52135d56 -2de37f54 -fa2ca437 -ffffffff -a61b20ad -8b0a522a -a3c87b65 -8b0a522a -1e06ea33 -00000000 -e1f915cc -ffffffff -6a5c5e66 -ce0c8056 -7b4b09c7 -00000000 -d7828e61 -74f5add5 -c3e3c21c -d0bc9a3a -c176fd11 -ffffffff -bb6bcedb -69ae119a -85e2cc35 -69ae119a -a1c12dab -ffffffff -5e3ed254 -00000000 -341c25a0 -dd3f62c5 -3ac42308 -00000000 -b4e156d2 -9651ee65 -2dc51a2a -072cdbff -0f7fb9dd -00000000 -4739f828 -9b11d383 -b7b9be0a -64ee2c7c -37571494 -00000000 -c8a8eb6b -ffffffff -adc99dd4 -374edbff -0cec7512 -00000000 -5532b707 -9b11d383 -74bd2e93 -971acc3b -c12b2aa5 -ffffffff -227d7839 -6cfe896f -1ca9ad63 -6cfe896f -74c7820e -00000000 -8b387df1 -ffffffff -7b41ceab -971d313c -d8653abe -ffffffff -bbbb8d5a -93017690 -f7f576a7 -2ab7ea92 -b19a788f -ffffffff -9a78a046 -3a2f646b -d41d2736 -3a2f646b -33196c52 -00000000 -cce693ad -ffffffff -07fa8737 -b5380c9b -c7bc8ecf -ffffffff -f39f6798 -c5d09b93 -b287d885 -6d8e7a4d -45900d40 -00000000 -74500830 -18d71be4 -ce3ffa8f -e728e41b -713c7ff2 -00000000 -8ec3800d -ffffffff -b507e365 -8e307d8d -79930dab -00000000 -ab53131b -18d71be4 -51704b2a -a57f8862 -742a7a0d -00000000 -796f46d2 -2a5dc0a0 -f2bac320 -d5a23f5f -bab52c2d -ffffffff -454ad3d2 -00000000 -697ab4d4 -b9800962 -7672afb1 -00000000 -83b7ec90 -2a5dc0a0 -9b07ed10 -afb2f00c -6389f704 -00000000 -3be1e75f -c2713ce2 -a797efa4 -3d8ec31d -adfd7f10 -ffffffff -520280ef -00000000 -1bd80da6 -303509d1 -c0aac83a -ffffffff -1912d895 -c2713ce2 -5ce4e7ad -7a9113c2 -32abd9ac -00000000 -b73e512d -9ea76f08 -7a6a777e -615890f7 -231d5bae -00000000 -dce2a451 -ffffffff -5f06f7ad -82ddebd3 -c3ac2daf -ffffffff -4941b630 -9ea76f08 -939e1ac3 -24eeb7cf -99316a61 -ffffffff -9f9fab31 -ecd58e89 -f9513eaf -ecd58e89 -c2853921 -ffffffff -3d7ac6de -00000000 -9bdf9ce3 -4aef382f -fdd2744d -ffffffff -0481359d -132a7176 -f9da381e -374b8630 -95245cdb -ffffffff -4732b273 -cc679c3b -2de91157 -cc679c3b -82dab2f1 -ffffffff -7d254d0e -00000000 -fde3c55e -386c49b8 -21ca9c13 -00000000 -f3e18abb -339863c4 -fdbc23ec -fb24d57d -1078b175 -00000000 -ead1c810 -2d885062 -0556869a -d277af9d -1016bdc8 -00000000 -efe94237 -ffffffff -01bed3ee -0434d582 -1aaf3b95 -00000000 -1558b4fa -2d885063 -01be696c -3edc9bee -42b27868 -00000000 -4f3020ac -b3e73cbb -f27da73b -4c18c344 -366424d1 -00000000 -c99bdb2e -ffffffff -19be8a6c -4122e410 -22a0fbf4 -00000000 -302354b8 -b3e73cbb -52df1cb0 -0e8b61f7 -38cf7fb8 -00000000 -781f9a5f -2d13320e -bf2f1a18 -d2eccdf1 -b66655d4 -ffffffff -4999aa2b -00000000 -52e0df3e -50ab8607 -6eee404e -00000000 -afbf2635 -2d13320e -00000000 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha256sum1-rwp2.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha256sum1-rwp2.reference_output deleted file mode 100644 index 108a3fa92..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha256sum1-rwp2.reference_output +++ /dev/null @@ -1,112 +0,0 @@ -924770d3 -08577eb1 -77833ce4 -00000000 -7b89296c -93fdcab8 -58f5e3bd -00000000 -7dc59a3a -d2d6b877 -4c75b3e5 -00000000 -a749f9c5 -cf84b683 -8ad52c0b -ffffffff -08ceac39 -854a9657 -04543fe1 -00000000 -53e8eb43 -137a9777 -91507f19 -ffffffff -ff1e5bef -5c74e45e -4d2e6d5b -00000000 -6b9f15c4 -dc338383 -66a9ed80 -00000000 -9a6ab329 -5ae6a228 -f6037357 -ffffffff -acca7f0d -432779ee -b2393665 -ffffffff -2cb7362c -af949e5e -2eac5c28 -00000000 -a96ec2b3 -5cd2875e -2fb1cf06 -00000000 -708cc1b6 -9d02fc90 -a96cf9a6 -ffffffff -0b54aa22 -953b00b0 -66392938 -00000000 -3c53d0e3 -224c0601 -b97eb4a7 -ffffffff -f0e58650 -e8dac663 -fb1ea2d1 -ffffffff -e5f0307e -3d7c95f9 -0c5341b5 -00000000 -aaac3142 -8c8a18b2 -74e74416 -00000000 -6f9fb997 -785036de -a08f46a6 -ffffffff -a7298c66 -95a4d257 -828e7053 -ffffffff -d814d575 -807da245 -73b1eb23 -00000000 -69b1dcbf -3d061437 -b2a5aefd -ffffffff -08208d09 -7f216822 -954702a1 -ffffffff -dae98554 -14b91c79 -8d325148 -ffffffff -c6880007 -c5ec6148 -5be2f2e3 -00000000 -6a013380 -7213516d -713c84dd -00000000 -ae4839a1 -4652f62d -96903936 -ffffffff -9e044706 -85986adb -f88852db -ffffffff diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha512sig0-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha512sig0-01.reference_output deleted file mode 100644 index 2e23842f8..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha512sig0-01.reference_output +++ /dev/null @@ -1,300 +0,0 @@ -47ca95f4 -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -00000000 -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -00000000 -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -7fffffff -deadbeef -3fffffff -deadbeef -9fffffff -deadbeef -cfffffff -deadbeef -e7ffffff -deadbeef -f3ffffff -deadbeef -f9ffffff -deadbeef -7cffffff -deadbeef -be7fffff -deadbeef -df3fffff -deadbeef -ef9fffff -deadbeef -f7cfffff -deadbeef -fbe7ffff -deadbeef -fdf3ffff -deadbeef -fef9ffff -deadbeef -ff7cffff -deadbeef -ffbe7fff -deadbeef -ffdf3fff -deadbeef -ffef9fff -deadbeef -fff7cfff -deadbeef -fffbe7ff -deadbeef -fffdf3ff -deadbeef -fffef9ff -deadbeef -ffff7cff -deadbeef -ffffbe7f -deadbeef -ffffdf3f -deadbeef -ffffef9f -deadbeef -fffff7cf -deadbeef -fffffbe7 -deadbeef -fffffdf3 -deadbeef -fffffef9 -deadbeef -ffffff7c -deadbeef -ffffffbe -deadbeef -ffffffdf -deadbeef -ffffffef -deadbeef -fffffff7 -deadbeef -fffffffb -deadbeef -fffffffd -deadbeef -fffffffe -deadbeef -ffffffff -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -6aa6b917 -deadbeef -c12d1d19 -deadbeef -f5fdadd9 -deadbeef -cda158a8 -deadbeef -32cc9477 -deadbeef -1d1ff87b -deadbeef -98c6ebc8 -deadbeef -93bb6872 -deadbeef -0e5d7fcc -deadbeef -6c358f6c -deadbeef -ba3ec29c -deadbeef -9e56421c -deadbeef -b5bdf6c8 -deadbeef -8173288e -deadbeef -b2e37615 -deadbeef -2603ce57 -deadbeef -aa2f4efa -deadbeef -2cc1a620 -deadbeef -d8c506f7 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -80000000 -deadbeef -c0000000 -deadbeef -60000000 -deadbeef -30000000 -deadbeef -18000000 -deadbeef -0c000000 -deadbeef -06000000 -deadbeef -83000000 -deadbeef -41800000 -deadbeef -20c00000 -deadbeef -10600000 -deadbeef -08300000 -deadbeef -04180000 -deadbeef -020c0000 -deadbeef -01060000 -deadbeef -00830000 -deadbeef -00418000 -deadbeef -0020c000 -deadbeef -00106000 -deadbeef -00083000 -deadbeef -00041800 -deadbeef -00020c00 -deadbeef -00010600 -deadbeef -00008300 -deadbeef -00004180 -deadbeef -000020c0 -deadbeef -00001060 -deadbeef -00000830 -deadbeef -00000418 -deadbeef -0000020c -deadbeef -00000106 -deadbeef -00000083 -deadbeef -00000041 -deadbeef -00000020 -deadbeef -00000010 -deadbeef -00000008 -deadbeef -00000004 -deadbeef -00000002 -deadbeef -00000001 -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha512sig0-rwp1.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha512sig0-rwp1.reference_output deleted file mode 100644 index f0f3c9404..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha512sig0-rwp1.reference_output +++ /dev/null @@ -1,488 +0,0 @@ -e9ce59bf -9baab409 -eedd7e35 -7379a5d8 -95545759 -e0846f60 -8476d693 -6c023547 -0ab7f032 -25b51cfc -f5480fcd -da4ae303 -0dd09a3f -9c55496a -b8fe3cb1 -f08e5b6e -3487661d -848c2627 -acf6b0ac -4f0e7329 -ac8e4387 -8b562b01 -53901868 -d722cf5f -00e1a410 -a38b1ba1 -6371f0e4 -402110fc -9c8e0f1b -bfdeef03 -53074732 -6fef7bd6 -5376aa50 -05478c67 -5295063f -61bc70c6 -85d9f49f -f3461900 -43629052 -67b6c6ab -ea0c52e1 -3b6441f5 -56913d4c -a32d78a1 -48b32de1 -1c73cbd9 -b74cd21e -e38c3426 -d625f8df -0c6725bc -ae689266 -59273bb0 -57d75519 -b5f9c30f -1515b62e -d5a6539a -a4b5e5cd -45adc339 -4145d5b3 -78d156c0 -1a0fcf81 -c2836a06 -0729f790 -610630bd -f8d6086f -9ef9cf42 -d6d5b6ce -26575c5d -0d11a5bc -dd4157ca -f301d63a -1abdedc3 -b1a509ca -bd7bb672 -cf006bff -957a57e3 -a6b1b740 -a87c43d4 -964e2340 -c2f9ebc8 -129dc3c5 -203bffd8 -ed623c3a -dfc40027 -41c6b234 -bd83b67d -272112cc -6b075fe4 -90d2ef8b -a80d741b -c4490a21 -3441a740 -a3685e0e -bb7c1149 -0d2067af -fd2ee764 -51b7c65e -b9ad09d2 -5e293b65 -031c73f3 -a1d6c49a -fce38c0c -18496d21 -b866479b -210c6d27 -fcfb8905 -cf54a6c8 -434e7f32 -ee915c98 -58d5d905 -f97b1da9 -b48392e9 -4f102f2d -bfadb480 -4994cd7b -f4d1d996 -9e10dbea -80759ea1 -61ef2415 -7f8a615e -0f65a0a0 -5f2a25d6 -7da37eb1 -8f746c85 -340eb135 -9aa292ef -81fd5f28 -f909502b -bc7ca875 -558fb3e5 -c3848a98 -459e5d51 -8007dd12 -efee114b -1c83e6ee -64c73a96 -e37c1911 -9b38c569 -7dfda0b2 -f92aad54 -c278d6b8 -cf9e295d -4270f9a5 -dfb01812 -f261884d -c35a255f -192666be -ade8fcc0 -962e201c -dd14e63c -70f7b95d -8f03e503 -bdeac465 -9b10f6ae -42153b9a -64ef0951 -0c721591 -24a25aa0 -e62d9cf6 -033ccbbf -7535e398 -7438e6bc -121290f0 -bed9e518 -213f7fc9 -aeaf98a3 -cd0d2125 -dcdbcba4 -13cda113 -8d8bacf8 -01d2866a -d4534a89 -fe2d7995 -2bacb576 -ea532d08 -3f220927 -9d1763f3 -17d06288 -8949c2df -8a44b590 -d235139a -6e5e995f -096cd6f9 -ad9daf04 -0f0cd16b -63238bdd -f99ff86d -3141db26 -17c55c3e -f5f32ffe -e83aa3c1 -0a0cd001 -dab51b9a -6f9ee25f -0d3552e1 -ad7fd209 -13955a73 -7c3df6e2 -d295e997 -7a9113e5 -c73d4af1 -2ac73ac6 -ee9f1dae -81420e07 -d65da8a0 -547acb3e -285432a9 -8ac1eac2 -d7abcd56 -753e153d -24da1627 -7c995be6 -38006529 -99c9061f -61a2bc88 -454e3ae0 -e49adff7 -990c7a8f -6260c09b -3a2d29c8 -c2eb4468 -3bd6975b -5f747b0c -fe04416c -9b5ba10b -72002c75 -64a45ef4 -8dffd38a -e49cdff7 -9af382af -0263ca9b -3bd6d5d0 -a2ef4f8e -3dd29463 -52135d56 -2de37f54 -d5ff9b4c -40879a2b -89c81fd6 -347237fe -a3c87b65 -8b0a522a -2e00653f -a11837e3 -d1ff9ac0 -5ee7c81c -6a5c5e66 -ce0c8056 -cf90cbd1 -005455ab -2bc8506b -754a0381 -c3e3c21c -d0bc9a3a -2eb5c548 -752f88b3 -54a8f682 -e37e66d6 -85e2cc35 -69ae119a -ed7f414e -816dfaff -1280beb1 -7e920500 -341c25a0 -dd3f62c5 -d55236be -cff8f0c5 -4f6f6a88 -664adf2b -2dc51a2a -072cdbff -9794c23b -299f1893 -dfd283ce -b28ecb10 -b7b9be0a -64ee2c7c -de0415c7 -38da244a -21fbea38 -c725dbb5 -adc99dd4 -374edbff -d612944c -cffebe93 -1e58d641 -6b109217 -74bd2e93 -971acc3b -f7c3503a -59344949 -149502a6 -ca353fd9 -1ca9ad63 -6cfe896f -3f712c46 -d5ca472c -c08ed3b9 -2a35b8d3 -7b41ceab -971d313c -792d2506 -6137bfcd -5c8377a2 -f439365e -f7f576a7 -2ab7ea92 -cce2a4c8 -32242d76 -e7007c01 -f7f4b6e2 -d41d2736 -3a2f646b -5672b4f2 -2b59c399 -a98d4b0d -d4a63c66 -07fa8737 -b5380c9b -2ef54c12 -ec434e58 -5ad824db -b213e9ec -b287d885 -6d8e7a4d -0f94642b -3371afa8 -3e54615b -2ba6b44c -ce3ffa8f -e728e41b -cb4dbd48 -7dbd0b21 -34b242b7 -8242f4de -b507e365 -8e307d8d -4c5cf997 -a38a6e40 -7e1cff07 -bc618a24 -51704b2a -a57f8862 -8e4bb548 -795044a9 -830e8997 -530d8409 -f2bac320 -d5a23f5f -194aaed5 -4baff9ee -e6b5512a -b4500611 -697ab4d4 -b9800962 -9206d5b7 -890a84aa -9f4c1296 -b368454a -9b07ed10 -afb2f00c -582efebf -4629af16 -0046eee4 -845893f4 -a797efa4 -3d8ec31d -f5234fe2 -ba81f2cb -0adcb01d -457e0d34 -1bd80da6 -303509d1 -fec06ec5 -be4adbf2 -57287f20 -80bc18d5 -5ce4e7ad -7a9113c2 -68975efe -10c73ad5 -ed02d67f -8e6055dd -7a6a777e -615890f7 -a4bb8526 -4e0fa1ca -5b447ad9 -b1f05e35 -5f06f7ad -82ddebd3 -da6270ce -6de993d5 -5ff7f94f -0c9102de -939e1ac3 -24eeb7cf -997baf4e -511a683f -9fd56e1e -42301949 -f9513eaf -ecd58e89 -66a36c14 -585fb9d7 -995c93eb -a7a04628 -9bdf9ce3 -4aef382f -bd43aed4 -46a8ad5f -c3f27024 -59d31ed5 -f9da381e -374b8630 -2de77247 -05fc1f92 -fff19cef -36647c56 -2de91157 -cc679c3b -db82b398 -b06766b9 -247d4c67 -4f989946 -fde3c55e -386c49b8 -b7f7c6e0 -427e9006 -8a0eb588 -7616f3cb -fdbc23ec -fb24d57d -78d8d592 -909f07c1 -8271acf7 -bd1757a3 -0556869a -d277af9d -25a4b8c6 -f24d4f3e -da5b4739 -0db2b0c1 -01bed3ee -0434d582 -86ddaa83 -ec1637bf -818723e8 -199e8822 -01be696c -3edc9bee -32ddf60d -732d285b -3f5faec9 -c0ca14e0 -f27da73b -4c18c344 -b4285574 -9dd848e7 -4bd7aa8b -6227b718 -19be8a6c -4122e410 -3cf586a8 -4c521524 -4a77df6c -003951df -52df1cb0 -0e8b61f7 -b098ef7d -b7562d59 -f0480a9a -9a451f57 -bf2f1a18 -d2eccdf1 -cd56fc22 -700153ae -32a903dd -8ffeac51 -52e0df3e -50ab8607 -a0874efe -16a43f89 -e15834e5 -43b77197 -00000000 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha512sig0-rwp2.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha512sig0-rwp2.reference_output deleted file mode 100644 index 09ad2424d..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha512sig0-rwp2.reference_output +++ /dev/null @@ -1,112 +0,0 @@ -924770d3 -08577eb1 -1b9571f8 -573346db -7b89296c -93fdcab8 -f5480fcd -244ae303 -7dc59a3a -d2d6b877 -276483b3 -521c27f3 -a749f9c5 -cf84b683 -574d26e8 -2392d69a -08ceac39 -854a9657 -7d7e05e8 -fa2a9491 -53e8eb43 -137a9777 -30004c9c -ca88c402 -ff1e5bef -5c74e45e -9c8e0f1b -41deef03 -6b9f15c4 -dc338383 -30732bdc -ab7d9545 -9a6ab329 -5ae6a228 -349be641 -849c7af2 -acca7f0d -432779ee -65906107 -ac56d57d -2cb7362c -af949e5e -f42e424c -7a3af28d -a96ec2b3 -5cd2875e -b74cd21e -1d8c3426 -708cc1b6 -9d02fc90 -88d7f599 -f926794d -0b54aa22 -953b00b0 -d5b7a8ef -6922cd59 -3c53d0e3 -224c0601 -9d6d1c00 -7240d70a -f0e58650 -e8dac663 -5c63eda2 -25540c7b -e5f0307e -3d7c95f9 -f8d6086f -60f9cf42 -aaac3142 -8c8a18b2 -82a9ecf2 -05d09270 -6f9fb997 -785036de -557f7c01 -2ba0eb34 -a7298c66 -95a4d257 -2b7dbca7 -2d6c845d -d814d575 -807da245 -226257c5 -b4be57c4 -69b1dcbf -3d061437 -ed623c3a -21c40027 -08208d09 -7f216822 -62082713 -b611d7a9 -dae98554 -14b91c79 -671bf825 -5e614518 -c6880007 -c5ec6148 -ba0f9803 -e4b80407 -6a013380 -7213516d -02be9a94 -b99f9d45 -ae4839a1 -4652f62d -a1d6c49a -02e38c0c -9e044706 -85986adb -a3a02f4a -45429dd2 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha512sig1-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha512sig1-01.reference_output deleted file mode 100644 index c15d4a2ba..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha512sig1-01.reference_output +++ /dev/null @@ -1,300 +0,0 @@ -9377ea60 -deadbeef -fffffffb -deadbeef -fffffffd -deadbeef -fffffffe -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -00000000 -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -7fffffff -deadbeef -bfffffff -deadbeef -dfffffff -deadbeef -efffffff -deadbeef -f7ffffff -deadbeef -fbffffff -deadbeef -fdffffff -deadbeef -feffffff -deadbeef -ff7fffff -deadbeef -ffbfffff -deadbeef -ffdfffff -deadbeef -ffefffff -deadbeef -fff7ffff -deadbeef -00000000 -deadbeef -bffdffff -deadbeef -dffeffff -deadbeef -efff7fff -deadbeef -f7ffbfff -deadbeef -fbffdfff -deadbeef -fdffefff -deadbeef -fefff7ff -deadbeef -ff7ffbff -deadbeef -7fbffdff -deadbeef -bfdffeff -deadbeef -dfefff7f -deadbeef -eff7ffbf -deadbeef -f7fbffdf -deadbeef -fbfdffef -deadbeef -fdfefff7 -deadbeef -feff7ffb -deadbeef -ff7fbffd -deadbeef -ffbfdffe -deadbeef -ffdfefff -deadbeef -ffeff7ff -deadbeef -fff7fbff -deadbeef -fffbfdff -deadbeef -fffdfeff -deadbeef -fffeff7f -deadbeef -ffff7fbf -deadbeef -ffffbfdf -deadbeef -ffffdfef -deadbeef -ffffeff7 -deadbeef -fffff7fb -deadbeef -fffffbfd -deadbeef -fffffdfe -deadbeef -fffffeff -deadbeef -ffffff7f -deadbeef -ffffffbf -deadbeef -ffffffdf -deadbeef -ffffffef -deadbeef -fffffff7 -deadbeef -00000004 -deadbeef -00000002 -deadbeef -00000001 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -80000000 -deadbeef -40000000 -deadbeef -20000000 -deadbeef -10000000 -deadbeef -08000000 -deadbeef -04000000 -deadbeef -02000000 -deadbeef -00000008 -deadbeef -376426cd -deadbeef -8f93e17a -deadbeef -0bf6ba17 -deadbeef -309c7a37 -deadbeef -ce9a33cd -deadbeef -519fbeb1 -deadbeef -3e47fdec -deadbeef -1c544101 -deadbeef -a37a4913 -deadbeef -81fb5a6e -deadbeef -44876213 -deadbeef -f8cf163e -deadbeef -ff371c19 -deadbeef -1d81f5c9 -deadbeef -4358854e -deadbeef -1d5cb915 -deadbeef -8d7db2fe -deadbeef -840a59d7 -deadbeef -5c1cbaef -deadbeef -01000000 -deadbeef -00800000 -deadbeef -00400000 -deadbeef -00200000 -deadbeef -00100000 -deadbeef -00080000 -deadbeef -80040000 -deadbeef -40020000 -deadbeef -20010000 -deadbeef -10008000 -deadbeef -08004000 -deadbeef -04002000 -deadbeef -02001000 -deadbeef -01000800 -deadbeef -00800400 -deadbeef -80400200 -deadbeef -40200100 -deadbeef -20100080 -deadbeef -10080040 -deadbeef -08040020 -deadbeef -04020010 -deadbeef -02010008 -deadbeef -01008004 -deadbeef -00804002 -deadbeef -00402001 -deadbeef -00201000 -deadbeef -00100800 -deadbeef -00080400 -deadbeef -00040200 -deadbeef -00020100 -deadbeef -00010080 -deadbeef -00008040 -deadbeef -00004020 -deadbeef -00002010 -deadbeef -00001008 -deadbeef -00000804 -deadbeef -00000402 -deadbeef -00000201 -deadbeef -00000100 -deadbeef -00000080 -deadbeef -00000040 -deadbeef -00000020 -deadbeef -00000010 -deadbeef -ffffffff -deadbeef -7ffbffff -deadbeef diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha512sig1-rwp1.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha512sig1-rwp1.reference_output deleted file mode 100644 index c17e70d52..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha512sig1-rwp1.reference_output +++ /dev/null @@ -1,488 +0,0 @@ -e9ce59bf -9baab409 -3f54c9a3 -140cf9ea -44dde0cf -87f13352 -8476d693 -6c023547 -7b0f9f4f -bb73cf69 -84f060b0 -448c3096 -0dd09a3f -9c55496a -6f9ed22e -f39cedff -eb27fb9a -879ab8b7 -acf6b0ac -4f0e7329 -0f636a3e -af5a2960 -f07d31d1 -f32ecd3e -00e1a410 -a38b1ba1 -e07a8609 -2a54e517 -1f8579f6 -d5ab1ae8 -53074732 -6fef7bd6 -2e0ceeef -96222ea0 -2d2b4ade -f29712ff -85d9f49f -f3461900 -eff8d396 -a76e2e08 -46961125 -fbbca956 -56913d4c -a32d78a1 -9ec78442 -3c4ee48d -61387bbd -c3b11b72 -d625f8df -0c6725bc -a6c0cbdf -dc1350fc -502f8e92 -38e5d85b -1515b62e -d5a6539a -0a8aa50c -18a1df2a -ef7a9572 -25dd4ad3 -1a0fcf81 -c2836a06 -a5568071 -eee165c8 -5aa97f8e -111e9a37 -d6d5b6ce -26575c5d -2a7d5a70 -84fa7b55 -106d8aee -c277114f -b1a509ca -bd7bb672 -31208c46 -48110ae3 -589150f9 -75171ed4 -964e2340 -c2f9ebc8 -ad513042 -d0aca1b4 -52aecfbd -2f535e4b -41c6b234 -bd83b67d -8dfd2355 -38ad2a83 -f7af0014 -75b33eba -c4490a21 -3441a740 -15b16da8 -83981a13 -bbf95409 -c5caec3e -51b7c65e -b9ad09d2 -65c2a7da -37452d80 -9a3d5825 -c8bad27f -18496d21 -b866479b -66d92fb0 -ec7792ca -15216951 -32ca88f8 -ee915c98 -58d5d905 -d8101c62 -ec5e9451 -6e7b2ee6 -e770b238 -4994cd7b -f4d1d996 -2eb2f1d8 -3cf2f54e -d14d0e27 -c30d0ab1 -0f65a0a0 -5f2a25d6 -67aa526c -4c398dc2 -1e1584f0 -5767b42c -81fd5f28 -f909502b -8be87c04 -604bbb3d -f4105ee9 -705a5589 -8007dd12 -efee114b -ec1787e3 -876d6fe4 -13e8781c -7892901b -7dfda0b2 -f92aad54 -ebb07caa -7ea79f33 -6ba89f97 -8eb98de8 -f261884d -c35a255f -a86e3a03 -28d5fa01 -27667ca1 -5829e0fd -70f7b95d -8f03e503 -f6de7a17 -8d08966f -092185e8 -72f76990 -0c721591 -24a25aa0 -a8f56551 -673278fe -37fdabf3 -d82e93fb -121290f0 -bed9e518 -cc7fcf84 -a62a588f -204d9168 -d45e0b88 -13cda113 -8d8bacf8 -0bbd3c61 -da4938c2 -f442c39e -25b6c73d -ea532d08 -3f220927 -8c14d9bf -9c4dc6ff -784738ab -0ec21a07 -d235139a -6e5e995f -3dcbb2db -d13efd50 -3babb549 -1f80d989 -f99ff86d -3141db26 -6c7d63bb -75c67873 -93829c44 -8a39878c -dab51b9a -6f9ee25f -7689f3eb -de3a2484 -7ce9fb7d -acf8495d -d295e997 -7a9113e5 -2199a14f -68503433 -083bf610 -c3d500f2 -d65da8a0 -547acb3e -10d3e96b -1793b855 -ef2c1694 -e86c47aa -24da1627 -7c995be6 -953f1df8 -a7fc55cd -bee17557 -53818a8e -e49adff7 -990c7a8f -94156850 -91f916b4 -349eeca3 -9002a827 -5f747b0c -fe04416c -c2f38265 -7cbb85a7 -3d0c7d9a -83447a58 -e49cdff7 -9af382af -eb217050 -4e09282b -8bacf543 -5004e6bf -52135d56 -2de37f54 -ae382d86 -0406b2e3 -f20fa91c -70f31f36 -a3c87b65 -8b0a522a -fe89aeb8 -5512097c -01765147 -aaedf683 -6a5c5e66 -ce0c8056 -9b414f04 -f890e973 -f778d39e -6d869748 -c3e3c21c -d0bc9a3a -6756c792 -fee5b9a9 -1d4bf458 -68b457cc -85e2cc35 -69ae119a -8732ba27 -155099a7 -78cd45d8 -eaaf6658 -341c25a0 -dd3f62c5 -5869fb13 -6e3bf005 -d2872edd -048dde6a -2dc51a2a -072cdbff -09e02080 -9a3f2c73 -41a66175 -012efff0 -b7b9be0a -64ee2c7c -8a9c805c -112397c9 -75637fa3 -eedc6836 -adc99dd4 -374edbff -4b843d6f -8911627b -93ca7f64 -242335fe -74bd2e93 -971acc3b -11bceeb1 -1f587808 -f2eabc2d -8c590e98 -1ca9ad63 -6cfe896f -88122e3b -53ebdcc2 -77edd1c4 -ac14233d -7b41ceab -971d313c -8dc4fd0e -83608fc4 -711b4faa -16620655 -f7f576a7 -2ab7ea92 -09263e1d -fbc16e6b -22c4e6d4 -3e11f5ff -d41d2736 -3a2f646b -e33437ae -7575598a -1ccbc851 -8a8aa675 -07fa8737 -b5380c9b -5258b35e -fbf2724d -7e3b8c27 -c1c30de1 -b287d885 -6d8e7a4d -6dbd6d19 -96d54635 -5c7d6869 -8e025dd1 -ce3ffa8f -e728e41b -02445252 -c58a7fab -fdbbadad -3a758054 -b507e365 -8e307d8d -915ab201 -8fd79c5d -c31ab771 -a8aeb841 -51704b2a -a57f8862 -f3cbd257 -200ce99c -fe8eee88 -0a51293c -f2bac320 -d5a23f5f -adf70c5d -f62368b6 -5208f3a2 -09dc9749 -697ab4d4 -b9800962 -c35c0159 -987cdc06 -d0a13e38 -c2da9ca6 -9b07ed10 -afb2f00c -b452e451 -828b5e52 -ec3af40a -40fa62b0 -a797efa4 -3d8ec31d -9242966d -1174a450 -6dbd6992 -ee8b5baf -1bd80da6 -303509d1 -3b952e7c -80dc5ca9 -93fd3ed7 -434d998b -5ce4e7ad -7a9113c2 -cc2ce569 -4997750f -49b96de8 -d7301a07 -7a6a777e -615890f7 -1ca4fd63 -45ae29d3 -e35b029c -ba51d62c -5f06f7ad -82ddebd3 -0831cd52 -ca11996e -8dc755d3 -68b90876 -939e1ac3 -24eeb7cf -74475c01 -e4be603e -72e99d51 -f7941148 -f9513eaf -ecd58e89 -5cbd8eaf -42cadfef -a3427150 -bd352010 -9bdf9ce3 -4aef382f -87966a12 -a5ce14c1 -8e452b62 -b8f88637 -f9da381e -374b8630 -7df0b72a -fd82d976 -afe65982 -ce1abab2 -2de91157 -cc679c3b -70784b46 -42278625 -8f87b4b9 -bdd879da -fde3c55e -386c49b8 -85deba58 -bb283bec -57f5a900 -eec09fb1 -fdbc23ec -fb24d57d -80b8505f -5eb7a7de -7a11293a -733ff7bc -0556869a -d277af9d -ab52ce66 -4027f818 -54ad3199 -bfd807e7 -01bed3ee -0434d582 -9f402408 -fbcbbfc0 -99e99d6d -29541023 -01be696c -3edc9bee -268872f3 -3b322ac4 -2b0a2a37 -88d5167f -f27da73b -4c18c344 -984c5109 -d51110a9 -67b3aef6 -2aeeef56 -19be8a6c -4122e410 -d110aa7c -d95e2334 -de930340 -8d455fef -52df1cb0 -0e8b61f7 -278d73a9 -97f723ec -675d964e -bae411e2 -bf2f1a18 -d2eccdf1 -a63a5b4b -776ec6e7 -59c5a4b4 -88913918 -52e0df3e -50ab8607 -fa8d90d2 -9ff95437 -3b5e76b9 -cd0c8646 -00000000 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha512sig1-rwp2.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha512sig1-rwp2.reference_output deleted file mode 100644 index ed8dae98d..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha512sig1-rwp2.reference_output +++ /dev/null @@ -1,112 +0,0 @@ -924770d3 -08577eb1 -bba4a913 -ac80c97c -7b89296c -93fdcab8 -84f060b0 -b88c3096 -7dc59a3a -d2d6b877 -e4d52806 -26b9c300 -a749f9c5 -cf84b683 -a2029d20 -40231f37 -08ceac39 -854a9657 -489cba65 -fdc6a848 -53e8eb43 -137a9777 -10e613c8 -86f13388 -ff1e5bef -5c74e45e -1f8579f6 -29ab1ae8 -6b9f15c4 -dc338383 -2126bf02 -00544993 -9a6ab329 -5ae6a228 -a57920cb -803ba090 -acca7f0d -432779ee -33dd040f -57d6faf6 -2cb7362c -af949e5e -8ec0a82b -98df357a -a96ec2b3 -5cd2875e -61387bbd -3fb11b72 -708cc1b6 -9d02fc90 -9a3630a3 -72553cd1 -0b54aa22 -953b00b0 -fa9e02d6 -3ec8bb25 -3c53d0e3 -224c0601 -66afefd0 -68f56458 -f0e58650 -e8dac663 -5023da82 -f5bf451d -e5f0307e -3d7c95f9 -5aa97f8e -ed1e9a37 -aaac3142 -8c8a18b2 -dcdd6f84 -e04abc66 -6f9fb997 -785036de -03987fae -34521922 -a7298c66 -95a4d257 -fd9a31e0 -9efcd340 -d814d575 -807da245 -638e43fb -9b4254a8 -69b1dcbf -3d061437 -52aecfbd -d3535e4b -08208d09 -7f216822 -e420ab7b -e956eb54 -dae98554 -14b91c79 -13a8b7e8 -95308528 -c6880007 -c5ec6148 -9b7338ef -2c74437e -6a013380 -7213516d -8f8c358d -b722c86c -ae4839a1 -4652f62d -9a3d5825 -34bad27f -9e044706 -85986adb -93015ae8 -a635e7c4 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha512sum0-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha512sum0-01.reference_output deleted file mode 100644 index c59a6d5e9..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha512sum0-01.reference_output +++ /dev/null @@ -1,300 +0,0 @@ -a1b97705 -deadbeef -deffffff -deadbeef -ef7fffff -deadbeef -f7bfffff -deadbeef -fbdfffff -deadbeef -7defffff -deadbeef -00000000 -deadbeef -df7bffff -deadbeef -00000000 -deadbeef -f7deffff -deadbeef -fbef7fff -deadbeef -fdf7bfff -deadbeef -fefbdfff -deadbeef -ff7defff -deadbeef -ffbef7ff -deadbeef -ffdf7bff -deadbeef -ffefbdff -deadbeef -fff7deff -deadbeef -fffbef7f -deadbeef -fffdf7bf -deadbeef -fffefbdf -deadbeef -ffff7def -deadbeef -ffffbef7 -deadbeef -ffffdf7b -deadbeef -ffffefbd -deadbeef -fffff7de -deadbeef -fffffbef -deadbeef -fffffdf7 -deadbeef -fffffefb -deadbeef -ffffff7d -deadbeef -ffffffbe -deadbeef -ffffffdf -deadbeef -ffffffef -deadbeef -fffffff7 -deadbeef -fffffffb -deadbeef -fffffffd -deadbeef -fffffffe -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -7fffffff -deadbeef -bfffffff -deadbeef -dfffffff -deadbeef -efffffff -deadbeef -f7ffffff -deadbeef -7bffffff -deadbeef -bdffffff -deadbeef -21000000 -deadbeef -10800000 -deadbeef -08400000 -deadbeef -04200000 -deadbeef -82100000 -deadbeef -41080000 -deadbeef -20840000 -deadbeef -10420000 -deadbeef -08210000 -deadbeef -04108000 -deadbeef -02084000 -deadbeef -01042000 -deadbeef -00821000 -deadbeef -00410800 -deadbeef -00208400 -deadbeef -00104200 -deadbeef -00082100 -deadbeef -00041080 -deadbeef -00020840 -deadbeef -00010420 -deadbeef -42000000 -deadbeef -9744a800 -deadbeef -54f7c10c -deadbeef -48d3bc1a -deadbeef -e31347e2 -deadbeef -37751014 -deadbeef -4d08ff8f -deadbeef -99f78a7d -deadbeef -fd4ed591 -deadbeef -ff87917f -deadbeef -cd628435 -deadbeef -eae976b1 -deadbeef -495ae9a4 -deadbeef -7a3cdd02 -deadbeef -41cc1db9 -deadbeef -1fc915fb -deadbeef -84d2ba06 -deadbeef -d0ec6cee -deadbeef -e8a9019a -deadbeef -c7ff47bb -deadbeef -00008210 -deadbeef -00004108 -deadbeef -00002084 -deadbeef -00001042 -deadbeef -00000821 -deadbeef -00000410 -deadbeef -00000208 -deadbeef -00000104 -deadbeef -00000082 -deadbeef -00000041 -deadbeef -00000020 -deadbeef -00000010 -deadbeef -00000008 -deadbeef -00000004 -deadbeef -00000002 -deadbeef -00000001 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -80000000 -deadbeef -40000000 -deadbeef -20000000 -deadbeef -10000000 -deadbeef -08000000 -deadbeef -84000000 -deadbeef -bef7ffff -deadbeef -efbdffff -deadbeef diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha512sum0-rwp1.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha512sum0-rwp1.reference_output deleted file mode 100644 index 40f013a8e..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha512sum0-rwp1.reference_output +++ /dev/null @@ -1,488 +0,0 @@ -e9ce59bf -9baab409 -2376b8f4 -f5459125 -58ff9198 -66b85b9d -8476d693 -6c023547 -3dfbdd43 -2978313f -c20422bc -d687cec0 -0dd09a3f -9c55496a -5d796e68 -8a662442 -d90297d4 -1e63eefa -acf6b0ac -4f0e7329 -bbbab2b6 -f70f4b8e -44a4e959 -ab7bafd0 -00e1a410 -a38b1ba1 -31146acf -0c23eb46 -ceeb9530 -f3dc14b9 -53074732 -6fef7bd6 -01d3bd67 -0813ac64 -00f21956 -648890c3 -85d9f49f -f3461900 -f7569a7a -7de28731 -5e3858c9 -2130006f -56913d4c -a32d78a1 -835a8ecc -7e1ab9e3 -7ca57133 -81e5461c -d625f8df -0c6725bc -bb735ce9 -2e7ab836 -64e21f9c -8b4d3f95 -1515b62e -d5a6539a -b2a7e1e0 -e034240a -5757d19e -dd48b1f3 -1a0fcf81 -c2836a06 -5b137c34 -2a4b1463 -a4ec83cb -d5b4eb9c -d6d5b6ce -26575c5d -70acbc72 -a343aa3c -569cecf0 -e0c04036 -b1a509ca -bd7bb672 -ed9f7ddb -535a94ca -842ea164 -6e5c80fd -964e2340 -c2f9ebc8 -9ea535ac -d05d209a -615aca53 -2fa2df65 -41c6b234 -bd83b67d -9e208d27 -b69902a2 -07d269e6 -f39f16da -c4490a21 -3441a740 -4b629e92 -f40a728f -e52aa733 -b25884a2 -51b7c65e -b9ad09d2 -89c88542 -2bb2fbf0 -76377abd -d44d040f -18496d21 -b866479b -ab0d24d8 -74b41b89 -59555e79 -bb0711b7 -ee915c98 -58d5d905 -abd94dad -996cbc1a -1db27f29 -92429a73 -4994cd7b -f4d1d996 -47c04cb2 -27bacd7b -b83fb34d -d8453284 -0f65a0a0 -5f2a25d6 -a5d6805e -d99da96c -5c41b2e2 -e4cbcfd6 -81fd5f28 -f909502b -ff254412 -a8a95ffb -80dd66ff -b8b8b14f -8007dd12 -efee114b -60c54cc8 -777c29d0 -9f3ab337 -8883d62f -7dfda0b2 -f92aad54 -49122b48 -685e9842 -c90a4e35 -787086f6 -f261884d -c35a255f -def268e2 -656425df -51fa2e40 -15983f23 -70f7b95d -8f03e503 -28e0aebd -d5a794fd -d71f5142 -2a586b02 -0c721591 -24a25aa0 -2144781d -8425385d -b04cbebf -f5215359 -121290f0 -bed9e518 -23559b0d -15898e16 -cf67c5e1 -67fddd11 -13cda113 -8d8bacf8 -1cc333e6 -c80ee23e -e33ccc19 -37f11dc1 -ea532d08 -3f220927 -ed965425 -1072bd9b -d9c8b311 -82e710a3 -d235139a -6e5e995f -4aa28e98 -68781767 -4cc2890a -a6c633be -f99ff86d -3141db26 -822f4710 -6a6b4738 -7dd0b8ef -9594b8c7 -dab51b9a -6f9ee25f -56d6a0ae -e2499577 -5d36a840 -b107ba50 -d295e997 -7a9113e5 -59405883 -965ec8c1 -70e20fdc -3ddbfc00 -d65da8a0 -547acb3e -121af4b4 -ade15b7c -ede50b4b -521ea483 -24da1627 -7c995be6 -584ada2c -08de53d2 -81ed318b -b4638893 -e49adff7 -990c7a8f -99b6aea8 -af427d3b -393d2a5b -aeb9c3a8 -5f747b0c -fe04416c -c6390e1c -382446fa -39c6f1e3 -c7dbb905 -e49cdff7 -9af382af -a6b12d50 -ef23f13b -473cb243 -f11fafcf -52135d56 -2de37f54 -f914ec6e -9d15248d -a52368f4 -e9e08958 -a3c87b65 -8b0a522a -1971a284 -c1323877 -e68e5d7b -3ecdc788 -6a5c5e66 -ce0c8056 -9ed73c73 -93864949 -fb0ec10d -087bf71e -c3e3c21c -d0bc9a3a -0647fc16 -fb4316ce -7c5acfdc -6d12f8ab -85e2cc35 -69ae119a -aa59c1ed -ca5fb5c3 -55a63e12 -35a04a3c -341c25a0 -dd3f62c5 -a5038a27 -86ad6b2e -1f20bdf1 -1cff5994 -2dc51a2a -072cdbff -a708d0ba -e97b6e1e -ef4e914f -726abd9d -b7b9be0a -64ee2c7c -c310908c -af1afc58 -3cef6f73 -50e503a7 -adc99dd4 -374edbff -d15094b2 -c8b0290d -1996d6a7 -63c1fc91 -74bd2e93 -971acc3b -b3444521 -e014d8c0 -501217bd -7315ae50 -1ca9ad63 -6cfe896f -d20ec9b8 -d389ee34 -2df13647 -2c7611cb -7b41ceab -971d313c -c33a65ea -d23a1a8e -a690b886 -653b911f -f7f576a7 -2ab7ea92 -2f863c5e -e745dd36 -0464e497 -229546a2 -d41d2736 -3a2f646b -4009c16f -637d00e0 -bff63e90 -9c82ff1f -07fa8737 -b5380c9b -d1a4ba8f -885927b8 -fd879358 -4e29c34c -b287d885 -6d8e7a4d -895f26bc -dfb971c6 -b89f23cc -c76e6a22 -ce3ffa8f -e728e41b -948a2972 -27ec29a8 -6b75d68d -d813d657 -b507e365 -8e307d8d -4b97a743 -2655c147 -7d57acb3 -3f2cdd2b -51704b2a -a57f8862 -abed9b2d -47fa40f6 -a6a8a7f2 -6da78056 -f2bac320 -d5a23f5f -2ee03e56 -68e7f743 -d11fc1a9 -971808bc -697ab4d4 -b9800962 -1f13946c -c9271517 -2c58d14b -f384d5b7 -9b07ed10 -afb2f00c -f19cd92a -8f892594 -a9f4c971 -4df81976 -a797efa4 -3d8ec31d -9ff49c9b -2bd42e75 -600b6364 -d42bd18a -1bd80da6 -303509d1 -c33db576 -59416911 -1ba5c5d1 -1bb2a5f4 -5ce4e7ad -7a9113c2 -ad405af2 -ddce8af3 -28d5d273 -4369e5fb -7a6a777e -615890f7 -711d9a6b -96c93ed7 -8ee26594 -6936c128 -5f06f7ad -82ddebd3 -166c7c16 -8110cadc -9c020497 -1fb839e4 -939e1ac3 -24eeb7cf -01990c65 -422116b7 -0737cd35 -510b67c1 -f9513eaf -ecd58e89 -69b42020 -f8b50728 -964bdfdf -074af8d7 -9bdf9ce3 -4aef382f -badd9282 -04399635 -c18c53d2 -176407ab -f9da381e -374b8630 -c504158f -c226bb94 -1712fb27 -f1bed850 -2de91157 -cc679c3b -9af8eb84 -63b0830b -6507147b -9c4f7cf4 -fde3c55e -386c49b8 -b4af5172 -90bf633e -86c6401a -c457c703 -fdbc23ec -fb24d57d -55722b2a -5f564e73 -afdb524f -72de1e11 -0556869a -d277af9d -a643fd68 -2e376506 -59bc0297 -d1c89af9 -01bed3ee -0434d582 -1e4804eb -9f81f7bc -18f17e50 -cd0a481f -01be696c -3edc9bee -3a03212c -478a704a -378179e8 -f46d4cf1 -f27da73b -4c18c344 -64123518 -92a1e134 -9bedcae7 -6d5e1ecb -19be8a6c -4122e410 -dae4bdcd -bdb4794b -e8671691 -719bb606 -52df1cb0 -0e8b61f7 -8b09d1cb -17e3b215 -cbd9342c -3af0801b -bf2f1a18 -d2eccdf1 -2bd235fc -7e44393f -d42dca03 -81bbc6c0 -52e0df3e -50ab8607 -e233d6f8 -f4100594 -2304bcdf -212337a3 -00000000 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha512sum0-rwp2.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha512sum0-rwp2.reference_output deleted file mode 100644 index 3b16780f4..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha512sum0-rwp2.reference_output +++ /dev/null @@ -1,112 +0,0 @@ -924770d3 -08577eb1 -e1729a48 -23c25fe5 -7b89296c -93fdcab8 -c20422bc -d687cec0 -7dc59a3a -d2d6b877 -ec7b841a -edd34e17 -a749f9c5 -cf84b683 -00354cf7 -9a0371de -08ceac39 -854a9657 -46f155c9 -e0c8f5ce -53e8eb43 -137a9777 -75512786 -04d35f37 -ff1e5bef -5c74e45e -ceeb9530 -f3dc14b9 -6b9f15c4 -dc338383 -7d8cbfd1 -65c1a717 -9a6ab329 -5ae6a228 -aa664747 -d1054b39 -acca7f0d -432779ee -78380e62 -baccfbe9 -2cb7362c -af949e5e -8bf3eb49 -fc07c12d -a96ec2b3 -5cd2875e -7ca57133 -81e5461c -708cc1b6 -9d02fc90 -1a5573da -340e3287 -0b54aa22 -953b00b0 -b3d4bd2d -d78921f5 -3c53d0e3 -224c0601 -2a17f99f -88515dab -f0e58650 -e8dac663 -164b622b -3580cf96 -e5f0307e -3d7c95f9 -a4ec83cb -d5b4eb9c -aaac3142 -8c8a18b2 -ee9a1937 -653d401a -6f9fb997 -785036de -75e7c03c -dec34861 -a7298c66 -95a4d257 -320f584b -341cf668 -d814d575 -807da245 -8cc5b788 -7cf84baf -69b1dcbf -3d061437 -615aca53 -2fa2df65 -08208d09 -7f216822 -bf209af8 -4410b2cf -dae98554 -14b91c79 -e696f2bb -2b97e71e -c6880007 -c5ec6148 -a036d41c -c8af107d -6a013380 -7213516d -3d55e42f -20477680 -ae4839a1 -4652f62d -76377abd -d44d040f -9e044706 -85986adb -f5eb87da -b0f96927 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha512sum1-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha512sum1-01.reference_output deleted file mode 100644 index 00bbcd242..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha512sum1-01.reference_output +++ /dev/null @@ -1,300 +0,0 @@ -141a8dae -deadbeef -ffbfffff -deadbeef -ffdfffff -deadbeef -ffefffff -deadbeef -00000000 -deadbeef -fffbffff -deadbeef -fffdffff -deadbeef -fffeffff -deadbeef -ffff7fff -deadbeef -ffffbfff -deadbeef -ffffdfff -deadbeef -ffffefff -deadbeef -fffff7ff -deadbeef -fffffbff -deadbeef -fffffdff -deadbeef -7ffffeff -deadbeef -bfffff7f -deadbeef -dfffffbf -deadbeef -efffffdf -deadbeef -00000000 -deadbeef -bbfffff7 -deadbeef -ddfffffb -deadbeef -eefffffd -deadbeef -f77ffffe -deadbeef -fbbfffff -deadbeef -fddfffff -deadbeef -feefffff -deadbeef -ff77ffff -deadbeef -ffbbffff -deadbeef -ffddffff -deadbeef -ffeeffff -deadbeef -fff77fff -deadbeef -fffbbfff -deadbeef -fffddfff -deadbeef -fffeefff -deadbeef -ffff77ff -deadbeef -ffffbbff -deadbeef -ffffddff -deadbeef -ffffeeff -deadbeef -fffff77f -deadbeef -fffffbbf -deadbeef -fffffddf -deadbeef -fffffeef -deadbeef -ffffff77 -deadbeef -ffffffbb -deadbeef -ffffffdd -deadbeef -ffffffee -deadbeef -fffffff7 -deadbeef -fffffffb -deadbeef -fffffffd -deadbeef -fffffffe -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -7fffffff -deadbeef -bfffffff -deadbeef -dfffffff -deadbeef -efffffff -deadbeef -f7ffffff -deadbeef -fbffffff -deadbeef -fdffffff -deadbeef -feffffff -deadbeef -ff7fffff -deadbeef -00400000 -deadbeef -00200000 -deadbeef -00100000 -deadbeef -00080000 -deadbeef -00040000 -deadbeef -00020000 -deadbeef -00010000 -deadbeef -00008000 -deadbeef -00004000 -deadbeef -00002000 -deadbeef -00001000 -deadbeef -00000800 -deadbeef -00000400 -deadbeef -00000200 -deadbeef -80000100 -deadbeef -40000080 -deadbeef -20000040 -deadbeef -10000020 -deadbeef -88000010 -deadbeef -44000008 -deadbeef -00800000 -deadbeef -48fe4258 -deadbeef -613d75d3 -deadbeef -66fb97ac -deadbeef -49a78013 -deadbeef -988de817 -deadbeef -caf50a29 -deadbeef -f3596998 -deadbeef -b3b562d4 -deadbeef -cad7c752 -deadbeef -acf5ad33 -deadbeef -fa2624f7 -deadbeef -ff0e3b36 -deadbeef -b754c610 -deadbeef -25534403 -deadbeef -8e38fd58 -deadbeef -95a1838e -deadbeef -c97259c6 -deadbeef -9054f86d -deadbeef -64f95b6c -deadbeef -22000004 -deadbeef -11000002 -deadbeef -08800001 -deadbeef -04400000 -deadbeef -02200000 -deadbeef -01100000 -deadbeef -00880000 -deadbeef -00440000 -deadbeef -00220000 -deadbeef -00110000 -deadbeef -00088000 -deadbeef -00044000 -deadbeef -00022000 -deadbeef -00011000 -deadbeef -00008800 -deadbeef -00004400 -deadbeef -00002200 -deadbeef -00001100 -deadbeef -00000880 -deadbeef -00000440 -deadbeef -00000220 -deadbeef -00000110 -deadbeef -00000088 -deadbeef -00000044 -deadbeef -00000022 -deadbeef -00000011 -deadbeef -00000008 -deadbeef -00000004 -deadbeef -00000002 -deadbeef -00000001 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -80000000 -deadbeef -40000000 -deadbeef -20000000 -deadbeef -10000000 -deadbeef -08000000 -deadbeef -04000000 -deadbeef -02000000 -deadbeef -01000000 -deadbeef -fff7ffff -deadbeef -77ffffef -deadbeef diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha512sum1-rwp1.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha512sum1-rwp1.reference_output deleted file mode 100644 index 3ca3a5ae3..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha512sum1-rwp1.reference_output +++ /dev/null @@ -1,488 +0,0 @@ -e9ce59bf -9baab409 -a2e80810 -f4656f6c -d961217c -6798a5d4 -8476d693 -6c023547 -11f9f1dc -4c2b5063 -ee060e23 -b3d4af9c -0dd09a3f -9c55496a -683c9e92 -fb777e0d -e3c5c7fe -8f7548c5 -acf6b0ac -4f0e7329 -064b5fde -fa4c54a2 -f9550431 -a638b0fc -00e1a410 -a38b1ba1 -a03d8633 -29c6d61c -5fc279cc -d63929e3 -53074732 -6fef7bd6 -a89b2f61 -262ca7e5 -a7b98b50 -82a18c44 -85d9f49f -f3461900 -adbb951d -2f1add33 -04d557ae -73c85a6d -56913d4c -a32d78a1 -1afc995c -eacaece0 -e50366a3 -1535131f -d625f8df -0c6725bc -301a5e8c -4320e079 -d989213f -9ff367d7 -1515b62e -d5a6539a -cde4023a -783a692b -28143244 -4546fcd2 -1a0fcf81 -c2836a06 -b278af09 -ceea7d4a -4d8750f6 -311582b5 -d6d5b6ce -26575c5d -c173054d -98607a13 -a76335cb -d5dd100d -b1a509ca -bd7bb672 -d108d726 -5c008834 -b8b90b99 -61069c03 -964e2340 -c2f9ebc8 -75b1005e -e1981c48 -8a4effa1 -1e67e3b7 -41c6b234 -bd83b67d -2e3496b0 -5aff3a37 -97e6736f -98054e6e -c4490a21 -3441a740 -e44900e5 -ca6eb893 -4a013944 -8c3c4ebe -51b7c65e -b9ad09d2 -4a610436 -01c5933c -b59efbc9 -fe3a6cc3 -18496d21 -b866479b -1f569414 -2242ab36 -cd9ecdb5 -6895a163 -ee915c98 -58d5d905 -5e7aab0d -a7b03dcc -e8119989 -ac9e1ba5 -4994cd7b -f4d1d996 -adc6dcda -cd95e415 -52392325 -326a1bea -0f65a0a0 -5f2a25d6 -4e022b5d -01aed9b2 -046d5de1 -0cdd001c -81fd5f28 -f909502b -80d86322 -3ea924c8 -ff2041cf -2eb8ca7c -8007dd12 -efee114b -480b1716 -26cf07ad -b7f4e8e9 -d930f852 -7dfda0b2 -f92aad54 -47787ddf -40d9a430 -c770a0cc -50eb92e4 -f261884d -c35a255f -3ac9980c -ecdd4d7a -b5c1deae -9c215786 -70f7b95d -8f03e503 -c38a9e11 -8a992413 -3c7561ee -7566dbec -0c721591 -24a25aa0 -34ba63f9 -8326e2ab -c3c2aa9b -f422fda7 -121290f0 -bed9e518 -9579203c -6bf7dd99 -794b7ed0 -19838e9e -13cda113 -8d8bacf8 -d1188e13 -9003339c -2ee771ec -6ffccc63 -ea532d08 -3f220927 -22c9c2dc -ec97dad6 -0efc21c8 -5f0c2dde -d235139a -6e5e995f -0e1f9315 -a5663864 -087f9487 -6bd81cbd -f99ff86d -3141db26 -2ccaf8f5 -8cd346ab -d335070a -732cb954 -dab51b9a -6f9ee25f -fcdf5308 -07627f11 -033f5a9a -d620a3eb -d295e997 -7a9113e5 -c0d3767b -2ed17e14 -e9712124 -85544ad5 -d65da8a0 -547acb3e -ce1ed184 -57c26a21 -31e12e7b -a83d95de -24da1627 -7c995be6 -2adf56f3 -2e064048 -5481ae52 -d98b7509 -e49adff7 -990c7a8f -0f50ed70 -8fd1cf1d -afdb6983 -8e2a718e -5f747b0c -fe04416c -9395682c -44df7dad -6c6a97d3 -bb208252 -e49cdff7 -9af382af -11d91295 -1fd1c31d -b2649788 -21cd81b0 -52135d56 -2de37f54 -8992ad76 -0824355b -d5a529ec -7cd1988e -a3c87b65 -8b0a522a -6ee5a2fa -e61eaad6 -911a5d05 -19e15529 -6a5c5e66 -ce0c8056 -122b35a6 -4537a59e -6e62ba40 -ba2d5373 -c3e3c21c -d0bc9a3a -400de13a -e595873c -3a10d2f0 -73c46959 -85e2cc35 -69ae119a -d8b861fb -4e9a0db5 -27479e04 -b165f24a -341c25a0 -dd3f62c5 -83cb02c6 -fd714da0 -fde83690 -93c33c05 -2dc51a2a -072cdbff -4c00ea08 -d1b47ff5 -0446abfd -4aa5ac76 -b7b9be0a -64ee2c7c -3fdf841e -a9f0d65c -c0207be1 -560f29a3 -adc99dd4 -374edbff -331afb39 -eff33426 -7b613d2e -8b0507a9 -74bd2e93 -971acc3b -ca2882bd -ec50e73a -297ed021 -7f5191aa -1ca9ad63 -6cfe896f -3651cac8 -695b3c13 -c9ae3537 -96a4c3ec -7b41ceab -971d313c -dd757d4f -d7391954 -c0cbcfeb -6a3a8fe5 -f7f576a7 -2ab7ea92 -037a39dd -ce4e9ac9 -2898e114 -0b9e015d -d41d2736 -3a2f646b -d3a8b2c1 -e0ff68a5 -2c574d3e -1f00975a -07fa8737 -b5380c9b -aa904212 -f090c4ed -d6731adb -b6616081 -b287d885 -6d8e7a4d -35136183 -b2edaeb6 -04d364f3 -aa3ab552 -ce3ffa8f -e728e41b -ee9a5f02 -197b7a94 -1165a0fd -e684856b -b507e365 -8e307d8d -5b92a160 -b395d8bc -8d52a6d0 -cc6cf4a0 -51704b2a -a57f8862 -56c36e59 -0f488484 -5b865286 -25154424 -f2bac320 -d5a23f5f -e2c2e75a -13b23e81 -1d3d18a5 -ec4dc17e -697ab4d4 -b9800962 -4d8dffb0 -cf53753a -5ad33c8f -f9b135da -9b07ed10 -afb2f00c -f46693a6 -494b16d1 -ac0e83fd -8b3a2a33 -a797efa4 -3d8ec31d -6eaf30db -cbaa32af -9150cf24 -3455cd50 -1bd80da6 -303509d1 -b6283312 -dd7ca0df -0e90436d -9fedddc2 -5ce4e7ad -7a9113c2 -dd44ac23 -4670c693 -58d124a2 -d8d7a99b -7a6a777e -615890f7 -d8d09b7b -3b9b280f -272f6484 -c464d7f0 -5f06f7ad -82ddebd3 -0378c52f -8af2e8bb -890e4db0 -299a57c3 -939e1ac3 -24eeb7cf -135fddc4 -0a75958c -15f11c94 -195fe4fa -f9513eaf -ecd58e89 -0e73f1d7 -f1e8e0fc -f18c0e28 -0e171f03 -9bdf9ce3 -4aef382f -5f10fe15 -837816c9 -65bfbf65 -96a2883f -f9da381e -374b8630 -f6547cdd -7603bde0 -24429275 -459bde24 -2de91157 -cc679c3b -3c044f10 -1c9c360f -c3fbb0ef -e363c9f0 -fde3c55e -386c49b8 -9b91fed3 -38519e48 -6da8ed7b -6bea020d -fdbc23ec -fb24d57d -96d51bf5 -39b60c4b -6c7c6290 -143e5c29 -0556869a -d277af9d -18fa6fd8 -754f5600 -e7059027 -8ab0a9ff -01bed3ee -0434d582 -946a9cfe -3a434eb7 -8f141663 -67cb9f1a -01be696c -3edc9bee -ff5ce8db -c8eb2bf1 -f2deb01f -7b0c174a -f27da73b -4c18c344 -a064f908 -575addb6 -5f9b06f7 -a8a52249 -19be8a6c -4122e410 -1f64f1e7 -8326cb86 -2ce74aab -370e0841 -52df1cb0 -0e8b61f7 -07a7da7b -4e455601 -47773f9c -6356640f -bf2f1a18 -d2eccdf1 -08d3e511 -563ae885 -f72c1aee -a9c5177a -52e0df3e -50ab8607 -66b4caf8 -489fa6eb -a785b0df -75b2d8f9 -00000000 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha512sum1-rwp2.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha512sum1-rwp2.reference_output deleted file mode 100644 index 583573940..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sha512sum1-rwp2.reference_output +++ /dev/null @@ -1,112 +0,0 @@ -924770d3 -08577eb1 -4cee0633 -47b1c0f0 -7b89296c -93fdcab8 -ee060e23 -b3d4af9c -7dc59a3a -d2d6b877 -52a9433b -35db1d22 -a749f9c5 -cf84b683 -1549b6ae -d8b5e90f -08ceac39 -854a9657 -e00b4442 -306c132e -53e8eb43 -137a9777 -59892612 -2c757d41 -ff1e5bef -5c74e45e -5fc279cc -d63929e3 -6b9f15c4 -dc338383 -0c836d5a -53d78848 -9a6ab329 -5ae6a228 -b4853c61 -7422087a -acca7f0d -432779ee -bf608ba7 -94a0396b -2cb7362c -af949e5e -48b8f3be -3a2fce2c -a96ec2b3 -5cd2875e -e50366a3 -1535131f -708cc1b6 -9d02fc90 -962b5f6e -7e8f952b -0b54aa22 -953b00b0 -d3a6b207 -da075bf7 -3c53d0e3 -224c0601 -68159858 -b72a684b -f0e58650 -e8dac663 -806352cc -492feb9e -e5f0307e -3d7c95f9 -4d8750f6 -311582b5 -aaac3142 -8c8a18b2 -45a04517 -900fc712 -6f9fb997 -785036de -1d720d82 -670ff088 -a7298c66 -95a4d257 -4e81a705 -7950673c -d814d575 -807da245 -5b462887 -42676b83 -69b1dcbf -3d061437 -8a4effa1 -1e67e3b7 -08208d09 -7f216822 -7e3f323e -0663b30b -dae98554 -14b91c79 -9cf34192 -48e82308 -c6880007 -c5ec6148 -9e93ddb2 -a47da2ca -6a013380 -7213516d -51d7fb2c -3454d450 -ae4839a1 -4652f62d -b59efbc9 -fe3a6cc3 -9e044706 -85986adb -329a53a5 -6014b524 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sm3p0-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sm3p0-01.reference_output deleted file mode 100644 index 1216d0f88..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sm3p0-01.reference_output +++ /dev/null @@ -1,300 +0,0 @@ -9945f84c -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -00000000 -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -00000000 -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -7ffefeff -deadbeef -bfff7f7f -deadbeef -dfffbfbf -deadbeef -efffdfdf -deadbeef -f7ffefef -deadbeef -fbfff7f7 -deadbeef -fdfffbfb -deadbeef -fefffdfd -deadbeef -ff7ffefe -deadbeef -7fbfff7f -deadbeef -bfdfffbf -deadbeef -dfefffdf -deadbeef -eff7ffef -deadbeef -f7fbfff7 -deadbeef -fbfdfffb -deadbeef -fdfefffd -deadbeef -feff7ffe -deadbeef -7f7fbfff -deadbeef -bfbfdfff -deadbeef -dfdfefff -deadbeef -efeff7ff -deadbeef -f7f7fbff -deadbeef -fbfbfdff -deadbeef -fdfdfeff -deadbeef -fefeff7f -deadbeef -ff7f7fbf -deadbeef -ffbfbfdf -deadbeef -ffdfdfef -deadbeef -ffefeff7 -deadbeef -fff7f7fb -deadbeef -fffbfbfd -deadbeef -fffdfdfe -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00020201 -deadbeef -d9217d2d -deadbeef -4de5f968 -deadbeef -bda6e514 -deadbeef -6decfd5c -deadbeef -bd986f74 -deadbeef -47a2ae11 -deadbeef -23c8dcdb -deadbeef -0b26483e -deadbeef -f64218e7 -deadbeef -a43f58a9 -deadbeef -f53972fd -deadbeef -78c5d629 -deadbeef -efe34f0e -deadbeef -3cf49177 -deadbeef -e4111619 -deadbeef -5187e8eb -deadbeef -7d82c94f -deadbeef -b80b391f -deadbeef -3ecac1d1 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -80010100 -deadbeef -40008080 -deadbeef -20004040 -deadbeef -10002020 -deadbeef -08001010 -deadbeef -04000808 -deadbeef -02000404 -deadbeef -01000202 -deadbeef -00800101 -deadbeef -80400080 -deadbeef -40200040 -deadbeef -20100020 -deadbeef -10080010 -deadbeef -08040008 -deadbeef -04020004 -deadbeef -02010002 -deadbeef -01008001 -deadbeef -80804000 -deadbeef -40402000 -deadbeef -20201000 -deadbeef -10100800 -deadbeef -08080400 -deadbeef -04040200 -deadbeef -02020100 -deadbeef -01010080 -deadbeef -00808040 -deadbeef -00404020 -deadbeef -00202010 -deadbeef -00101008 -deadbeef -00080804 -deadbeef -00040402 -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sm3p0-rwp1.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sm3p0-rwp1.reference_output deleted file mode 100644 index 0cb6b3d55..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sm3p0-rwp1.reference_output +++ /dev/null @@ -1,488 +0,0 @@ -e9ce59bf -9baab409 -c602f5f0 -ffffffff -bd8bdc9c -6c023547 -8476d693 -6c023547 -c4fcf976 -ffffffff -3b030689 -00000000 -0dd09a3f -9c55496a -989aff85 -ffffffff -142428f1 -93fdcab8 -acf6b0ac -4f0e7329 -20ceb018 -00000000 -dfd0ebf7 -5c74e45e -00e1a410 -a38b1ba1 -8b8985d2 -ffffffff -74767a2d -00000000 -53074732 -6fef7bd6 -d3ed859a -ffffffff -d30be189 -5c74e45e -85d9f49f -f3461900 -df0fc027 -ffffffff -76610294 -a32d78a1 -56913d4c -a32d78a1 -0e7308c3 -00000000 -f18cf73c -ffffffff -d625f8df -0c6725bc -6c6beb38 -00000000 -15daadeb -5cd2875f -1515b62e -d5a6539a -5225c02f -00000000 -b7d5f051 -3d7c95f9 -1a0fcf81 -c2836a06 -9a92f9aa -ffffffff -656d0655 -00000000 -d6d5b6ce -26575c5d -102586c8 -00000000 -f615b746 -3d7c95f9 -b1a509ca -bd7bb672 -e823ffe3 -ffffffff -8192235c -c2f9ebc8 -964e2340 -c2f9ebc8 -4c898ef0 -00000000 -b376710f -ffffffff -41c6b234 -bd83b67d -a8ca593a -ffffffff -127c35f9 -3d061437 -c4490a21 -3441a740 -421ec13b -00000000 -ec56f89a -4652f62d -51b7c65e -b9ad09d2 -b287d992 -ffffffff -4d78266d -00000000 -18496d21 -b866479b -50d11f83 -00000000 -ff195924 -4652f62d -ee915c98 -58d5d905 -7519b067 -00000000 -c37282e3 -0b2e2669 -4994cd7b -f4d1d996 -faf8a8c1 -ffffffff -0507573e -00000000 -0f65a0a0 -5f2a25d6 -8564fe75 -ffffffff -3bd030f9 -0b2e2669 -81fd5f28 -f909502b -c5120dd1 -ffffffff -baea2f3c -efee114b -8007dd12 -efee114b -3598f81d -00000000 -ca6707e2 -ffffffff -7dfda0b2 -f92aad54 -c7d83fb2 -ffffffff -47d0629f -1011eeb4 -f261884d -c35a255f -21eaf76a -00000000 -aee2b1c8 -70fc1afc -70f7b95d -8f03e503 -ed3fe253 -ffffffff -12c01dac -00000000 -0c721591 -24a25aa0 -c37b2f6d -ffffffff -5283760f -70fc1afc -121290f0 -bed9e518 -16d354f1 -00000000 -fae10a1d -72745307 -13cda113 -8d8bacf8 -caa9a0af -ffffffff -35565f50 -00000000 -ea532d08 -3f220927 -1618e87a -00000000 -024b4766 -72745308 -d235139a -6e5e995f -9f278254 -ffffffff -994785c6 -3141db26 -f99ff86d -3141db26 -36b4d0a1 -00000000 -c94b2f5e -ffffffff -dab51b9a -6f9ee25f -87b79b45 -ffffffff -8e17a2d7 -cebe24d8 -d295e997 -7a9113e5 -2a696319 -00000000 -03cb3446 -ab8534c1 -d65da8a0 -547acb3e -3c4d45b7 -00000000 -c3b2ba48 -ffffffff -24da1627 -7c995be6 -bcb811da -ffffffff -e65a6939 -ab8534c0 -e49adff7 -990c7a8f -6ecaf90b -00000000 -ce417df8 -01fbbe93 -5f747b0c -fe04416c -419add5a -00000000 -be6522a5 -ffffffff -e49cdff7 -9af382af -62ccf907 -00000000 -03587dfa -01fbbe94 -52135d56 -2de37f54 -ce0555d4 -ffffffff -9232d14e -8b0a522a -a3c87b65 -8b0a522a -c5f5f7b2 -ffffffff -3a0a084d -00000000 -6a5c5e66 -ce0c8056 -6e2c460a -00000000 -ca63caa4 -74f5add5 -c3e3c21c -d0bc9a3a -805e7c5c -ffffffff -fa434f96 -69ae119a -85e2cc35 -69ae119a -d811acfb -ffffffff -27ee5304 -00000000 -341c25a0 -dd3f62c5 -47170df0 -00000000 -c13441ba -9651ee65 -2dc51a2a -072cdbff -93a515fb -ffffffff -dbe3540e -64ee2c7c -b7b9be0a -64ee2c7c -b8d0c416 -ffffffff -472f3be9 -00000000 -adc99dd4 -374edbff -055b6f1c -00000000 -4da1b111 -9b11d383 -74bd2e93 -971acc3b -53c6e100 -00000000 -b090b39c -93017690 -1ca9ad63 -6cfe896f -15355209 -00000000 -eacaadf6 -ffffffff -7b41ceab -971d313c -658a6ede -00000000 -48e0c17a -93017691 -f7f576a7 -2ab7ea92 -f057d6a2 -ffffffff -dbb50e6b -3a2f646b -d41d2736 -3a2f646b -a03ee2a4 -ffffffff -5fc11d5b -00000000 -07fa8737 -b5380c9b -fc9ae6cd -ffffffff -287dbf96 -c5d09b94 -b287d885 -6d8e7a4d -0c3db6ef -00000000 -3dfdb39f -18d71be4 -ce3ffa8f -e728e41b -44d5796c -00000000 -bb2a8693 -ffffffff -b507e365 -8e307d8d -7c0a4200 -00000000 -adca4770 -18d71be4 -51704b2a -a57f8862 -27b2bd68 -00000000 -2af781b7 -2a5dc0a0 -f2bac320 -d5a23f5f -017d67b0 -00000000 -fe82984f -ffffffff -697ab4d4 -b9800962 -f5bbcef3 -ffffffff -03010bd2 -2a5dc0a0 -9b07ed10 -afb2f00c -4efcfa29 -00000000 -1694ea72 -c2713ce2 -a797efa4 -3d8ec31d -5701e9c4 -00000000 -a8fe163b -ffffffff -1bd80da6 -303509d1 -b08f7621 -ffffffff -08f7867c -c2713ce2 -5ce4e7ad -7a9113c2 -5a7104dd -00000000 -dfe48c5c -9ea76f08 -7a6a777e -615890f7 -40787f5e -00000000 -bf8780a1 -ffffffff -5f06f7ad -82ddebd3 -bdb3131e -ffffffff -43489b9f -9ea76f08 -939e1ac3 -24eeb7cf -9a2cbad8 -ffffffff -9c827b88 -ecd58e89 -f9513eaf -ecd58e89 -267393ff -00000000 -d98c6c00 -ffffffff -9bdf9ce3 -4aef382f -1d216c6b -00000000 -23d02dbb -132a7176 -f9da381e -374b8630 -3d97f659 -00000000 -ef8118f1 -339863c4 -2de91157 -cc679c3b -dd65e4de -ffffffff -229a1b21 -00000000 -fde3c55e -386c49b8 -b0d48362 -ffffffff -82eb720a -339863c4 -fdbc23ec -fb24d57d -c222016f -ffffffff -388b780a -d277af9d -0556869a -d277af9d -a56fb83d -ffffffff -5a9047c2 -00000000 -01bed3ee -0434d582 -dbc50c90 -ffffffff -d66e85f5 -2d885062 -01be696c -3edc9bee -afb4b213 -ffffffff -a236ead7 -4c18c344 -f27da73b -4c18c344 -47443424 -00000000 -b8bbcbdb -ffffffff -19be8a6c -4122e410 -70726122 -00000000 -7df4b9e6 -b3e73cbb -52df1cb0 -0e8b61f7 -d586d9ab -ffffffff -95563c4c -d2eccdf1 -bf2f1a18 -d2eccdf1 -d52a5538 -ffffffff -2ad5aac7 -00000000 -52e0df3e -50ab8607 -2d22065a -00000000 -6df2ec41 -2d13320e -00000000 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sm3p0-rwp2.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sm3p0-rwp2.reference_output deleted file mode 100644 index 6bb86437b..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sm3p0-rwp2.reference_output +++ /dev/null @@ -1,112 +0,0 @@ -924770d3 -08577eb1 -fd01f379 -ffffffff -7b89296c -93fdcab8 -3b030689 -00000000 -7dc59a3a -d2d6b877 -c285154a -ffffffff -a749f9c5 -cf84b683 -c7313c18 -ffffffff -08ceac39 -854a9657 -cde4cfb5 -ffffffff -53e8eb43 -137a9777 -54b8ca35 -00000000 -ff1e5bef -5c74e45e -74767a2d -00000000 -6b9f15c4 -dc338383 -7e3c4a2d -00000000 -9a6ab329 -5ae6a228 -295fd4c8 -00000000 -acca7f0d -432779ee -c62f3dc0 -ffffffff -2cb7362c -af949e5e -2e83371b -00000000 -a96ec2b3 -5cd2875e -f18cf73c -ffffffff -708cc1b6 -9d02fc90 -ea634c4e -ffffffff -0b54aa22 -953b00b0 -f644f89d -ffffffff -3c53d0e3 -224c0601 -3a346e3c -00000000 -f0e58650 -e8dac663 -3748c67a -00000000 -e5f0307e -3d7c95f9 -656d0655 -00000000 -aaac3142 -8c8a18b2 -904be14f -ffffffff -6f9fb997 -785036de -23c24877 -00000000 -a7298c66 -95a4d257 -ecfc0f7b -ffffffff -d814d575 -807da245 -5b558eec -00000000 -69b1dcbf -3d061437 -b376710f -ffffffff -08208d09 -7f216822 -53288f58 -00000000 -dae98554 -14b91c79 -034a9932 -00000000 -c6880007 -c5ec6148 -d687829a -ffffffff -6a013380 -7213516d -0f66e756 -00000000 -ae4839a1 -4652f62d -4d78266d -00000000 -9e044706 -85986adb -18877632 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sm3p1-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sm3p1-01.reference_output deleted file mode 100644 index 36106f46b..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sm3p1-01.reference_output +++ /dev/null @@ -1,300 +0,0 @@ -2691a37c -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -00000000 -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -00000000 -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef -7fbfbfff -deadbeef -bfdfdfff -deadbeef -dfefefff -deadbeef -eff7f7ff -deadbeef -f7fbfbff -deadbeef -fbfdfdff -deadbeef -fdfefeff -deadbeef -feff7f7f -deadbeef -ff7fbfbf -deadbeef -ffbfdfdf -deadbeef -ffdfefef -deadbeef -ffeff7f7 -deadbeef -fff7fbfb -deadbeef -fffbfdfd -deadbeef -fffdfefe -deadbeef -7ffeff7f -deadbeef -bfff7fbf -deadbeef -dfffbfdf -deadbeef -efffdfef -deadbeef -f7ffeff7 -deadbeef -fbfff7fb -deadbeef -fdfffbfd -deadbeef -fefffdfe -deadbeef -7f7ffeff -deadbeef -bfbfff7f -deadbeef -dfdfffbf -deadbeef -efefffdf -deadbeef -f7f7ffef -deadbeef -fbfbfff7 -deadbeef -fdfdfffb -deadbeef -fefefffd -deadbeef -ff7f7ffe -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00808001 -deadbeef -c1786071 -deadbeef -d86c820f -deadbeef -90826890 -deadbeef -2d25edc5 -deadbeef -f4a74528 -deadbeef -7237021d -deadbeef -59350989 -deadbeef -949ecc9d -deadbeef -ef813217 -deadbeef -707b6d0c -deadbeef -e2aa4249 -deadbeef -61196a50 -deadbeef -097695a7 -deadbeef -1c93fa5b -deadbeef -8f03f583 -deadbeef -82537a7e -deadbeef -0e2cf4af -deadbeef -584138b4 -deadbeef -a9e2ed42 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -00000000 -deadbeef -80404000 -deadbeef -40202000 -deadbeef -20101000 -deadbeef -10080800 -deadbeef -08040400 -deadbeef -04020200 -deadbeef -02010100 -deadbeef -01008080 -deadbeef -00804040 -deadbeef -00402020 -deadbeef -00201010 -deadbeef -00100808 -deadbeef -00080404 -deadbeef -00040202 -deadbeef -00020101 -deadbeef -80010080 -deadbeef -40008040 -deadbeef -20004020 -deadbeef -10002010 -deadbeef -08001008 -deadbeef -04000804 -deadbeef -02000402 -deadbeef -01000201 -deadbeef -80800100 -deadbeef -40400080 -deadbeef -20200040 -deadbeef -10100020 -deadbeef -08080010 -deadbeef -04040008 -deadbeef -02020004 -deadbeef -01010002 -deadbeef -ffffffff -deadbeef -ffffffff -deadbeef diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sm3p1-rwp1.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sm3p1-rwp1.reference_output deleted file mode 100644 index d2a02542b..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sm3p1-rwp1.reference_output +++ /dev/null @@ -1,488 +0,0 @@ -e9ce59bf -9baab409 -1ae54a74 -00000000 -616c6318 -93fdcab8 -8476d693 -6c023547 -a6fd2fc3 -ffffffff -5902d03c -00000000 -0dd09a3f -9c55496a -5f49f49a -00000000 -dad31e06 -93fdcab8 -acf6b0ac -4f0e7329 -a2f69d8f -ffffffff -5de8c660 -a38b1ba1 -00e1a410 -a38b1ba1 -dae9d4b2 -ffffffff -25162b4d -00000000 -53074732 -6fef7bd6 -69b7ed12 -00000000 -68d64901 -5c74e45f -85d9f49f -f3461900 -3054da89 -00000000 -993a183a -5cd2875e -56913d4c -a32d78a1 -6e1c5e9a -00000000 -91e3a165 -ffffffff -d625f8df -0c6725bc -45a10131 -00000000 -ef0fc3e4 -5cd2875e -1515b62e -d5a6539a -d908367f -ffffffff -3cf80601 -c2836a06 -1a0fcf81 -c2836a06 -3d424561 -00000000 -c2bdba9e -ffffffff -d6d5b6ce -26575c5d -6ad9b77f -00000000 -50c9e7fd -3d7c95fa -b1a509ca -bd7bb672 -d018839c -ffffffff -b9a95f23 -c2f9ebc8 -964e2340 -c2f9ebc8 -27a54f76 -00000000 -d85ab089 -ffffffff -41c6b234 -bd83b67d -02fc718e -00000000 -6cae4e4d -3d061437 -c4490a21 -3441a740 -51bbcc80 -00000000 -fff3f521 -4652f62d -51b7c65e -b9ad09d2 -9db03566 -ffffffff -624fca99 -00000000 -18496d21 -b866479b -3e55c5b3 -00000000 -ec9dff54 -4652f62d -ee915c98 -58d5d905 -0caa637e -00000000 -bac151fa -0b2e2669 -4994cd7b -f4d1d996 -928da3d7 -ffffffff -6d725c28 -00000000 -0f65a0a0 -5f2a25d6 -8f3215c2 -ffffffff -459d4846 -0b2e2669 -81fd5f28 -f909502b -ba29e179 -ffffffff -c5d1c394 -efee114b -8007dd12 -efee114b -e7ce9eff -ffffffff -18316100 -00000000 -7dfda0b2 -f92aad54 -f49a609c -ffffffff -74928389 -1011eeb4 -f261884d -c35a255f -10be41b9 -00000000 -9fb6071b -70fc1afc -70f7b95d -8f03e503 -02e17afa -00000000 -fd1e8505 -ffffffff -0c721591 -24a25aa0 -ce3caaa2 -ffffffff -5d44f144 -70fc1afc -121290f0 -bed9e518 -226390b1 -00000000 -ce51ce5d -72745307 -13cda113 -8d8bacf8 -4acdce25 -00000000 -b53231da -ffffffff -ea532d08 -3f220927 -f8a271b7 -ffffffff -e4d4d0a3 -72745307 -d235139a -6e5e995f -96916009 -ffffffff -90f1679b -3141db26 -f99ff86d -3141db26 -3355cb5e -00000000 -ccaa34a1 -ffffffff -dab51b9a -6f9ee25f -9a152c4d -ffffffff -a07533df -cebe24d8 -d295e997 -7a9113e5 -edb74a29 -ffffffff -c4151d76 -547acb3e -d65da8a0 -547acb3e -5266ed5a -00000000 -ad9912a5 -ffffffff -24da1627 -7c995be6 -3c5be941 -00000000 -65fe40a0 -ab8534c1 -e49adff7 -990c7a8f -709360d5 -00000000 -d018e426 -01fbbe93 -5f747b0c -fe04416c -e4ddee8b -ffffffff -1b221174 -00000000 -e49cdff7 -9af382af -709563d6 -00000000 -1120e8c9 -01fbbe94 -52135d56 -2de37f54 -57917df1 -00000000 -0ba6f96b -74f5add5 -a3c87b65 -8b0a522a -2cab4ebc -00000000 -d354b143 -ffffffff -6a5c5e66 -ce0c8056 -765a4567 -00000000 -d291ca01 -74f5add5 -c3e3c21c -d0bc9a3a -2c8c520c -00000000 -569161c6 -9651ee65 -85e2cc35 -69ae119a -f93affa2 -ffffffff -06c5005d -00000000 -341c25a0 -dd3f62c5 -f6d631bc -ffffffff -70f36586 -9651ee65 -2dc51a2a -072cdbff -b5c6ee45 -ffffffff -fd80afb0 -64ee2c7c -b7b9be0a -64ee2c7c -6de73909 -00000000 -9218c6f6 -ffffffff -adc99dd4 -374edbff -89752ffe -ffffffff -d1bb71f3 -9b11d382 -74bd2e93 -971acc3b -aa4eca5a -ffffffff -491898c6 -6cfe896f -1ca9ad63 -6cfe896f -7b9677e1 -00000000 -8469881e -ffffffff -7b41ceab -971d313c -c9a9d3ec -ffffffff -ad002688 -93017690 -f7f576a7 -2ab7ea92 -1f5d77e6 -00000000 -34bfaf2f -c5d09b94 -d41d2736 -3a2f646b -dcec43ab -ffffffff -2313bc54 -00000000 -07fa8737 -b5380c9b -dfe2f989 -ffffffff -0bc5d252 -c5d09b94 -b287d885 -6d8e7a4d -1c1c422a -00000000 -2ddc475a -18d71be4 -ce3ffa8f -e728e41b -749f026d -00000000 -8b60fd92 -ffffffff -b507e365 -8e307d8d -f66fba17 -ffffffff -282fbf87 -18d71be4 -51704b2a -a57f8862 -e1cddbb7 -ffffffff -ec88e768 -d5a23f5f -f2bac320 -d5a23f5f -0353e71c -00000000 -fcac18e3 -ffffffff -697ab4d4 -b9800962 -59243d33 -00000000 -66697a12 -2a5dc0a0 -9b07ed10 -afb2f00c -e5c22365 -ffffffff -bdaa333e -3d8ec31d -a797efa4 -3d8ec31d -82167798 -ffffffff -7de98867 -00000000 -1bd80da6 -303509d1 -ce06ec4c -ffffffff -266efca7 -c2713ce2 -5ce4e7ad -7a9113c2 -f99c3bac -ffffffff -7c09b32d -615890f7 -7a6a777e -615890f7 -fee87f70 -ffffffff -0117808f -00000000 -5f06f7ad -82ddebd3 -f27fdb55 -ffffffff -781563d6 -9ea76f08 -939e1ac3 -24eeb7cf -ff361c01 -ffffffff -f998dd51 -ecd58e89 -f9513eaf -ecd58e89 -31fa6a98 -00000000 -ce059567 -ffffffff -9bdf9ce3 -4aef382f -2463bec2 -00000000 -2b128012 -132a7176 -f9da381e -374b8630 -eaa9a9ef -ffffffff -38bf4747 -cc679c3b -2de91157 -cc679c3b -0ed4732b -00000000 -f12b8cd4 -ffffffff -fde3c55e -386c49b8 -b0324a4d -ffffffff -824938f5 -339863c4 -fdbc23ec -fb24d57d -1a348323 -00000000 -e09dfa46 -2d885062 -0556869a -d277af9d -0b192f72 -00000000 -f4e6d08d -ffffffff -01bed3ee -0434d582 -9f490c58 -ffffffff -99f285bd -2d885062 -01be696c -3edc9bee -8308b687 -ffffffff -8e8aee43 -4c18c344 -f27da73b -4c18c344 -bc1960d6 -ffffffff -43e69f29 -00000000 -19be8a6c -4122e410 -6a8459f6 -00000000 -7806b2ba -b3e73cbb -52df1cb0 -0e8b61f7 -84ae5a51 -ffffffff -c47ebfb6 -d2eccdf1 -bf2f1a18 -d2eccdf1 -3e7cd202 -00000000 -c1832dfd -ffffffff -52e0df3e -50ab8607 -a2568621 -ffffffff -e3276c08 -2d13320d -00000000 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sm3p1-rwp2.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sm3p1-rwp2.reference_output deleted file mode 100644 index 8a8dcc656..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sm3p1-rwp2.reference_output +++ /dev/null @@ -1,112 +0,0 @@ -924770d3 -08577eb1 -43e79a48 -00000000 -7b89296c -93fdcab8 -5902d03c -00000000 -7dc59a3a -d2d6b877 -ade64615 -ffffffff -a749f9c5 -cf84b683 -b9788e9d -ffffffff -08ceac39 -854a9657 -42564f08 -00000000 -53e8eb43 -137a9777 -87e0b6c2 -ffffffff -ff1e5bef -5c74e45e -25162b4d -00000000 -6b9f15c4 -dc338383 -0348ef81 -00000000 -9a6ab329 -5ae6a228 -57334b45 -00000000 -acca7f0d -432779ee -159acc57 -00000000 -2cb7362c -af949e5e -a1b77bec -ffffffff -a96ec2b3 -5cd2875e -91e3a165 -ffffffff -708cc1b6 -9d02fc90 -cb6fbf90 -ffffffff -0b54aa22 -953b00b0 -4f4005dd -00000000 -3c53d0e3 -224c0601 -a5bc6722 -ffffffff -f0e58650 -e8dac663 -1bb58ce1 -00000000 -e5f0307e -3d7c95f9 -c2bdba9e -ffffffff -aaac3142 -8c8a18b2 -1358320c -00000000 -6f9fb997 -785036de -78e3c184 -00000000 -a7298c66 -95a4d257 -52494b34 -00000000 -d814d575 -807da245 -08423315 -00000000 -69b1dcbf -3d061437 -d85ab089 -ffffffff -08208d09 -7f216822 -ca20195f -ffffffff -dae98554 -14b91c79 -b22e9ce2 -ffffffff -c6880007 -c5ec6148 -c568a743 -ffffffff -6a013380 -7213516d -33f40619 -00000000 -ae4839a1 -4652f62d -624fca99 -00000000 -9e044706 -85986adb -3ec80a27 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sm4ed-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sm4ed-01.reference_output deleted file mode 100644 index 152a36d41..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sm4ed-01.reference_output +++ /dev/null @@ -1,564 +0,0 @@ -3031cefc -00000000 -96d167a5 -ffffffff -8c898ebb -ffffffff -c9967a60 -ffffffff -22aec608 -00000000 -e6bfeae8 -ffffffff -3232f32b -00000000 -04953bf1 -00000000 -ecde94d8 -ffffffff -24a9cd7a -00000000 -0adb9eb2 -00000000 -6464197d -00000000 -fac3cd71 -ffffffff -3b68e1f7 -00000000 -7101171e -00000000 -00000000 -00000000 -4b4b09aa -00000000 -8fac5730 -ffffffff -fcc35ba8 -ffffffff -9a40e0a5 -ffffffff -79f9277c -00000000 -390605c2 -00000000 -a1dd8081 -ffffffff -4413ab47 -00000000 -1a1b8561 -00000000 -93dbd8b1 -ffffffff -c2271d1c -ffffffff -d4321ed7 -ffffffff -a4a52d73 -ffffffff -ab45461b -ffffffff -8b7f0001 -ffffffff -ac237baf -ffffffff -9796ed8c -ffffffff -537271d0 -00000000 -bf8bc4c5 -ffffffff -802d5d83 -ffffffff -1b1acb22 -00000000 -c2cac9e5 -ffffffff -1ddb2a2b -00000000 -0955b00a -00000000 -7a7b891d -00000000 -7ff8fb6e -00000000 -2e34f2f3 -00000000 -52853f51 -00000000 -fcfd2f39 -ffffffff -85cfccaf -ffffffff -722dbbba -00000000 -428e2841 -00000000 -c1c06e49 -ffffffff -651b189f -00000000 -95493c3d -ffffffff -b9762fba -ffffffff -d3d2eddc -ffffffff -859695ce -ffffffff -0c4e9e9f -00000000 -0eab790d -00000000 -6b6af045 -00000000 -ab181b6a -ffffffff -6dbe0b0a -00000000 -4c3ca84f -00000000 -39386380 -00000000 -7ff4f75e -00000000 -e6231110 -ffffffff -d01410d3 -ffffffff -fffedff6 -ffffffff -9a24276f -ffffffff -a9453c3d -ffffffff -e41c28e7 -ffffffff -454476e1 -00000000 -8acbc88c -ffffffff -92e2bcbd -ffffffff -a81470ab -ffffffff -8b8adc99 -ffffffff -73a9aa13 -00000000 -90f8a0a1 -ffffffff -8bda9988 -ffffffff -b7b6d6ab -ffffffff -1d8c8f54 -00000000 -6ad57b7a -00000000 -abddb2a8 -ffffffff -f1f04a7d -ffffffff -403f3cbe -00000000 -7d8e3332 -00000000 -b41c68b7 -ffffffff -2d2c7897 -00000000 -057774cf -00000000 -d47c1415 -ffffffff -4042be43 -00000000 -b3b2beb3 -ffffffff -aefffce8 -ffffffff -e18dd4d5 -ffffffff -0ad76509 -00000000 -0e0fd561 -00000000 -e6a3a0f0 -ffffffff -805d6968 -ffffffff -d86e02db -ffffffff -e0e16335 -ffffffff -200e0d9f -00000000 -3f048b8a -00000000 -444cb847 -00000000 -c8c96c16 -ffffffff -a8000305 -ffffffff -8c012120 -ffffffff -0b872008 -00000000 -acad6e6c -ffffffff -781714c6 -00000000 -e4dc9091 -ffffffff -e6f8b6e5 -ffffffff -9f9ea491 -ffffffff -311e1d8a -00000000 -46cc2e2f -00000000 -7c538b7f -00000000 -d3d2b8cd -ffffffff -432320c1 -00000000 -6a408a8b -00000000 -3ac55f39 -00000000 -a9a8212a -ffffffff -6f5e5dac -00000000 -ad645554 -ffffffff -d10f42d2 -ffffffff -29283285 -00000000 -f4151678 -ffffffff -28ef5f5e -00000000 -a91425aa -ffffffff -4c4d6fb9 -00000000 -a3040732 -ffffffff -cbbfe0e1 -ffffffff -2d3a832e -00000000 -141576f4 -00000000 -92c7c4c4 -ffffffff -89e0f9f8 -ffffffff -43a67540 -00000000 -fdfc0867 -ffffffff -79b5b641 -00000000 -7eb44647 -00000000 -507aa653 -00000000 -01002ca3 -00000000 -ae0c0f2b -ffffffff -9ecbdddc -ffffffff -0eea6c0d -00000000 -6c6d7395 -00000000 -1dcdce55 -00000000 -0f24afae -00000000 -793bc67a -00000000 -2c2d6cc6 -00000000 -e2545737 -ffffffff -bb5a6160 -ffffffff -9c465a9f -ffffffff -8283c0c0 -ffffffff -04e1e298 -00000000 -7d747574 -00000000 -a74893a4 -ffffffff -4e4f3000 -00000000 -9d0003e4 -ffffffff -b0925a5b -ffffffff -68bdad6b -00000000 -f9f8db58 -ffffffff -7c2b2822 -00000000 -30286c6d -00000000 -77767574 -00000000 -2425a2f0 -00000000 -693b3823 -00000000 -54c9edec -00000000 -3ca2ee3f -00000000 -0d0cec93 -00000000 -b8828157 -ffffffff -12e29c9d -00000000 -e74cc7e4 -ffffffff -fbfa48dd -ffffffff -f07477ed -ffffffff -12f28889 -00000000 -ef4bccec -ffffffff -6f6e686d -00000000 -411f1c3b -00000000 -69505d5c -00000000 -f742d1f4 -ffffffff -1f1e7b02 -00000000 -49e8ebc0 -00000000 -b1f72627 -ffffffff -023b5901 -00000000 -eeef038f -ffffffff -38737016 -00000000 -506d6160 -00000000 -f0b61af3 -ffffffff -bcbda644 -ffffffff -ba8e8d6d -ffffffff -c4b32f2e -ffffffff -020d5701 -00000000 -9a9b28e8 -ffffffff -2d9c9fe4 -00000000 -d4d35352 -ffffffff -fa3c92f9 -ffffffff -f6f73c9c -ffffffff -f47c7fd9 -ffffffff -8ae03a3b -ffffffff -c237a5c1 -ffffffff -969721e5 -ffffffff -322a2955 -00000000 -7382bdbc -00000000 -2a167029 -00000000 -4140ccc3 -00000000 -43e8ebe2 -00000000 -05397475 -00000000 -5dcdd85e -00000000 -d0d1ac36 -ffffffff -4bb5b6bb -00000000 -e27ddbda -ffffffff -5b415e58 -00000000 -5a5b031f -00000000 -11a8abf8 -00000000 -54091d1c -00000000 -8e30fe8d -ffffffff -8c8db17f -ffffffff -2dd5d6c5 -00000000 -a9fa6f6e -ffffffff -40e29e43 -00000000 -3d3cbfbc -00000000 -05a0a39c -00000000 -04f9c5c4 -00000000 -05b78a06 -00000000 -eeef4d99 -ffffffff -3a90939f -00000000 -2b5a4544 -00000000 -f9874afa -ffffffff -a4a5d240 -ffffffff -f26467a7 -ffffffff -d87a9293 -ffffffff -133a1910 -00000000 -1415fbdd -00000000 -6023206e -00000000 -24090100 -00000000 -7e7b297d -00000000 -e3e21ed3 -ffffffff -c1a3a04b -ffffffff -85369b9a -ffffffff -14e6da17 -00000000 -9c9dc771 -ffffffff -03f5f6d3 -00000000 -76366465 -00000000 -2e656f2d -00000000 -5554bbc8 -00000000 -b1cbc85b -ffffffff -b9da4342 -ffffffff -9cce729f -ffffffff -6564b2f5 -00000000 -a186853a -ffffffff -0c415150 -00000000 -0e5b490d -00000000 -b5b4b51e -ffffffff -e67c7f83 -ffffffff -1d040100 -00000000 -019e8702 -00000000 -3e3f5175 -00000000 -b9cfcc63 -ffffffff -8fe47f7e -ffffffff -8a70ee89 -ffffffff -bbba3e93 -ffffffff -dc1d1ed0 -ffffffff -17060100 -00000000 -e9ae57ea -ffffffff -bbba3b92 -ffffffff -c50506cd -ffffffff -1b4a5d5c -00000000 -d5ba63d6 -ffffffff -57561b42 -00000000 -1a1e1d0d -00000000 -2796b9b8 -00000000 -e4f21ee7 -ffffffff -abaa2180 -ffffffff -01fdfef9 -00000000 -ed4ba2a3 -ffffffff -4594d546 -00000000 -5c5dd08a -00000000 -68dcdfb5 -00000000 -3ecbf5f4 -00000000 -84e06487 -ffffffff -f0f591d8 -ffffffff -74d5849e -00000000 -de4ffdae -ffffffff -cf276629 -ffffffff -3405c537 -00000000 -00000000 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sm4ed-rwp1.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sm4ed-rwp1.reference_output deleted file mode 100644 index b2409420d..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sm4ed-rwp1.reference_output +++ /dev/null @@ -1,52 +0,0 @@ -4591d4d6 -00000000 -68d4a091 -00000000 -055fc122 -00000000 -0348bb8c -00000000 -65d2b9db -00000000 -1eb7e4d0 -00000000 -461020b4 -00000000 -2094b1a4 -00000000 -e0d19134 -ffffffff -61d2a158 -00000000 -a85e3a29 -ffffffff -4702a286 -00000000 -4a7d716d -00000000 -c022d77e -ffffffff -7a2fdfd2 -00000000 -cae8ca49 -ffffffff -d12f7a1b -ffffffff -42be5d4e -00000000 -d840701d -ffffffff -f848c5c4 -ffffffff -586edf94 -00000000 -79c264f9 -00000000 -3eacc2da -00000000 -30e75484 -00000000 -fb4c88b9 -ffffffff -8f75a8a6 -ffffffff diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sm4ks-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sm4ks-01.reference_output deleted file mode 100644 index e02983204..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sm4ks-01.reference_output +++ /dev/null @@ -1,564 +0,0 @@ -831b67cc -ffffffff -f6b00dd0 -ffffffff -5977fccf -00000000 -66b6595a -00000000 -765a1017 -00000000 -b5726738 -ffffffff -d7da59d6 -ffffffff -a4300751 -ffffffff -f77d94db -ffffffff -0da6e512 -00000000 -8c2f0ea0 -ffffffff -9aa8e8ca -ffffffff -99e629b5 -ffffffff -3b76c00e -00000000 -9ab78bb6 -ffffffff -bec082ef -ffffffff -a46ce102 -ffffffff -13d04f04 -00000000 -616f949a -00000000 -00000000 -00000000 -c9ca89e5 -ffffffff -c13efae3 -ffffffff -d0a11d77 -ffffffff -e5952b3c -ffffffff -df71c185 -ffffffff -b3faf0dc -ffffffff -e7c3d97f -ffffffff -629f3298 -00000000 -1b60922f -00000000 -1b76e882 -00000000 -c98b557b -ffffffff -e98e05f4 -ffffffff -f7f5f9ec -ffffffff -d3f2f5e0 -ffffffff -d5bf5179 -ffffffff -e89c2d70 -ffffffff -b3f5ecca -ffffffff -e6ce6ce8 -ffffffff -971fcd72 -ffffffff -78b254cc -00000000 -4f62df89 -00000000 -6f6af9aa -00000000 -882c29f0 -ffffffff -e6dd8728 -ffffffff -4b728b2d -00000000 -ada6ecc1 -ffffffff -ac710576 -ffffffff -6ad28cc4 -00000000 -c777a16d -ffffffff -9d22eedf -ffffffff -d895016e -ffffffff -f1a97720 -ffffffff -63e3e7ec -00000000 -cd9edfd5 -ffffffff -b70eddc6 -ffffffff -d1e4a95c -ffffffff -7f5bcbf1 -00000000 -6bdacf80 -00000000 -816e59ce -ffffffff -47a83c78 -00000000 -dbcd8560 -ffffffff -5fd6c490 -00000000 -cfe7f552 -ffffffff -4fb614f4 -00000000 -97d7d0de -ffffffff -6e72468e -00000000 -eea9b15f -ffffffff -4ab41c70 -00000000 -73468375 -00000000 -8eee45ec -ffffffff -e1924dc7 -ffffffff -54a214ec -00000000 -ef4cc5dd -ffffffff -13cad2a4 -00000000 -e69089c3 -ffffffff -c9c2d9c8 -ffffffff -2b49c6d7 -00000000 -5586d78d -00000000 -90692551 -ffffffff -44cbdea4 -00000000 -67578349 -00000000 -bc224eff -ffffffff -9d7e41d7 -ffffffff -58ac1c60 -00000000 -a3559c7b -ffffffff -cdfeb385 -ffffffff -8ad4fdb1 -ffffffff -20c1425c -00000000 -df3ebcbf -ffffffff -ea9a3390 -ffffffff -96e1d933 -ffffffff -b68cd538 -ffffffff -1b378fd5 -00000000 -f2163d96 -ffffffff -ac815532 -ffffffff -2cdb6ed4 -00000000 -172cdf61 -00000000 -9c5234a7 -ffffffff -f43c71a1 -ffffffff -2ccc4c10 -00000000 -73a9de6e -00000000 -04ce38f9 -00000000 -be8dcd28 -ffffffff -2aba848c -00000000 -afb6cd6c -ffffffff -c44a249f -ffffffff -8ce469a1 -ffffffff -2183fac8 -00000000 -0b2bafa5 -00000000 -8966a0b3 -ffffffff -d644e5b8 -ffffffff -b9dd5364 -ffffffff -0725abb9 -00000000 -c3a2ad90 -ffffffff -c668e1b9 -ffffffff -af91c760 -ffffffff -e3b2e022 -ffffffff -af9e9b84 -ffffffff -86acdd9a -ffffffff -0dd70efc -00000000 -3f0bcb31 -00000000 -78fa05e9 -00000000 -c32bb90e -ffffffff -8adc1518 -ffffffff -3b04e36d -00000000 -331681c6 -00000000 -b9cb351f -ffffffff -82c13b54 -ffffffff -978ae574 -ffffffff -c6321bba -ffffffff -9e88d193 -ffffffff -9588a510 -ffffffff -f301dc0b -ffffffff -414e94eb -00000000 -f67ccd92 -ffffffff -11f57a6c -00000000 -ef1adc2f -ffffffff -2aaa1dd8 -00000000 -819f290a -ffffffff -07bae8a8 -00000000 -ab15f571 -ffffffff -55c69fed -00000000 -c20cc595 -ffffffff -10d93a64 -00000000 -c79bf06e -ffffffff -362217da -00000000 -9fba8187 -ffffffff -1be14660 -00000000 -838aa1c0 -ffffffff -989ee10f -ffffffff -7e7c3d7c -00000000 -79654bbc -00000000 -ff775b30 -ffffffff -e5ba6a37 -ffffffff -1fb27961 -00000000 -6318bdf8 -00000000 -7b6e29d8 -00000000 -2096ff5f -00000000 -5430b57c -00000000 -77767574 -00000000 -f76c1fa0 -ffffffff -21327b59 -00000000 -605591f4 -00000000 -e91ba210 -ffffffff -93e13eef -ffffffff -540eea71 -00000000 -5112ed63 -00000000 -6b7f4f2c -00000000 -cfea7f49 -ffffffff -ec8af92b -ffffffff -57126967 -00000000 -ef7a4848 -ffffffff -4bea6969 -00000000 -39a66e4b -00000000 -6068a565 -00000000 -637441e4 -00000000 -a7656a7a -ffffffff -c1227531 -ffffffff -0bb341fa -00000000 -684e3960 -00000000 -03ee5003 -00000000 -143ed479 -00000000 -5851bddd -00000000 -c22bb63c -ffffffff -5f4121a4 -00000000 -6efadf42 -00000000 -15c7f9cb -00000000 -51710f98 -00000000 -5b546128 -00000000 -e516430d -ffffffff -17d775c4 -00000000 -da633e34 -ffffffff -575b613c -00000000 -d832c015 -ffffffff -3e88114b -00000000 -5f6035d0 -00000000 -73dc6921 -00000000 -566ece40 -00000000 -5172cd4b -00000000 -c462146c -ffffffff -2fde0ccf -00000000 -e34a5c1c -ffffffff -6c05a9c1 -00000000 -db08cce8 -ffffffff -8b563aae -ffffffff -bbc65a3a -ffffffff -14e1a5d0 -00000000 -c74542a4 -ffffffff -a7ce6603 -ffffffff -f902561d -ffffffff -4855a1c2 -00000000 -cd7b3220 -ffffffff -23dc38b3 -00000000 -c57e2241 -ffffffff -75aabd2e -00000000 -a451e2dc -ffffffff -3f2e7dbc -00000000 -9dfa2d6b -ffffffff -2405d9bf -00000000 -aa7db6d8 -ffffffff -9bb4034d -ffffffff -9e16a060 -ffffffff -392ab537 -00000000 -a16f8654 -ffffffff -b72a47d0 -ffffffff -a692a37a -ffffffff -47da312d -00000000 -32363930 -00000000 -13ab55f9 -00000000 -6c4ea50d -00000000 -2a254dad -00000000 -250479ac -00000000 -4fa8341f -00000000 -496a2519 -00000000 -7d86a93d -00000000 -b24de6c8 -ffffffff -8bb75fc5 -ffffffff -d3a63b5e -ffffffff -0f76252e -00000000 -2f076764 -00000000 -a7356bb8 -ffffffff -59622e1d -00000000 -6fba2133 -00000000 -be55cec0 -ffffffff -03b069b1 -00000000 -39de190f -00000000 -160d7d9e -00000000 -173c599c -00000000 -5f0b48b6 -00000000 -823a8a54 -ffffffff -181cd918 -00000000 -0b599fd8 -00000000 -3b933d51 -00000000 -61d61b2f -00000000 -5a8c5507 -00000000 -9b2572f4 -ffffffff -7793003f -00000000 -d0728971 -ffffffff -11169110 -00000000 -044dafd0 -00000000 -5317043a -00000000 -cd4e156d -ffffffff -051a8d0e -00000000 -1955bbcc -00000000 -cf0c061a -ffffffff -0eaa890a -00000000 -1d26890d -00000000 -9477f268 -ffffffff -0b0f1d20 -00000000 -f9c61a7b -ffffffff -73ef2599 -00000000 -154e9504 -00000000 -c71c6ed2 -ffffffff -b4e2975b -ffffffff -1d3fa187 -00000000 -9f72e020 -ffffffff -b9f4f3d0 -ffffffff -3909b9cd -00000000 -77b0f820 -00000000 -bb688d85 -ffffffff -e289133c -ffffffff -00000000 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sm4ks-rwp1.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sm4ks-rwp1.reference_output deleted file mode 100644 index 3dc69aa11..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/sm4ks-rwp1.reference_output +++ /dev/null @@ -1,52 +0,0 @@ -0c28109a -00000000 -e6532c14 -ffffffff -b7203110 -ffffffff -3abb6c4c -00000000 -2fd24baf -00000000 -2cb5bc59 -00000000 -1492e616 -00000000 -249767d0 -00000000 -21fb1859 -00000000 -e3c2b8b5 -ffffffff -e17be5cf -ffffffff -cb1a9046 -ffffffff -281dabba -00000000 -be8723c8 -ffffffff -55727f88 -00000000 -331fa0cc -00000000 -dc87fc62 -ffffffff -c94a02d5 -ffffffff -51210727 -00000000 -3eee27ce -00000000 -d9983185 -ffffffff -31362cdf -00000000 -488943a2 -00000000 -f29331f2 -ffffffff -8603e2ee -ffffffff -62004df6 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/xnor-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/xnor-01.reference_output deleted file mode 100644 index ddbb61224..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/xnor-01.reference_output +++ /dev/null @@ -1,1052 +0,0 @@ -ffffffff -ffffffff -ffffffff -ffffffff -3c798e49 -10f9e292 -d50bd2c6 -6d1114e3 -dafdcf80 -17adb940 -c6d1905c -1af426b5 -7f1b2dc4 -4f9d8b6b -ffffffff -b3ffffff -a2ffc1c7 -ccbef345 -f47ea10f -487e4352 -7c1d45c5 -40d77fb5 -b91b5427 -1b340bed -dbd27310 -d9640d25 -00000000 -00000000 -3e0c9051 -be6012b0 -288fbd9f -72b45018 -fa7e9f19 -cdfefc74 -27435b20 -4a92c7ad -17ed22b6 -b57a6882 -c2cd2fe1 -80e9188a -dfc81cb1 -b1a381bc -78bbcb2c -8e229c8d -78a1640a -2dd24348 -e8275de8 -5c4cf5e3 -78066929 -422fc5f4 -f2bd15fe -347e029f -d21b14df -5dde69f0 -29cf7c7a -809a89ca -548d0660 -550357d6 -b1848ca6 -7237d934 -269bd636 -4a12ed38 -373209c1 -1a63e46a -3f9df604 -0ab55976 -9bb6e758 -60e2623c -309c7860 -41dff2e3 -20c3e528 -0d69d5a9 -e44c1cb8 -48a25913 -a412303a -2e32ac9b -6bb69f99 -1afb6751 -73aad0b4 -e2c5459f -e1af8e67 -4be119a2 -64a94f1d -cd7fb6d1 -64562014 -c33a0c2f -4ddfc912 -f923cfea -7c9ddecf -c6e3306a -c6ae3ad7 -2e605d8a -178c6832 -d86bfc99 -8efe3c6d -9e7b599e -2f0bddaf -cf8adda4 -d1bc6f4e -e912e8d9 -81213917 -23633e24 -92400851 -81103de8 -7f3bd426 -3352bd5b -89c238aa -c1ecd666 -9e6cb728 -a823affd -5db293cc -4a66d8fb -4e109336 -a9bd8e23 -609dc5a9 -65804f34 -5c708be2 -1814ac1c -165e4111 -8d10e8e6 -86123e02 -98b77e64 -19fe6373 -7017e8b7 -8e1df280 -9cb82c85 -870e1cea -1a715cfa -cc577061 -572a3858 -d9e350fc -b330148a -16d59ecf -e5cdc9f6 -b412d68a -92b13128 -cdf94b8e -9634ad50 -b10bc490 -d51a21e8 -2dc93212 -98da0a6e -cb7f3f52 -720c7e29 -bc9f0136 -55001a72 -9f1fee14 -d46b6d36 -add517dd -ad0fec45 -66b5aaa0 -d21a6dba -a29d6ac0 -f020e4a5 -32f87774 -2248bab5 -b15b8772 -82d38a49 -448aea95 -bc9d4188 -8f619f0e -6377b648 -c0081b72 -8300327f -18e98ec0 -801cb3b4 -4fc00b76 -6c082974 -a3c2a918 -2ca451d6 -e7332808 -1d13c025 -a8a2da71 -9f0c4a23 -831e0b4c -88f96544 -9060cb4d -79ceba72 -b07cd137 -4c37f283 -dbb26df9 -3eaf2231 -a4ecfb8b -83ac2dd3 -9b18869e -ac5272d5 -cfa1c07f -0abdaa29 -9edaf777 -6934ce23 -f817409a -10cc7e67 -9d6e0f1d -e2a9494c -a70bacd7 -285a8039 -f5f6afb6 -6fab8839 -4cbb344f -8127ec57 -dd12768e -f39c373a -9f0e0971 -2ea6ba0f -4708e34f -8fe6aac3 -b877f4ee -666d3538 -aedcffa7 -7b88fd9c -0f06fdaa -7eb55686 -f4141aa8 -69a10a0b -19c9fd83 -13bb1df0 -d18a6f08 -846ca6b4 -f0f931e3 -417d3cdb -853a98b7 -4fbfe49a -ae0c431f -3c298e94 -9413cd17 -84aa62ee -d7697c10 -81bffa20 -593acd9f -33eafcd9 -fe1098c2 -ec74c8c0 -8af2538e -daaeda53 -ebf292e7 -68431e17 -cefb7958 -d3eb9f1a -01da0929 -115dc199 -8ec3834e -98ac3b46 -8808ebd8 -a4b99752 -ec6987a2 -f8ccb8f3 -938b8379 -742265dd -413def03 -54795622 -384500fa -86c2244c -de900b6b -f4c8175c -59fff39c -5440e85a -4814d18a -3854c54b -a59f6908 -7a3d12eb -df0901fb -9fa25170 -82730caa -b6b03f3c -c3311ea6 -ce4c5818 -dfb08cf5 -41c73a55 -373a1b60 -906d2aa6 -6902f19e -130755c4 -91df54b7 -2252b6a2 -5662d47d -1c7c8cff -46f5c125 -94ad618c -d6c4e752 -da0d97d9 -44fd8dc2 -f2c3ff40 -7af897d4 -f49bbf9e -b79ac580 -06fb7576 -27ae80ba -37fbfd83 -1321b557 -55176b7b -0c507b91 -ef753c31 -719c21d0 -dd862a48 -0c11baff -5d52097d -26e7c902 -c36252b8 -d566d875 -17704279 -1f1d4cb4 -acda0c25 -2c193d02 -76eb11f2 -2f44e7ad -267032a0 -9221b010 -b08a2531 -ae30f1c0 -a21cf818 -ead02d4d -7a8e9d32 -e5e07552 -178e930b -970bba39 -cd76db50 -f51139a4 -37500bc4 -aa44c8ad -71f84515 -f3547e48 -9159cf7e -594902ca -944d33e5 -ce2e7447 -28bc691e -f7192179 -21c7f8ac -15a03321 -70348284 -b733640c -778bb9d0 -6aede476 -297bc007 -6d2db9e3 -777568b1 -bffb6c5c -4d919b2c -27b012a3 -601ab28f -14a7dd83 -5c13758e -2f6aa770 -c53cdcec -112154cc -6ee2a48d -f96eaffa -bea9e8e1 -8fbff9ba -f85318ab -2552fbf9 -7766baf8 -0f99d8bc -90caf76c -b68c8fce -e76d4fd2 -13e5cf6b -241c62a9 -47cd73ed -7286ebd5 -8364a709 -04655da3 -d0917142 -fe34a15a -76427709 -051f776c -20176dbe -643861c8 -9738bfb9 -a0a5da8e -5843990b -1d48d020 -25fb16b4 -fb0eb1b1 -bd94509c -7e41ea23 -fe183d04 -235c2871 -386ef954 -a7ae401e -0274846b -ea41b7ed -180c5db5 -4e610134 -41e5a5de -59c88ec0 -275bbf80 -e67ce511 -ae5fdcbb -a4b6b671 -b0f94bb3 -6dae4547 -7369fd5d -dc905617 -ab1ad495 -e2ed5e55 -ae7956e9 -8d1ad6ad -4850ce39 -51292419 -587e6045 -ac00dc6f -e3c10402 -db7f00d2 -3179de9e -e94a4aae -8c3003f2 -344b7378 -babcca25 -739e6846 -4e0bd50e -fb1fabbe -1e968c87 -20ef8fb9 -61abfe14 -d3d2949f -cf06b7ba -0a0a51ab -009528a2 -21ca5d6a -4e1ce991 -f56226f0 -458386c3 -369a77e4 -07794c17 -904e1be2 -ccc9946a -7ebcfbeb -975d4081 -d6c7557a -6ae9cad2 -6e2914f1 -079f948a -da41a115 -c718d7e2 -50c0297e -90df8591 -a1ba54e4 -0416a183 -60dfcf34 -7df931f4 -ed8685a8 -ff5235a4 -e2c67631 -806c32a5 -9bd712f2 -227a5c05 -941eb482 -07e0de00 -9929530c -ed770f3c -a940316a -4dfc2307 -61ef64f3 -ce6ee408 -095b11d2 -998d1525 -1f8959c6 -75ee935f -8c012a58 -59cf4bb2 -37129737 -97933e6c -88e84d10 -9687f28f -af67ce7e -d2fe2e7e -03d868ca -b6d75e84 -315dd6e0 -092936e8 -2b2b66bc -784abebb -924323e0 -4f829b65 -1f93156a -17b8b123 -09b8adbd -8b16bb0d -eab40053 -39be2172 -e449d725 -91e42acb -12d44866 -975a8550 -890b11f4 -b432d4f7 -9d2679e4 -b76d454d -8d50f5a3 -cd9cb03a -82765bb9 -eed7a24a -4d70bff2 -76b1fd3d -f21aa48f -b3988b52 -93ff019d -3c464110 -4e1b3480 -9b01f7cc -fb77097b -5b331999 -3a590a1e -2d37de81 -181634e1 -bf97e520 -6eb627af -6df8ccf6 -6fb4da1c -e08409f0 -d9b79d35 -432ff218 -038cadcd -03b1d74b -de339eca -4b6ea010 -47ac5fed -bbe8f88d -aff7c0fc -2f8b9e9d -a6ea1c0d -d8811d8b -8f552614 -f9372307 -1f54c800 -c6185622 -49e53ebf -618c63b6 -5b82ed10 -88161ece -a4655337 -1a5e0a7c -67172b13 -7eda7fa5 -8480ccb8 -20df9f5f -d15d74e2 -78352f25 -3cddd319 -ad057c8a -bd9ddde3 -ba474c12 -0f405811 -2d6c70e9 -fc1ab9b1 -e06b92d7 -6528dc26 -6c5f83e7 -27d96724 -c8118677 -91e5ea9b -6f91b4e9 -9bee3e88 -73c76989 -89b51740 -0ad53eaa -6b93f9e6 -fba3efd2 -027bb37e -f546a748 -e292ce95 -11de2f22 -6e66e63a -4911f990 -e4d1d766 -d0c19189 -2ac3db77 -e9e12a01 -3de99647 -e157e19c -a3804f76 -768c298e -514f56c6 -3789436b -337e0da0 -c09b83b6 -dfbe3fdd -32210885 -0f0e272c -b9b244f9 -bd919226 -9c8c75fa -18ea2018 -ee44bb7c -24ab19a7 -977b499b -5c8d6a66 -6410a88e -902f726e -b1fddfae -e5263927 -190e7f0a -fa2ab34d -9f5709f6 -61d1a41a -80a0facc -799acb32 -dc5e11e0 -a90aadba -996d80fc -bb14ce1b -e079d9c9 -824b2c4a -80cf3c1b -cc8d6960 -701ec1f8 -5c72f0c6 -0d1ba1d8 -4f998f55 -158b623f -dc082dd8 -d3ba8c80 -77855195 -21eb1435 -ef99f823 -941fd871 -3b550ca5 -eacfab95 -f67e5449 -481fd4ce -24eb5ff6 -358ec558 -1156c490 -e9833309 -05cbd4ea -1365ac69 -48474e5f -0485c092 -cb8c0ae0 -0e451971 -a82ac1bc -9caddbe4 -debe392e -4cda8288 -1800da46 -3e693a7f -d73f2b51 -492c17b4 -f6bd3c04 -865d12f6 -be74044f -ec0a4362 -50c5155c -5eee0a00 -e27b61d4 -2b9ad975 -bbcc63ef -984587b6 -8b901a46 -355f5ebe -6f9b2426 -6c2cbffa -e5e1249c -edc4dddb -cdcdd94a -8f431550 -07b6a06c -3178dfc6 -97ee3481 -bade9444 -0d6c4a36 -386a0e05 -20c84858 -f51f77ac -ac2fac39 -f310b87c -14a0d801 -6756e5d3 -5d0192c6 -e684088e -ac162d96 -080d1b0b -a1ebff68 -1d0dd747 -fa5eb662 -f88ef8da -f85277a6 -59a681e0 -7576ec10 -f4200585 -6b441fc9 -aaaff3ef -1ec44a2d -9dc1f7aa -6421bdd5 -f2a116ce -5675afb7 -a251f3cf -22f357f6 -82931f69 -15c27bb8 -5674fdc3 -ecbb9e18 -1aaf9ac4 -848c35e4 -ddf0b0ce -4c8d386e -5f284491 -138fc61d -afd89e1b -04fe62a1 -967e79d4 -e866189d -829c3a67 -f41224d0 -51f69bea -bb161b4f -529b977b -15c5f972 -582e600e -62bd0989 -4ec931cd -ee64b018 -73e7fe60 -674dfbef -f6a8eec0 -9bbf6224 -273cba30 -098db45f -ae9a56f2 -f3dd7d99 -840f9b3a -1e28cff0 -cbd8bbb9 -464cc714 -6dc00f2c -5d089b85 -9fae2edd -ed35c08f -3b2f7846 -63c134ab -da4fade5 -c968e1e4 -5bc3c89d -6c4c5c26 -1d4d6ab9 -faf97b40 -e2360bf3 -9aeae3bf -3b09013e -de78f0f4 -fd350dff -f0aad36b -e1c9bd6b -dd8b15e7 -fc1e4641 -09324d07 -baef44a8 -a9c16412 -9a42289e -94888cf0 -f29adecf -87aee9f7 -ffdc53d6 -c957f420 -274641b1 -b587634c -6fd5eeeb -3bd48e8f -c5349e64 -7cb39785 -eab32cc4 -4accfd03 -5669b5ba -ea3e2d20 -c42fccc0 -5c15d7b2 -38cde319 -893b9751 -cf4e82e0 -1ed4d470 -2b159a20 -78bc0149 -626a7b86 -5994f2c7 -34ff77ae -d056ebda -69a125cc -cf629486 -380217fa -88cb283e -21bdecd9 -f98e4a34 -10de24f1 -bd34a761 -139cd27b -51e8d3c4 -13dd5114 -e0c1c434 -9148302d -69d55af3 -21086fb1 -bac37e1f -911ac278 -6f22348e -298ae053 -eefb3b8f -f5fdbbda -eef19f48 -aea98bf2 -0965d15b -88a8bafc -c952d5e7 -8255b509 -0c797cfd -fc78cb40 -ac76fc1c -eba04f8b -5139fd32 -f4987eec -612c89ec -b71b6b94 -36325874 -e133fc32 -2a9c0a13 -066efdd3 -279ea165 -a1f56a7c -2dd63c28 -3c8048cf -071c9458 -6ab1936d -76b4a96f -91fe61d3 -1d95cb4a -1eb47462 -6b3d9f66 -6bb8ff4e -891b83d7 -15ef8b16 -b68a27da -281cd82e -ce80f7c3 -c26f1db2 -897d9fe5 -a87a170b -75f32b41 -4d51c058 -239853f5 -a4fe495b -08d6920e -006e4fc6 -94038f30 -eb8330d4 -a9632e3c -82b69205 -1141b67f -940e472b -faa97965 -398f5587 -d6ac851f -d29e0845 -07f5e51d -9da580da -9875bad1 -d53af4a2 -339863c4 -ff704db9 -c988a7cc -0d737406 -5bc1c366 -060a96a3 -132a7176 -37bca109 -498db88f -a3203c5d -c313bc1f -62fb1bdd -b1834066 -032c8eef -aa467bbe -79a1be95 -9b9aaad1 -d9727976 -e4367cca -1e4fa722 -3c2c0e92 -e3d46aaf -b264d045 -b4c8ccd7 -6baeea37 -54086782 -e0f003e9 -c099a251 -f69b0ae6 -7dddc76e -29ade05f -6dc3c897 -13e6d903 -d9adf7ed -0af2ee97 -0d453de3 -2a5dc0a0 -cb293e7d -e6a4d5ca -6ed26048 -a422af66 -8347dddc -755961a9 -fc6c3182 -9aaacd63 -7886e3e0 -9c1f741f -e1832ab2 -5902a9db -596f5f8a -1694bd33 -ca11073c -dd4ec4d8 -dc17ae6e -ef677106 -c3ade7e5 -c21356dd -298afd85 -8ff6f686 -4a76e8bd -b5ebf281 -11d39975 -72160203 -5c8d5a53 -f5ecdea7 -7cf8f48f -f6334166 -5eb56eb3 -0e362f5b -980c1951 -3c4600e4 -8895b556 -9ccf6ae3 -a8337ec9 -a6847b5a -fc4ac26e -d60c071a -f3f739b0 -fe1e1b5f -f62bb743 -da795f59 -051f7fce -b9fb3366 -3d6e3656 -6793dc88 -14479032 -81ab3ced -cf5e006a -c268d3b8 -3468c62f -5916831c -6ca2aa45 -33220d21 -738de638 -a08b9f10 -333afa1e -8e36868a -997506fb -b8f41082 -acb0dce1 -ffec3646 -324a1353 -6d3f41e2 -8cccf3db -c96efd04 -7efa48c8 -242a80c0 -0ffbb59f -f65e770d -da9c389c -e380a160 -4dd5ba9f -f65cf3fd -1012f03f -9e7e1fc7 -b16fd2bd -85fcd603 -3359593a -6c5e1579 -66a4d211 -72745307 -a60f5508 -7c2c966d -3396820a -9bb4752d -0f26a0eb -0cf25923 -07b45c93 -df3c45b4 -2e2ffb99 -8f0846a2 -e683ff72 -66b072b9 -11cd9a20 -2a933ad3 -450fdb90 -8525e8a8 -67dcaa94 -9535971c -51fd3b91 -3e1c8521 -8b668bc1 -b66b3284 -58f7947a -53fbff6c -2c9b6faf -c70afc92 -2dac529c -dd68f201 -6a001c14 -7213516d -c5ecc015 -18bb28e9 -99ef61ef -265039f6 -dae9b288 -14b91c79 -3d060671 -0973e89c -280b1b74 -d798c9cf -a7298946 -95a4d257 -8c8a1a32 -735c076b -4d884414 -894deab4 -0b54aacc -953b00b0 -3d4806b6 -f829d29f -4d984bcd -a96ec2b3 -acca7f12 -432779ee -5ae6a222 -61b0ee09 -bedc25e2 -ff1e5bef -53e8eb40 -137a9777 -cf84b682 -2904cdef -03cc0f27 -34c2da80 -a51ef9fb -a45d3822 -3138cec5 -97fa4cf8 -7c1d45c5 -8c577fb5 -272722b8 -22b26b7b -00000000 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/xperm.b-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/xperm.b-01.reference_output deleted file mode 100644 index 46ae2a6f8..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/xperm.b-01.reference_output +++ /dev/null @@ -1,1092 +0,0 @@ -ff000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -000000db -00000000 -00000000 -00005800 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -fefefefe -fefefefe -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -0000f6d5 -00000000 -00000000 -000000fc -00000000 -00000000 -00000000 -00000000 -00000000 -04040404 -04040404 -b6b6b6b6 -00b6b6b6 -39393939 -00393939 -7f7f7f7f -007f7f7f -a3a3a3a3 -00a3a3a3 -3b3b3b3b -003b3b3b -3a3a3a3a -003a3a3a -38383838 -00383838 -00000000 -00000000 -3a3a3a3a -00003a3a -d8d8d8d8 -0000d8d8 -efefefef -0000efef -47474747 -00004747 -aeaeaeae -0000aeae -60606060 -00006060 -e6e6e6e6 -0000e6e6 -dfdfdfdf -0000dfdf -49494949 -00000049 -1e1e1e1e -0000001e -4e4e4e4e -0000004e -d3d3d3d3 -000000d3 -f5f5f5f5 -000000f5 -17171717 -00000017 -d6d6d6d6 -000000d6 -01010101 -00000001 -20202020 -00000000 -85858585 -00000000 -9f9f9f9f -00000000 -59595959 -00000000 -c9c9c9c9 -d9000000 -3e3e3e3e -00000000 -fbfbfbfb -004c0000 -a7a7a7a7 -00000000 -009f9f9f -00000000 -00d7d7d7 -00000000 -00474747 -00000000 -00c5c5c5 -00000000 -00666666 -00000000 -004b4b4b -00000000 -00989898 -00000000 -00e2e2e2 -00000000 -2900ebeb -00000000 -0000eded -00000000 -00003030 -00000000 -00002828 -00000000 -0000cdcd -00000000 -00009292 -00000000 -00005050 -00000000 -0000b1b1 -00000000 -000000e8 -00000000 -000000ae -00000000 -000000d9 -00000000 -00000055 -00000000 -000000d7 -00000000 -00000033 -00000000 -0000dbc9 -00000000 -00000056 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00560000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -0000b000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000090 -00000000 -00008000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -23000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -000000ad -00000000 -00000000 -00000000 -00000000 -00008000 -00000000 -40000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00e70000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -2b000000 -00000000 -000000ed -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000055 -00000000 -00000000 -00000000 -00000000 -0000006e -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -000000e4 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -0000ad00 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -0000f100 -00000000 -4d000000 -00000000 -6b000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -001a0000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -006e0000 -00000000 -00004b00 -00000000 -f9000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00010000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -0000fe00 -00000000 -00000000 -00000000 -7f000000 -00000000 -00000000 -00000000 -004e0000 -00000000 -0000ff00 -00180012 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -0d000000 -0000a400 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00004300 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00008c00 -00000000 -000000ff -00000075 -00000000 -000000ff -00000000 -00000000 -00000000 -000000fd -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00008700 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -ff000000 -00000000 -0000ff00 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00003100 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -0000ff00 -00000000 -00000000 -00ff0000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -ff000000 -00000000 -00000000 -bf000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00f60000 -00000000 -00000000 -00000000 -00000000 -00000000 -17000000 -9f000000 -00009400 -4d000000 -00000050 -90000000 -00000000 -72000000 -00000000 -a8000000 -00000000 -57000000 -00000000 -c4000000 -00000000 -7c000000 -00000000 -0ad89d00 -00000000 -c85a0000 -00000000 -b7f30000 -00000053 -74740000 -00000000 -cbcb0000 -00000000 -9a9a0000 -00000000 -54540000 -00000000 -7e7e0000 -00000000 -dadad700 -00000000 -90908800 -00000000 -75752e00 -00000000 -42424200 -00000000 -34343400 -00000000 -68686800 -00000000 -dedede00 -00000000 -34343400 -00000000 -f7f7f76e -00000000 -181818fc -00000000 -35353558 -00000000 -22222222 -00000000 -2f2f2f2f -00000000 -3b3b3b3b -00000000 -fdfdfdfd -00000000 -95959595 -65000000 -5f5f5f5f -20000000 -acacacac -fd000000 -34343434 -f8000000 -f8f8f8f8 -4d000000 -4d4d4d4d -9e000000 -9e9e9e9e -f9000000 -f9f9f9f9 -01000000 -01010101 -ac880000 -acacacac -09de0000 -09090909 -defc0000 -dededede -9b9b0000 -9b9b9b9b -03030000 -03030303 -7b7b0000 -7b7b7b7b -2e2e0000 -2e2e2e2e -c8c80000 -c8c8c8c8 -3b3b1f00 -3b3b3b3b -9898ba00 -98989898 -56562500 -56565656 -dadada00 -dadadada -c2c2c200 -c2c2c2c2 -79797900 -79797979 -17171700 -17171717 -90909000 -90909090 -fbfbfb2b -fbfbfbfb -898989d4 -89898989 -48484878 -48484848 -41414141 -41414141 -00000000 -00000000 -00000000 -00ee0000 -00000000 -000000c3 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -001b0000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -17000000 -00000000 -00000000 -9e000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -61000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00ba0000 -00000000 -00000000 -00002800 -00000000 -00000015 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000100 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -07000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -ab000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00020000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000026 -00000000 -00001000 -00000000 -00240000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00006400 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000007 -00000000 -00000000 -00000000 -000000cd -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00450000 -4b000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00008400 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -0000008a -00000000 -00000000 -00000000 -000000ff -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000039 -00d00000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00ff0000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -0000ff00 -00000000 -00000000 -00000000 -00001100 -0000ff00 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00ff0000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -f0f0f0f0 -00f0f0f0 -00000000 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/xperm.n-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/xperm.n-01.reference_output deleted file mode 100644 index f29baecfd..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/K_unratified/references/xperm.n-01.reference_output +++ /dev/null @@ -1,1092 +0,0 @@ -ffffffff -ffffffff -fdf6f5af -01684ef4 -80080188 -8a1c2002 -b1b7f498 -b1176671 -fb8ef22d -2bf24b78 -00000000 -00000000 -00000000 -00000000 -b0109003 -4d147391 -a8988e8e -6f9bca4e -19edfdc1 -16611c00 -130e16f5 -2ce5511f -f8468cff -ff4567f4 -d9ef9dfd -ed6dd9eb -66666666 -66666666 -ffa99147 -4ffef9e9 -3ec96a52 -9d95fe93 -6fcd666b -db9d3d3f -44120721 -b840f930 -f9f5f6bc -6c5f451c -4e7d488f -d8bfef83 -79d93429 -34449553 -44444444 -44444444 -66666666 -d6666666 -99999999 -49999999 -ffffffff -6fffffff -33333333 -63333333 -bbbbbbbb -d4bbbbbb -aaaaaaaa -75aaaaaa -88888888 -ae888888 -00000000 -ba000000 -aaaaaaaa -88aaaaaa -88888888 -d1488888 -ffffffff -cf2fffff -77777777 -ddd77777 -eeeeeeee -7bffeeee -00000000 -6a200000 -66666666 -7f056666 -ffffffff -dd2affff -99999999 -d191d999 -eeeeeeee -db752eee -eeeeeeee -e273eeee -33333333 -3302d333 -55555555 -94e98755 -77777777 -8d787777 -66666666 -49879e66 -11111111 -42402611 -00000000 -2022d2f0 -55555555 -8c36cc05 -ffffffff -bf50c99f -99999999 -727e2559 -99999999 -9222cc9f -eeeeeeee -cb8cb9bb -bbbbbbbb -ccb02bc9 -77777777 -07072a01 -ffffffff -cd4c5508 -e7777777 -3dff33cc -37777777 -13b7e070 -25555555 -cba258ca -d4666666 -64472364 -f5bbbbbb -ef555ef4 -73888888 -44b925cf -ea222222 -ae0c636a -bf7bbbbb -9c97d2e9 -080ddddd -a966f939 -30400000 -9445950d -14188888 -87471812 -6252dddd -4d4e586b -cfd92222 -e3dc8cd9 -98c20000 -200785c2 -20cd1111 -8b2b0977 -64644888 -66486889 -b99d0eee -9611ad37 -6218b999 -80bab9aa -feab2555 -5ff52eaf -6b2dc477 -7fcc6ccc -85808833 -b3345805 -17b99799 -bc007cdd -d5560d66 -2e252257 -cfa14afd -1f00939f -fe62bbbe -a9c9dc6e -a9a56fbd -909af661 -56959bac -55276cdb -0e607567 -e6035705 -3370ad70 -b7770767 -f0f60a96 -06cc7606 -f3493694 -83438796 -00000000 -00000000 -00000000 -00000000 -00000000 -00000004 -00200002 -00000000 -00000000 -0000d000 -00000000 -00500000 -0000fc00 -00ffc000 -00200020 -00000000 -00007000 -00700000 -00000006 -00000000 -0c000004 -00040000 -0e000000 -00000000 -0600000b -00000000 -00000000 -00000700 -00050030 -00440000 -00009003 -00232300 -d000000c -00000500 -800ff000 -0d800008 -0a0800e0 -0880ee00 -00007010 -10000170 -00000004 -001b0008 -0a80e0f0 -0e0a00ff -0d0d0000 -0a00000a -00000160 -10010006 -00090000 -7600070e -0d000000 -00800024 -00700c00 -c0808078 -000a0b00 -0ba030b0 -00000000 -0a1606c0 -00389200 -bb080300 -007080d0 -70000008 -0a20000a -29d00047 -0a070007 -0aa00b0b -00006660 -01018068 -808674c0 -00067070 -006060e0 -9090ee60 -08ff07a0 -8005fff0 -59dd0a00 -0a4880d0 -8f000004 -0640400e -56030000 -50300e0a -00191008 -08d0b060 -09ab00ff -1a9a0977 -000420f2 -804f0fc0 -df02d90d -2cce330c -0047b704 -405c7400 -c40667d0 -0dd00c6c -5b00001b -051f6bf5 -aed0705a -4a06d707 -d5c00030 -527c7525 -9707a48e -0f7a8a59 -4aaddaf0 -44fcd4c4 -9959d902 -0500555a -02b20c51 -0139ce0d -03810e33 -106e3e00 -ff93f090 -90398aa3 -ff90e9ad -6a11bd19 -0bda0bb9 -f0526d54 -e109150e -5a5550e0 -2e9d552e -55c55945 -3b62553c -0310f003 -2b18c661 -ccbc63cc -f04f5ffc -cfc5520f -edbe6493 -3124cec2 -8fefefee -04604fef -76adaadd -6dad7d47 -00e0bbae -003707eb -fb226ae6 -edfa66ed -d01d2240 -04d22177 -03aa8847 -33e3a3a3 -e8623830 -308ee0a3 -a4dad02a -9f395b92 -00c02cf1 -10c0cf66 -ff1187d8 -1ad42457 -ff6aca99 -9c699acc -25004400 -25b04a47 -1e4f3666 -1e3d36f4 -add6d966 -dacd014a -3a7a1777 -57e28a81 -6a505ccc -a925265a -78bbb777 -b7bab7cb -d6303000 -1c6707e0 -8f6abbbb -fa26466f -7970cccc -c9889902 -7afd6666 -868e0436 -c7466666 -4ddd3d6d -77f77777 -797304df -c77fffff -7df7d147 -60711111 -6116a01b -f4600000 -b20f0cf0 -d0888888 -dd08dddd -65eeeeee -27b57eba -8bdddddd -1b900ba0 -15111111 -f51d9414 -83333333 -8488c884 -08888888 -b5e88804 -01111111 -9ca9001a -41111111 -599e5ae9 -cccccccc -70892da1 -22222222 -859c2a62 -33333333 -06363c66 -eeeeeeee -e8adfee6 -44444444 -ad13b994 -22222222 -4c2bac42 -11111111 -f17b1c71 -cccccccc -4cc1111c -00000000 -af6cc000 -88888888 -c8d22c88 -eeeeeeee -4faf9aee -44444444 -faafa844 -88888888 -994f5888 -11111111 -0d9c7111 -77777777 -6fe78777 -cccccccc -6c451ccc -55555555 -9e665555 -66666666 -a73a6666 -99999999 -579a9999 -eeeeeeee -0777eeee -bbbbbbbb -dddbbbbb -11111111 -8e811111 -bbbbbbbb -409bbbbb -eeeeeeee -e12eeeee -00000000 -30000000 -66666666 -20666666 -99999999 -ef999999 -99999999 -d0999999 -33333333 -43333333 -33333333 -c3333333 -aaaaaaaa -eaaaaaaa -22222222 -a2222222 -66666666 -66666666 -2a803062 -22016a88 -fd88cdcd -6d2d6d8d -1bfa1112 -11acc243 -2eeadb2a -ad2e2292 -51f18568 -6a895958 -ff05fe2c -022f00ef -e8611f32 -3e4348ef -ff4f7379 -b3500579 -c314f1cd -b14e31e1 -66f3f4f7 -e336773e -f0efff0e -f2f34ffb -0294f9f9 -01999998 -95f59fda -afb9f758 -81bfccbf -ffdc88f8 -dd474bbf -f5544577 -c4cff647 -cf4f3b64 -d0c22df9 -2d5d3f8f -cffdb16c -f01fffc5 -c36f3fef -97eb77f6 -997f9c9f -9f74f5f7 -aa77af70 -e7ffaaf9 -41f54e1f -c1e3ec1f -391e3b1f -91b7fff3 -fd772fdf -7f7b7f57 -1153ff5f -fe3f33aa -5fffffcf -e559ff5f -f333ffaf -28a552ff -f595faff -f337f3e3 -fc8f08ff -f80ffffb -f111f4f8 -f83171f4 -0df2fff3 -ff2ffff2 -f6f66fff -ff1ccfbf -776affff -bfacfcf0 -ff55bff6 -ffff6ff0 -f75af33f -f543f733 -2f2ffef7 -f22fff77 -6fff6ff6 -f3f0fccc -7f25f5f5 -75f27fff -3fbff7ff -7bffffdf -f7f7ff5f -ffff73f2 -fffcd8dd -ffcfff8f -fffff4ff -fff45ff5 -ff0f0fff -ff90ff08 -f2ff22fb -2fafbfff -ff21ffff -ff6fffff -ffafffa1 -ffffffff -ffffffff -ffff1f7f -7fffafff -fff8ff8f -fff8fff8 -ffffdfff -94f9ffff -ff9fffff -cc9fffff -9cfff66f -ffff62f2 -ff7ffff6 -ffffffff -fcf3fffc -ffffffff -ffffffff -ffff4fff -ffffffff -ffffffff -ff7ffff5 -fffffcff -ffffffcf -f6ffdfff -6ffffff6 -ff3fff3f -ffffffff -7fffff6f -ffffffff -fff22fff -ffffffff -ffffffff -dfffffff -ffffffff -fffffbff -ffff7fff -f77fff7f -ffffffff -ffffffff -ce090039 -8e393e36 -b2bb1992 -a2695d95 -dfd7e92d -6eff6ff9 -a436f526 -f3b48442 -81c1c298 -276a1981 -66c71af1 -6e1e69f7 -55682b84 -284c0708 -8b5f2668 -6a2031ff -390e30e0 -2260446e -0a13d211 -88c490a3 -0fea81be -777a5d70 -c47736f4 -44cc4049 -5a1381f3 -ccc98e11 -992ad905 -aaa0a66a -a1ccac58 -88811c55 -0f0af7fb -777bf467 -33e45543 -44444a44 -462c6bb4 -bbbb8116 -94908262 -aaaa9049 -533d96dc -44445219 -e55b7b6b -eeeee955 -e277cc26 -aaaaa99b -b02fb25f -0000059e -692ac6a6 -5555577e -c275b734 -22222207 -3c498e4e -4444449e -fa612ec1 -888888e8 -3cd0323b -eeeeeedd -3bf54b80 -4444444b -9766fd4f -77777776 -0d5e5811 -8888888a -995234e6 -55555553 -32828a48 -22222222 -e828ddff -ffffffff -d3cb18f6 -bbbbbbbb -f5d52cd2 -dddddddd -55ee9bee -55555555 -f945fc95 -ffffffff -cf2aa55f -cccccccc -43464df6 -44444444 -88d87d4d -88888888 -dd664f69 -dddddddd -ee190a33 -eeeeeeee -99fbaa60 -99999999 -111d3370 -11111111 -ccc2677e -cccccccc -999b106b -99999999 -eeedafee -eeeeeeee -bbbb1909 -bbbbbbbb -3333076d -33333333 -bbbb09a9 -bbbbbbbb -eeee2b35 -eeeeeeee -88888797 -88888888 -bbbbba7b -bbbbbbbb -88888491 -88888888 -66666524 -66666666 -aaaaaa5f -aaaaaaaa -22222265 -22222222 -999999e8 -99999999 -77777711 -77777777 -00000003 -00000000 -bbbbbbb1 -bbbbbbbb -99999992 -99999999 -88888884 -88888888 -11111111 -11111111 -7d877b87 -b9ff3b0b -6a3e9030 -ec8cae10 -16cf2630 -f1c79ce7 -ecb22242 -d464c42d -05555166 -0a0460b6 -6dc543d2 -75cd0007 -211f55f1 -5c559f4f -5ce0d705 -11e1dd41 -5ca68a80 -6c7ac4aa -155305aa -a1616500 -33013fff -10e3307f -99d0059e -2e9d19e9 -d5cdc508 -28629049 -00000600 -09007900 -b7bbc0db -dbbd6c00 -8d04de10 -0d1cd444 -6b40f00b -bf00fbb2 -60002726 -76678930 -6520069a -0060d291 -0bfee8c0 -0fe0a108 -7afc0f1c -7e11b00f -429380fe -f0f20003 -80a0cf00 -00760890 -eb00e21e -00aebb02 -2bea000e -0002a00e -760076e0 -6444047a -b070b99c -b00000b7 -110d1155 -dd010d0b -000e4000 -007097e7 -00000b80 -008e0a3c -004210f0 -3300e001 -060d1000 -010d2a22 -08000f04 -d88c0000 -085004e0 -0b55a004 -a0010003 -a07707aa -8d830000 -0301ddd0 -60007680 -00066000 -01b05000 -0b007100 -29004002 -f900d004 -01000000 -0070001e -3c000f00 -9000f0f0 -03307000 -06060600 -00000300 -a3a00400 -b0080000 -01b1b0a3 -09000900 -a100f0f0 -f0000000 -f0000007 -60f20f06 -11020060 -f60f0003 -00000f00 -000ffb00 -00b00000 -00000000 -000004a0 -20002202 -00044020 -bba1000a -1000b000 -00000000 -00000000 -0b605000 -0060050b -00000300 -00000000 -90000100 -00001100 -00000000 -a00a0000 -00090000 -00000000 -00002006 -00000000 -04010040 -01000000 -0000000f -00000000 -00000000 -00007000 -00220000 -00000000 -00000000 -01000000 -00000000 -00000000 -a11e2166 -1b96a2ab -18200010 -2b10303b -ce9e9e5a -aae785a6 -c1fd10d0 -c6ffdc12 -c2226d3f -6d616d61 -3ef6e755 -beee3bee -7ebe5e67 -68b81be6 -9e9b5319 -efbfbffb -d77d2227 -ee2e244d -9398b522 -0025623b -868f3739 -cc73bf8b -0043f548 -00cc930c -fc5595cf -aaafaa95 -146e6f6e -5551145e -e7836352 -666f2532 -464e3255 -33366536 -693bca63 -2222cd1c -3fe59093 -2222e777 -6022a76a -22226105 -72200001 -000078d2 -0436da94 -77777e0b -9c591cc9 -11111bdc -d7dd83d7 -66666ddb -2d1601d2 -88888908 -abca2802 -bbbbbb0b -9b77ec91 -cccccc18 -81c8ffa2 -88888878 -5cfc5550 -77777755 -37358227 -2222222f -2db62803 -00000002 -3936650e -99999993 -e3b32ad0 -aaaaaaa9 -411f11b4 -11111111 -9f567cf6 -ffffffff -c871d9d8 -dddddddd -705f75dd -00000000 -99955a15 -99999999 -349e3131 -33333333 -c8b9a1cf -cccccccc -5b31b9e0 -55555555 -11a7160a -11111111 -44f38f44 -44444444 -cc331bb3 -cccccccc -bb1b5862 -bbbbbbbb -aaadba3f -aaaaaaaa -9991167a -99999999 -eee64cc7 -eeeeeeee -333c411d -33333333 -bbbb45ee -bbbbbbbb -6666ebe8 -66666666 -eeeeff2e -eeeeeeee -ffff646c -ffffffff -22222d9c -22222222 -11111d3d -11111111 -00000f2d -00000000 -22222ad3 -22222222 -eeeeee3e -eeeeeeee -aaaaaaa0 -aaaaaaaa -77777753 -77777777 -999999a9 -99999999 -99999996 -99999999 -5555555a -55555555 -11111114 -11111111 -dddddddd -dddddddd -eeeeeeee -eeeeeeee -ca7013a3 -79353015 -d72c8ee9 -ce14d5bc -94d6d5e5 -e4ed56ee -17277cc7 -a7e4b27e -c913eca1 -facfffc3 -9ca919ad -f69ac996 -cfbfecfc -c6fe6fff -1fd43443 -41331183 -2e01e90f -6d10601d -26f8f46e -64e2f78d -ff1adfeb -d8226fcf -c85cecec -ff68cb6b -728f72cf -f2738282 -b4b3334f -34fffaf3 -d78d1dde -186e75e8 -bbbc3fef -e433a83e -cfdc52bf -f4c5b9d4 -cf03f6ff -b615f021 -75f7c73c -eeffea2f -fc451bfb -45cec1f5 -ff9029f6 -5f625ff2 -23ffe3f4 -f2f5c3ef -cf66cf07 -ffff67ff -1af1ff46 -cf1f146f -ff833ef5 -f38ffffa -ffbe9aff -e7ef49af -fffdd0df -fbdf0010 -3f053fff -f895f06f -1fffffa0 -ffeff8f8 -51f91fff -ffbf3ff2 -fdfafa57 -d4fff665 -be9ffff9 -9fef5ebe -ff736fff -73796727 -fffff5ef -9fcff55f -3ffddbfb -fffedb8f -61fff6e4 -1ffb4fba -5f5ff1ff -ff3f14f1 -6ffcf6ff -ffbf1bf6 -f9f0f3ff -ccf3f0ff -6b66fff3 -bff88ff8 -d7fff7ff -f717ffff -ffffff83 -f828ff3f -cdfcfffc -7fdffccd -ffffe2ff -ffff27f2 -ffffff9f -f0ffffff -2ffff2ff -ff6ffff2 -9ffffcfa -fffff92a -ffb6ddfb -f06df6ff -fffffaff -afffefff -ffff4fff -6ff78fff -ffffffff -2fff2fff -ef9fbfef -9ffeffff -5f6f77ff -ffffffff -ffafffff -fffffaff -ffff7ffd -ffffffff -ffffff4f -ffffffff -1fffffff -ffff11f1 -ffffbfff -ffffffff -ffffffff -ffffffff -ffffff0f -ffffffff -ffffffff -fff5ff5f -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffefffff -66640428 -44da44a1 -99961173 -77f4f876 -a3be96a6 -425b2bd1 -89a243da -0aa0a88a -7f751225 -99a33735 -00000000 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/M/references/div-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/M/references/div-01.reference_output deleted file mode 100644 index 9f5ca9ebe..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/M/references/div-01.reference_output +++ /dev/null @@ -1,1356 +0,0 @@ -00000001 -00000000 -ffffffff -ffffffff -1f07c1f0 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -ffffffff -ffffffff -00000000 -00000000 -00000000 -00000000 -b504f335 -00000000 -00000000 -00000000 -fc000001 -ffffffff -00000000 -00000000 -00000000 -00020000 -00000001 -00000000 -f0000000 -ffffffff -fffc0000 -ffffffff -00000000 -00000000 -00000000 -00000000 -00000000 -ffffc000 -00000000 -00000000 -00040000 -00000000 -40000000 -00000000 -00000000 -00000000 -00004000 -00000000 -00000000 -00000000 -00016a09 -00000000 -33333333 -00003333 -00000001 -00000000 -55555555 -00001555 -00080000 -00000000 -66666666 -00000666 -01000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -ffffffc0 -ffffffff -00000000 -00000000 -fffffff5 -ffffffff -00000000 -00000000 -20000000 -00000000 -00002000 -00000000 -f0000000 -ffffffff -00000000 -00000000 -00000000 -00000000 -fc000000 -ffffffff -fff80000 -ffffffff -00000000 -00000000 -00000000 -00000000 -fffc0000 -ffffffff -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000800 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -ffffff80 -ffffffff -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000066 -00000000 -00000008 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -fffffffe -ffffffff -ddddddde -dddddddd -00000000 -00000000 -3c3c3c3d -fffc3c3c -00000000 -00000000 -00000000 -00000000 -ffffe020 -ffffffff -ff007fc1 -fffffc01 -00000000 -00000000 -ffffffff -ffffffff -00000001 -00000000 -00000000 -00000000 -ffffffff -ffffffff -00000000 -00000000 -00000000 -00000000 -fffff001 -ffffffff -00000000 -00000000 -fffff001 -ffffffff -fffff4b0 -ffffffff -000005a8 -00000000 -00000000 -00000000 -00000000 -00000000 -0000007f -00000000 -00000000 -00000000 -00000000 -00000000 -00000fff -00000000 -00000000 -00000000 -ffc00001 -ffffffff -ffffffc1 -ffffffff -00000000 -00000000 -fff00001 -ffffffff -00000000 -00000000 -0000003f -00000000 -00000000 -00000000 -00000000 -00000000 -feaaaaab -ffffffff -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -ffffffe1 -ffffffff -00000000 -00000000 -ffff5556 -ffffffff -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -fffffd56 -ffffffff -fffffff1 -ffffffff -00000000 -00000000 -ffffff9a -ffffffff -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -ffffffff -ffffffff -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -0000000e -00000000 -00000000 -00000000 -fffffff1 -ffffffff -fffffff9 -ffffffff -00000000 -00000000 -00000008 -00000000 -00000000 -00000000 -00000040 -00000000 -01000000 -00000000 -fffe0002 -ffffffff -00000000 -00000000 -00000010 -00000000 -00000000 -00000000 -00000000 -00000000 -ffffa57e -ffffffff -08000000 -00000000 -66666667 -ffffe666 -aaaaaaaa -0000aaaa -66666666 -00066666 -00000000 -00000000 -f001ffc1 -fffc007f -00000000 -e0000000 -00000000 -00000000 -00000000 -00000000 -ffffff9a -ffffffff -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -fffc0000 -ffffffff -00000000 -00000000 -00000000 -00000000 -00003fe0 -00000000 -00000000 -00000000 -00000000 -00000000 -fffffff0 -ffffffff -00000000 -00000000 -00000000 -00000000 -0f83e0f8 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -fffffff8 -ffffffff -00000000 -00000000 -00000000 -ffffffc0 -00000000 -00000000 -001fffff -00000000 -7fffc000 -00000000 -0002d413 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -0fc0fc0f -000fc0fc -55555555 -01555555 -fffffff0 -ffffffff -55001550 -00155001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -ffffffff -ffffffff -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -71c71c71 -1c71c71c -00000001 -00000000 -00000000 -00000000 -11111111 -11111111 -00000001 -00000000 -00000000 -00000000 -87520888 -ffffffff -78adf778 -00000000 -aaaaaaaa -2aaaaaaa -00000001 -00000000 -ffffffff -ffffffff -55555555 -15555555 -00000001 -00000000 -00000000 -00000000 -78adf779 -00000000 -00000000 -00000000 -ffffffff -ffffffff -38e38e38 -0e38e38e -00000001 -00000000 -00000000 -00000000 -87520887 -ffffffff -78adf777 -00000000 -8e38e38e -e38e38e3 -ffffffff -ffffffff -00000001 -00000000 -eeeeeeef -eeeeeeee -ffffffff -ffffffff -00000000 -00000000 -78adf778 -00000000 -87520888 -ffffffff -55555555 -d5555555 -ffffffff -ffffffff -ffffffff -ffffffff -aaaaaaab -eaaaaaaa -ffffffff -ffffffff -00000000 -00000000 -87520887 -ffffffff -ffffffff -ffffffff -00000001 -00000000 -c71c71c7 -f1c71c71 -ffffffff -ffffffff -00000000 -00000000 -78adf779 -00000000 -87520889 -ffffffff -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000002 -00000000 -00000000 -00000000 -ffffffff -ffffffff -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -11111111 -11111111 -00000000 -00000000 -00000000 -00000000 -d70a3d70 -0a3d70a3 -00000001 -00000000 -00000000 -00000000 -b7979eb8 -ffffffff -48686148 -00000000 -99999999 -19999999 -00000000 -00000000 -ffffffff -ffffffff -cccccccc -0ccccccc -00000001 -00000000 -00000000 -00000000 -48686148 -00000000 -00000000 -00000000 -00000000 -00000000 -88888888 -08888888 -00000000 -00000000 -00000000 -00000000 -b7979eb8 -ffffffff -48686147 -00000000 -22222222 -22222222 -00000001 -00000000 -ffffffff -ffffffff -ae147ae1 -147ae147 -00000002 -00000000 -00000001 -00000000 -6f2f3d70 -ffffffff -90d0c290 -00000000 -33333333 -33333333 -00000001 -00000000 -ffffffff -ffffffff -99999999 -19999999 -00000002 -00000000 -00000001 -00000000 -90d0c291 -00000000 -00000001 -00000000 -ffffffff -ffffffff -11111111 -11111111 -00000001 -00000000 -00000000 -00000000 -6f2f3d6f -ffffffff -90d0c28f -00000000 -c3a90445 -ffffffff -00000000 -00000000 -00000000 -00000000 -dbcbcf5d -ffffffff -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -ffffffff -ffffffff -a57d8667 -ffffffff -00000000 -00000000 -ffffffff -ffffffff -d2bec334 -ffffffff -00000000 -00000000 -00000000 -00000000 -ffffffff -ffffffff -00000000 -00000000 -00000000 -00000000 -e1d48223 -ffffffff -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -3c56fbbb -00000000 -00000000 -00000000 -00000000 -00000000 -243430a3 -00000000 -00000000 -00000000 -00000000 -00000000 -ffffffff -ffffffff -00000001 -00000000 -5a827999 -00000000 -00000000 -00000000 -ffffffff -ffffffff -2d413ccc -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -1e2b7ddd -00000000 -00000000 -00000000 -00000000 -00000000 -ffffffff -ffffffff -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -ffffffff -ffffffff -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -71c71c71 -1c71c71c -00000000 -00000000 -00000000 -00000000 -11111110 -11111111 -00000001 -00000000 -00000000 -00000000 -87520888 -ffffffff -78adf778 -00000000 -aaaaaaaa -2aaaaaaa -00000001 -00000000 -ffffffff -ffffffff -55555555 -15555555 -00000001 -00000000 -00000000 -00000000 -78adf779 -00000000 -00000000 -00000000 -00000000 -00000000 -38e38e38 -0e38e38e -00000001 -00000000 -00000000 -00000000 -87520887 -ffffffff -78adf777 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000002 -00000000 -00000000 -00000000 -ffffffff -ffffffff -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -11111110 -11111111 -00000000 -00000000 -00000000 -00000000 -d70a3d70 -0a3d70a3 -00000000 -00000000 -00000000 -00000000 -b7979eb8 -ffffffff -48686148 -00000000 -99999999 -19999999 -00000000 -00000000 -ffffffff -ffffffff -cccccccc -0ccccccc -00000001 -00000000 -00000000 -00000000 -48686148 -00000000 -00000000 -00000000 -00000000 -00000000 -88888888 -08888888 -00000000 -00000000 -00000000 -00000000 -b7979eb8 -ffffffff -48686147 -00000000 -22222221 -22222222 -00000001 -00000000 -ffffffff -ffffffff -ae147ae1 -147ae147 -00000001 -00000000 -00000000 -00000000 -6f2f3d70 -ffffffff -90d0c290 -00000000 -33333332 -33333333 -00000001 -00000000 -ffffffff -ffffffff -99999999 -19999999 -00000002 -00000000 -00000001 -00000000 -90d0c291 -00000000 -00000001 -00000000 -ffffffff -ffffffff -11111110 -11111111 -00000001 -00000000 -00000000 -00000000 -6f2f3d6f -ffffffff -90d0c28f -00000000 -3c56fbbb -00000000 -00000000 -00000000 -00000000 -00000000 -243430a3 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -5a827999 -00000000 -00000000 -00000000 -ffffffff -ffffffff -2d413ccc -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -1e2b7ddd -00000000 -00000000 -00000000 -00000000 -00000000 -ffffffff -ffffffff -00000000 -00000000 -71c71c72 -1c71c71c -00000001 -00000000 -ffffffff -ffffffff -11111111 -11111111 -00000001 -00000000 -00000000 -00000000 -87520888 -ffffffff -78adf778 -00000000 -aaaaaaab -2aaaaaaa -00000001 -00000000 -ffffffff -ffffffff -55555555 -15555555 -00000001 -00000000 -00000000 -00000000 -78adf779 -00000000 -00000001 -00000000 -ffffffff -ffffffff -38e38e39 -0e38e38e -00000001 -00000000 -00000000 -00000000 -87520887 -ffffffff -78adf777 -00000000 -8e38e38f -e38e38e3 -ffffffff -ffffffff -00000000 -00000000 -eeeeeeef -eeeeeeee -ffffffff -ffffffff -00000000 -00000000 -78adf778 -00000000 -87520888 -ffffffff -55555556 -d5555555 -ffffffff -ffffffff -ffffffff -ffffffff -aaaaaaab -eaaaaaaa -ffffffff -ffffffff -00000000 -00000000 -87520887 -ffffffff -00000000 -00000000 -00000001 -00000000 -c71c71c8 -f1c71c71 -ffffffff -ffffffff -00000000 -00000000 -78adf779 -00000000 -87520889 -ffffffff -00000002 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000003 -00000000 -00000000 -00000000 -ffffffff -ffffffff -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -11111111 -11111111 -00000000 -00000000 -00000000 -00000000 -d70a3d70 -0a3d70a3 -00000001 -00000000 -00000000 -00000000 -b7979eb8 -ffffffff -48686148 -00000000 -9999999a -19999999 -00000000 -00000000 -ffffffff -ffffffff -cccccccd -0ccccccc -00000001 -00000000 -00000000 -00000000 -48686148 -00000000 -00000000 -00000000 -00000000 -00000000 -88888888 -08888888 -00000001 -00000000 -00000000 -00000000 -b7979eb8 -ffffffff -48686147 -00000000 -22222222 -22222222 -00000001 -00000000 -ffffffff -ffffffff -ae147ae1 -147ae147 -00000002 -00000000 -00000001 -00000000 -6f2f3d70 -ffffffff -90d0c290 -00000000 -33333333 -33333333 -00000001 -00000000 -ffffffff -ffffffff -99999999 -19999999 -00000002 -00000000 -00000001 -00000000 -90d0c291 -00000000 -00000001 -00000000 -ffffffff -ffffffff -11111111 -11111111 -00000001 -00000000 -00000001 -00000000 -6f2f3d6f -ffffffff -90d0c28f -00000000 -c3a90445 -ffffffff -00000000 -00000000 -00000000 -00000000 -dbcbcf5d -ffffffff -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -a57d8667 -ffffffff -00000000 -00000000 -ffffffff -ffffffff -d2bec334 -ffffffff -00000000 -00000000 -00000000 -00000000 -ffffffff -ffffffff -00000000 -00000000 -00000000 -00000000 -e1d48223 -ffffffff -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -3c56fbbc -00000000 -00000000 -00000000 -00000000 -00000000 -243430a4 -00000000 -00000000 -00000000 -00000000 -00000000 -ffffffff -ffffffff -00000001 -00000000 -5a82799a -00000000 -00000000 -00000000 -ffffffff -ffffffff -2d413ccd -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -1e2b7dde -00000000 -00000000 -00000000 -00000000 -00000000 -ffffffff -ffffffff -00000001 -00000000 -00000000 -00000000 -ffffffff -ffffffff -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -38e38e39 -fffffffe -00000001 -00000000 -00000000 -00000080 -99999999 -00019999 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/M/references/divu-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/M/references/divu-01.reference_output deleted file mode 100644 index f9d0068d6..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/M/references/divu-01.reference_output +++ /dev/null @@ -1,1648 +0,0 @@ -00000001 -00000000 -00000001 -00000000 -ffffffff -ffffffff -00000000 -00000000 -0000000d -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -ffdfffff -3fffffff -ffffffff -1ffeffff -00000000 -00000001 -00000000 -00000020 -00000000 -00000000 -ffffffff -01ffbfff -00000080 -00000000 -00000000 -00000000 -00000000 -00000200 -00000000 -00000000 -000fffff -00000000 -ffffffff -0006ffff -ffffffff -ffffffff -00000004 -00000000 -ffffffff -00007fff -33333333 -00003333 -ffffbfff -00003fff -00000000 -00000000 -fffbffff -00000fff -00000100 -00000000 -00000000 -00000000 -000001ff -00000000 -00000000 -00000000 -00000000 -00000000 -fff7ffff -0000003f -ffffffff -0000001f -00000080 -00000000 -bfffffff -00000007 -ffffffff -00000003 -00000001 -00000000 -00000000 -00000000 -2aaaaaaa -00000000 -3fffffff -00000000 -00000000 -00000000 -00000000 -00000000 -02aaaaaa -00000000 -00000000 -00000000 -01ffffff -00000000 -00ffffdf -00000000 -007fefff -00000000 -003ff7ff -00000000 -00000000 -00000000 -000bffff -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00003fff -00000000 -00000000 -00000000 -00000fff -00000000 -000007ff -00000000 -00000002 -00000000 -000001ff -00000000 -000000ff -00000000 -00000000 -00000000 -0000003f -00000000 -0000001f -00000000 -00000000 -00000000 -00000000 -00000000 -00000003 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -0000000b -00000000 -0000001c -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000800 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00002000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000200 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -04000000 -00000000 -00002000 -000fffff -00000000 -50d79435 -0d79435e -000001ff -00000000 -00000001 -00000000 -00000001 -00000000 -00000001 -00000000 -b13b139d -13b13b13 -00000000 -00000000 -00000001 -00000000 -ffffffbf -000fffff -110fffff -11111111 -332ccccc -33333333 -1fffffff -00000000 -ffffbfff -001fffff -00000001 -00000000 -fffeffff -0003ffff -0000ffff -00000000 -1fffffff -00000000 -fdffffff -0003ffff -ffffffff -1999997f -ffffffff -3fffff7f -00000000 -00000000 -fdffffff -00001fff -ffffffff -00fffeff -f7ffffff -000003ff -3ffeffff -00000000 -ffffffff -ffefffff -ffffffff -000003fd -ffffffff -07dfffff -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -ffffffff -ffffffff -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000003 -00000000 -00000000 -00000000 -71c71c71 -1c71c71c -00000001 -00000000 -00000000 -00000000 -11111111 -11111111 -00000001 -00000000 -00000000 -00000000 -78adf778 -00000000 -ffffffff -ffffffff -55555555 -00000000 -aaaaaaaa -2aaaaaaa -00000001 -00000000 -00000000 -00000000 -55555555 -15555555 -00000001 -00000000 -00000000 -00000000 -78adf779 -00000000 -55555555 -00000000 -00000000 -00000000 -00000000 -00000000 -38e38e38 -0e38e38e -00000001 -00000000 -00000000 -00000000 -78adf777 -00000000 -55555555 -55555555 -55555555 -00000000 -e38e38e3 -38e38e38 -00000002 -00000000 -00000001 -00000000 -22222222 -22222222 -00000003 -00000000 -00000001 -00000000 -f15beef1 -00000000 -ffffffff -ffffffff -aaaaaaaa -00000000 -55555555 -55555555 -00000002 -00000000 -00000001 -00000000 -aaaaaaaa -2aaaaaaa -00000003 -00000000 -00000001 -00000000 -f15beef2 -00000000 -aaaaaaab -00000000 -00000001 -00000000 -00000000 -00000000 -71c71c71 -1c71c71c -00000003 -00000000 -00000001 -00000000 -f15beeef -00000000 -aaaaaaaa -aaaaaaaa -aaaaaaaa -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -ffffffff -ffffffff -00000000 -00000000 -00000002 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000005 -00000000 -00000000 -00000000 -11111111 -11111111 -00000000 -00000000 -00000000 -00000000 -d70a3d70 -0a3d70a3 -00000001 -00000000 -00000000 -00000000 -48686148 -00000000 -ffffffff -ffffffff -33333333 -00000000 -99999999 -19999999 -00000000 -00000000 -00000000 -00000000 -cccccccc -0ccccccc -00000001 -00000000 -00000000 -00000000 -48686148 -00000000 -33333333 -00000000 -00000000 -00000000 -00000000 -00000000 -88888888 -08888888 -00000000 -00000000 -00000000 -00000000 -48686147 -00000000 -33333333 -33333333 -33333333 -00000000 -22222222 -22222222 -00000001 -00000000 -00000000 -00000000 -ae147ae1 -147ae147 -00000002 -00000000 -00000001 -00000000 -90d0c290 -00000000 -ffffffff -ffffffff -66666666 -00000000 -33333333 -33333333 -00000001 -00000000 -00000000 -00000000 -99999999 -19999999 -00000002 -00000000 -00000001 -00000000 -90d0c291 -00000000 -66666666 -00000000 -00000001 -00000000 -00000000 -00000000 -11111111 -11111111 -00000001 -00000000 -00000000 -00000000 -90d0c28f -00000000 -66666666 -66666666 -66666666 -00000000 -3c56fbbb -00000000 -00000000 -00000000 -00000000 -00000000 -243430a3 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -ffffffff -ffffffff -00000000 -00000000 -5a827999 -00000000 -00000000 -00000000 -00000000 -00000000 -2d413ccc -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -1e2b7ddd -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -b504f333 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -ffffffff -ffffffff -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -55555555 -00000000 -00000000 -00000000 -00000000 -00000000 -33333333 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -ffffffff -ffffffff -00000001 -00000000 -80000000 -00000000 -00000000 -00000000 -00000000 -00000000 -40000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -2aaaaaaa -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -ffffffff -ffffffff -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000002 -00000000 -00000000 -00000000 -71c71c71 -1c71c71c -00000000 -00000000 -00000000 -00000000 -11111110 -11111111 -00000001 -00000000 -00000000 -00000000 -78adf778 -00000000 -ffffffff -ffffffff -55555555 -00000000 -aaaaaaaa -2aaaaaaa -00000001 -00000000 -00000000 -00000000 -55555555 -15555555 -00000001 -00000000 -00000000 -00000000 -78adf779 -00000000 -55555555 -00000000 -00000000 -00000000 -00000000 -00000000 -38e38e38 -0e38e38e -00000001 -00000000 -00000000 -00000000 -78adf777 -00000000 -55555554 -55555555 -55555554 -00000000 -e38e38e3 -38e38e38 -00000001 -00000000 -00000000 -00000000 -22222221 -22222222 -00000003 -00000000 -00000001 -00000000 -f15beef1 -00000000 -ffffffff -ffffffff -aaaaaaaa -00000000 -55555554 -55555555 -00000002 -00000000 -00000001 -00000000 -aaaaaaaa -2aaaaaaa -00000003 -00000000 -00000001 -00000000 -f15beef2 -00000000 -aaaaaaab -00000000 -00000001 -00000000 -00000000 -00000000 -71c71c71 -1c71c71c -00000003 -00000000 -00000001 -00000000 -f15beeef -00000000 -aaaaaaa9 -aaaaaaaa -aaaaaaa9 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -ffffffff -ffffffff -00000000 -00000000 -00000002 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000004 -00000000 -00000000 -00000000 -11111110 -11111111 -00000000 -00000000 -00000000 -00000000 -d70a3d70 -0a3d70a3 -00000000 -00000000 -00000000 -00000000 -48686148 -00000000 -ffffffff -ffffffff -33333333 -00000000 -99999999 -19999999 -00000000 -00000000 -00000000 -00000000 -cccccccc -0ccccccc -00000001 -00000000 -00000000 -00000000 -48686148 -00000000 -33333333 -00000000 -00000000 -00000000 -00000000 -00000000 -88888888 -08888888 -00000000 -00000000 -00000000 -00000000 -48686147 -00000000 -33333332 -33333333 -33333332 -00000000 -22222221 -22222222 -00000001 -00000000 -00000000 -00000000 -ae147ae1 -147ae147 -00000001 -00000000 -00000000 -00000000 -90d0c290 -00000000 -ffffffff -ffffffff -66666666 -00000000 -33333332 -33333333 -00000001 -00000000 -00000000 -00000000 -99999999 -19999999 -00000002 -00000000 -00000001 -00000000 -90d0c291 -00000000 -66666666 -00000000 -00000001 -00000000 -00000000 -00000000 -11111110 -11111111 -00000001 -00000000 -00000000 -00000000 -90d0c28f -00000000 -66666665 -66666666 -66666665 -00000000 -3c56fbbb -00000000 -00000000 -00000000 -00000000 -00000000 -243430a3 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -ffffffff -ffffffff -00000000 -00000000 -5a827999 -00000000 -00000000 -00000000 -00000000 -00000000 -2d413ccc -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -1e2b7ddd -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -b504f332 -00000000 -00000000 -00000000 -55555555 -00000000 -00000000 -00000000 -00000000 -00000000 -33333333 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -ffffffff -ffffffff -00000000 -00000000 -7fffffff -00000000 -00000000 -00000000 -00000000 -00000000 -3fffffff -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -2aaaaaaa -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -ffffffff -00000000 -00000000 -00000000 -71c71c72 -1c71c71c -00000001 -00000000 -00000000 -00000000 -11111111 -11111111 -00000001 -00000000 -00000000 -00000000 -78adf778 -00000000 -ffffffff -ffffffff -55555555 -00000000 -aaaaaaab -2aaaaaaa -00000001 -00000000 -00000000 -00000000 -55555555 -15555555 -00000001 -00000000 -00000000 -00000000 -78adf779 -00000000 -55555555 -00000000 -00000001 -00000000 -00000000 -00000000 -38e38e39 -0e38e38e -00000001 -00000000 -00000000 -00000000 -78adf777 -00000000 -55555556 -55555555 -55555555 -00000000 -e38e38e3 -38e38e38 -00000002 -00000000 -00000001 -00000000 -22222222 -22222222 -00000003 -00000000 -00000001 -00000000 -f15beef1 -00000000 -ffffffff -ffffffff -aaaaaaaa -00000000 -55555555 -55555555 -00000002 -00000000 -00000001 -00000000 -aaaaaaaa -2aaaaaaa -00000003 -00000000 -00000001 -00000000 -f15beef2 -00000000 -aaaaaaab -00000000 -00000001 -00000000 -71c71c71 -1c71c71c -00000003 -00000000 -00000001 -00000000 -f15beeef -00000000 -aaaaaaab -aaaaaaaa -aaaaaaaa -00000000 -00000002 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -ffffffff -ffffffff -00000000 -00000000 -00000003 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -d70a3d70 -0a3d70a3 -00000001 -00000000 -00000000 -00000000 -48686148 -00000000 -ffffffff -ffffffff -33333333 -00000000 -9999999a -19999999 -00000000 -00000000 -00000000 -00000000 -cccccccd -0ccccccc -00000001 -00000000 -00000000 -00000000 -48686148 -00000000 -33333333 -00000000 -00000000 -00000000 -00000000 -00000000 -88888888 -08888888 -00000001 -00000000 -00000000 -00000000 -48686147 -00000000 -33333334 -33333333 -33333333 -00000000 -22222222 -22222222 -00000001 -00000000 -00000000 -00000000 -ae147ae1 -147ae147 -00000002 -00000000 -00000001 -00000000 -90d0c290 -00000000 -ffffffff -ffffffff -66666666 -00000000 -33333333 -33333333 -00000001 -00000000 -00000000 -00000000 -99999999 -19999999 -00000002 -00000000 -00000001 -00000000 -90d0c291 -00000000 -66666666 -00000000 -00000001 -00000000 -00000000 -00000000 -11111111 -11111111 -00000001 -00000000 -00000001 -00000000 -90d0c28f -00000000 -66666667 -66666666 -66666666 -00000000 -3c56fbbc -00000000 -00000000 -00000000 -00000000 -00000000 -243430a4 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -ffffffff -ffffffff -00000000 -00000000 -5a82799a -00000000 -00000000 -00000000 -00000000 -00000000 -2d413ccd -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -1e2b7dde -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -b504f334 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -ffffffff -ffffffff -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -55555555 -00000000 -00000000 -00000000 -00000000 -00000000 -33333333 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -ffffffff -ffffffff -00000001 -00000000 -80000000 -00000000 -00000000 -00000000 -00000000 -00000000 -40000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -2aaaaaaa -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000001 -00000001 -00000001 -00000000 -00000006 -00000000 -00000000 -00000000 -11111111 -11111111 -00000001 -00000000 -00200000 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/M/references/divuw-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/M/references/divuw-01.reference_output deleted file mode 100644 index b69cd713c..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/M/references/divuw-01.reference_output +++ /dev/null @@ -1,1644 +0,0 @@ -00000001 -00000000 -00000001 -00000000 -ffffffff -ffffffff -00000000 -00000000 -ffffffff -ffffffff -ffffffff -ffffffff -00000000 -00000000 -00100000 -00000000 -19999999 -00000000 -00000000 -00000000 -0b504f33 -00000000 -06ffffff -00000000 -00000000 -00000000 -01ffffff -00000000 -00000000 -00000000 -00000000 -00000000 -003ffffd -00000000 -001ffeff -00000000 -000fffff -00000000 -00000000 -00000000 -00015555 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00003fef -00000000 -00001fff -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000002 -00000000 -00000000 -00000000 -ffffffff -ffffffff -00000000 -00000000 -0000001f -00000000 -0000000f -00000000 -00000007 -00000000 -00000003 -00000000 -00000001 -00000000 -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000001 -00000000 -00000001 -00000000 -00000000 -00000000 -00000001 -00000000 -00000001 -00000000 -00000001 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000001 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000001 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000010 -00000000 -ffffffff -ffffffff -00000000 -00000000 -ffffffff -ffffffff -00000000 -00000000 -ffffffff -ffffffff -00000666 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000040 -00000000 -ffffffff -ffffffff -00000000 -00000000 -00000000 -00000000 -ffffffff -ffffffff -ffffffff -ffffffff -00000000 -00000000 -00000000 -00000000 -20000000 -00000000 -00000040 -00000000 -00000000 -00000000 -ffffffff -ffffffff -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -ffffffff -ffffffff -00000000 -00000000 -ffffffff -ffffffff -00000000 -00000000 -ffffffff -ffffffff -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000fff -00000000 -2aaaaaa9 -00000000 -00000001 -00000000 -000fffff -00000000 -00000000 -00000000 -001ffff7 -00000000 -00000000 -00000000 -000003ff -00000000 -ffffffff -ffffffff -7fefffff -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -0000000f -00000000 -00000001 -00000000 -1fffffff -00000000 -00000001 -00000000 -00000001 -00000000 -3fffffff -00000000 -33333333 -00000000 -ffffffff -ffffffff -000003ff -00000000 -7fffffff -00000000 -00000001 -00000000 -00000001 -00000000 -ffffffff -ffffffff -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -ffffffff -ffffffff -ffffffff -ffffffff -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000003 -00000000 -00000003 -00000000 -1c71c71c -00000000 -00000001 -00000000 -00000000 -00000000 -11111111 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -ffffffff -ffffffff -ffffffff -ffffffff -2aaaaaaa -00000000 -00000001 -00000000 -00000000 -00000000 -15555555 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -0e38e38e -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -55555555 -00000000 -55555555 -00000000 -38e38e38 -00000000 -00000002 -00000000 -00000001 -00000000 -22222222 -00000000 -00000003 -00000000 -00000001 -00000000 -00000000 -00000000 -ffffffff -ffffffff -ffffffff -ffffffff -55555555 -00000000 -00000002 -00000000 -00000001 -00000000 -2aaaaaaa -00000000 -00000003 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -1c71c71c -00000000 -00000003 -00000000 -00000001 -00000000 -00000000 -00000000 -aaaaaaaa -ffffffff -aaaaaaaa -ffffffff -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -ffffffff -ffffffff -ffffffff -ffffffff -00000002 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000005 -00000000 -00000005 -00000000 -11111111 -00000000 -00000000 -00000000 -00000000 -00000000 -0a3d70a3 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -ffffffff -ffffffff -ffffffff -ffffffff -19999999 -00000000 -00000000 -00000000 -00000000 -00000000 -0ccccccc -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -08888888 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -33333333 -00000000 -33333333 -00000000 -22222222 -00000000 -00000001 -00000000 -00000000 -00000000 -147ae147 -00000000 -00000002 -00000000 -00000001 -00000000 -00000000 -00000000 -ffffffff -ffffffff -ffffffff -ffffffff -33333333 -00000000 -00000001 -00000000 -00000000 -00000000 -19999999 -00000000 -00000002 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -11111111 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -66666666 -00000000 -66666666 -00000000 -3c56fbbb -00000000 -00000002 -00000000 -00000001 -00000000 -243430a3 -00000000 -00000003 -00000000 -00000001 -00000000 -00000001 -00000000 -ffffffff -ffffffff -ffffffff -ffffffff -5a827999 -00000000 -00000002 -00000000 -00000001 -00000000 -2d413ccc -00000000 -00000003 -00000000 -00000001 -00000000 -00000001 -00000000 -00000000 -00000000 -00000002 -00000000 -00000001 -00000000 -1e2b7ddd -00000000 -00000003 -00000000 -00000001 -00000000 -00000000 -00000000 -b504f333 -ffffffff -b504f333 -ffffffff -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -ffffffff -ffffffff -ffffffff -ffffffff -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -ffffffff -ffffffff -ffffffff -ffffffff -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -ffffffff -ffffffff -ffffffff -ffffffff -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000002 -00000000 -00000002 -00000000 -1c71c71c -00000000 -00000000 -00000000 -00000000 -00000000 -11111110 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -ffffffff -ffffffff -ffffffff -ffffffff -2aaaaaaa -00000000 -00000001 -00000000 -00000000 -00000000 -15555555 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -0e38e38e -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -55555554 -00000000 -55555554 -00000000 -38e38e38 -00000000 -00000001 -00000000 -00000000 -00000000 -22222221 -00000000 -00000003 -00000000 -00000001 -00000000 -00000000 -00000000 -ffffffff -ffffffff -ffffffff -ffffffff -55555554 -00000000 -00000002 -00000000 -00000001 -00000000 -2aaaaaaa -00000000 -00000003 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -1c71c71c -00000000 -00000003 -00000000 -00000001 -00000000 -00000000 -00000000 -aaaaaaa9 -ffffffff -aaaaaaa9 -ffffffff -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -ffffffff -ffffffff -ffffffff -ffffffff -00000002 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000004 -00000000 -00000004 -00000000 -11111110 -00000000 -00000000 -00000000 -00000000 -00000000 -0a3d70a3 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -ffffffff -ffffffff -ffffffff -ffffffff -19999999 -00000000 -00000000 -00000000 -00000000 -00000000 -0ccccccc -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -08888888 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -33333332 -00000000 -33333332 -00000000 -22222221 -00000000 -00000001 -00000000 -00000000 -00000000 -147ae147 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -ffffffff -ffffffff -ffffffff -ffffffff -33333332 -00000000 -00000001 -00000000 -00000000 -00000000 -19999999 -00000000 -00000002 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -11111110 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -66666665 -00000000 -66666665 -00000000 -3c56fbbb -00000000 -00000002 -00000000 -00000001 -00000000 -243430a3 -00000000 -00000003 -00000000 -00000001 -00000000 -00000000 -00000000 -ffffffff -ffffffff -ffffffff -ffffffff -5a827999 -00000000 -00000002 -00000000 -00000001 -00000000 -2d413ccc -00000000 -00000003 -00000000 -00000001 -00000000 -00000001 -00000000 -00000000 -00000000 -00000002 -00000000 -00000001 -00000000 -1e2b7ddd -00000000 -00000003 -00000000 -00000001 -00000000 -00000000 -00000000 -b504f332 -ffffffff -b504f332 -ffffffff -55555555 -00000000 -00000003 -00000000 -00000001 -00000000 -33333333 -00000000 -00000005 -00000000 -00000002 -00000000 -00000001 -00000000 -ffffffff -ffffffff -ffffffff -ffffffff -7fffffff -00000000 -00000003 -00000000 -00000001 -00000000 -3fffffff -00000000 -00000005 -00000000 -00000002 -00000000 -00000001 -00000000 -00000001 -00000000 -00000002 -00000000 -00000001 -00000000 -2aaaaaaa -00000000 -00000004 -00000000 -00000002 -00000000 -00000001 -00000000 -ffffffff -ffffffff -1c71c71c -00000000 -00000001 -00000000 -00000000 -00000000 -11111111 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -ffffffff -ffffffff -ffffffff -ffffffff -2aaaaaab -00000000 -00000001 -00000000 -00000000 -00000000 -15555555 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -0e38e38e -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -55555556 -00000000 -55555556 -00000000 -38e38e39 -00000000 -00000002 -00000000 -00000001 -00000000 -22222222 -00000000 -00000003 -00000000 -00000001 -00000000 -00000000 -00000000 -ffffffff -ffffffff -ffffffff -ffffffff -55555555 -00000000 -00000002 -00000000 -00000001 -00000000 -2aaaaaaa -00000000 -00000003 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000001 -00000000 -1c71c71c -00000000 -00000003 -00000000 -00000001 -00000000 -00000000 -00000000 -aaaaaaab -ffffffff -aaaaaaab -ffffffff -00000002 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -ffffffff -ffffffff -ffffffff -ffffffff -00000003 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -0a3d70a4 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -ffffffff -ffffffff -ffffffff -ffffffff -1999999a -00000000 -00000000 -00000000 -00000000 -00000000 -0ccccccd -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -08888888 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -33333334 -00000000 -33333334 -00000000 -22222222 -00000000 -00000000 -00000000 -147ae147 -00000000 -00000002 -00000000 -00000001 -00000000 -00000000 -00000000 -ffffffff -ffffffff -ffffffff -ffffffff -33333333 -00000000 -00000001 -00000000 -00000000 -00000000 -00000002 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -11111111 -00000000 -00000001 -00000000 -00000001 -00000000 -00000000 -00000000 -66666667 -00000000 -66666667 -00000000 -3c56fbbc -00000000 -00000002 -00000000 -00000001 -00000000 -243430a4 -00000000 -00000003 -00000000 -00000001 -00000000 -00000001 -00000000 -ffffffff -ffffffff -ffffffff -ffffffff -5a82799a -00000000 -00000002 -00000000 -00000001 -00000000 -2d413ccd -00000000 -00000003 -00000000 -00000001 -00000000 -00000001 -00000000 -00000000 -00000000 -11111111 -00000000 -00000002 -00000000 -00000001 -00000000 -1e2b7dde -00000000 -00000003 -00000000 -00000001 -00000000 -00000001 -00000000 -b504f334 -ffffffff -b504f334 -ffffffff -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -ffffffff -ffffffff -ffffffff -ffffffff -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -ffffffff -ffffffff -ffffffff -ffffffff -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000006 -00000000 -00000006 -00000000 -ffffffff -ffffffff -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/M/references/divw-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/M/references/divw-01.reference_output deleted file mode 100644 index 377ac7085..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/M/references/divw-01.reference_output +++ /dev/null @@ -1,1344 +0,0 @@ -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000001 -00000000 -00000001 -00000000 -ffffffff -ffffffff -ffffffff -ffffffff -00000000 -00000000 -00000000 -00000000 -ffffffff -ffffffff -00000000 -00000000 -00000000 -00000000 -ffffffff -ffffffff -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -ff800000 -ffffffff -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000080 -00000000 -ffffffff -ffffffff -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -fffffff8 -ffffffff -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000002 -00000000 -00000000 -00000000 -00000000 -00000000 -00000002 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -00000000 -00000000 -ffffeaab -ffffffff -00000000 -00000000 -fcfcfcfe -ffffffff -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -ffff8080 -ffffffff -00000000 -00000000 -00000000 -00000000 -fffffff9 -ffffffff -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -0000001f -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -fffffe00 -ffffffff -04000001 -00000000 -00000001 -00000000 -fffe0000 -ffffffff -b504f332 -ffffffff -00000001 -00000000 -55555555 -00000000 -aaaaaaab -ffffffff -00000000 -00000000 -00000000 -00000000 -01000001 -00000000 -00800001 -00000000 -00200001 -00000000 -00000008 -00000000 -00000001 -00000000 -00000000 -00000000 -00000002 -00000000 -00000001 -00000000 -00000000 -00000000 -00000081 -00000000 -fffffffc -ffffffff -00000000 -00000000 -4afb0cce -00000000 -04000001 -00000000 -00000001 -00000000 -00400001 -00000000 -fff00000 -ffffffff -00000000 -00000000 -00000000 -00000000 -00000201 -00000000 -00000000 -00000000 -00000000 -00000000 -fffffff0 -ffffffff -00000000 -00000000 -00000000 -00000000 -ffffffff -ffffffff -00000000 -00000000 -ffffffff -ffffffff -fe000000 -ffffffff -ffc3c3c4 -ffffffff -00000000 -00000000 -f3333334 -ffffffff -c0000000 -ffffffff -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -ffffffff -ffffffff -ffffffff -ffffffff -00000000 -00000000 -00000000 -00000000 -ffffffff -ffffffff -00000000 -00000000 -ffffffff -ffffffff -ffffffff -ffffffff -00000000 -00000000 -ffffffff -ffffffff -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000003 -00000000 -00000000 -00000000 -00000000 -00000000 -ffffffff -ffffffff -00000401 -00000000 -00000200 -00000000 -00000000 -00000000 -fffff8e4 -ffffffff -000007c1 -00000000 -00020001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -10000001 -00000000 -ffffffff -ffffffff -00000000 -00000000 -00000000 -00000000 -ffffffff -ffffffff -00000000 -00000000 -00000001 -00000000 -00000001 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -ffffffff -ffffffff -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -1c71c71c -00000000 -00000001 -00000000 -00000000 -00000000 -11111111 -00000000 -00000001 -00000000 -00000000 -00000000 -00000001 -00000000 -ffffffff -ffffffff -2aaaaaaa -00000000 -00000001 -00000000 -ffffffff -ffffffff -15555555 -00000000 -00000001 -00000000 -00000000 -00000000 -ffffffff -ffffffff -00000000 -00000000 -ffffffff -ffffffff -0e38e38e -00000000 -00000001 -00000000 -00000000 -00000000 -00000001 -00000000 -ffffffff -ffffffff -e38e38e4 -ffffffff -ffffffff -ffffffff -00000001 -00000000 -eeeeeeef -ffffffff -ffffffff -ffffffff -00000000 -00000000 -ffffffff -ffffffff -00000001 -00000000 -d5555555 -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -eaaaaaab -ffffffff -ffffffff -ffffffff -00000000 -00000000 -00000001 -00000000 -ffffffff -ffffffff -00000001 -00000000 -f1c71c72 -ffffffff -ffffffff -ffffffff -00000000 -00000000 -ffffffff -ffffffff -00000001 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000002 -00000000 -00000000 -00000000 -ffffffff -ffffffff -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -11111111 -00000000 -00000000 -00000000 -00000000 -00000000 -0a3d70a3 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -19999999 -00000000 -00000000 -00000000 -ffffffff -ffffffff -0ccccccc -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -08888888 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -22222222 -00000000 -00000001 -00000000 -ffffffff -ffffffff -147ae147 -00000000 -00000002 -00000000 -00000001 -00000000 -00000001 -00000000 -ffffffff -ffffffff -33333333 -00000000 -00000001 -00000000 -ffffffff -ffffffff -19999999 -00000000 -00000002 -00000000 -00000001 -00000000 -ffffffff -ffffffff -00000001 -00000000 -ffffffff -ffffffff -11111111 -00000000 -00000001 -00000000 -00000000 -00000000 -00000001 -00000000 -ffffffff -ffffffff -18fe5999 -00000000 -00000000 -00000000 -00000000 -00000000 -0eff028f -00000000 -00000001 -00000000 -00000000 -00000000 -00000001 -00000000 -ffffffff -ffffffff -257d8666 -00000000 -00000000 -00000000 -ffffffff -ffffffff -12bec333 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -0c7f2ccc -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -ffffffff -ffffffff -e701a667 -ffffffff -00000000 -00000000 -00000000 -00000000 -f100fd71 -ffffffff -ffffffff -ffffffff -00000000 -00000000 -ffffffff -ffffffff -00000001 -00000000 -da82799a -ffffffff -00000000 -00000000 -ffffffff -ffffffff -ed413ccd -ffffffff -ffffffff -ffffffff -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -f380d334 -ffffffff -ffffffff -ffffffff -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -ffffffff -ffffffff -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -1c71c71c -00000000 -00000000 -00000000 -00000000 -00000000 -11111110 -00000000 -00000001 -00000000 -00000000 -00000000 -00000001 -00000000 -ffffffff -ffffffff -2aaaaaaa -00000000 -00000001 -00000000 -ffffffff -ffffffff -15555555 -00000000 -00000001 -00000000 -00000000 -00000000 -ffffffff -ffffffff -00000000 -00000000 -00000000 -00000000 -0e38e38e -00000000 -00000001 -00000000 -00000000 -00000000 -00000001 -00000000 -ffffffff -ffffffff -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000002 -00000000 -00000000 -00000000 -ffffffff -ffffffff -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -11111110 -00000000 -00000000 -00000000 -00000000 -00000000 -0a3d70a3 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -19999999 -00000000 -00000000 -00000000 -ffffffff -ffffffff -0ccccccc -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -08888888 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -22222221 -00000000 -00000001 -00000000 -ffffffff -ffffffff -147ae147 -00000000 -00000001 -00000000 -00000000 -00000000 -00000001 -00000000 -ffffffff -ffffffff -33333332 -00000000 -00000001 -00000000 -ffffffff -ffffffff -19999999 -00000000 -00000002 -00000000 -00000001 -00000000 -ffffffff -ffffffff -00000001 -00000000 -ffffffff -ffffffff -11111110 -00000000 -00000001 -00000000 -00000000 -00000000 -00000001 -00000000 -ffffffff -ffffffff -e701a666 -ffffffff -00000000 -00000000 -00000000 -00000000 -f100fd71 -ffffffff -ffffffff -ffffffff -00000000 -00000000 -ffffffff -ffffffff -00000001 -00000000 -da827999 -ffffffff -00000000 -00000000 -ffffffff -ffffffff -ed413ccd -ffffffff -ffffffff -ffffffff -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -f380d333 -ffffffff -ffffffff -ffffffff -00000000 -00000000 -ffffffff -ffffffff -00000001 -00000000 -1c71c71c -00000000 -00000001 -00000000 -ffffffff -ffffffff -11111111 -00000000 -00000001 -00000000 -00000000 -00000000 -00000001 -00000000 -ffffffff -ffffffff -2aaaaaab -00000000 -00000001 -00000000 -ffffffff -ffffffff -15555555 -00000000 -00000001 -00000000 -00000000 -00000000 -ffffffff -ffffffff -00000001 -00000000 -ffffffff -ffffffff -0e38e38e -00000000 -00000001 -00000000 -00000000 -00000000 -00000001 -00000000 -ffffffff -ffffffff -e38e38e4 -ffffffff -ffffffff -ffffffff -00000000 -00000000 -eeeeeeef -ffffffff -ffffffff -ffffffff -00000000 -00000000 -ffffffff -ffffffff -00000001 -00000000 -d5555556 -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -eaaaaaab -ffffffff -ffffffff -ffffffff -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -f1c71c72 -ffffffff -ffffffff -ffffffff -00000000 -00000000 -ffffffff -ffffffff -00000001 -00000000 -00000002 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000003 -00000000 -00000000 -00000000 -ffffffff -ffffffff -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -11111111 -00000000 -00000000 -00000000 -00000000 -00000000 -0a3d70a4 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -1999999a -00000000 -00000000 -00000000 -ffffffff -ffffffff -0ccccccd -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -08888888 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -22222222 -00000000 -00000001 -00000000 -ffffffff -ffffffff -147ae147 -00000000 -00000002 -00000000 -00000001 -00000000 -00000001 -00000000 -ffffffff -ffffffff -33333333 -00000000 -00000001 -00000000 -ffffffff -ffffffff -19999999 -00000000 -00000002 -00000000 -00000001 -00000000 -ffffffff -ffffffff -00000001 -00000000 -ffffffff -ffffffff -11111111 -00000000 -00000001 -00000000 -00000001 -00000000 -00000001 -00000000 -ffffffff -ffffffff -18fe599a -00000000 -00000000 -00000000 -00000000 -00000000 -0eff028f -00000000 -00000001 -00000000 -00000000 -00000000 -00000001 -00000000 -ffffffff -ffffffff -257d8667 -00000000 -00000000 -00000000 -ffffffff -ffffffff -12bec333 -00000000 -00000001 -00000000 -00000000 -00000000 -ffffffff -ffffffff -00000000 -00000000 -00000000 -00000000 -0c7f2ccd -00000000 -00000001 -00000000 -00000000 -00000000 -00000001 -00000000 -ffffffff -ffffffff -e701a667 -ffffffff -00000000 -00000000 -00000000 -00000000 -f100fd71 -ffffffff -ffffffff -ffffffff -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -da82799a -ffffffff -00000000 -00000000 -ffffffff -ffffffff -ed413ccd -ffffffff -ffffffff -ffffffff -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -f380d334 -ffffffff -ffffffff -ffffffff -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -ffffffff -ffffffff -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -ffffffff -ffffffff -fffffc00 -ffffffff -00000000 -00000000 -00004000 -00000000 -00000000 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/M/references/mul-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/M/references/mul-01.reference_output deleted file mode 100644 index 05417e617..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/M/references/mul-01.reference_output +++ /dev/null @@ -1,1364 +0,0 @@ -00000000 -00000010 -0a3d70a4 -3d70a3d7 -b504f333 -33300000 -00000000 -efffe000 -00200001 -00000100 -00000000 -00000000 -00000000 -00000000 -00000001 -a0000000 -00000000 -00000000 -00000000 -80000000 -00000000 -00000000 -fffffffc -ffffffff -00000100 -00000000 -00000000 -04000000 -00000400 -00000000 -55555560 -55555555 -00000000 -00000000 -fffffd80 -ffffffff -00000180 -00000000 -00000000 -00000004 -00000000 -04000000 -fefff800 -ffffffff -00000000 -00000000 -ffffe000 -dfffffff -00004000 -00000000 -00000000 -00001000 -ffff0000 -bfffffff -aaaa0000 -aaaaaaaa -fffc0000 -7fffffff -fff80000 -fffffeff -33300000 -000b504f -ffc00000 -ffffffff -ff800000 -ffffffff -f8000000 -ffffffff -cc000000 -cccccccc -e8000000 -ffffffff -e0000000 -ffffffff -d0000000 -ffffffff -e0000000 -fffffdff -80000000 -2d413ccc -80000000 -00000001 -00000000 -55555556 -00000000 -fffffffe -00000000 -00000080 -00000000 -00100000 -00000000 -fffffdf0 -00000000 -00000000 -00000000 -dfffffc0 -00000000 -00200000 -00000000 -55555600 -00000000 -00010000 -00000000 -fffffc00 -00000000 -fffff800 -00000000 -00000000 -00000000 -00000000 -00000000 -00018000 -00000000 -55560000 -00000000 -00080000 -00000000 -fffc0000 -00000000 -fff80000 -00000000 -00000000 -00000000 -00000000 -00000000 -01c00000 -00000000 -ff800000 -00000000 -ff000000 -00000000 -fe000000 -00000000 -e8000000 -00000000 -90000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -fffffee0 -ffffffff -20000011 -00000002 -00000021 -00000420 -f641bfb2 -0000002d -00000000 -fffdfc00 -ffffdfe0 -ffffffff -fffdff00 -ffffffff -fffbff00 -ffffffff -00040881 -00000000 -00001001 -02002000 -00000000 -fffdfff0 -bfff0000 -ffffffff -00002aab -00000000 -00030001 -00000002 -ff800000 -fffffeff -00048001 -00000002 -b15b0ccc -fffa57d7 -00000000 -f7ffffc0 -00401001 -00000004 -80000000 -ffbfffff -01000001 -00020000 -ffffc000 -ffffff7f -44000011 -00000000 -c7fffff9 -ffffffff -10000001 -00000000 -fffff000 -fffffdff -aaaaaaac -55555555 -80004001 -00002000 -00100001 -00100001 -00000000 -fffffc00 -00000001 -00040004 -ffffffc0 -fffffdff -fff80000 -ff7fffff -fff80000 -feffffff -ccccccce -0000004c -00000000 -ffffc000 -ffffffe0 -ffffbfff -ff800000 -ffffffff -00000001 -00000880 -ffffff00 -ffefffff -00000000 -ffff8000 -00000000 -ffffe000 -00000001 -00008008 -55555556 -aaab5555 -99999999 -cccb9999 -00000001 -80040000 -fff80000 -ffffffff -00000001 -04200000 -ff000000 -ffffffff -00000101 -80800000 -9999999a -33999999 -00000000 -fff80000 -00000001 -08000000 -fffffe00 -ffffffff -00000081 -10000000 -40000001 -20000000 -fffffffe -7fffffff -55555554 -55555555 -5555555c -55555555 -fffffff8 -efffffff -00000000 -00000000 -99999000 -99999999 -cccca000 -cccccccc -00000000 -00040000 -66600000 -66666666 -ffe00000 -fffffff7 -00c00000 -00000000 -9c000000 -99999999 -98000000 -99999999 -00000000 -00080000 -00000000 -00000000 -00000000 -00000200 -00000000 -55555556 -00000000 -00000024 -00000000 -02000000 -00000000 -10000000 -00000000 -fffffe00 -00000000 -fffff800 -00000000 -fffe0000 -00000000 -fffc0000 -00000000 -00000000 -00000000 -00800000 -00000000 -00000000 -00000000 -ff800000 -00000000 -ff000000 -00000000 -00000000 -00000000 -f8000000 -00000000 -00000000 -00000000 -e0000000 -00000005 -14000000 -00001209 -00000000 -bf000000 -ffffffff -40000201 -00000080 -00008421 -00000000 -33333cce -33333333 -fffe0000 -fffffffd -40041001 -00000000 -00000000 -fbffff80 -00400001 -02000000 -04000004 -00000000 -01555556 -00000000 -00000000 -fffff800 -00000000 -fffffe00 -dffffffe -ffffffff -00000000 -ff000000 -00000001 -00020001 -fffffff9 -fffffff1 -00800001 -02000004 -00000000 -00000000 -02000001 -80000040 -fe000000 -ffffffff -fff00000 -7fffffff -ffffff00 -ffefffff -00000000 -ffff0000 -fffffe00 -efffffff -00000001 -08100000 -fffff800 -ffffffff -00000000 -fffff800 -00000001 -01000001 -55555556 -01555555 -00000000 -e0000000 -0000000a -80000000 -00000009 -00000000 -ffffffff -ffffffff -fffffffe -ffffffff -0000000f -00000000 -99999999 -99999999 -33333332 -33333333 -e0f12667 -fffffffd -1f0ed999 -00000002 -00000006 -00000000 -fffffffc -ffffffff -00000000 -00000000 -0000000c -00000000 -99999996 -99999999 -3333332f -33333333 -1f0ed996 -00000002 -00000002 -00000000 -00000001 -00000000 -00000012 -00000000 -9999999c -99999999 -33333335 -33333333 -e0f1266a -fffffffd -1f0ed99c -00000002 -ffffffff -ffffffff -38e38e39 -8e38e38e -71c71c72 -1c71c71c -aaaaaaa9 -aaaaaaaa -eeeeeeef -eeeeeeee -ddddddde -dddddddd -91ac5111 -55555555 -6e53aeef -aaaaaaaa -aaaaaaaa -aaaaaaaa -e38e38e4 -38e38e38 -00000000 -00000000 -55555554 -55555555 -9999999a -99999999 -88888889 -88888888 -18fe599a -55555555 -8e38e38e -e38e38e3 -c71c71c7 -71c71c71 -fffffffe -ffffffff -44444444 -44444444 -33333333 -33333333 -e701a666 -aaaaaaaa -c3a90444 -ffffffff -fffffffe -ffffffff -71c71c72 -1c71c71c -e38e38e4 -38e38e38 -55555552 -55555555 -ddddddde -dddddddd -bbbbbbbc -bbbbbbbb -2358a222 -aaaaaaab -dca75dde -55555554 -55555554 -55555555 -c71c71c8 -71c71c71 -00000000 -00000000 -aaaaaaa8 -aaaaaaaa -33333334 -33333333 -11111112 -11111111 -31fcb334 -aaaaaaaa -1c71c71c -c71c71c7 -8e38e38e -e38e38e3 -fffffffc -ffffffff -88888888 -88888888 -66666666 -66666666 -ce034ccc -55555555 -87520888 -ffffffff -0000000f -00000000 -aaaaaaa9 -aaaaaaaa -55555552 -55555555 -00000019 -00000000 -ffffffff -ffffffff -fffffffe -ffffffff -76e74001 -fffffffc -8918bfff -00000003 -0000000a -00000000 -aaaaaaa4 -aaaaaaaa -00000000 -00000000 -00000014 -00000000 -fffffffa -ffffffff -fffffff9 -ffffffff -8918bffa -00000003 -aaaaaaae -aaaaaaaa -55555557 -55555555 -0000001e -00000000 -00000004 -00000000 -00000003 -00000000 -76e74006 -fffffffc -8918c004 -00000003 -99999999 -99999999 -eeeeeeef -eeeeeeee -ddddddde -dddddddd -ffffffff -ffffffff -c28f5c29 -8f5c28f5 -851eb852 -1eb851eb -576763d7 -33333333 -a8989c29 -cccccccc -66666666 -66666666 -bbbbbbbc -bbbbbbbb -00000000 -00000000 -cccccccc -cccccccc -8f5c28f6 -5c28f5c2 -51eb851f -eb851eb8 -756568f6 -99999999 -22222222 -22222222 -11111111 -11111111 -33333332 -33333333 -f5c28f5c -c28f5c28 -b851eb85 -51eb851e -8a9a970a -66666666 -dbcbcf5c -ffffffff -33333332 -33333333 -ddddddde -dddddddd -bbbbbbbc -bbbbbbbb -fffffffe -ffffffff -851eb852 -1eb851eb -0a3d70a4 -3d70a3d7 -aecec7ae -66666666 -51313852 -99999999 -cccccccc -cccccccc -77777778 -77777777 -00000000 -00000000 -99999998 -99999999 -1eb851ec -b851eb85 -a3d70a3e -d70a3d70 -eacad1ec -33333332 -44444444 -44444444 -22222222 -22222222 -66666664 -66666666 -eb851eb8 -851eb851 -70a3d70a -a3d70a3d -15352e14 -cccccccd -b7979eb8 -ffffffff -e0f12667 -fffffffd -91ac5111 -55555555 -2358a222 -aaaaaaab -76e74001 -fffffffc -576763d7 -33333333 -aecec7ae -66666666 -9ea1dc29 -7ffffffe -615e23d7 -80000001 -95f6199a -fffffffe -46b14444 -55555556 -00000000 -00000000 -2bec3334 -fffffffd -0c6c570a -33333334 -63d3bae1 -66666667 -1663170a -80000002 -dca75dde -55555554 -6e53aeef -aaaaaaaa -c1e24cce -fffffffb -a26270a4 -33333332 -f9c9d47b -66666665 -e99ce8f6 -7ffffffd -ac5930a4 -80000000 -1f0ed999 -00000002 -6e53aeef -aaaaaaaa -dca75dde -55555554 -8918bfff -00000003 -a8989c29 -cccccccc -51313852 -99999999 -615e23d7 -80000001 -9ea1dc29 -7ffffffe -6a09e666 -00000001 -b94ebbbc -aaaaaaa9 -00000000 -00000000 -d413cccc -00000002 -f393a8f6 -cccccccb -9c2c451f -99999998 -e99ce8f6 -7ffffffd -2358a222 -aaaaaaab -91ac5111 -55555555 -3e1db332 -00000004 -5d9d8f5c -cccccccd -06362b85 -9999999a -1663170a -80000002 -53a6cf5c -7fffffff -00000006 -00000000 -aaaaaaaa -aaaaaaaa -55555554 -55555555 -0000000a -00000000 -66666666 -66666666 -cccccccc -cccccccc -95f6199a -fffffffe -6a09e666 -00000001 -00000004 -00000000 -aaaaaaa8 -aaaaaaaa -00000000 -00000000 -00000008 -00000000 -66666664 -66666666 -ccccccca -cccccccc -6a09e664 -00000001 -aaaaaaac -aaaaaaaa -55555556 -55555555 -0000000c -00000000 -66666668 -66666666 -ccccccce -cccccccc -95f6199c -fffffffe -6a09e668 -00000001 -fffffffc -ffffffff -e38e38e4 -38e38e38 -c71c71c8 -71c71c71 -aaaaaaa4 -aaaaaaaa -bbbbbbbc -bbbbbbbb -77777778 -77777777 -46b14444 -55555556 -b94ebbbc -aaaaaaa9 -aaaaaaa8 -aaaaaaaa -8e38e390 -e38e38e3 -00000000 -00000000 -55555550 -55555555 -66666668 -66666666 -22222224 -22222222 -63f96668 -55555554 -38e38e38 -8e38e38e -1c71c71c -c71c71c7 -fffffff8 -ffffffff -11111110 -11111111 -cccccccc -cccccccc -9c069998 -aaaaaaab -0ea41110 -ffffffff -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -0000000c -00000000 -aaaaaaa8 -aaaaaaaa -00000014 -00000000 -cccccccc -cccccccc -99999998 -99999999 -2bec3334 -fffffffd -d413cccc -00000002 -00000008 -00000000 -55555550 -55555555 -00000000 -00000000 -00000010 -00000000 -ccccccc8 -cccccccc -99999994 -99999999 -d413ccc8 -00000002 -55555558 -55555555 -aaaaaaac -aaaaaaaa -00000018 -00000000 -ccccccd0 -cccccccc -9999999c -99999999 -2bec3338 -fffffffd -d413ccd0 -00000002 -99999996 -99999999 -9999999a -99999999 -33333334 -33333333 -fffffffa -ffffffff -8f5c28f6 -5c28f5c2 -1eb851ec -b851eb85 -0c6c570a -33333334 -f393a8f6 -cccccccb -66666664 -66666666 -66666668 -66666666 -00000000 -00000000 -ccccccc8 -cccccccc -5c28f5c4 -28f5c28f -eb851eba -851eb851 -c06075c4 -99999998 -cccccccc -cccccccc -66666666 -66666666 -3333332c -33333333 -c28f5c28 -8f5c28f5 -51eb851e -eb851eb8 -3f9f8a3c -66666667 -26c6dc28 -ffffffff -3333332f -33333333 -88888889 -88888888 -11111112 -11111111 -fffffff9 -ffffffff -51eb851f -eb851eb8 -a3d70a3e -d70a3d70 -63d3bae1 -66666667 -9c2c451f -99999998 -ccccccca -cccccccc -22222224 -22222222 -00000000 -00000000 -99999994 -99999999 -eb851eba -851eb851 -3d70a3d9 -70a3d70a -35c5deba -33333332 -eeeeeeee -eeeeeeee -77777777 -77777777 -6666665e -66666666 -b851eb84 -51eb851e -0a3d70a3 -3d70a3d7 -ca3a2146 -cccccccd -0292ab84 -ffffffff -1f0ed996 -00000002 -18fe599a -55555555 -31fcb334 -aaaaaaaa -8918bffa -00000003 -756568f6 -99999999 -eacad1ec -33333332 -1663170a -80000002 -e99ce8f6 -7ffffffd -6a09e664 -00000001 -63f96668 -55555554 -00000000 -00000000 -d413ccc8 -00000002 -c06075c4 -99999998 -35c5deba -33333332 -3497f5c4 -7ffffffd -ce034ccc -55555555 -e701a666 -aaaaaaaa -3e1db32c -00000004 -2a6a5c28 -9999999a -9fcfc51e -33333333 -cb680a3c -80000002 -9ea1dc28 -7ffffffe -00000002 -00000000 -8e38e38e -e38e38e3 -1c71c71c -c71c71c7 -aaaaaaae -aaaaaaaa -22222222 -22222222 -44444444 -44444444 -dca75dde -55555554 -2358a222 -aaaaaaab -aaaaaaac -aaaaaaaa -38e38e38 -8e38e38e -00000000 -00000000 -55555558 -55555555 -cccccccc -cccccccc -eeeeeeee -eeeeeeee -ce034ccc -55555555 -e38e38e4 -38e38e38 -71c71c72 -1c71c71c -00000004 -00000000 -77777778 -77777777 -9999999a -99999999 -31fcb334 -aaaaaaaa -78adf778 -00000000 -00000001 -00000000 -c71c71c7 -71c71c71 -8e38e38e -e38e38e3 -55555557 -55555555 -11111111 -11111111 -22222222 -22222222 -6e53aeef -aaaaaaaa -91ac5111 -55555555 -55555556 -55555555 -1c71c71c -c71c71c7 -00000000 -00000000 -aaaaaaac -aaaaaaaa -66666666 -66666666 -77777777 -77777777 -e701a666 -aaaaaaaa -71c71c72 -1c71c71c -38e38e39 -8e38e38e -00000000 -00000000 -00000002 -00000000 -bbbbbbbc -bbbbbbbb -cccccccd -cccccccc -18fe599a -55555555 -3c56fbbc -00000000 -00000012 -00000000 -fffffffe -ffffffff -fffffffc -ffffffff -0000001e -00000000 -33333332 -33333333 -66666664 -66666666 -c1e24cce -fffffffb -3e1db332 -00000004 -0000000c -00000000 -fffffff8 -ffffffff -00000000 -00000000 -00000018 -00000000 -3333332c -33333333 -6666665e -66666666 -3e1db32c -00000004 -00000004 -00000000 -00000002 -00000000 -00000024 -00000000 -33333338 -33333333 -6666666a -66666666 -c1e24cd4 -fffffffb -3e1db338 -00000004 -9999999c -99999999 -44444444 -44444444 -88888888 -88888888 -00000004 -00000000 -f5c28f5c -c28f5c28 -eb851eb8 -851eb851 -a26270a4 -33333332 -5d9d8f5c -cccccccd -66666668 -66666666 -11111110 -11111111 -00000000 -00000000 -ccccccd0 -cccccccc -c28f5c28 -8f5c28f5 -b851eb84 -51eb851e -2a6a5c28 -9999999a -77777778 -77777777 -bbbbbbbc -bbbbbbbb -33333338 -33333333 -28f5c290 -f5c28f5c -1eb851ec -b851eb85 -d595a3d8 -66666665 -90d0c290 -00000000 -33333335 -33333333 -33333333 -33333333 -66666666 -66666666 -00000003 -00000000 -b851eb85 -51eb851e -70a3d70a -a3d70a3d -f9c9d47b -66666665 -06362b85 -9999999a -ccccccce -cccccccc -cccccccc -cccccccc -00000000 -00000000 -9999999c -99999999 -51eb851e -eb851eb8 -0a3d70a3 -3d70a3d7 -9fcfc51e -33333333 -9999999a -99999999 -cccccccd -cccccccc -6666666a -66666666 -1eb851ec -b851eb85 -d70a3d71 -0a3d70a3 -60303ae2 -cccccccc -6c9c91ec -00000000 -e0f1266a -fffffffd -e701a666 -aaaaaaaa -ce034ccc -55555555 -76e74006 -fffffffc -8a9a970a -66666666 -15352e14 -cccccccd -e99ce8f6 -7ffffffd -1663170a -80000002 -95f6199c -fffffffe -9c069998 -aaaaaaab -00000000 -00000000 -2bec3338 -fffffffd -3f9f8a3c -66666667 -ca3a2146 -cccccccd -cb680a3c -80000002 -31fcb334 -aaaaaaaa -18fe599a -55555555 -c1e24cd4 -fffffffb -d595a3d8 -66666665 -60303ae2 -cccccccc -3497f5c4 -7ffffffd -615e23d8 -80000001 -1f0ed99c -00000002 -c3a90444 -ffffffff -87520888 -ffffffff -8918c004 -00000003 -dbcbcf5c -ffffffff -b7979eb8 -ffffffff -ac5930a4 -80000000 -53a6cf5c -7fffffff -6a09e668 -00000001 -0ea41110 -ffffffff -00000000 -00000000 -d413ccd0 -00000002 -26c6dc28 -ffffffff -0292ab84 -ffffffff -9ea1dc28 -7ffffffe -78adf778 -00000000 -3c56fbbc -00000000 -3e1db338 -00000004 -90d0c290 -00000000 -6c9c91ec -00000000 -615e23d8 -80000001 -08abc290 -80000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000080 -9999999a -33333399 -00000010 -00000000 -ffffffc0 -ffffffff -00000000 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/M/references/mulh-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/M/references/mulh-01.reference_output deleted file mode 100644 index 89450d6f1..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/M/references/mulh-01.reference_output +++ /dev/null @@ -1,1356 +0,0 @@ -04000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000010 -55555555 -d5555555 -00000000 -00000000 -000000ff -00000000 -ffffffff -ffffffff -fc000000 -ffffffff -00000000 -00000000 -1fffffff -00000000 -00000000 -00000000 -ffffffff -ffffffff -00000000 -00000000 -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffe0 -ffffffff -00000008 -00000000 -00000000 -00000000 -00000008 -00000000 -00000000 -00000000 -ffffffff -ffffffff -ffffffff -ffffffff -00000aaa -00000000 -ffffffff -ffffffff -00000000 -00000000 -ffffffff -ffffffff -00001000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -fffbffff -ffffffff -00000000 -00000000 -ffffffff -ffffffff -00800000 -00000000 -ffffffff -ffffffff -0aaaaaaa -00000000 -00000000 -00000000 -ff7fffff -ffffffff -01000000 -00000000 -00000000 -00000000 -fdffffff -ffffffff -00080000 -00000000 -00000200 -00000000 -ffffffff -ffffffff -00080000 -00000000 -000000b5 -00000000 -fffffffe -ffffffff -00010000 -00000000 -00800000 -00000000 -33333333 -00000333 -00000000 -00000000 -fffbffff -ffffffff -feffffff -ffffffff -fffffffd -ffffffff -fffffeff -ffffffff -00040000 -00000000 -ffffffff -ffffffff -00000000 -00000000 -00000000 -00000000 -00000040 -00000000 -ffffffff -ffffffff -00000000 -00200000 -00001000 -00000000 -ffffffff -ffffffff -00000000 -00000000 -00800000 -00000000 -ffffbfff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -00000000 -00000000 -00000000 -00000000 -ffffffff -ffffffff -00000000 -00000000 -00000000 -00000000 -ffffffff -ffffffff -fffffccc -ffffffff -fffffaaa -ffffffff -00000000 -00000000 -fffffeff -ffffffff -00000000 -00000000 -00000004 -00000000 -ffffff7f -ffffffff -fffffff7 -ffffffff -ffffffff -ffffffff -00000000 -00000000 -ffffffff -ffffffff -00000100 -00000000 -00000000 -00000000 -00000000 -00000000 -ff555555 -ffffffff -ffffffff -ffffffff -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00020000 -00000000 -bfffffff -ffffffff -00000080 -00000000 -20000000 -00000000 -00000000 -00000002 -ffffffff -ffffffff -ffffffa5 -ffffffff -fffffbff -ffffffff -00100000 -00000000 -02000000 -00000000 -00000000 -00000000 -00200000 -00000000 -80000000 -00000000 -ffffffef -ffffffff -ffffffff -ffffffdf -00000000 -00001000 -00400000 -00000000 -ff7fffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -00000000 -00000000 -ffffffff -ffffffff -00080000 -00000000 -99999999 -ff999999 -00000004 -00000000 -fff7ffff -ffffffff -fffffffb -ffffffff -aaaaaaaa -faaaaaaa -33333332 -f3333333 -7fffffff -ffffffff -00000005 -00000000 -00000000 -00000000 -ffffffff -ffffffff -00000000 -00000000 -ffffffff -ffffffff -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000100 -00000000 -00000000 -00000000 -ffffffff -ffffffff -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000040 -00000000 -00000000 -00000000 -55555555 -00000155 -ffffffff -ffffffff -fffffbff -ffffffff -ffffffff -ffffffff -fffffdff -ffffffff -00008000 -00000000 -00000000 -00000008 -aaaaaaaa -00aaaaaa -00000001 -00000000 -80000000 -00000000 -00000000 -00000000 -fffffffe -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -00000000 -00000000 -ffffffff -ffffffff -00000100 -00000000 -ffbfffff -ffffffff -00000000 -00000000 -ffffffef -ffffffff -ffffffff -ffffffff -00000002 -00000000 -00000000 -00000000 -ffbfffff -ffffffff -bfffffff -ffffffff -ffffffff -fffffeff -ffffffff -fffffeff -ffffffff -ffffffff -02000000 -00000000 -ffffffbf -ffffffff -ffffffff -ffdfffff -ffffffff -ffffff7f -fffffdff -ffffffff -00000400 -00000000 -c3a90444 -ffffffff -00000000 -00000000 -00000000 -00000000 -fffffffe -ffffffff -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -ffffffff -ffffffff -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000001 -00000000 -ffffffff -ffffffff -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -ffffffff -ffffffff -00000000 -00000000 -00000000 -00000000 -71c71c71 -1c71c71c -8e38e38e -e38e38e3 -00000001 -00000000 -11111110 -11111111 -22222221 -22222222 -c3a90444 -ffffffff -3c56fbbb -00000000 -00000000 -00000000 -71c71c71 -1c71c71c -00000000 -00000000 -00000001 -00000000 -11111110 -11111111 -22222221 -22222222 -3c56fbbb -00000000 -71c71c71 -1c71c71c -8e38e38e -e38e38e3 -00000001 -00000000 -11111111 -11111111 -22222222 -22222222 -c3a90444 -ffffffff -3c56fbbb -00000000 -fffffffe -ffffffff -8e38e38e -e38e38e3 -71c71c72 -1c71c71c -fffffffe -ffffffff -eeeeeeee -eeeeeeee -dddddddd -dddddddd -3c56fbbb -00000000 -ffffffff -ffffffff -8e38e38e -e38e38e3 -00000000 -00000000 -fffffffe -ffffffff -eeeeeeef -eeeeeeee -ddddddde -dddddddd -c3a90444 -ffffffff -8e38e38d -e38e38e3 -71c71c71 -1c71c71c -fffffffd -ffffffff -eeeeeeee -eeeeeeee -dddddddd -dddddddd -3c56fbbb -00000000 -c3a90443 -ffffffff -00000000 -00000000 -00000001 -00000000 -fffffffe -ffffffff -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -ffffffff -ffffffff -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000001 -00000000 -fffffffe -ffffffff -00000000 -00000000 -00000001 -00000000 -00000002 -00000000 -ffffffff -ffffffff -00000000 -00000000 -00000000 -00000000 -11111110 -11111111 -eeeeeeee -eeeeeeee -00000000 -00000000 -d70a3d70 -0a3d70a3 -ae147ae1 -147ae147 -dbcbcf5c -ffffffff -243430a3 -00000000 -00000000 -00000000 -11111110 -11111111 -00000000 -00000000 -00000000 -00000000 -d70a3d70 -0a3d70a3 -ae147ae0 -147ae147 -243430a3 -00000000 -11111111 -11111111 -eeeeeeef -eeeeeeee -00000001 -00000000 -d70a3d70 -0a3d70a3 -ae147ae1 -147ae147 -dbcbcf5c -ffffffff -243430a3 -00000000 -00000001 -00000000 -22222221 -22222222 -dddddddd -dddddddd -00000001 -00000000 -ae147ae1 -147ae147 -5c28f5c2 -28f5c28f -b7979eb8 -ffffffff -48686147 -00000000 -00000000 -00000000 -22222221 -22222222 -00000000 -00000000 -00000001 -00000000 -ae147ae0 -147ae147 -5c28f5c1 -28f5c28f -48686147 -00000000 -22222222 -22222222 -ddddddde -dddddddd -00000002 -00000000 -ae147ae1 -147ae147 -5c28f5c2 -28f5c28f -b7979eb8 -ffffffff -48686147 -00000000 -ffffffff -ffffffff -c3a90444 -ffffffff -3c56fbbb -00000000 -ffffffff -ffffffff -dbcbcf5c -ffffffff -b7979eb8 -ffffffff -00000000 -00000000 -ffffffff -ffffffff -ffffffff -ffffffff -c3a90444 -ffffffff -00000000 -00000000 -ffffffff -ffffffff -dbcbcf5c -ffffffff -b7979eb8 -ffffffff -ffffffff -ffffffff -c3a90444 -ffffffff -3c56fbbb -00000000 -ffffffff -ffffffff -dbcbcf5c -ffffffff -b7979eb8 -ffffffff -00000000 -00000000 -ffffffff -ffffffff -00000000 -00000000 -3c56fbbb -00000000 -c3a90444 -ffffffff -00000000 -00000000 -243430a3 -00000000 -48686147 -00000000 -ffffffff -ffffffff -00000000 -00000000 -00000000 -00000000 -3c56fbbb -00000000 -00000000 -00000000 -00000000 -00000000 -243430a3 -00000000 -48686147 -00000000 -00000000 -00000000 -3c56fbbb -00000000 -c3a90444 -ffffffff -00000000 -00000000 -243430a3 -00000000 -48686147 -00000000 -ffffffff -ffffffff -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -ffffffff -ffffffff -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -ffffffff -ffffffff -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -ffffffff -ffffffff -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -ffffffff -ffffffff -00000000 -00000000 -00000000 -00000000 -71c71c71 -1c71c71c -8e38e38e -e38e38e3 -00000001 -00000000 -11111110 -11111111 -22222221 -22222222 -c3a90444 -ffffffff -3c56fbbb -00000000 -00000000 -00000000 -71c71c70 -1c71c71c -00000000 -00000000 -00000001 -00000000 -11111110 -11111111 -22222221 -22222222 -3c56fbbb -00000000 -71c71c71 -1c71c71c -8e38e38e -e38e38e3 -00000001 -00000000 -11111111 -11111111 -22222221 -22222222 -c3a90444 -ffffffff -3c56fbbb -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -fffffffe -ffffffff -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -ffffffff -ffffffff -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000001 -00000000 -fffffffe -ffffffff -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -ffffffff -ffffffff -00000000 -00000000 -00000000 -00000000 -11111110 -11111111 -eeeeeeef -eeeeeeee -00000000 -00000000 -d70a3d70 -0a3d70a3 -ae147ae0 -147ae147 -dbcbcf5c -ffffffff -243430a3 -00000000 -00000000 -00000000 -11111110 -11111111 -00000000 -00000000 -00000000 -00000000 -d70a3d70 -0a3d70a3 -ae147ae0 -147ae147 -243430a3 -00000000 -11111110 -11111111 -eeeeeeef -eeeeeeee -00000001 -00000000 -d70a3d70 -0a3d70a3 -ae147ae0 -147ae147 -dbcbcf5c -ffffffff -243430a3 -00000000 -00000001 -00000000 -22222221 -22222222 -ddddddde -dddddddd -00000001 -00000000 -ae147ae0 -147ae147 -5c28f5c1 -28f5c28f -b7979eb8 -ffffffff -48686147 -00000000 -00000000 -00000000 -22222221 -22222222 -00000000 -00000000 -00000001 -00000000 -ae147ae0 -147ae147 -5c28f5c1 -28f5c28f -48686147 -00000000 -22222221 -22222222 -ddddddde -dddddddd -00000002 -00000000 -ae147ae1 -147ae147 -5c28f5c2 -28f5c28f -b7979eb8 -ffffffff -48686147 -00000000 -00000000 -00000000 -3c56fbbb -00000000 -c3a90444 -ffffffff -00000000 -00000000 -243430a3 -00000000 -48686147 -00000000 -ffffffff -ffffffff -00000000 -00000000 -00000000 -00000000 -3c56fbbb -00000000 -00000000 -00000000 -00000000 -00000000 -243430a3 -00000000 -48686147 -00000000 -00000000 -00000000 -3c56fbbb -00000000 -c3a90444 -ffffffff -00000000 -00000000 -243430a3 -00000000 -48686147 -00000000 -ffffffff -ffffffff -00000000 -00000000 -00000001 -00000000 -71c71c71 -1c71c71c -8e38e38d -e38e38e3 -00000001 -00000000 -11111111 -11111111 -22222222 -22222222 -c3a90444 -ffffffff -3c56fbbb -00000000 -00000000 -00000000 -71c71c71 -1c71c71c -00000000 -00000000 -00000001 -00000000 -11111110 -11111111 -22222221 -22222222 -3c56fbbb -00000000 -71c71c72 -1c71c71c -8e38e38e -e38e38e3 -00000002 -00000000 -11111111 -11111111 -22222222 -22222222 -c3a90444 -ffffffff -3c56fbbc -00000000 -ffffffff -ffffffff -8e38e38e -e38e38e3 -71c71c71 -1c71c71c -fffffffe -ffffffff -eeeeeeef -eeeeeeee -ddddddde -dddddddd -3c56fbbb -00000000 -c3a90444 -ffffffff -ffffffff -ffffffff -8e38e38e -e38e38e3 -00000000 -00000000 -fffffffe -ffffffff -eeeeeeef -eeeeeeee -ddddddde -dddddddd -c3a90444 -ffffffff -8e38e38e -e38e38e3 -71c71c71 -1c71c71c -fffffffe -ffffffff -eeeeeeee -eeeeeeee -dddddddd -dddddddd -3c56fbbb -00000000 -c3a90444 -ffffffff -00000000 -00000000 -00000001 -00000000 -fffffffd -ffffffff -00000000 -00000000 -00000001 -00000000 -00000002 -00000000 -ffffffff -ffffffff -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000002 -00000000 -00000000 -00000000 -00000002 -00000000 -fffffffe -ffffffff -00000000 -00000000 -00000001 -00000000 -00000002 -00000000 -ffffffff -ffffffff -00000000 -00000000 -00000000 -00000000 -11111111 -11111111 -eeeeeeee -eeeeeeee -00000001 -00000000 -d70a3d70 -0a3d70a3 -ae147ae1 -147ae147 -dbcbcf5c -ffffffff -243430a3 -00000000 -00000000 -00000000 -11111111 -11111111 -00000000 -00000000 -00000000 -00000000 -d70a3d70 -0a3d70a3 -ae147ae1 -147ae147 -243430a3 -00000000 -11111111 -11111111 -eeeeeeee -eeeeeeee -00000001 -00000000 -d70a3d70 -0a3d70a3 -ae147ae1 -147ae147 -dbcbcf5c -ffffffff -243430a4 -00000000 -00000001 -00000000 -22222222 -22222222 -dddddddd -dddddddd -00000002 -00000000 -ae147ae1 -147ae147 -5c28f5c2 -28f5c28f -b7979eb8 -ffffffff -48686147 -00000000 -00000000 -00000000 -22222221 -22222222 -00000000 -00000000 -00000001 -00000000 -ae147ae0 -147ae147 -5c28f5c2 -28f5c28f -48686147 -00000000 -22222222 -22222222 -dddddddd -dddddddd -00000002 -00000000 -ae147ae1 -147ae147 -5c28f5c3 -28f5c28f -b7979eb8 -ffffffff -48686148 -00000000 -ffffffff -ffffffff -3c56fbbb -00000000 -ffffffff -ffffffff -dbcbcf5c -ffffffff -b7979eb8 -ffffffff -00000000 -00000000 -ffffffff -ffffffff -ffffffff -ffffffff -c3a90444 -ffffffff -00000000 -00000000 -ffffffff -ffffffff -dbcbcf5c -ffffffff -b7979eb8 -ffffffff -ffffffff -ffffffff -c3a90444 -ffffffff -3c56fbbb -00000000 -ffffffff -ffffffff -dbcbcf5c -ffffffff -b7979eb8 -ffffffff -00000000 -00000000 -ffffffff -ffffffff -00000000 -00000000 -3c56fbbb -00000000 -c3a90443 -ffffffff -00000000 -00000000 -243430a3 -00000000 -48686147 -00000000 -ffffffff -ffffffff -00000000 -00000000 -00000000 -00000000 -3c56fbbb -00000000 -00000000 -00000000 -00000000 -00000000 -243430a3 -00000000 -48686147 -00000000 -00000000 -00000000 -3c56fbbc -00000000 -c3a90444 -ffffffff -00000000 -00000000 -243430a4 -00000000 -48686148 -00000000 -ffffffff -ffffffff -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -ffffffff -ffffffff -c3a90444 -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -00000000 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/M/references/mulhsu-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/M/references/mulhsu-01.reference_output deleted file mode 100644 index 1e298a0db..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/M/references/mulhsu-01.reference_output +++ /dev/null @@ -1,1484 +0,0 @@ -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -0000000f -00000000 -ffffffff -ffffffff -00010000 -80000000 -00000000 -00000000 -ffffffff -01ffffff -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -00000000 -00000000 -ffffffff -ffffffff -00000000 -00000000 -ffffff7f -ffffffff -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -fffff7ff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -00006666 -00000000 -00000400 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -ffefffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -00200000 -00000000 -ffffffff -ffffffff -fff7ffff -ffffffff -00000000 -00000000 -f5555555 -ffffffff -ffffffff -ffffffff -00000000 -00000000 -00000000 -00000000 -ffffffff -ffffffff -ffffffff -ffffffff -fffffffb -ffffffff -00000020 -00000000 -00020000 -00000000 -cccccccc -0000000c -00000000 -00000000 -fff7ffff -ffffffff -fffff7ff -ffffffff -ffffffff -fffffffd -ffffffff -fffffffd -ffffffff -ffffffff -00000000 -00000000 -ffffffff -ffffffff -00000000 -00000400 -00000002 -00000000 -00010000 -00000000 -7fffffff -ffffffff -ffffdfff -ffffffff -00010000 -00000000 -ffffffbf -ffffffff -00000000 -00000000 -00002000 -00000000 -f7ffffff -ffffffff -fffbffff -ffffffff -33333333 -03333333 -ffffffff -ffffffff -00000004 -00000000 -ffffff7f -ffffffff -00020000 -00000000 -00ffffff -00000000 -efffffff -ffffffff -33333332 -33333333 -ffffffff -000007ff -ffffffff -000003ff -ffffffff -001fffff -ffffffff -003fffff -ffffffbe -7fffffff -00000000 -00000000 -ffffffff -00003fff -33333199 -33333333 -ffffefff -ffffffff -00001fff -00000000 -33332666 -33333333 -003fffff -00000000 -ffffffff -000003ff -fffffbff -00ffffff -00000004 -00000000 -ffffffff -0000000f -07ffffff -00000000 -33266665 -33333333 -33199999 -33333333 -fffeffff -00ffffff -0000000f -fffff800 -53ffffff -55555555 -0000007f -00000000 -4fffffff -55555555 -0000ffff -00000000 -fffff7ff -00001fff -fffffffb -00000007 -fffffff6 -ffffffff -fdffffff -00ffffff -1fffffff -00000000 -00000fff -fffffe00 -007fffff -00000000 -ff7fffff -0003ffff -ffffffff -07fffffd -ff7fffff -ffffffff -ffffffff -fe000003 -b504f05e -00000000 -00ffffff -ffffe000 -ffffffff -f00000ff -4afb236e -ffffffff -ffffffff -fff00003 -b50498b0 -00000000 -fffffffd -ffffffff -fc0007ff -ffffffff -0003ffff -ffffffff -00000000 -00000000 -ffffffff -ffffffff -fdffffff -0000000f -fbffffff -0000000f -00000006 -00000000 -ffffffff -ffffffff -00003f7f -00000000 -fffffffd -ffffffff -fffffffc -ffffffff -ffffffff -000077ff -ffffffff -000dffff -ffffffff -017fffff -00000000 -00000000 -ffffeaaa -ffffffff -00000000 -00000000 -00000007 -00000000 -0000002f -00000000 -00000000 -00000000 -000001ff -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -03fffffd -00000000 -3fffffdf -00000000 -00800000 -00000000 -ffffffff -00000003 -00000000 -00000000 -ffffffff -0000003f -ffffffff -0000007f -00000000 -00000000 -ffffffff -000001ff -08000000 -00000000 -00000000 -00000800 -00000010 -00000000 -00000000 -00002000 -ffffffff -03ffffff -00000000 -00000020 -ff7fffff -3fffffff -fffffffe -ffffffff -fffffffb -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffbf -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -fffffbff -ffffffff -ffffffff -ffffffff -ffffff7f -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffefffff -ffffffff -ffbfffff -ffffffff -fffffdff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffdfff -ffffffff -aaaaaaaa -fffffffa -00000000 -00000000 -ffffffff -ffffffff -ffffefff -ffffffff -ffffffff -ffffffff -fffffd2b -ffffffff -fffff000 -ffffffff -ffffffff -ffffbfff -00000000 -00000000 -fdffffff -ffffffff -00000003 -fffc0000 -fffff7ff -ffffffff -ffffffff -ffdfffff -ffffffff -fffffffb -ffffdfff -ffffffff -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000002 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -71c71c71 -1c71c71c -e38e38e3 -38e38e38 -00000001 -00000000 -11111110 -11111111 -22222221 -22222222 -3c56fbbb -00000000 -00000000 -00000000 -55555555 -00000000 -00000000 -00000000 -71c71c71 -1c71c71c -e38e38e2 -38e38e38 -00000001 -00000000 -11111110 -11111111 -22222221 -22222222 -3c56fbbb -00000000 -55555554 -00000000 -71c71c71 -1c71c71c -e38e38e3 -38e38e38 -00000001 -00000000 -11111111 -11111111 -22222222 -22222222 -3c56fbbb -00000000 -00000000 -00000000 -55555555 -00000000 -fffffffe -ffffffff -8e38e38e -e38e38e3 -1c71c71c -c71c71c7 -fffffffe -ffffffff -eeeeeeee -eeeeeeee -dddddddd -dddddddd -c3a90444 -ffffffff -00000000 -00000000 -aaaaaaaa -ffffffff -ffffffff -ffffffff -8e38e38e -e38e38e3 -1c71c71c -c71c71c7 -fffffffe -ffffffff -eeeeeeef -eeeeeeee -ddddddde -dddddddd -c3a90444 -ffffffff -aaaaaaaa -ffffffff -8e38e38d -e38e38e3 -1c71c71b -c71c71c7 -fffffffd -ffffffff -eeeeeeee -eeeeeeee -dddddddd -dddddddd -c3a90443 -ffffffff -aaaaaaaa -ffffffff -00000000 -00000000 -00000001 -00000000 -00000003 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000003 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000003 -00000000 -00000000 -00000000 -00000001 -00000000 -00000002 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -11111110 -11111111 -22222221 -22222222 -00000000 -00000000 -d70a3d70 -0a3d70a3 -ae147ae1 -147ae147 -243430a3 -00000000 -00000000 -00000000 -33333333 -00000000 -00000000 -00000000 -11111110 -11111111 -22222221 -22222222 -00000000 -00000000 -d70a3d70 -0a3d70a3 -ae147ae0 -147ae147 -243430a3 -00000000 -33333332 -00000000 -11111111 -11111111 -22222222 -22222222 -00000001 -00000000 -d70a3d70 -0a3d70a3 -ae147ae1 -147ae147 -243430a3 -00000000 -00000000 -00000000 -33333333 -00000000 -00000001 -00000000 -22222221 -22222222 -44444443 -44444444 -00000001 -00000000 -ae147ae1 -147ae147 -5c28f5c2 -28f5c28f -48686147 -00000000 -00000000 -00000000 -66666666 -00000000 -00000000 -00000000 -22222221 -22222222 -44444443 -44444444 -00000001 -00000000 -ae147ae0 -147ae147 -5c28f5c1 -28f5c28f -48686147 -00000000 -66666665 -00000000 -22222222 -22222222 -44444444 -44444444 -00000002 -00000000 -ae147ae1 -147ae147 -5c28f5c2 -28f5c28f -48686147 -00000000 -00000000 -00000000 -66666666 -00000000 -ffffffff -ffffffff -c3a90444 -ffffffff -87520888 -ffffffff -ffffffff -ffffffff -dbcbcf5c -ffffffff -b7979eb8 -ffffffff -ffffffff -ffffffff -00000000 -00000000 -ffffffff -ffffffff -ffffffff -ffffffff -c3a90444 -ffffffff -87520888 -ffffffff -ffffffff -ffffffff -dbcbcf5c -ffffffff -b7979eb8 -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -c3a90444 -ffffffff -87520888 -ffffffff -ffffffff -ffffffff -dbcbcf5c -ffffffff -b7979eb8 -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -00000000 -00000000 -3c56fbbb -00000000 -78adf777 -00000000 -00000000 -00000000 -243430a3 -00000000 -48686147 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -3c56fbbb -00000000 -78adf777 -00000000 -00000000 -00000000 -243430a3 -00000000 -48686147 -00000000 -00000000 -00000000 -00000000 -00000000 -3c56fbbb -00000000 -78adf777 -00000000 -00000000 -00000000 -243430a3 -00000000 -48686147 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -71c71c71 -1c71c71c -e38e38e2 -38e38e38 -00000001 -00000000 -11111110 -11111111 -22222221 -22222222 -3c56fbbb -00000000 -00000000 -00000000 -55555555 -00000000 -00000000 -00000000 -71c71c70 -1c71c71c -e38e38e2 -38e38e38 -00000001 -00000000 -11111110 -11111111 -22222221 -22222222 -3c56fbbb -00000000 -55555554 -00000000 -71c71c71 -1c71c71c -e38e38e2 -38e38e38 -00000001 -00000000 -11111111 -11111111 -22222221 -22222222 -3c56fbbb -00000000 -00000000 -00000000 -55555555 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000002 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000002 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000002 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -11111110 -11111111 -22222221 -22222222 -00000000 -00000000 -d70a3d70 -0a3d70a3 -ae147ae0 -147ae147 -243430a3 -00000000 -00000000 -00000000 -33333333 -00000000 -00000000 -00000000 -11111110 -11111111 -22222221 -22222222 -00000000 -00000000 -d70a3d70 -0a3d70a3 -ae147ae0 -147ae147 -243430a3 -00000000 -33333332 -00000000 -11111110 -11111111 -22222221 -22222222 -00000001 -00000000 -d70a3d70 -0a3d70a3 -ae147ae0 -147ae147 -243430a3 -00000000 -00000000 -00000000 -33333333 -00000000 -00000001 -00000000 -22222221 -22222222 -44444443 -44444444 -00000001 -00000000 -ae147ae0 -147ae147 -5c28f5c1 -28f5c28f -48686147 -00000000 -00000000 -00000000 -66666666 -00000000 -00000000 -00000000 -22222221 -22222222 -44444442 -44444444 -00000001 -00000000 -ae147ae0 -147ae147 -5c28f5c1 -28f5c28f -48686147 -00000000 -66666665 -00000000 -22222221 -22222222 -44444443 -44444444 -00000002 -00000000 -ae147ae1 -147ae147 -5c28f5c2 -28f5c28f -48686147 -00000000 -00000000 -00000000 -66666666 -00000000 -00000000 -00000000 -3c56fbbb -00000000 -78adf776 -00000000 -00000000 -00000000 -243430a3 -00000000 -48686147 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -3c56fbbb -00000000 -78adf776 -00000000 -00000000 -00000000 -243430a3 -00000000 -48686147 -00000000 -00000000 -00000000 -00000000 -00000000 -3c56fbbb -00000000 -78adf776 -00000000 -00000000 -00000000 -243430a3 -00000000 -48686147 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -71c71c71 -1c71c71c -e38e38e3 -38e38e38 -00000001 -00000000 -11111111 -11111111 -22222222 -22222222 -3c56fbbb -00000000 -00000000 -00000000 -55555555 -00000000 -00000000 -00000000 -71c71c71 -1c71c71c -e38e38e3 -38e38e38 -00000001 -00000000 -11111110 -11111111 -22222221 -22222222 -3c56fbbb -00000000 -55555555 -00000000 -71c71c72 -1c71c71c -e38e38e4 -38e38e38 -00000002 -00000000 -11111111 -11111111 -22222222 -22222222 -3c56fbbc -00000000 -00000000 -00000000 -55555555 -00000000 -ffffffff -ffffffff -8e38e38e -e38e38e3 -1c71c71c -c71c71c7 -fffffffe -ffffffff -eeeeeeef -eeeeeeee -ddddddde -dddddddd -c3a90444 -ffffffff -00000000 -00000000 -aaaaaaaa -ffffffff -ffffffff -ffffffff -8e38e38e -e38e38e3 -1c71c71d -c71c71c7 -fffffffe -ffffffff -eeeeeeef -eeeeeeee -ddddddde -dddddddd -c3a90444 -ffffffff -aaaaaaab -ffffffff -8e38e38e -e38e38e3 -1c71c71c -c71c71c7 -fffffffe -ffffffff -eeeeeeee -eeeeeeee -dddddddd -dddddddd -c3a90444 -ffffffff -66666666 -00000000 -ffffffff -ffffffff -c3a90444 -ffffffff -87520889 -ffffffff -ffffffff -ffffffff -dbcbcf5c -ffffffff -b7979eb8 -ffffffff -ffffffff -ffffffff -00000000 -00000000 -ffffffff -ffffffff -ffffffff -ffffffff -c3a90444 -ffffffff -87520889 -ffffffff -ffffffff -ffffffff -dbcbcf5c -ffffffff -b7979eb8 -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -c3a90444 -ffffffff -87520889 -ffffffff -ffffffff -ffffffff -dbcbcf5c -ffffffff -b7979eb8 -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -00000000 -00000000 -3c56fbbb -00000000 -78adf777 -00000000 -00000000 -00000000 -243430a3 -00000000 -48686147 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -3c56fbbb -00000000 -78adf777 -00000000 -00000000 -00000000 -243430a3 -00000000 -48686147 -00000000 -00000000 -00000000 -00000000 -00000000 -3c56fbbc -00000000 -78adf778 -00000000 -00000000 -00000000 -243430a4 -00000000 -48686148 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -ffffffff -ffffffff -aaaaaaaa -ffffffff -00000000 -00000000 -00000001 -00000000 -00000003 -00000000 -00000000 -00000000 -00000001 -00000000 -00000002 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000003 -00000000 -00000000 -00000000 -00000001 -00000000 -00000002 -00000000 -00000000 -00000000 -00000000 -00000000 -00000002 -00000000 -00000004 -00000000 -00000000 -00000000 -00000001 -00000000 -00000002 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -11111111 -11111111 -22222222 -22222222 -00000001 -00000000 -d70a3d70 -0a3d70a3 -ae147ae1 -147ae147 -243430a3 -00000000 -00000000 -00000000 -33333333 -00000000 -00000000 -00000000 -11111111 -11111111 -22222222 -22222222 -00000000 -00000000 -d70a3d70 -0a3d70a3 -ae147ae1 -147ae147 -243430a3 -00000000 -33333333 -00000000 -11111111 -11111111 -22222222 -22222222 -00000001 -00000000 -d70a3d70 -0a3d70a3 -ae147ae1 -147ae147 -243430a4 -00000000 -00000000 -00000000 -33333333 -00000000 -00000001 -00000000 -22222222 -22222222 -44444444 -44444444 -00000002 -00000000 -ae147ae1 -147ae147 -5c28f5c2 -28f5c28f -48686147 -00000000 -00000000 -00000000 -66666666 -00000000 -00000000 -00000000 -22222221 -22222222 -44444443 -44444444 -00000001 -00000000 -ae147ae0 -147ae147 -5c28f5c2 -28f5c28f -48686147 -00000000 -66666666 -00000000 -22222222 -22222222 -44444444 -44444444 -00000002 -00000000 -ae147ae1 -147ae147 -5c28f5c3 -28f5c28f -48686148 -00000000 -00000000 -00000000 -00003fff -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/M/references/mulhu-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/M/references/mulhu-01.reference_output deleted file mode 100644 index 22ad15dc2..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/M/references/mulhu-01.reference_output +++ /dev/null @@ -1,1628 +0,0 @@ -000000fe -ffffffe0 -fffffffe -fe00ffff -00000000 -00000000 -fffffffe -fffdffff -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000007 -00000000 -0000000f -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -000007ff -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00007fff -00000000 -00000004 -00000000 -0001ffff -00000000 -0003ffef -00000000 -00000400 -00000000 -000fffff -00000000 -001fffff -00000000 -00001000 -00000000 -007fffff -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -0fffffff -00000000 -00000000 -00000000 -00000000 -00000000 -00040000 -00000000 -00008000 -00000000 -ffefffff -00000001 -00000000 -00000000 -00004000 -00000000 -aaaaaaaa -0000000a -ffffffff -0000001f -00000020 -00000000 -01000000 -00000000 -00000000 -00000000 -feffffff -000001ff -00000000 -00000000 -ffffffff -000007ff -66666666 -00000666 -00000000 -00000000 -01000000 -00000000 -00000000 -00000200 -ffffdfff -0000ffff -bfffffff -0001ffff -aaaaaaaa -0002aaaa -00000000 -00002000 -00000000 -00000000 -0016a09e -00000000 -feffffff -003fffff -00000000 -00002000 -00000000 -00000001 -00010000 -00000000 -ffffefff -03ffffff -ffffffff -07ffffef -33333333 -03333333 -00200000 -00000000 -ffffffff -2fffffff -00000000 -00000000 -00000004 -00000000 -ffffffff -000001ff -0000000f -00000000 -0007ffff -00000000 -ffffffec -ffffffff -ffffffff -007fffff -0001ffff -00000000 -00000003 -00000000 -000003ff -00000000 -ffffffff -0000007f -f7fffbfe -ffffffff -00000012 -00000000 -ffff6ffe -ffffffff -ffffdffe -ffffbfff -55552aaa -55555555 -fffe7ffe -ffffffff -fffdfffe -ffffffff -0000003f -00000000 -fff7fffe -fffff7ff -ffeffffa -ffffffff -ffffffdf -0000ffff -fffffdff -0007ffff -ff80000e -ffffdfff -a9fffffe -aaaaaaaa -fffffffd -000000ff -fc0003fe -fffeffff -0000000a -00000000 -9fffffff -aaaaaaaa -00000009 -00000000 -00000005 -00000000 -7fffffee -ffffffff -0003ffff -00000000 -fdfffffe -fffffffd -fffffeff -0000003f -00000003 -00000000 -ffeffffe -ffffffef -fffefffe -ffffffbf -ffffffff -0ffffff7 -fff7fffe -fffffeff -fffffbfe -fffffdff -ffffffde -fffffbff -ffffffde -fffff7ff -fffffdfe -ffffefff -7ffffffe -fffbe000 -fffffffe -bfffcfff -00000006 -00000000 -fffffffe -ffef000f -cccccccd -3332cccc -fffffffe -fffbc000 -0000000e -00000000 -fffffffe -ffe000ff -ffffffff -000ffdff -bfffffff -000000ff -1fefffff -00000000 -00000000 -00000000 -c0fffffe -fbffffff -ffffffff -003dffff -00000009 -00000000 -fffffffd -dfffffff -000005ff -00000000 -00000000 -00000000 -aaa95554 -aaaaaaaa -00000000 -00000000 -00000007 -00000000 -0000001f -00000000 -000000ff -00000000 -00000000 -00000000 -00003fff -00000000 -0000ffff -00000000 -00000000 -00000000 -001fffff -00000000 -00000000 -00000000 -00000000 -00000000 -3fffffff -00000000 -ffffbfff -00000000 -fffeffff -00000001 -ffffffef -00000003 -00000000 -00000000 -fffff7ff -0000000f -fff7ffff -0000001f -7fffffff -00000fff -fffffffd -00001fff -bfffffff -00003fff -00000000 -00001000 -fffffeff -00ffffff -00000000 -00000000 -fffffffe -1fffffff -ffffffff -3ffffffb -00000000 -00000004 -ffffffbe -ffffefff -ffffbf7e -ffffffff -ffffffff -0000000f -fff7f7fe -ffffffff -feffeffe -ffffffff -ffffffff -00003fff -ffffbffe -fffffffe -ffd7fffe -ffffffff -fffffeff -0003ffff -fffffffb -000007ff -fefffffa -ffffffff -ffffffff -00000001 -8000000e -ffffffdf -efffffff -0fffffff -99999999 -66666665 -00000006 -fffffff7 -fffdffff -00000fff -00003ffe -fffffec0 -bfffffff -007fffff -00000003 -00000000 -7ffffdff -00000000 -ffffefff -00000000 -0ffbffff -00000000 -fff803fe -ff7fffff -99999997 -65999999 -b230df65 -00000000 -01efffff -00000000 -bfffffff -00000003 -0037ffff -00000000 -ffffffff -00ffffff -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000002 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -71c71c71 -1c71c71c -e38e38e3 -38e38e38 -00000001 -00000000 -11111110 -11111111 -22222221 -22222222 -3c56fbbb -00000000 -00000000 -00000000 -55555555 -00000000 -00000000 -00000000 -71c71c71 -1c71c71c -e38e38e2 -38e38e38 -00000001 -00000000 -11111110 -11111111 -22222221 -22222222 -3c56fbbb -00000000 -55555554 -00000000 -71c71c71 -1c71c71c -e38e38e3 -38e38e38 -00000001 -00000000 -11111111 -11111111 -22222222 -22222222 -3c56fbbb -00000000 -00000000 -00000000 -55555555 -00000000 -00000001 -00000000 -e38e38e3 -38e38e38 -c71c71c6 -71c71c71 -00000003 -00000000 -22222221 -22222222 -44444443 -44444444 -78adf777 -00000000 -00000000 -00000000 -aaaaaaaa -00000000 -00000001 -00000000 -e38e38e2 -38e38e38 -c71c71c5 -71c71c71 -00000002 -00000000 -22222221 -22222222 -44444443 -44444444 -78adf776 -00000000 -aaaaaaa9 -00000000 -e38e38e3 -38e38e38 -c71c71c6 -71c71c71 -00000003 -00000000 -22222222 -22222222 -44444444 -44444444 -78adf777 -00000000 -00000000 -00000000 -aaaaaaab -00000000 -00000000 -00000000 -00000001 -00000000 -00000003 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000003 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000003 -00000000 -00000000 -00000000 -00000001 -00000000 -00000002 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -11111110 -11111111 -22222221 -22222222 -00000000 -00000000 -d70a3d70 -0a3d70a3 -ae147ae1 -147ae147 -243430a3 -00000000 -00000000 -00000000 -33333333 -00000000 -00000000 -00000000 -11111110 -11111111 -22222221 -22222222 -00000000 -00000000 -d70a3d70 -0a3d70a3 -ae147ae0 -147ae147 -243430a3 -00000000 -33333332 -00000000 -11111111 -11111111 -22222222 -22222222 -00000001 -00000000 -d70a3d70 -0a3d70a3 -ae147ae1 -147ae147 -243430a3 -00000000 -00000000 -00000000 -33333333 -00000000 -00000001 -00000000 -22222221 -22222222 -44444443 -44444444 -00000001 -00000000 -ae147ae1 -147ae147 -5c28f5c2 -28f5c28f -48686147 -00000000 -00000000 -00000000 -66666666 -00000000 -00000000 -00000000 -22222221 -22222222 -44444443 -44444444 -00000001 -00000000 -ae147ae0 -147ae147 -5c28f5c1 -28f5c28f -48686147 -00000000 -66666665 -00000000 -22222222 -22222222 -44444444 -44444444 -00000002 -00000000 -ae147ae1 -147ae147 -5c28f5c2 -28f5c28f -48686147 -00000000 -00000000 -00000000 -66666666 -00000000 -00000000 -00000000 -3c56fbbb -00000000 -78adf777 -00000000 -00000000 -00000000 -243430a3 -00000000 -48686147 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -3c56fbbb -00000000 -78adf777 -00000000 -00000000 -00000000 -243430a3 -00000000 -48686147 -00000000 -00000000 -00000000 -00000000 -00000000 -3c56fbbb -00000000 -78adf777 -00000000 -00000000 -00000000 -243430a3 -00000000 -48686147 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -55555555 -00000000 -aaaaaaaa -00000000 -00000000 -00000000 -33333333 -00000000 -66666666 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -55555555 -00000000 -aaaaaaaa -00000000 -00000000 -00000000 -33333333 -00000000 -66666666 -00000000 -00000000 -00000000 -00000000 -00000000 -55555555 -00000000 -aaaaaaaa -00000000 -00000000 -00000000 -33333333 -00000000 -66666666 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -71c71c71 -1c71c71c -e38e38e2 -38e38e38 -00000001 -00000000 -11111110 -11111111 -22222221 -22222222 -3c56fbbb -00000000 -00000000 -00000000 -55555555 -00000000 -00000000 -00000000 -71c71c70 -1c71c71c -e38e38e2 -38e38e38 -00000001 -00000000 -11111110 -11111111 -22222221 -22222222 -3c56fbbb -00000000 -55555554 -00000000 -71c71c71 -1c71c71c -e38e38e2 -38e38e38 -00000001 -00000000 -11111111 -11111111 -22222221 -22222222 -3c56fbbb -00000000 -00000000 -00000000 -55555555 -00000000 -00000001 -00000000 -e38e38e2 -38e38e38 -c71c71c5 -71c71c71 -00000003 -00000000 -22222221 -22222222 -44444443 -44444444 -78adf777 -00000000 -00000000 -00000000 -aaaaaaaa -00000000 -00000001 -00000000 -e38e38e2 -38e38e38 -c71c71c4 -71c71c71 -00000002 -00000000 -22222221 -22222222 -44444442 -44444444 -78adf776 -00000000 -aaaaaaa9 -00000000 -e38e38e3 -38e38e38 -c71c71c6 -71c71c71 -00000003 -00000000 -22222222 -22222222 -44444443 -44444444 -78adf777 -00000000 -00000000 -00000000 -aaaaaaab -00000000 -00000000 -00000000 -00000001 -00000000 -00000002 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000002 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000002 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -11111110 -11111111 -22222221 -22222222 -00000000 -00000000 -d70a3d70 -0a3d70a3 -ae147ae0 -147ae147 -243430a3 -00000000 -00000000 -00000000 -33333333 -00000000 -00000000 -00000000 -11111110 -11111111 -22222221 -22222222 -00000000 -00000000 -d70a3d70 -0a3d70a3 -ae147ae0 -147ae147 -243430a3 -00000000 -33333332 -00000000 -11111110 -11111111 -22222221 -22222222 -00000001 -00000000 -d70a3d70 -0a3d70a3 -ae147ae0 -147ae147 -243430a3 -00000000 -00000000 -00000000 -33333333 -00000000 -00000001 -00000000 -22222221 -22222222 -44444443 -44444444 -00000001 -00000000 -ae147ae0 -147ae147 -5c28f5c1 -28f5c28f -48686147 -00000000 -66666666 -00000000 -00000000 -00000000 -22222221 -22222222 -44444442 -44444444 -00000001 -00000000 -ae147ae0 -147ae147 -5c28f5c1 -28f5c28f -48686147 -00000000 -66666665 -00000000 -22222221 -22222222 -44444443 -44444444 -00000002 -00000000 -ae147ae1 -147ae147 -5c28f5c2 -28f5c28f -48686147 -00000000 -00000000 -00000000 -66666666 -00000000 -00000000 -00000000 -3c56fbbb -00000000 -78adf776 -00000000 -00000000 -00000000 -243430a3 -00000000 -48686147 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -3c56fbbb -00000000 -78adf776 -00000000 -00000000 -00000000 -243430a3 -00000000 -48686147 -00000000 -00000000 -00000000 -00000000 -00000000 -3c56fbbb -00000000 -78adf776 -00000000 -00000000 -00000000 -243430a3 -00000000 -48686147 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -55555554 -00000000 -aaaaaaa9 -00000000 -00000000 -00000000 -33333332 -00000000 -66666665 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -55555554 -00000000 -aaaaaaa9 -00000000 -00000000 -00000000 -33333332 -00000000 -66666665 -00000000 -00000000 -00000000 -00000000 -00000000 -55555555 -00000000 -aaaaaaaa -00000000 -00000000 -00000000 -33333333 -00000000 -66666666 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -71c71c71 -1c71c71c -e38e38e3 -38e38e38 -00000001 -00000000 -11111111 -11111111 -22222222 -22222222 -3c56fbbb -00000000 -00000000 -00000000 -55555555 -00000000 -00000000 -00000000 -71c71c71 -1c71c71c -e38e38e3 -38e38e38 -00000001 -00000000 -11111110 -11111111 -22222221 -22222222 -3c56fbbb -00000000 -55555555 -00000000 -71c71c72 -1c71c71c -e38e38e4 -38e38e38 -00000002 -00000000 -11111111 -11111111 -22222222 -22222222 -3c56fbbc -00000000 -00000000 -00000000 -55555555 -00000000 -00000002 -00000000 -e38e38e3 -38e38e38 -c71c71c6 -71c71c71 -00000003 -00000000 -22222222 -22222222 -44444444 -44444444 -78adf777 -00000000 -00000000 -00000000 -aaaaaaaa -00000000 -00000001 -00000000 -e38e38e2 -38e38e38 -c71c71c6 -71c71c71 -00000002 -00000000 -22222221 -22222222 -44444443 -44444444 -78adf776 -00000000 -aaaaaaaa -00000000 -e38e38e4 -38e38e38 -c71c71c7 -71c71c71 -00000004 -00000000 -22222222 -22222222 -44444444 -44444444 -78adf778 -00000000 -00000000 -00000000 -aaaaaaab -00000000 -00000000 -00000000 -00000001 -00000000 -00000003 -00000000 -00000000 -00000000 -00000001 -00000000 -00000002 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000003 -00000000 -00000001 -00000000 -00000002 -00000000 -00000000 -00000000 -00000000 -00000000 -00000002 -00000000 -00000004 -00000000 -00000000 -00000000 -00000001 -00000000 -00000002 -00000000 -11111111 -11111111 -22222222 -22222222 -00000001 -00000000 -d70a3d70 -0a3d70a3 -ae147ae1 -147ae147 -243430a3 -00000000 -00000000 -00000000 -33333333 -00000000 -00000000 -00000000 -11111111 -11111111 -22222222 -22222222 -00000000 -00000000 -d70a3d70 -0a3d70a3 -ae147ae1 -147ae147 -243430a3 -00000000 -33333333 -00000000 -11111111 -11111111 -22222222 -22222222 -00000001 -00000000 -d70a3d70 -0a3d70a3 -ae147ae1 -147ae147 -243430a4 -00000000 -00000000 -00000000 -33333333 -00000000 -00000001 -00000000 -22222222 -22222222 -44444444 -44444444 -00000002 -00000000 -ae147ae1 -147ae147 -5c28f5c2 -28f5c28f -48686147 -00000000 -00000000 -00000000 -66666666 -00000000 -00000000 -00000000 -22222221 -22222222 -44444443 -44444444 -00000001 -00000000 -ae147ae0 -147ae147 -5c28f5c2 -28f5c28f -48686147 -00000000 -66666666 -00000000 -22222222 -22222222 -44444444 -44444444 -00000002 -00000000 -ae147ae1 -147ae147 -5c28f5c3 -28f5c28f -48686148 -00000000 -00000000 -00000000 -66666666 -00000000 -00000000 -00000000 -3c56fbbb -00000000 -78adf777 -00000000 -00000000 -00000000 -243430a3 -00000000 -48686147 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -3c56fbbb -00000000 -78adf777 -00000000 -00000000 -00000000 -243430a3 -00000000 -48686147 -00000000 -00000000 -00000000 -00000000 -00000000 -3c56fbbc -00000000 -78adf778 -00000000 -00000000 -00000000 -243430a4 -00000000 -48686148 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -55555555 -00000000 -aaaaaaab -00000000 -00000000 -00000000 -33333333 -00000000 -66666666 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -55555555 -00000000 -aaaaaaab -00000000 -00000000 -00000000 -33333333 -00000000 -66666666 -00000000 -00000000 -00000000 -00000000 -00000000 -55555555 -00000000 -aaaaaaab -00000000 -00000000 -00000000 -33333333 -00000000 -66666666 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -fffffffe -fe00ffff -0000003f -00000000 -00020000 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/M/references/mulw-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/M/references/mulw-01.reference_output deleted file mode 100644 index 2c7902422..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/M/references/mulw-01.reference_output +++ /dev/null @@ -1,1344 +0,0 @@ -00000100 -00000000 -00000000 -00000000 -aaaaaad6 -ffffffff -aaaaaaaa -ffffffff -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -fffff800 -ffffffff -ffffffff -ffffffff -00000000 -00000000 -00000000 -00000000 -00200001 -00000000 -00008000 -00000000 -aaaaaaa8 -ffffffff -10000000 -00000000 -fffffbf8 -ffffffff -00000000 -00000000 -00000000 -00000000 -ffffffc0 -ffffffff -ffffff00 -ffffffff -08000000 -00000000 -00040000 -00000000 -ff7ffc00 -ffffffff -33333000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -fff60000 -ffffffff -199c0000 -00000000 -00000000 -00000000 -00000000 -00000000 -fff00000 -ffffffff -00000000 -00000000 -ffc00000 -ffffffff -ff800000 -ffffffff -ff000000 -ffffffff -00000000 -00000000 -00000000 -00000000 -f8000000 -ffffffff -00000000 -00000000 -e0000000 -ffffffff -c0000000 -ffffffff -80000000 -ffffffff -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -ffe00000 -ffffffff -00000003 -00000000 -0000002d -00000000 -ffffff70 -ffffffff -00000099 -00000000 -00021021 -00000000 -fffffdfc -ffffffff -ffbfc000 -ffffffff -00000000 -00000000 -00000000 -00000000 -ffffe7fd -ffffffff -00000000 -00000000 -dfff8000 -ffffffff -00000000 -00000000 -00010001 -00000000 -cccb9999 -ffffffff -00040001 -00000000 -04080001 -00000000 -fdffffe0 -ffffffff -aad55556 -ffffffff -33ccccce -00000000 -e0000000 -ffffffff -02800001 -00000000 -f7fffffe -ffffffff -48000001 -00000000 -10000801 -00000000 -e0000007 -ffffffff -40000001 -00000000 -aaaaaaaa -ffffffff -00000001 -00000000 -00800001 -00000000 -55555556 -00000000 -00000001 -00000000 -00000001 -00000000 -02000001 -00000000 -00000000 -00000000 -aaaaaaaa -ffffffff -00000001 -00000000 -aaaaaaaa -ffffffff -00008001 -00000000 -00004001 -00000000 -00000001 -00000000 -9999999b -ffffffff -00000000 -00000000 -ccccccce -ffffffff -ff800000 -ffffffff -fffffff9 -ffffffff -ffff8000 -ffffffff -00000009 -00000000 -04000001 -00000000 -00000001 -00000000 -00000000 -00000000 -00000001 -00000000 -ffe00000 -ffffffff -00000001 -00000000 -fffffc00 -ffffffff -10000001 -00000000 -00000000 -00000000 -000aaaab -00000000 -00555556 -00000000 -00001000 -00000000 -00000000 -00000000 -00000000 -00000000 -fffe0000 -ffffffff -ffc00000 -ffffffff -00000000 -00000000 -00000000 -00000000 -c0000000 -ffffffff -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -fffffff4 -ffffffff -aaaaaaa9 -ffffffff -00022011 -00000000 -ffdf0000 -ffffffff -20000101 -00000000 -ffeff800 -ffffffff -555552aa -00000000 -fdffff00 -ffffffff -00000000 -00000000 -00100001 -00000000 -00400001 -00000000 -ff000000 -ffffffff -b9999999 -ffffffff -fc000000 -ffffffff -00000000 -00000000 -00010001 -00000000 -00000001 -00000000 -00020001 -00000000 -00000000 -00000000 -40000001 -00000000 -00000000 -00000000 -4afb0ccd -00000000 -00000000 -00000000 -b504f332 -ffffffff -00000001 -00000000 -00000001 -00000000 -00000000 -00000000 -00000801 -00000000 -aaaaaaac -ffffffff -00000009 -00000000 -ffffffff -ffffffff -fffffffe -ffffffff -0000000f -00000000 -99999999 -ffffffff -33333332 -00000000 -e0f12667 -ffffffff -1f0ed999 -00000000 -00000006 -00000000 -fffffffc -ffffffff -00000000 -00000000 -0000000c -00000000 -99999996 -ffffffff -3333332f -00000000 -1f0ed996 -00000000 -00000002 -00000000 -00000001 -00000000 -00000012 -00000000 -9999999c -ffffffff -33333335 -00000000 -e0f1266a -ffffffff -1f0ed99c -00000000 -ffffffff -ffffffff -38e38e39 -00000000 -71c71c72 -00000000 -aaaaaaa9 -ffffffff -eeeeeeef -ffffffff -ddddddde -ffffffff -91ac5111 -ffffffff -6e53aeef -00000000 -aaaaaaaa -ffffffff -e38e38e4 -ffffffff -00000000 -00000000 -55555554 -00000000 -9999999a -ffffffff -88888889 -ffffffff -18fe599a -00000000 -8e38e38e -ffffffff -c71c71c7 -ffffffff -fffffffe -ffffffff -44444444 -00000000 -33333333 -00000000 -e701a666 -ffffffff -c3a90444 -ffffffff -fffffffe -ffffffff -71c71c72 -00000000 -e38e38e4 -ffffffff -55555552 -00000000 -ddddddde -ffffffff -bbbbbbbc -ffffffff -2358a222 -00000000 -dca75dde -ffffffff -55555554 -00000000 -c71c71c8 -ffffffff -00000000 -00000000 -aaaaaaa8 -ffffffff -33333334 -00000000 -11111112 -00000000 -31fcb334 -00000000 -1c71c71c -00000000 -8e38e38e -ffffffff -fffffffc -ffffffff -88888888 -ffffffff -66666666 -00000000 -ce034ccc -ffffffff -87520888 -ffffffff -0000000f -00000000 -aaaaaaa9 -ffffffff -55555552 -00000000 -00000019 -00000000 -ffffffff -ffffffff -fffffffe -ffffffff -76e74001 -00000000 -8918bfff -ffffffff -0000000a -00000000 -aaaaaaa4 -ffffffff -00000000 -00000000 -00000014 -00000000 -fffffffa -ffffffff -fffffff9 -ffffffff -8918bffa -ffffffff -aaaaaaae -ffffffff -55555557 -00000000 -0000001e -00000000 -00000004 -00000000 -00000003 -00000000 -76e74006 -00000000 -8918c004 -ffffffff -99999999 -ffffffff -eeeeeeef -ffffffff -ddddddde -ffffffff -ffffffff -ffffffff -c28f5c29 -ffffffff -851eb852 -ffffffff -576763d7 -00000000 -a8989c29 -ffffffff -66666666 -00000000 -bbbbbbbc -ffffffff -00000000 -00000000 -cccccccc -ffffffff -8f5c28f6 -ffffffff -51eb851f -00000000 -756568f6 -00000000 -22222222 -00000000 -11111111 -00000000 -33333332 -00000000 -f5c28f5c -ffffffff -b851eb85 -ffffffff -8a9a970a -ffffffff -dbcbcf5c -ffffffff -33333332 -00000000 -ddddddde -ffffffff -bbbbbbbc -ffffffff -fffffffe -ffffffff -851eb852 -ffffffff -0a3d70a4 -00000000 -aecec7ae -ffffffff -51313852 -00000000 -cccccccc -ffffffff -77777778 -00000000 -00000000 -00000000 -99999998 -ffffffff -1eb851ec -00000000 -a3d70a3e -ffffffff -eacad1ec -ffffffff -44444444 -00000000 -22222222 -00000000 -66666664 -00000000 -eb851eb8 -ffffffff -70a3d70a -00000000 -15352e14 -00000000 -b7979eb8 -ffffffff -e0f12667 -ffffffff -91ac5111 -ffffffff -2358a222 -00000000 -76e74001 -00000000 -576763d7 -00000000 -aecec7ae -ffffffff -9ea1dc29 -ffffffff -615e23d7 -00000000 -95f6199a -ffffffff -46b14444 -00000000 -00000000 -00000000 -2bec3334 -00000000 -0c6c570a -00000000 -63d3bae1 -00000000 -1663170a -00000000 -dca75dde -ffffffff -6e53aeef -00000000 -c1e24cce -ffffffff -a26270a4 -ffffffff -f9c9d47b -ffffffff -e99ce8f6 -ffffffff -ac5930a4 -ffffffff -1f0ed999 -00000000 -6e53aeef -00000000 -dca75dde -ffffffff -8918bfff -ffffffff -a8989c29 -ffffffff -51313852 -00000000 -615e23d7 -00000000 -9ea1dc29 -ffffffff -6a09e666 -00000000 -b94ebbbc -ffffffff -00000000 -00000000 -d413cccc -ffffffff -f393a8f6 -ffffffff -9c2c451f -ffffffff -e99ce8f6 -ffffffff -2358a222 -00000000 -91ac5111 -ffffffff -3e1db332 -00000000 -5d9d8f5c -00000000 -06362b85 -00000000 -1663170a -00000000 -53a6cf5c -00000000 -00000006 -00000000 -aaaaaaaa -ffffffff -55555554 -00000000 -0000000a -00000000 -66666666 -00000000 -cccccccc -ffffffff -95f6199a -ffffffff -6a09e666 -00000000 -00000004 -00000000 -aaaaaaa8 -ffffffff -00000000 -00000000 -00000008 -00000000 -66666664 -00000000 -ccccccca -ffffffff -6a09e664 -00000000 -aaaaaaac -ffffffff -55555556 -00000000 -0000000c -00000000 -66666668 -00000000 -ccccccce -ffffffff -95f6199c -ffffffff -6a09e668 -00000000 -fffffffc -ffffffff -e38e38e4 -ffffffff -c71c71c8 -ffffffff -aaaaaaa4 -ffffffff -bbbbbbbc -ffffffff -77777778 -00000000 -46b14444 -00000000 -b94ebbbc -ffffffff -8e38e390 -ffffffff -00000000 -00000000 -55555550 -00000000 -66666668 -00000000 -22222224 -00000000 -63f96668 -00000000 -38e38e38 -00000000 -1c71c71c -00000000 -fffffff8 -ffffffff -11111110 -00000000 -cccccccc -ffffffff -9c069998 -ffffffff -0ea41110 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -0000000c -00000000 -55555554 -00000000 -aaaaaaa8 -ffffffff -00000014 -00000000 -cccccccc -ffffffff -99999998 -ffffffff -2bec3334 -00000000 -d413cccc -ffffffff -00000008 -00000000 -55555550 -00000000 -00000000 -00000000 -00000010 -00000000 -ccccccc8 -ffffffff -99999994 -ffffffff -d413ccc8 -ffffffff -55555558 -00000000 -aaaaaaac -ffffffff -00000018 -00000000 -ccccccd0 -ffffffff -9999999c -ffffffff -2bec3338 -00000000 -d413ccd0 -ffffffff -99999996 -ffffffff -9999999a -ffffffff -33333334 -00000000 -fffffffa -ffffffff -8f5c28f6 -ffffffff -1eb851ec -00000000 -0c6c570a -00000000 -f393a8f6 -ffffffff -66666664 -00000000 -66666668 -00000000 -00000000 -00000000 -ccccccc8 -ffffffff -5c28f5c4 -00000000 -eb851eba -ffffffff -c06075c4 -ffffffff -cccccccc -ffffffff -66666666 -00000000 -3333332c -00000000 -c28f5c28 -ffffffff -51eb851e -00000000 -3f9f8a3c -00000000 -26c6dc28 -00000000 -3333332f -00000000 -88888889 -ffffffff -11111112 -00000000 -fffffff9 -ffffffff -51eb851f -00000000 -a3d70a3e -ffffffff -63d3bae1 -00000000 -9c2c451f -ffffffff -ccccccca -ffffffff -22222224 -00000000 -00000000 -00000000 -99999994 -ffffffff -eb851eba -ffffffff -3d70a3d9 -00000000 -35c5deba -00000000 -eeeeeeee -ffffffff -77777777 -00000000 -6666665e -00000000 -b851eb84 -ffffffff -0a3d70a3 -00000000 -ca3a2146 -ffffffff -0292ab84 -00000000 -1f0ed996 -00000000 -18fe599a -00000000 -31fcb334 -00000000 -8918bffa -ffffffff -756568f6 -00000000 -eacad1ec -ffffffff -1663170a -00000000 -e99ce8f6 -ffffffff -6a09e664 -00000000 -63f96668 -00000000 -00000000 -00000000 -d413ccc8 -ffffffff -c06075c4 -ffffffff -35c5deba -00000000 -3497f5c4 -00000000 -ce034ccc -ffffffff -e701a666 -ffffffff -3e1db32c -00000000 -2a6a5c28 -00000000 -9fcfc51e -ffffffff -cb680a3c -ffffffff -9ea1dc28 -ffffffff -00000002 -00000000 -8e38e38e -ffffffff -1c71c71c -00000000 -aaaaaaae -ffffffff -22222222 -00000000 -44444444 -00000000 -dca75dde -ffffffff -2358a222 -00000000 -aaaaaaac -ffffffff -38e38e38 -00000000 -00000000 -00000000 -55555558 -00000000 -cccccccc -ffffffff -eeeeeeee -ffffffff -ce034ccc -ffffffff -e38e38e4 -ffffffff -71c71c72 -00000000 -00000004 -00000000 -77777778 -00000000 -9999999a -ffffffff -31fcb334 -00000000 -78adf778 -00000000 -00000001 -00000000 -c71c71c7 -ffffffff -8e38e38e -ffffffff -55555557 -00000000 -11111111 -00000000 -22222222 -00000000 -6e53aeef -00000000 -91ac5111 -ffffffff -55555556 -00000000 -1c71c71c -00000000 -00000000 -00000000 -aaaaaaac -ffffffff -66666666 -00000000 -77777777 -00000000 -e701a666 -ffffffff -71c71c72 -00000000 -38e38e39 -00000000 -00000002 -00000000 -bbbbbbbc -ffffffff -cccccccd -ffffffff -18fe599a -00000000 -3c56fbbc -00000000 -00000012 -00000000 -fffffffe -ffffffff -fffffffc -ffffffff -0000001e -00000000 -33333332 -00000000 -66666664 -00000000 -c1e24cce -ffffffff -3e1db332 -00000000 -0000000c -00000000 -fffffff8 -ffffffff -00000000 -00000000 -00000018 -00000000 -3333332c -00000000 -6666665e -00000000 -3e1db32c -00000000 -00000004 -00000000 -00000002 -00000000 -00000024 -00000000 -33333338 -00000000 -6666666a -00000000 -c1e24cd4 -ffffffff -3e1db338 -00000000 -9999999c -ffffffff -44444444 -00000000 -88888888 -ffffffff -00000004 -00000000 -f5c28f5c -ffffffff -eb851eb8 -ffffffff -a26270a4 -ffffffff -5d9d8f5c -00000000 -66666668 -00000000 -11111110 -00000000 -00000000 -00000000 -ccccccd0 -ffffffff -c28f5c28 -ffffffff -b851eb84 -ffffffff -2a6a5c28 -00000000 -77777778 -00000000 -bbbbbbbc -ffffffff -33333338 -00000000 -28f5c290 -00000000 -1eb851ec -00000000 -d595a3d8 -ffffffff -90d0c290 -ffffffff -33333335 -00000000 -33333333 -00000000 -66666666 -00000000 -00000003 -00000000 -b851eb85 -ffffffff -70a3d70a -00000000 -f9c9d47b -ffffffff -06362b85 -00000000 -ccccccce -ffffffff -cccccccc -ffffffff -00000000 -00000000 -9999999c -ffffffff -51eb851e -00000000 -0a3d70a3 -00000000 -9fcfc51e -ffffffff -9999999a -ffffffff -cccccccd -ffffffff -6666666a -00000000 -1eb851ec -00000000 -d70a3d71 -ffffffff -60303ae2 -00000000 -6c9c91ec -00000000 -e0f1266a -ffffffff -e701a666 -ffffffff -ce034ccc -ffffffff -76e74006 -00000000 -8a9a970a -ffffffff -15352e14 -00000000 -e99ce8f6 -ffffffff -1663170a -00000000 -95f6199c -ffffffff -9c069998 -ffffffff -00000000 -00000000 -2bec3338 -00000000 -3f9f8a3c -00000000 -ca3a2146 -ffffffff -cb680a3c -ffffffff -31fcb334 -00000000 -18fe599a -00000000 -c1e24cd4 -ffffffff -d595a3d8 -ffffffff -60303ae2 -00000000 -3497f5c4 -00000000 -615e23d8 -00000000 -1f0ed99c -00000000 -c3a90444 -ffffffff -87520888 -ffffffff -8918c004 -ffffffff -dbcbcf5c -ffffffff -b7979eb8 -ffffffff -ac5930a4 -ffffffff -53a6cf5c -00000000 -6a09e668 -00000000 -0ea41110 -00000000 -00000000 -00000000 -d413ccd0 -ffffffff -26c6dc28 -00000000 -0292ab84 -00000000 -9ea1dc28 -ffffffff -78adf778 -00000000 -3c56fbbc -00000000 -3e1db338 -00000000 -90d0c290 -ffffffff -6c9c91ec -00000000 -615e23d8 -00000000 -08abc290 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -ffb00000 -ffffffff diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/M/references/rem-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/M/references/rem-01.reference_output deleted file mode 100644 index 6f197d865..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/M/references/rem-01.reference_output +++ /dev/null @@ -1,1332 +0,0 @@ -00000000 -01000000 -00000000 -00000000 -fffffffe -ffffffff -fffffff8 -ffffffff -00000000 -00000000 -ffffffff -f7ffffff -00000000 -00000004 -ffffffdf -ffffffff -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -ffffffff -ffffffff -00000000 -00000000 -ffffffff -ffffffff -00000000 -00000000 -ffffffff -ffffffff -0000003f -00000000 -00000000 -00000000 -00000004 -00000000 -00000333 -00000000 -00000000 -00000000 -ffffffff -ffffffff -00000000 -00000000 -00001555 -00000000 -ffffffff -ffffffff -00000000 -00000000 -ffffffff -ffffffff -00000000 -00000000 -ffffbfff -ffffffff -00000000 -00000000 -fffffffa -ffffffff -00004000 -00000000 -ffffffff -ffffffff -ffffbfff -ffffffff -ffffffff -ffffffff -00080000 -00000000 -fffbffff -ffffffff -ffffffff -ffffffff -00020000 -00000000 -20000000 -00000000 -00000000 -00000000 -fffff7ff -ffffffff -00000000 -00000000 -ffffffff -ffffffff -ffffffff -ffffffff -fdffffff -ffffffff -fffffffa -ffffffff -bfffffff -ffffffff -00000400 -00000000 -fffeffff -ffffffff -ffffffff -ffffffff -fffffffa -ffffffff -00000020 -00000000 -00000000 -00000000 -00000000 -00000000 -00000009 -00000000 -00008000 -00000000 -ffffffff -fffffffb -00000000 -00000000 -ffffffff -fffffffe -ffffffff -ffffffff -ffffffff -ffffffbf -ffffffff -ffff7fff -00000800 -00000000 -00000000 -00010000 -ffffffff -fffff7ff -00000004 -00000000 -ffffffff -fffffbff -00000000 -00000100 -10000000 -00000000 -4afb0cce -ffffffff -ffffffff -ffffffff -00000002 -00000000 -fffffffd -ffffffff -00000007 -00000000 -fffffffe -ffffffff -fffffff7 -ffffffff -ffffffdf -ffffffff -ffffffdf -ffffffff -00000010 -00000000 -fffffe7e -ffffffff -fffffffb -ffffffff -fffffe00 -ffffffff -00000fc1 -00000000 -00000004 -00000000 -00000002 -00000000 -fffffff8 -ffffffff -fffffeff -ffffffff -00000004 -00000000 -00000040 -00000000 -00000004 -00000000 -fffbffff -ffffffff -00000005 -00000000 -00000020 -00000000 -00000100 -00000000 -00ffffc1 -00000000 -00000002 -00000000 -fc00fffe -ffffffff -fffffbff -ffffffff -0fffffe1 -00000000 -e000001e -ffffffff -c3fffffe -ffffffff -00000080 -00000000 -fffdffff -ffffffff -e0000001 -00000001 -fffe0001 -00000003 -00000001 -00000000 -b504f332 -00000000 -08000000 -00000000 -ff800000 -000000ff -fffffffd -ffffffff -000001fe -fffffc00 -00080000 -00000000 -fff7ffff -ffffffff -ffffffbf -ffffffff -000001fe -ffff8000 -fffffbff -ffffffff -00000000 -00000200 -ffffffff -fffffffb -ffdfffff -ffffffff -fffffc01 -000fffff -fffff7ff -ffffffff -fffeffff -ffffffff -0000001e -ff000000 -00000008 -00000000 -ffff7fff -ffffffff -00000000 -00000004 -ffffffef -ffffffff -00000008 -00000000 -ffefffff -ffffffff -00008000 -00000000 -00000000 -00000000 -000000f1 -00000000 -00002000 -00000000 -00010000 -00000000 -00400000 -00000000 -04000000 -00000000 -80000000 -00000000 -00000000 -00000001 -000003e1 -00000000 -00000080 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -ffffe001 -00000000 -ffffffff -00001fff -00000000 -00000000 -00000000 -00000000 -00000000 -00200000 -fffe0001 -0000003f -7685e185 -00000000 -00000000 -00000000 -00000000 -00000000 -fffffffb -ffffffff -00000000 -00000000 -ffffff7f -ffffffff -fffffdff -ffffffff -fffffffb -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -fffffffe -ffffffff -dfffffff -ffffffff -fffffffd -ffffffff -ffffffff -fffffffd -ffffffff -ffffffef -fffffffd -ffffffff -ffffffff -ffffff7f -ffffffff -ffffffff -00000ffe -fffffffc -ffffffff -fffeffff -ffffffff -fffdffff -ffffffff -ffffffff -fffffffb -ffffffff -db43aa5b -ffffffff -ffffffff -efffffff -ffffaaaa -ffffffff -00000000 -00000000 -00000003 -00000000 -00000003 -00000000 -00000003 -00000000 -00000003 -00000000 -00000003 -00000000 -00000003 -00000000 -00000003 -00000000 -00000001 -00000000 -00000003 -00000000 -00000003 -00000000 -00000003 -00000000 -00000003 -00000000 -00000003 -00000000 -00000003 -00000000 -00000003 -00000000 -00000003 -00000000 -00000003 -00000000 -00000003 -00000000 -00000003 -00000000 -00000003 -00000000 -00000003 -00000000 -00000002 -00000000 -00000000 -00000000 -55555555 -55555555 -00000000 -00000000 -22222222 -22222222 -55555555 -55555555 -72e6206d -00000000 -72e6206d -00000000 -00000001 -00000000 -00000001 -00000000 -55555555 -55555555 -00000001 -00000000 -22222223 -22222222 -55555555 -55555555 -368f24b3 -00000000 -55555555 -55555555 -00000000 -00000000 -00000005 -00000000 -22222221 -22222222 -55555555 -55555555 -368f24b3 -00000000 -af3d1c29 -00000000 -00000000 -00000000 -ffffffff -ffffffff -00000000 -00000000 -ffffffff -ffffffff -dddddddd -dddddddd -aaaaaaaa -aaaaaaaa -8d19df92 -ffffffff -8d19df92 -ffffffff -00000000 -00000000 -fffffffe -ffffffff -aaaaaaaa -aaaaaaaa -fffffffe -ffffffff -dddddddc -dddddddd -aaaaaaaa -aaaaaaaa -c970db4c -ffffffff -00000000 -00000000 -ffffffff -ffffffff -00000000 -00000000 -ddddddde -dddddddd -aaaaaaaa -aaaaaaaa -c970db4c -ffffffff -50c2e3d6 -ffffffff -00000002 -00000000 -00000005 -00000000 -00000005 -00000000 -00000000 -00000000 -00000005 -00000000 -00000005 -00000000 -00000005 -00000000 -00000005 -00000000 -00000001 -00000000 -00000005 -00000000 -00000005 -00000000 -00000001 -00000000 -00000005 -00000000 -00000005 -00000000 -00000005 -00000000 -00000005 -00000000 -00000005 -00000000 -00000005 -00000000 -00000005 -00000000 -00000005 -00000000 -00000005 -00000000 -00000005 -00000000 -00000000 -00000000 -33333333 -33333333 -33333333 -33333333 -00000003 -00000000 -00000000 -00000000 -33333333 -33333333 -44f079db -00000000 -44f079db -00000000 -00000001 -00000000 -33333333 -33333333 -33333333 -33333333 -00000003 -00000000 -00000001 -00000000 -33333333 -33333333 -8d58db23 -00000000 -33333333 -33333333 -33333333 -33333333 -00000003 -00000000 -33333333 -33333333 -33333333 -33333333 -8d58db23 -00000000 -b18d0bc7 -00000000 -00000000 -00000000 -11111111 -11111111 -11111110 -11111111 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -89e0f3b6 -00000000 -89e0f3b6 -00000000 -00000000 -00000000 -11111112 -11111111 -66666666 -66666666 -00000002 -00000000 -00000002 -00000000 -00000001 -00000000 -65acc314 -00000000 -11111110 -11111111 -11111111 -11111111 -00000000 -00000000 -33333332 -33333333 -66666666 -66666666 -65acc314 -00000000 -ae15245a -00000000 -fffffffe -ffffffff -4afb0ccd -ffffffff -4afb0ccd -ffffffff -fffffffc -ffffffff -4afb0ccd -ffffffff -4afb0ccd -ffffffff -00000000 -00000000 -00000000 -00000000 -ffffffff -ffffffff -4afb0ccd -ffffffff -4afb0ccd -ffffffff -fffffffd -ffffffff -4afb0ccd -ffffffff -4afb0ccd -ffffffff -ffffffff -ffffffff -4afb0ccd -ffffffff -4afb0ccd -ffffffff -fffffffb -ffffffff -4afb0ccd -ffffffff -4afb0ccd -ffffffff -ffffffff -ffffffff -4afb0ccd -ffffffff -00000002 -00000000 -b504f333 -00000000 -b504f333 -00000000 -00000004 -00000000 -b504f333 -00000000 -b504f333 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -b504f333 -00000000 -b504f333 -00000000 -00000003 -00000000 -b504f333 -00000000 -b504f333 -00000000 -00000001 -00000000 -b504f333 -00000000 -b504f333 -00000000 -00000005 -00000000 -b504f333 -00000000 -b504f333 -00000000 -00000001 -00000000 -b504f333 -00000000 -00000002 -00000000 -00000002 -00000000 -00000002 -00000000 -00000002 -00000000 -00000002 -00000000 -00000002 -00000000 -00000002 -00000000 -00000002 -00000000 -00000000 -00000000 -00000002 -00000000 -00000002 -00000000 -00000002 -00000000 -00000002 -00000000 -00000002 -00000000 -00000002 -00000000 -00000002 -00000000 -00000002 -00000000 -00000002 -00000000 -00000002 -00000000 -00000002 -00000000 -00000002 -00000000 -00000002 -00000000 -00000001 -00000000 -55555554 -55555555 -55555554 -55555555 -00000004 -00000000 -22222221 -22222222 -55555554 -55555555 -72e6206c -00000000 -72e6206c -00000000 -00000000 -00000000 -00000000 -00000000 -55555554 -55555555 -00000000 -00000000 -22222222 -22222222 -55555554 -55555555 -368f24b2 -00000000 -55555554 -55555555 -55555554 -55555555 -00000004 -00000000 -22222220 -22222222 -55555554 -55555555 -368f24b2 -00000000 -af3d1c28 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000004 -00000000 -00000004 -00000000 -00000004 -00000000 -00000004 -00000000 -00000004 -00000000 -00000004 -00000000 -00000004 -00000000 -00000000 -00000000 -00000004 -00000000 -00000004 -00000000 -00000000 -00000000 -00000004 -00000000 -00000004 -00000000 -00000004 -00000000 -00000004 -00000000 -00000004 -00000000 -00000004 -00000000 -00000004 -00000000 -00000004 -00000000 -00000004 -00000000 -00000004 -00000000 -00000002 -00000000 -33333332 -33333333 -33333332 -33333333 -00000002 -00000000 -33333332 -33333333 -33333332 -33333333 -44f079da -00000000 -44f079da -00000000 -00000000 -00000000 -33333332 -33333333 -33333332 -33333333 -00000002 -00000000 -00000000 -00000000 -33333332 -33333333 -8d58db22 -00000000 -33333332 -33333333 -33333332 -33333333 -00000002 -00000000 -33333332 -33333333 -33333332 -33333333 -8d58db22 -00000000 -b18d0bc6 -00000000 -00000002 -00000000 -11111110 -11111111 -1111110f -11111111 -00000000 -00000000 -33333332 -33333333 -66666665 -66666666 -89e0f3b5 -00000000 -89e0f3b5 -00000000 -00000001 -00000000 -11111111 -11111111 -66666665 -66666666 -00000001 -00000000 -00000001 -00000000 -00000000 -00000000 -65acc313 -00000000 -1111110f -11111111 -11111110 -11111111 -00000005 -00000000 -33333331 -33333333 -66666665 -66666666 -65acc313 -00000000 -ae152459 -00000000 -00000001 -00000000 -b504f332 -00000000 -b504f332 -00000000 -00000003 -00000000 -b504f332 -00000000 -b504f332 -00000000 -b504f332 -00000000 -b504f332 -00000000 -00000000 -00000000 -b504f332 -00000000 -b504f332 -00000000 -00000002 -00000000 -b504f332 -00000000 -b504f332 -00000000 -00000000 -00000000 -b504f332 -00000000 -b504f332 -00000000 -00000004 -00000000 -b504f332 -00000000 -b504f332 -00000000 -00000000 -00000000 -b504f332 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000001 -00000000 -22222223 -22222222 -55555556 -55555555 -72e6206e -00000000 -72e6206e -00000000 -00000000 -00000000 -00000002 -00000000 -55555556 -55555555 -00000002 -00000000 -22222224 -22222222 -55555556 -55555555 -368f24b4 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -22222222 -22222222 -55555556 -55555555 -368f24b4 -00000000 -af3d1c2a -00000000 -fffffffe -ffffffff -00000000 -00000000 -aaaaaaab -aaaaaaaa -00000000 -00000000 -ddddddde -dddddddd -aaaaaaab -aaaaaaaa -8d19df93 -ffffffff -8d19df93 -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -aaaaaaab -aaaaaaaa -ffffffff -ffffffff -dddddddd -dddddddd -aaaaaaab -aaaaaaaa -c970db4d -ffffffff -aaaaaaab -aaaaaaaa -00000000 -00000000 -fffffffb -ffffffff -dddddddf -dddddddd -aaaaaaab -aaaaaaaa -c970db4d -ffffffff -50c2e3d7 -ffffffff -00000000 -00000000 -00000006 -00000000 -00000006 -00000000 -00000001 -00000000 -00000006 -00000000 -00000006 -00000000 -00000006 -00000000 -00000006 -00000000 -00000000 -00000000 -00000006 -00000000 -00000006 -00000000 -00000002 -00000000 -00000006 -00000000 -00000006 -00000000 -00000006 -00000000 -00000006 -00000000 -00000006 -00000000 -00000000 -00000000 -00000006 -00000000 -00000006 -00000000 -00000006 -00000000 -00000006 -00000000 -00000001 -00000000 -33333334 -33333333 -33333334 -33333333 -00000004 -00000000 -00000001 -00000000 -33333334 -33333333 -44f079dc -00000000 -44f079dc -00000000 -00000000 -00000000 -33333334 -33333333 -33333334 -33333333 -00000000 -00000000 -00000002 -00000000 -33333334 -33333333 -8d58db24 -00000000 -33333334 -33333333 -33333334 -33333333 -00000004 -00000000 -00000000 -00000000 -33333334 -33333333 -8d58db24 -00000000 -b18d0bc8 -00000000 -00000001 -00000000 -11111112 -11111111 -11111111 -11111111 -00000002 -00000000 -00000001 -00000000 -00000001 -00000000 -89e0f3b7 -00000000 -89e0f3b7 -00000000 -00000001 -00000000 -11111113 -11111111 -66666667 -66666666 -00000003 -00000000 -00000003 -00000000 -00000002 -00000000 -65acc315 -00000000 -11111111 -11111111 -11111112 -11111111 -00000001 -00000000 -33333333 -33333333 -00000000 -00000000 -65acc315 -00000000 -ae15245b -00000000 -ffffffff -ffffffff -4afb0cce -ffffffff -4afb0cce -ffffffff -fffffffd -ffffffff -4afb0cce -ffffffff -4afb0cce -ffffffff -4afb0cce -ffffffff -4afb0cce -ffffffff -00000000 -00000000 -4afb0cce -ffffffff -4afb0cce -ffffffff -fffffffe -ffffffff -4afb0cce -ffffffff -4afb0cce -ffffffff -00000000 -00000000 -4afb0cce -ffffffff -4afb0cce -ffffffff -fffffffc -ffffffff -4afb0cce -ffffffff -4afb0cce -ffffffff -00000000 -00000000 -4afb0cce -ffffffff -00000000 -00000000 -b504f334 -00000000 -b504f334 -00000000 -00000000 -00000000 -b504f334 -00000000 -b504f334 -00000000 -00000001 -00000000 -00000001 -00000000 -00000000 -00000000 -b504f334 -00000000 -b504f334 -00000000 -00000000 -00000000 -b504f334 -00000000 -b504f334 -00000000 -00000002 -00000000 -b504f334 -00000000 -b504f334 -00000000 -00000000 -00000000 -b504f334 -00000000 -b504f334 -00000000 -00000002 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00800000 -00000000 -00000040 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/M/references/remu-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/M/references/remu-01.reference_output deleted file mode 100644 index 637ba5ce6..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/M/references/remu-01.reference_output +++ /dev/null @@ -1,1644 +0,0 @@ -55555555 -55555555 -00000000 -00000000 -fffff7ff -ffffffff -aaaaaaaa -aaaaaaaa -00000000 -00000000 -00000000 -00000000 -0000ffff -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -0000000f -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000006 -00000000 -00000001 -00000000 -00000000 -00000000 -00000555 -00000000 -00000000 -00000000 -00000000 -00000000 -00007fff -00000000 -00000000 -00000000 -00000010 -00000000 -00000004 -00000000 -000fffff -00000000 -00000000 -00000000 -00000020 -00000000 -0004f332 -00000000 -ffffffef -ffffffff -00000002 -00000000 -03feffff -00000000 -07ffffff -00000000 -00000000 -00000000 -1bffffff -00000000 -01000000 -00000000 -66666665 -00000000 -ffffffff -00000000 -b504f332 -00000000 -ffffffff -00000003 -00000000 -00000000 -ffffffff -0000001f -aaaaaaaa -0000002a -ffffffff -0000007f -00000006 -00000000 -00000000 -00000000 -ffffffbf -000003ff -04000000 -00000000 -ffefffff -00000fff -00800000 -00000000 -ffffffff -00003fff -fff7ffff -00007fff -00000009 -00000000 -55555555 -00015555 -00000002 -00000000 -00000000 -00000010 -ffffffff -000fffbf -00000004 -00000000 -00000009 -00000000 -ffffffff -0077ffff -00000001 -00000000 -00100000 -00000000 -ffffbfff -03ffffff -20000000 -00000000 -00000100 -00000000 -dfffffff -1fffffff -00000000 -00001000 -00400000 -00000000 -00000000 -00000020 -66666667 -66666666 -33333332 -33333333 -ffffbfff -ffffffff -66666666 -66666666 -00100000 -00000000 -55555556 -55555555 -ffffffff -fffffbff -00080000 -00000000 -ffffffff -ffffefff -000003f0 -00000000 -aaaaaaa9 -aaaaaaaa -00000003 -00000000 -00000009 -00000000 -00000012 -00000000 -02000000 -00000000 -0000000e -00000000 -00000000 -00400000 -ffffffff -ffffffef -00000000 -00000000 -00000040 -00000000 -00180000 -00000000 -aaaaaaaa -aaaaaaaa -55555555 -55555555 -00000000 -00040000 -ffffffff -fffffffd -00000005 -00000000 -00000000 -00001000 -0ffffc00 -00000000 -ffffffff -fffeffff -55555555 -55555555 -ffffffff -fdffffff -ffe00000 -00000000 -00000001 -00000000 -ffffffff -fff7ffff -00000000 -08000000 -04000000 -00000000 -fc000000 -0000003f -00000000 -00000100 -33333334 -33333333 -00000000 -10000000 -00000000 -000003e0 -00008000 -00000000 -00080000 -00000000 -0000000a -00000000 -00000000 -00000400 -0000000f -00000000 -10000000 -00000000 -ffffff80 -0003ffff -00000000 -00040000 -00000000 -00000800 -10000000 -00000000 -ffffffff -ff7fffff -00002000 -00000000 -00000040 -00000000 -33333333 -33333333 -01000000 -00000000 -00000000 -07c00000 -33333334 -33333333 -20000000 -00000000 -00000000 -3ffe0000 -00000004 -00000000 -55555555 -55555455 -00000000 -00000040 -00000002 -00000000 -00000080 -00000000 -00000200 -00000000 -00000004 -00000000 -00000800 -00000000 -00000001 -00000000 -00004000 -00000000 -00020000 -00000000 -08000000 -00000000 -80000000 -00000000 -00000000 -00000002 -00000000 -00000004 -00000000 -00000000 -00000000 -00000080 -00000000 -00000200 -00000000 -00002000 -00000000 -00004000 -00000000 -00008000 -00000002 -00000000 -00000000 -00080000 -00000000 -00100000 -00000000 -00200000 -00000000 -00800000 -00000000 -01000000 -00000000 -00000000 -00000000 -04000000 -00000000 -20000000 -00000000 -40000000 -0000000e -00000000 -0000007d -00000000 -5555554f -55555555 -00000007 -00000000 -ffffffdf -000001ff -0007ff00 -00000000 -000ffe00 -00000000 -000003ff -00000000 -003fe000 -00000000 -3332b331 -33333333 -00000003 -00000000 -55515555 -55555555 -ffbfffff -ffffffff -ff800000 -000fffff -1f000000 -00000000 -fdffffff -0000003f -f7ffffff -0003ffff -45555554 -55555555 -c0000000 -0001ffff -00000001 -00000000 -58b26147 -00000000 -0000000a -00000000 -00000000 -00000380 -00000003 -00000000 -07ffffff -00000000 -00000007 -00000000 -00000000 -00300000 -ffffffff -0007ffff -ffffffff -00000003 -55555556 -51555555 -00000000 -10000000 -00003fff -00000000 -ffffffff -bfffffff -00000000 -00000000 -00000003 -00000000 -00000003 -00000000 -00000003 -00000000 -00000003 -00000000 -00000003 -00000000 -00000003 -00000000 -00000003 -00000000 -00000003 -00000000 -00000001 -00000000 -00000003 -00000000 -00000003 -00000000 -00000003 -00000000 -00000003 -00000000 -00000003 -00000000 -00000003 -00000000 -00000003 -00000000 -00000003 -00000000 -00000003 -00000000 -00000003 -00000000 -00000003 -00000000 -00000003 -00000000 -00000003 -00000000 -00000000 -00000000 -00000003 -00000000 -00000002 -00000000 -00000000 -00000000 -55555555 -55555555 -00000000 -00000000 -22222222 -22222222 -55555555 -55555555 -72e6206d -00000000 -55555555 -55555555 -55555555 -00000000 -00000001 -00000000 -00000001 -00000000 -55555555 -55555555 -00000001 -00000000 -22222223 -22222222 -55555555 -55555555 -368f24b3 -00000000 -aaaaaaaa -00000000 -55555555 -55555555 -55555555 -55555555 -00000005 -00000000 -22222221 -22222222 -55555555 -55555555 -af3d1c29 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -11111111 -11111111 -44444444 -44444444 -30c74da7 -00000000 -aaaaaaaa -aaaaaaaa -aaaaaaaa -00000000 -00000000 -00000000 -00000002 -00000000 -00000001 -00000000 -00000002 -00000000 -11111114 -11111111 -44444445 -44444444 -6d1e4966 -00000000 -55555555 -00000000 -55555554 -55555555 -aaaaaaaa -aaaaaaaa -00000004 -00000000 -1111110e -11111111 -44444443 -44444444 -a975451e -00000000 -00000000 -00000000 -00000000 -00000000 -00000002 -00000000 -00000005 -00000000 -00000005 -00000000 -00000000 -00000000 -00000005 -00000000 -00000005 -00000000 -00000005 -00000000 -00000005 -00000000 -00000005 -00000000 -00000001 -00000000 -00000005 -00000000 -00000005 -00000000 -00000001 -00000000 -00000005 -00000000 -00000005 -00000000 -00000005 -00000000 -00000005 -00000000 -00000005 -00000000 -00000005 -00000000 -00000005 -00000000 -00000005 -00000000 -00000005 -00000000 -00000005 -00000000 -00000000 -00000000 -00000005 -00000000 -00000000 -00000000 -33333333 -33333333 -33333333 -33333333 -00000003 -00000000 -00000000 -00000000 -33333333 -33333333 -44f079db -00000000 -33333333 -33333333 -33333333 -00000000 -00000001 -00000000 -33333333 -33333333 -33333333 -33333333 -00000003 -00000000 -00000001 -00000000 -33333333 -33333333 -8d58db23 -00000000 -66666666 -00000000 -33333333 -33333333 -33333333 -33333333 -00000003 -00000000 -33333333 -33333333 -33333333 -33333333 -b18d0bc7 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -11111111 -11111111 -66666666 -66666666 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -89e0f3b6 -00000000 -66666666 -66666666 -66666666 -00000000 -11111112 -11111111 -66666666 -66666666 -00000002 -00000000 -00000002 -00000000 -00000001 -00000000 -65acc314 -00000000 -cccccccc -00000000 -11111110 -11111111 -66666666 -66666666 -00000000 -00000000 -33333332 -33333333 -66666666 -66666666 -ae15245a -00000000 -00000000 -00000000 -00000000 -00000000 -00000002 -00000000 -b504f333 -00000000 -b504f333 -00000000 -00000004 -00000000 -b504f333 -00000000 -b504f333 -00000000 -00000000 -00000000 -b504f333 -00000000 -b504f333 -00000000 -00000001 -00000000 -b504f333 -00000000 -b504f333 -00000000 -00000003 -00000000 -b504f333 -00000000 -b504f333 -00000000 -00000001 -00000000 -b504f333 -00000000 -b504f333 -00000000 -b504f333 -00000000 -00000005 -00000000 -b504f333 -00000000 -b504f333 -00000000 -b504f333 -00000000 -00000000 -00000000 -b504f333 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000001 -00000000 -00000001 -00000001 -00000000 -00000000 -00000001 -00000000 -00000001 -4afb0ccd -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000001 -00000000 -00000000 -00000000 -00000001 -00000000 -00000001 -4afb0cce -00000000 -00000001 -00000000 -00000000 -00000001 -00000000 -00000001 -00000004 -00000000 -00000000 -00000001 -00000000 -00000001 -4afb0ccc -00000000 -00000000 -00000000 -00000000 -00000001 -00000002 -00000000 -00000002 -00000000 -00000002 -00000000 -00000002 -00000000 -00000002 -00000000 -00000002 -00000000 -00000002 -00000000 -00000002 -00000000 -00000002 -00000000 -00000000 -00000000 -00000002 -00000000 -00000002 -00000000 -00000002 -00000000 -00000002 -00000000 -00000002 -00000000 -00000002 -00000000 -00000002 -00000000 -00000002 -00000000 -00000002 -00000000 -00000002 -00000000 -00000002 -00000000 -00000002 -00000000 -00000002 -00000000 -00000000 -00000000 -00000002 -00000000 -00000001 -00000000 -55555554 -55555555 -55555554 -55555555 -00000004 -00000000 -22222221 -22222222 -55555554 -55555555 -72e6206c -00000000 -55555554 -55555555 -55555554 -00000000 -00000000 -00000000 -00000000 -00000000 -55555554 -55555555 -00000000 -00000000 -22222222 -22222222 -55555554 -55555555 -368f24b2 -00000000 -aaaaaaa9 -00000000 -55555554 -55555555 -55555554 -55555555 -00000004 -00000000 -22222220 -22222222 -55555554 -55555555 -af3d1c28 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -55555554 -55555555 -aaaaaaa9 -aaaaaaaa -00000004 -00000000 -11111110 -11111111 -44444443 -44444444 -30c74da6 -00000000 -aaaaaaa9 -aaaaaaaa -aaaaaaa9 -00000000 -00000001 -00000000 -00000001 -00000000 -00000000 -00000000 -00000001 -00000000 -11111113 -11111111 -44444444 -44444444 -6d1e4965 -00000000 -55555554 -00000000 -55555553 -55555555 -aaaaaaa9 -aaaaaaaa -00000003 -00000000 -1111110d -11111111 -44444442 -44444444 -a975451d -00000000 -00000000 -00000000 -00000000 -00000001 -00000001 -00000000 -00000004 -00000000 -00000004 -00000000 -00000004 -00000000 -00000004 -00000000 -00000004 -00000000 -00000004 -00000000 -00000004 -00000000 -00000004 -00000000 -00000000 -00000000 -00000004 -00000000 -00000004 -00000000 -00000000 -00000000 -00000004 -00000000 -00000004 -00000000 -00000004 -00000000 -00000004 -00000000 -00000004 -00000000 -00000004 -00000000 -00000004 -00000000 -00000004 -00000000 -00000004 -00000000 -00000004 -00000000 -00000000 -00000000 -00000004 -00000000 -00000002 -00000000 -33333332 -33333333 -33333332 -33333333 -00000002 -00000000 -33333332 -33333333 -33333332 -33333333 -44f079da -00000000 -33333332 -33333333 -33333332 -00000000 -00000000 -00000000 -33333332 -33333333 -33333332 -33333333 -00000002 -00000000 -00000000 -00000000 -33333332 -33333333 -8d58db22 -00000000 -66666665 -00000000 -33333332 -33333333 -33333332 -33333333 -00000002 -00000000 -33333332 -33333333 -33333332 -33333333 -b18d0bc6 -00000000 -00000000 -00000000 -00000000 -00000001 -00000002 -00000000 -11111110 -11111111 -66666665 -66666666 -00000000 -00000000 -33333332 -33333333 -66666665 -66666666 -89e0f3b5 -00000000 -66666665 -66666666 -66666665 -00000000 -00000001 -00000000 -11111111 -11111111 -66666665 -66666666 -00000001 -00000000 -00000001 -00000000 -00000000 -00000000 -65acc313 -00000000 -cccccccb -00000000 -1111110f -11111111 -66666665 -66666666 -00000005 -00000000 -33333331 -33333333 -66666665 -66666666 -ae152459 -00000000 -00000000 -00000000 -00000000 -00000001 -00000001 -00000000 -b504f332 -00000000 -b504f332 -00000000 -00000003 -00000000 -b504f332 -00000000 -b504f332 -00000000 -b504f332 -00000000 -b504f332 -00000000 -b504f332 -00000000 -00000000 -00000000 -b504f332 -00000000 -b504f332 -00000000 -00000002 -00000000 -b504f332 -00000000 -b504f332 -00000000 -00000000 -00000000 -b504f332 -00000000 -b504f332 -00000000 -b504f332 -00000000 -00000004 -00000000 -b504f332 -00000000 -b504f332 -00000000 -b504f332 -00000000 -00000000 -00000000 -b504f332 -00000000 -00000000 -00000000 -ffffffff -00000000 -ffffffff -00000000 -00000000 -00000000 -ffffffff -00000000 -ffffffff -00000000 -4afb0ccc -00000000 -ffffffff -00000000 -ffffffff -00000000 -00000001 -00000000 -ffffffff -00000000 -ffffffff -00000000 -00000003 -00000000 -ffffffff -00000000 -ffffffff -00000000 -4afb0ccd -00000000 -00000000 -00000000 -ffffffff -00000000 -ffffffff -00000000 -00000003 -00000000 -ffffffff -00000000 -ffffffff -00000000 -4afb0ccb -00000000 -00000000 -00000000 -ffffffff -00000000 -00000000 -00000000 -00000001 -00000000 -55555556 -55555555 -00000001 -00000000 -22222223 -22222222 -55555556 -55555555 -72e6206e -00000000 -55555556 -55555555 -55555556 -00000000 -00000000 -00000000 -00000002 -00000000 -55555556 -55555555 -00000002 -00000000 -22222224 -22222222 -55555556 -55555555 -368f24b4 -00000000 -aaaaaaab -00000000 -00000000 -00000000 -55555556 -55555555 -00000000 -00000000 -22222222 -22222222 -55555556 -55555555 -af3d1c2a -00000000 -00000000 -00000000 -00000001 -00000000 -00000002 -00000000 -00000001 -00000000 -00000001 -00000000 -00000001 -00000000 -11111112 -11111111 -44444445 -44444444 -30c74da8 -00000000 -aaaaaaab -aaaaaaaa -aaaaaaab -00000000 -00000001 -00000000 -00000003 -00000000 -00000002 -00000000 -00000003 -00000000 -11111115 -11111111 -44444446 -44444444 -6d1e4967 -00000000 -55555556 -00000000 -55555555 -55555555 -00000000 -00000000 -00000005 -00000000 -1111110f -11111111 -44444444 -44444444 -a975451f -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000006 -00000000 -00000006 -00000000 -00000001 -00000000 -00000006 -00000000 -00000006 -00000000 -00000006 -00000000 -00000006 -00000000 -00000006 -00000000 -00000000 -00000000 -00000006 -00000000 -00000006 -00000000 -00000002 -00000000 -00000006 -00000000 -00000006 -00000000 -00000006 -00000000 -00000006 -00000000 -00000006 -00000000 -00000006 -00000000 -00000000 -00000000 -00000006 -00000000 -00000006 -00000000 -00000006 -00000000 -33333334 -33333333 -33333334 -33333333 -00000004 -00000000 -00000001 -00000000 -33333334 -33333333 -44f079dc -00000000 -33333334 -33333333 -33333334 -00000000 -00000000 -00000000 -33333334 -33333333 -33333334 -33333333 -00000000 -00000000 -00000002 -00000000 -33333334 -33333333 -8d58db24 -00000000 -66666667 -00000000 -33333334 -33333333 -33333334 -33333333 -00000004 -00000000 -00000000 -00000000 -33333334 -33333333 -b18d0bc8 -00000000 -00000000 -00000000 -00000001 -00000000 -00000001 -00000000 -11111112 -11111111 -66666667 -66666666 -00000002 -00000000 -00000001 -00000000 -00000001 -00000000 -89e0f3b7 -00000000 -66666667 -66666666 -66666667 -00000000 -00000001 -00000000 -11111113 -11111111 -66666667 -66666666 -00000003 -00000000 -00000003 -00000000 -00000002 -00000000 -65acc315 -00000000 -cccccccd -00000000 -11111111 -11111111 -66666667 -66666666 -00000001 -00000000 -33333333 -33333333 -00000000 -00000000 -ae15245b -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -b504f334 -00000000 -b504f334 -00000000 -00000000 -00000000 -b504f334 -00000000 -b504f334 -00000000 -00000001 -00000000 -b504f334 -00000000 -b504f334 -00000000 -00000000 -00000000 -b504f334 -00000000 -b504f334 -00000000 -00000000 -00000000 -b504f334 -00000000 -b504f334 -00000000 -00000002 -00000000 -b504f334 -00000000 -b504f334 -00000000 -b504f334 -00000000 -00000000 -00000000 -b504f334 -00000000 -b504f334 -00000000 -00000000 -00000000 -00000000 -00000000 -b504f334 -00000000 -00000001 -00000000 -00000001 -00000000 -00000001 -00000000 -00000001 -00000000 -00000001 -00000000 -00000001 -00000000 -00000001 -00000000 -00000001 -00000000 -00000001 -00000000 -00000001 -00000000 -00000001 -00000000 -00000001 -00000000 -00000001 -00000000 -00000001 -00000000 -00000001 -00000000 -00000001 -00000000 -00000001 -00000000 -00000001 -00000000 -00000001 -00000000 -00000001 -00000000 -00000001 -00000000 -00000001 -00000000 -00000001 -00000000 -00000000 -00000000 -00000001 -00000000 -00000002 -00000000 -00000001 -00000001 -00000001 -00000001 -00000002 -00000000 -00000001 -00000001 -00000001 -00000001 -4afb0cce -00000000 -00000001 -00000001 -00000001 -00000000 -00000001 -00000000 -00000001 -00000001 -00000001 -00000001 -00000001 -00000000 -00000001 -00000001 -00000001 -00000001 -4afb0ccf -00000000 -00000002 -00000000 -00000001 -00000001 -00000001 -00000001 -00000005 -00000000 -00000001 -00000001 -00000001 -00000001 -4afb0ccd -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000006 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00ffffef -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/M/references/remuw-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/M/references/remuw-01.reference_output deleted file mode 100644 index d208d5667..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/M/references/remuw-01.reference_output +++ /dev/null @@ -1,1636 +0,0 @@ -00000002 -00000000 -00000000 -00000000 -ffffffff -ffffffff -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000001 -00000000 -00000000 -00000000 -00000007 -00000000 -0000000f -00000000 -0000001f -00000000 -0000003f -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -000003ff -00000000 -000007ff -00000000 -00000000 -00000000 -00000000 -00000000 -00003ffe -00000000 -00000000 -00000000 -0000ffff -00000000 -00000000 -00000000 -0002aaab -00000000 -0007ffff -00000000 -00000000 -00000000 -001fffff -00000000 -00000000 -00000000 -00000000 -00000000 -01ffffff -00000000 -00002000 -00000000 -05555556 -00000000 -0ffffffd -00000000 -00000000 -00000000 -00000800 -00000000 -33333333 -00000000 -00100000 -00000000 -00000000 -00000000 -00000010 -00000000 -55555555 -00000000 -00000000 -00000000 -aaaaaaaa -ffffffff -fffffdff -ffffffff -00000000 -00000000 -ffffffff -ffffffff -00000005 -00000000 -00000000 -00000000 -0000000f -00000000 -ffffffff -ffffffff -00000000 -00000000 -00000006 -00000000 -ffffffbf -ffffffff -00000002 -00000000 -00000012 -00000000 -00000080 -00000000 -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -66666666 -00000000 -00000002 -00000000 -00000000 -00000000 -00000000 -00000000 -0000000b -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -ffffffff -ffffffff -ffffffff -ffffffff -00000005 -00000000 -55555554 -00000000 -00000003 -00000000 -b504f333 -ffffffff -00000000 -00000000 -33333334 -00000000 -00000040 -00000000 -00000000 -00000000 -ffffdfff -ffffffff -00000000 -00000000 -00080000 -00000000 -00000800 -00000000 -00000000 -00000000 -00000200 -00000000 -b504f332 -ffffffff -00007fe0 -00000000 -10000000 -00000000 -fffbffff -ffffffff -00000000 -00000000 -00080000 -00000000 -00000003 -00000000 -00000000 -00000000 -00000040 -00000000 -00000000 -00000000 -00000011 -00000000 -01fffe00 -00000000 -aaaaaaab -ffffffff -00000001 -00000000 -00000000 -00000000 -20000000 -00000000 -00000007 -00000000 -00000001 -00000000 -66666666 -00000000 -7fffffff -00000000 -00000002 -00000000 -00000000 -00000000 -00004000 -00000000 -00000000 -00000000 -00000000 -00000000 -ffffdfff -ffffffff -00000000 -00000000 -00000080 -00000000 -00000008 -00000000 -ffff7fff -ffffffff -fffffeff -ffffffff -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -fffff7ff -ffffffff -efffffff -ffffffff -00000000 -00000000 -00000000 -00000000 -00000012 -00000000 -55555556 -00000000 -00000000 -00000000 -ffffffdf -ffffffff -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -fff7ffff -ffffffff -fffff7ff -ffffffff -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000004 -00000000 -00000020 -00000000 -00000001 -00000000 -00000400 -00000000 -00001000 -00000000 -00000000 -00000000 -00010000 -00000000 -00020000 -00000000 -00040000 -00000000 -00200000 -00000000 -00000004 -00000000 -00800000 -00000000 -01000000 -00000000 -04000000 -00000000 -08000000 -00000000 -20000000 -00000000 -40000000 -00000000 -80000000 -ffffffff -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000005 -00000000 -0ffffff7 -00000000 -000ffff0 -00000000 -ffffff7f -ffffffff -00000005 -00000000 -007ff000 -00000000 -0007bfff -00000000 -001effff -00000000 -fffdffff -ffffffff -00300000 -00000000 -ff7fffff -ffffffff -feffffff -ffffffff -fdffffff -ffffffff -fbffffff -ffffffff -f7ffffff -ffffffff -bfffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -00000000 -00000000 -00003fff -00000000 -ffffffff -ffffffff -00000001 -00000000 -00008000 -00000000 -00000000 -00000000 -ffffffff -ffffffff -03ffffff -00000000 -00004000 -00000000 -000001ff -00000000 -00000000 -00000000 -00000000 -00000000 -ffffffff -ffffffff -00000000 -00000000 -00000003 -00000000 -00000003 -00000000 -00000003 -00000000 -00000003 -00000000 -00000003 -00000000 -00000003 -00000000 -00000003 -00000000 -00000003 -00000000 -00000001 -00000000 -00000003 -00000000 -00000003 -00000000 -00000003 -00000000 -00000003 -00000000 -00000003 -00000000 -00000003 -00000000 -00000003 -00000000 -00000003 -00000000 -00000003 -00000000 -00000003 -00000000 -00000003 -00000000 -00000003 -00000000 -00000003 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -55555555 -00000000 -00000000 -00000000 -22222222 -00000000 -55555555 -00000000 -55555555 -00000000 -55555555 -00000000 -55555555 -00000000 -00000001 -00000000 -00000001 -00000000 -55555555 -00000000 -00000001 -00000000 -22222223 -00000000 -55555555 -00000000 -55555555 -00000000 -55555555 -00000000 -55555555 -00000000 -55555555 -00000000 -00000001 -00000000 -22222221 -00000000 -55555555 -00000000 -55555555 -00000000 -00000000 -00000000 -00000000 -00000000 -00000002 -00000000 -00000000 -00000000 -00000000 -00000000 -11111111 -00000000 -44444444 -00000000 -aaaaaaaa -ffffffff -aaaaaaaa -ffffffff -aaaaaaaa -ffffffff -00000000 -00000000 -00000002 -00000000 -00000001 -00000000 -00000002 -00000000 -11111114 -00000000 -44444445 -00000000 -aaaaaaaa -ffffffff -aaaaaaaa -ffffffff -55555554 -00000000 -aaaaaaaa -ffffffff -00000002 -00000000 -1111110e -00000000 -44444443 -00000000 -aaaaaaaa -ffffffff -00000000 -00000000 -00000000 -00000000 -00000002 -00000000 -00000005 -00000000 -00000005 -00000000 -00000000 -00000000 -00000005 -00000000 -00000005 -00000000 -00000005 -00000000 -00000005 -00000000 -00000005 -00000000 -00000001 -00000000 -00000005 -00000000 -00000005 -00000000 -00000001 -00000000 -00000005 -00000000 -00000005 -00000000 -00000005 -00000000 -00000005 -00000000 -00000005 -00000000 -00000005 -00000000 -00000005 -00000000 -00000005 -00000000 -00000005 -00000000 -00000005 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -33333333 -00000000 -33333333 -00000000 -00000004 -00000000 -00000000 -00000000 -33333333 -00000000 -33333333 -00000000 -33333333 -00000000 -33333333 -00000000 -00000001 -00000000 -33333333 -00000000 -33333333 -00000000 -00000003 -00000000 -00000001 -00000000 -33333333 -00000000 -33333333 -00000000 -33333333 -00000000 -33333333 -00000000 -33333333 -00000000 -00000003 -00000000 -33333333 -00000000 -33333333 -00000000 -33333333 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -11111111 -00000000 -66666666 -00000000 -00000003 -00000000 -00000000 -00000000 -00000000 -00000000 -66666666 -00000000 -66666666 -00000000 -66666666 -00000000 -00000000 -00000000 -11111112 -00000000 -66666666 -00000000 -00000002 -00000000 -00000002 -00000000 -00000001 -00000000 -66666666 -00000000 -66666666 -00000000 -11111110 -00000000 -66666666 -00000000 -00000000 -00000000 -33333332 -00000000 -66666666 -00000000 -66666666 -00000000 -00000000 -00000000 -00000000 -00000000 -00000002 -00000000 -0a5a4889 -00000000 -0a5a4889 -00000000 -00000004 -00000000 -1b6b599a -00000000 -4e9e8ccd -00000000 -00000000 -00000000 -b504f333 -ffffffff -b504f333 -ffffffff -00000001 -00000000 -0a5a488b -00000000 -0a5a488a -00000000 -00000003 -00000000 -1b6b599d -00000000 -4e9e8cce -00000000 -00000001 -00000000 -b504f333 -ffffffff -0a5a4887 -00000000 -0a5a4888 -00000000 -00000005 -00000000 -1b6b5997 -00000000 -4e9e8ccc -00000000 -b504f333 -ffffffff -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000002 -00000000 -00000002 -00000000 -00000002 -00000000 -00000002 -00000000 -00000002 -00000000 -00000002 -00000000 -00000002 -00000000 -00000002 -00000000 -00000002 -00000000 -00000000 -00000000 -00000002 -00000000 -00000002 -00000000 -00000002 -00000000 -00000002 -00000000 -00000002 -00000000 -00000002 -00000000 -00000002 -00000000 -00000002 -00000000 -00000002 -00000000 -00000002 -00000000 -00000002 -00000000 -00000002 -00000000 -00000002 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -55555554 -00000000 -55555554 -00000000 -00000004 -00000000 -22222221 -00000000 -55555554 -00000000 -55555554 -00000000 -55555554 -00000000 -55555554 -00000000 -00000000 -00000000 -00000000 -00000000 -55555554 -00000000 -00000000 -00000000 -22222222 -00000000 -55555554 -00000000 -55555554 -00000000 -55555554 -00000000 -55555554 -00000000 -55555554 -00000000 -00000000 -00000000 -22222220 -00000000 -55555554 -00000000 -55555554 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -55555554 -00000000 -aaaaaaa9 -ffffffff -00000004 -00000000 -11111110 -00000000 -44444443 -00000000 -aaaaaaa9 -ffffffff -aaaaaaa9 -ffffffff -aaaaaaa9 -ffffffff -00000001 -00000000 -00000001 -00000000 -00000000 -00000000 -00000001 -00000000 -11111113 -00000000 -44444444 -00000000 -aaaaaaa9 -ffffffff -aaaaaaa9 -ffffffff -55555553 -00000000 -aaaaaaa9 -ffffffff -00000001 -00000000 -1111110d -00000000 -44444442 -00000000 -aaaaaaa9 -ffffffff -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000004 -00000000 -00000004 -00000000 -00000004 -00000000 -00000004 -00000000 -00000004 -00000000 -00000004 -00000000 -00000004 -00000000 -00000004 -00000000 -00000000 -00000000 -00000004 -00000000 -00000004 -00000000 -00000000 -00000000 -00000004 -00000000 -00000004 -00000000 -00000004 -00000000 -00000004 -00000000 -00000004 -00000000 -00000004 -00000000 -00000004 -00000000 -00000004 -00000000 -00000004 -00000000 -00000004 -00000000 -00000000 -00000000 -00000000 -00000000 -00000002 -00000000 -33333332 -00000000 -33333332 -00000000 -00000003 -00000000 -33333332 -00000000 -33333332 -00000000 -33333332 -00000000 -33333332 -00000000 -33333332 -00000000 -00000000 -00000000 -33333332 -00000000 -33333332 -00000000 -00000002 -00000000 -00000000 -00000000 -33333332 -00000000 -33333332 -00000000 -33333332 -00000000 -33333332 -00000000 -33333332 -00000000 -00000002 -00000000 -33333332 -00000000 -33333332 -00000000 -33333332 -00000000 -00000000 -00000000 -00000000 -00000000 -00000002 -00000000 -11111110 -00000000 -66666665 -00000000 -00000002 -00000000 -33333332 -00000000 -66666665 -00000000 -66666665 -00000000 -66666665 -00000000 -66666665 -00000000 -00000001 -00000000 -11111111 -00000000 -66666665 -00000000 -00000001 -00000000 -00000001 -00000000 -00000000 -00000000 -66666665 -00000000 -66666665 -00000000 -1111110f -00000000 -66666665 -00000000 -00000005 -00000000 -33333331 -00000000 -66666665 -00000000 -66666665 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -0a5a4888 -00000000 -0a5a4888 -00000000 -00000003 -00000000 -1b6b5999 -00000000 -4e9e8ccc -00000000 -b504f332 -ffffffff -b504f332 -ffffffff -b504f332 -ffffffff -00000000 -00000000 -0a5a488a -00000000 -0a5a4889 -00000000 -00000002 -00000000 -1b6b599c -00000000 -4e9e8ccd -00000000 -00000000 -00000000 -b504f332 -ffffffff -0a5a4886 -00000000 -0a5a4887 -00000000 -00000004 -00000000 -1b6b5996 -00000000 -4e9e8ccb -00000000 -b504f332 -ffffffff -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -55555555 -00000000 -00000000 -00000000 -00000000 -00000000 -33333333 -00000000 -4afb0ccc -00000000 -ffffffff -ffffffff -ffffffff -ffffffff -00000001 -00000000 -00000003 -00000000 -55555556 -00000000 -00000003 -00000000 -00000005 -00000000 -33333335 -00000000 -4afb0ccd -00000000 -00000000 -00000000 -55555553 -00000000 -55555554 -00000000 -00000003 -00000000 -3333332f -00000000 -33333331 -00000000 -4afb0ccb -00000000 -00000000 -00000000 -00000000 -00000000 -00000002 -00000000 -00000001 -00000000 -55555556 -00000000 -00000001 -00000000 -22222223 -00000000 -55555556 -00000000 -55555556 -00000000 -55555556 -00000000 -55555556 -00000000 -00000000 -00000000 -00000002 -00000000 -55555556 -00000000 -00000002 -00000000 -22222224 -00000000 -55555556 -00000000 -55555556 -00000000 -55555556 -00000000 -00000000 -00000000 -55555556 -00000000 -00000002 -00000000 -22222222 -00000000 -55555556 -00000000 -55555556 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000001 -00000000 -00000001 -00000000 -11111112 -00000000 -44444445 -00000000 -aaaaaaab -ffffffff -aaaaaaab -ffffffff -aaaaaaab -ffffffff -00000001 -00000000 -00000003 -00000000 -00000002 -00000000 -00000003 -00000000 -11111115 -00000000 -44444446 -00000000 -aaaaaaab -ffffffff -aaaaaaab -ffffffff -55555555 -00000000 -00000000 -00000000 -00000003 -00000000 -1111110f -00000000 -44444444 -00000000 -aaaaaaab -ffffffff -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000006 -00000000 -00000006 -00000000 -00000001 -00000000 -00000006 -00000000 -00000006 -00000000 -00000006 -00000000 -00000006 -00000000 -00000006 -00000000 -00000000 -00000000 -00000006 -00000000 -00000006 -00000000 -00000002 -00000000 -00000006 -00000000 -00000006 -00000000 -00000006 -00000000 -00000006 -00000000 -00000006 -00000000 -00000006 -00000000 -00000000 -00000000 -00000006 -00000000 -00000006 -00000000 -33333334 -00000000 -33333334 -00000000 -00000000 -00000000 -00000001 -00000000 -33333334 -00000000 -33333334 -00000000 -33333334 -00000000 -33333334 -00000000 -00000000 -00000000 -33333334 -00000000 -33333334 -00000000 -00000000 -00000000 -00000002 -00000000 -33333334 -00000000 -33333334 -00000000 -33333334 -00000000 -33333334 -00000000 -33333334 -00000000 -00000004 -00000000 -00000000 -00000000 -33333334 -00000000 -33333334 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -11111112 -00000000 -66666667 -00000000 -00000004 -00000000 -00000001 -00000000 -00000001 -00000000 -66666667 -00000000 -66666667 -00000000 -66666667 -00000000 -00000001 -00000000 -11111113 -00000000 -66666667 -00000000 -00000003 -00000000 -00000003 -00000000 -00000002 -00000000 -66666667 -00000000 -66666667 -00000000 -11111111 -00000000 -66666667 -00000000 -00000001 -00000000 -33333333 -00000000 -00000000 -00000000 -66666667 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -0a5a488a -00000000 -0a5a488a -00000000 -00000000 -00000000 -1b6b599b -00000000 -4e9e8cce -00000000 -00000001 -00000000 -b504f334 -ffffffff -b504f334 -ffffffff -00000000 -00000000 -0a5a488c -00000000 -0a5a488b -00000000 -00000000 -00000000 -1b6b599e -00000000 -4e9e8ccf -00000000 -00000002 -00000000 -b504f334 -ffffffff -0a5a4888 -00000000 -0a5a4889 -00000000 -00000000 -00000000 -1b6b5998 -00000000 -4e9e8ccd -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000001 -00000000 -00000001 -00000000 -00000001 -00000000 -00000001 -00000000 -00000001 -00000000 -00000001 -00000000 -00000001 -00000000 -00000001 -00000000 -00000001 -00000000 -00000001 -00000000 -00000001 -00000000 -00000001 -00000000 -00000001 -00000000 -00000001 -00000000 -00000001 -00000000 -00000001 -00000000 -00000001 -00000000 -00000001 -00000000 -00000001 -00000000 -00000001 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000001 -00000000 -00000001 -00000000 -00000001 -00000000 -00000001 -00000000 -00000001 -00000000 -00000001 -00000000 -00000001 -00000000 -00000001 -00000000 -00000001 -00000000 -00000001 -00000000 -00000001 -00000000 -00000001 -00000000 -00000001 -00000000 -00000001 -00000000 -00000001 -00000000 -00000001 -00000000 -00000001 -00000000 -00000001 -00000000 -00000001 -00000000 -00000001 -00000000 -00000001 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000006 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -00000055 -00000000 -00000000 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/M/references/remw-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/M/references/remw-01.reference_output deleted file mode 100644 index a7eadfb99..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/M/references/remw-01.reference_output +++ /dev/null @@ -1,1352 +0,0 @@ -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000002 -00000000 -00000000 -00000000 -ffffefff -ffffffff -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -ffffffff -ffffffff -00000000 -00000000 -ffffffff -ffffffff -00000000 -00000000 -00000000 -00000000 -fffffff7 -ffffffff -00000000 -00000000 -00000003 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -fffffeff -ffffffff -00000004 -00000000 -ffffffff -ffffffff -ffffff7f -ffffffff -dfffffff -ffffffff -00000005 -00000000 -00000002 -00000000 -ffffffff -ffffffff -ffffffff -ffffffff -00000000 -00000000 -00155555 -00000000 -fffffff7 -ffffffff -fffdffff -ffffffff -fff7ffff -ffffffff -fffffbff -ffffffff -00000000 -00000000 -00001000 -00000000 -00000000 -00000000 -0afb0cce -00000000 -00000000 -00000000 -ffffffff -ffffffff -00000000 -00000000 -fffbffff -ffffffff -ffffffff -ffffffff -00000000 -00000000 -ffffffff -ffffffff -00000000 -00000000 -ffffffff -ffffffff -00000000 -00000000 -aaaaaaaa -ffffffff -00000006 -00000000 -00000100 -00000000 -ffffffff -ffffffff -ffffffff -ffffffff -00000400 -00000000 -ffffffff -ffffffff -aaaaaaaa -ffffffff -4afb0ccd -00000000 -00000009 -00000000 -00000000 -00000000 -fffffffa -ffffffff -00000003 -00000000 -ffffffff -ffffffff -ffffffff -ffffffff -00000003 -00000000 -ffffffff -ffffffff -b504f334 -ffffffff -ffffefff -ffffffff -fffff7ff -ffffffff -ffffffff -ffffffff -00000000 -00000000 -00000002 -00000000 -ffffffff -ffffffff -fffffff7 -ffffffff -00000000 -00000000 -00000005 -00000000 -00000007 -00000000 -ffffffff -ffffffff -000001fd -00000000 -00000000 -00000000 -fffffffb -ffffffff -fffffffc -ffffffff -00000000 -00000000 -00000006 -00000000 -00000000 -00000000 -ffff01fe -ffffffff -fffe000e -ffffffff -0003f001 -00000000 -fff80fff -ffffffff -fffffff9 -ffffffff -00000000 -00000000 -00000080 -00000000 -ffffffff -ffffffff -00000000 -00000000 -fe00001e -ffffffff -02fb0cbc -00000000 -02000000 -00000000 -faaaaaaf -ffffffff -ffffffff -ffffffff -00000001 -00000000 -ffffffff -ffffffff -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -ffffffff -ffffffff -00000004 -00000000 -00000010 -00000000 -00000002 -00000000 -00001fff -00000000 -00008000 -00000000 -00010000 -00000000 -00020000 -00000000 -00100000 -00000000 -00200000 -00000000 -00400000 -00000000 -00800000 -00000000 -00000004 -00000000 -04000000 -00000000 -08000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -fffffffe -ffffffff -fffffffb -ffffffff -00000000 -00000000 -ffffffdf -ffffffff -ffffffbf -ffffffff -fffffdff -ffffffff -ffffffff -ffffffff -fffffffc -ffffffff -fffeffff -ffffffff -ffefffff -ffffffff -ffbfffff -ffffffff -ffffffff -ffffffff -ff000002 -ffffffff -00000001 -00000000 -00000000 -00000000 -00000000 -00000000 -ffffffff -ffffffff -ffffffff -ffffffff -00000000 -00000000 -ffffffff -ffffffff -ffffffff -ffffffff -00000000 -00000000 -00000000 -00000000 -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -00000000 -00000000 -ffffffff -ffffffff -ffffffff -ffffffff -00000000 -00000000 -00000000 -00000000 -00000003 -00000000 -00000003 -00000000 -00000003 -00000000 -00000003 -00000000 -00000003 -00000000 -00000003 -00000000 -00000003 -00000000 -00000001 -00000000 -00000003 -00000000 -00000003 -00000000 -00000003 -00000000 -00000003 -00000000 -00000003 -00000000 -00000003 -00000000 -00000003 -00000000 -00000003 -00000000 -00000003 -00000000 -00000003 -00000000 -00000003 -00000000 -00000003 -00000000 -00000003 -00000000 -00000001 -00000000 -00000000 -00000000 -55555555 -00000000 -00000000 -00000000 -22222222 -00000000 -55555555 -00000000 -0a5a4888 -00000000 -0a5a4888 -00000000 -00000001 -00000000 -00000001 -00000000 -55555555 -00000000 -00000001 -00000000 -22222223 -00000000 -55555555 -00000000 -0a5a4887 -00000000 -55555555 -00000000 -00000000 -00000000 -00000001 -00000000 -22222221 -00000000 -55555555 -00000000 -0a5a4887 -00000000 -0a5a4889 -00000000 -fffffffe -ffffffff -ffffffff -ffffffff -00000000 -00000000 -ffffffff -ffffffff -dddddddd -ffffffff -aaaaaaaa -ffffffff -f5a5b777 -ffffffff -f5a5b777 -ffffffff -00000000 -00000000 -fffffffe -ffffffff -aaaaaaaa -ffffffff -fffffffe -ffffffff -dddddddc -ffffffff -aaaaaaaa -ffffffff -f5a5b778 -ffffffff -00000000 -00000000 -ffffffff -ffffffff -fffffffe -ffffffff -ddddddde -ffffffff -aaaaaaaa -ffffffff -f5a5b778 -ffffffff -f5a5b776 -ffffffff -00000002 -00000000 -00000005 -00000000 -00000005 -00000000 -00000000 -00000000 -00000005 -00000000 -00000005 -00000000 -00000005 -00000000 -00000005 -00000000 -00000001 -00000000 -00000005 -00000000 -00000005 -00000000 -00000001 -00000000 -00000005 -00000000 -00000005 -00000000 -00000005 -00000000 -00000005 -00000000 -00000005 -00000000 -00000005 -00000000 -00000005 -00000000 -00000005 -00000000 -00000005 -00000000 -00000005 -00000000 -00000000 -00000000 -33333333 -00000000 -33333333 -00000000 -00000004 -00000000 -00000000 -00000000 -33333333 -00000000 -33333333 -00000000 -33333333 -00000000 -00000001 -00000000 -33333333 -00000000 -33333333 -00000000 -00000003 -00000000 -00000001 -00000000 -33333333 -00000000 -33333333 -00000000 -33333333 -00000000 -33333333 -00000000 -00000003 -00000000 -33333333 -00000000 -33333333 -00000000 -33333333 -00000000 -33333333 -00000000 -00000000 -00000000 -11111111 -00000000 -11111110 -00000000 -00000003 -00000000 -00000000 -00000000 -00000000 -00000000 -1b6b5999 -00000000 -1b6b5999 -00000000 -00000000 -00000000 -11111112 -00000000 -66666666 -00000000 -00000002 -00000000 -00000002 -00000000 -00000001 -00000000 -1b6b5998 -00000000 -11111110 -00000000 -11111111 -00000000 -00000000 -00000000 -33333332 -00000000 -66666666 -00000000 -1b6b5998 -00000000 -1b6b599a -00000000 -00000002 -00000000 -4afb0ccd -00000000 -4afb0ccd -00000000 -00000002 -00000000 -17c7d99a -00000000 -4afb0ccd -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -4afb0ccd -00000000 -4afb0ccd -00000000 -00000001 -00000000 -17c7d99b -00000000 -4afb0ccd -00000000 -4afb0ccd -00000000 -4afb0ccd -00000000 -4afb0ccd -00000000 -00000005 -00000000 -17c7d999 -00000000 -4afb0ccd -00000000 -4afb0ccd -00000000 -00000001 -00000000 -fffffffe -ffffffff -b504f333 -ffffffff -b504f333 -ffffffff -fffffffe -ffffffff -e8382666 -ffffffff -b504f333 -ffffffff -00000000 -00000000 -00000000 -00000000 -ffffffff -ffffffff -b504f333 -ffffffff -b504f333 -ffffffff -ffffffff -ffffffff -e8382665 -ffffffff -b504f333 -ffffffff -b504f333 -ffffffff -b504f333 -ffffffff -b504f333 -ffffffff -fffffffb -ffffffff -e8382667 -ffffffff -b504f333 -ffffffff -b504f333 -ffffffff -ffffffff -ffffffff -00000002 -00000000 -00000002 -00000000 -00000002 -00000000 -00000002 -00000000 -00000002 -00000000 -00000002 -00000000 -00000002 -00000000 -00000002 -00000000 -00000000 -00000000 -00000002 -00000000 -00000002 -00000000 -00000002 -00000000 -00000002 -00000000 -00000002 -00000000 -00000002 -00000000 -00000002 -00000000 -00000002 -00000000 -00000002 -00000000 -00000002 -00000000 -00000002 -00000000 -00000002 -00000000 -00000002 -00000000 -00000000 -00000000 -55555554 -00000000 -55555554 -00000000 -00000004 -00000000 -22222221 -00000000 -55555554 -00000000 -0a5a4887 -00000000 -0a5a4887 -00000000 -00000000 -00000000 -00000000 -00000000 -55555554 -00000000 -00000000 -00000000 -22222222 -00000000 -55555554 -00000000 -0a5a4886 -00000000 -55555554 -00000000 -55555554 -00000000 -00000000 -00000000 -22222220 -00000000 -55555554 -00000000 -0a5a4886 -00000000 -0a5a4888 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000001 -00000000 -00000004 -00000000 -00000004 -00000000 -00000004 -00000000 -00000004 -00000000 -00000004 -00000000 -00000004 -00000000 -00000000 -00000000 -00000004 -00000000 -00000004 -00000000 -00000000 -00000000 -00000004 -00000000 -00000004 -00000000 -00000004 -00000000 -00000004 -00000000 -00000004 -00000000 -00000004 -00000000 -00000004 -00000000 -00000004 -00000000 -00000004 -00000000 -00000004 -00000000 -00000002 -00000000 -33333332 -00000000 -33333332 -00000000 -00000003 -00000000 -33333332 -00000000 -33333332 -00000000 -33333332 -00000000 -33333332 -00000000 -00000000 -00000000 -33333332 -00000000 -33333332 -00000000 -00000002 -00000000 -00000000 -00000000 -33333332 -00000000 -33333332 -00000000 -33333332 -00000000 -33333332 -00000000 -00000002 -00000000 -33333332 -00000000 -33333332 -00000000 -33333332 -00000000 -33333332 -00000000 -00000002 -00000000 -11111110 -00000000 -1111110f -00000000 -00000002 -00000000 -33333332 -00000000 -66666665 -00000000 -1b6b5998 -00000000 -1b6b5998 -00000000 -00000001 -00000000 -11111111 -00000000 -66666665 -00000000 -00000001 -00000000 -00000001 -00000000 -00000000 -00000000 -1b6b5997 -00000000 -1111110f -00000000 -11111110 -00000000 -00000005 -00000000 -33333331 -00000000 -66666665 -00000000 -1b6b5997 -00000000 -1b6b5999 -00000000 -00000000 -00000000 -b504f332 -ffffffff -b504f332 -ffffffff -fffffffd -ffffffff -e8382665 -ffffffff -b504f332 -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -00000000 -00000000 -b504f332 -ffffffff -b504f332 -ffffffff -fffffffe -ffffffff -e8382664 -ffffffff -b504f332 -ffffffff -00000000 -00000000 -b504f332 -ffffffff -b504f332 -ffffffff -00000000 -00000000 -e8382666 -ffffffff -b504f332 -ffffffff -00000000 -00000000 -fffffffe -ffffffff -00000002 -00000000 -00000001 -00000000 -00000000 -00000000 -00000001 -00000000 -22222223 -00000000 -55555556 -00000000 -0a5a4889 -00000000 -0a5a4889 -00000000 -00000000 -00000000 -00000002 -00000000 -55555556 -00000000 -00000002 -00000000 -22222224 -00000000 -55555556 -00000000 -0a5a4888 -00000000 -00000000 -00000000 -00000001 -00000000 -00000002 -00000000 -22222222 -00000000 -55555556 -00000000 -0a5a4888 -00000000 -0a5a488a -00000000 -ffffffff -ffffffff -00000000 -00000000 -aaaaaaab -ffffffff -00000000 -00000000 -ddddddde -ffffffff -aaaaaaab -ffffffff -f5a5b778 -ffffffff -f5a5b778 -ffffffff -ffffffff -ffffffff -ffffffff -ffffffff -aaaaaaab -ffffffff -ffffffff -ffffffff -dddddddd -ffffffff -aaaaaaab -ffffffff -f5a5b779 -ffffffff -aaaaaaab -ffffffff -00000000 -00000000 -ffffffff -ffffffff -00000000 -00000000 -00000000 -00000000 -dddddddf -ffffffff -aaaaaaab -ffffffff -f5a5b779 -ffffffff -f5a5b777 -ffffffff -00000000 -00000000 -00000006 -00000000 -00000006 -00000000 -00000001 -00000000 -00000006 -00000000 -00000006 -00000000 -00000006 -00000000 -00000006 -00000000 -00000000 -00000000 -00000006 -00000000 -00000006 -00000000 -00000002 -00000000 -00000006 -00000000 -00000006 -00000000 -00000006 -00000000 -00000006 -00000000 -00000006 -00000000 -00000000 -00000000 -00000006 -00000000 -00000006 -00000000 -00000006 -00000000 -00000006 -00000000 -00000001 -00000000 -33333334 -00000000 -33333334 -00000000 -00000000 -00000000 -00000001 -00000000 -33333334 -00000000 -33333334 -00000000 -33333334 -00000000 -00000000 -00000000 -33333334 -00000000 -33333334 -00000000 -00000000 -00000000 -00000002 -00000000 -33333334 -00000000 -33333334 -00000000 -33333334 -00000000 -33333334 -00000000 -00000004 -00000000 -00000000 -00000000 -33333334 -00000000 -33333334 -00000000 -33333334 -00000000 -00000001 -00000000 -11111112 -00000000 -11111111 -00000000 -00000004 -00000000 -00000001 -00000000 -00000001 -00000000 -1b6b599a -00000000 -1b6b599a -00000000 -00000001 -00000000 -11111113 -00000000 -66666667 -00000000 -00000003 -00000000 -00000003 -00000000 -00000002 -00000000 -1b6b5999 -00000000 -11111111 -00000000 -11111112 -00000000 -00000001 -00000000 -33333333 -00000000 -00000000 -00000000 -1b6b5999 -00000000 -1b6b599b -00000000 -00000000 -00000000 -4afb0cce -00000000 -4afb0cce -00000000 -00000003 -00000000 -17c7d99b -00000000 -4afb0cce -00000000 -00000001 -00000000 -00000001 -00000000 -00000000 -00000000 -4afb0cce -00000000 -4afb0cce -00000000 -17c7d99c -00000000 -4afb0cce -00000000 -00000000 -00000000 -4afb0cce -00000000 -4afb0cce -00000000 -00000000 -00000000 -17c7d99a -00000000 -4afb0cce -00000000 -00000000 -00000000 -00000002 -00000000 -ffffffff -ffffffff -b504f334 -ffffffff -b504f334 -ffffffff -ffffffff -ffffffff -e8382667 -ffffffff -b504f334 -ffffffff -b504f334 -ffffffff -b504f334 -ffffffff -00000000 -00000000 -b504f334 -ffffffff -b504f334 -ffffffff -00000000 -00000000 -e8382666 -ffffffff -b504f334 -ffffffff -b504f334 -ffffffff -b504f334 -ffffffff -b504f334 -ffffffff -fffffffc -ffffffff -e8382668 -ffffffff -b504f334 -ffffffff -b504f334 -ffffffff -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000008 -00000000 -ffffffff -ffffffff -00000001 -00000000 -ffffffff -ffffffff diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/Zifencei/references/Fencei.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/Zifencei/references/Fencei.reference_output deleted file mode 100644 index 1a31ff373..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/Zifencei/references/Fencei.reference_output +++ /dev/null @@ -1,4 +0,0 @@ -00000030 -00000012 -00000042 -001101b3 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/ebreak.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/ebreak.reference_output deleted file mode 100644 index 91fef5137..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/ebreak.reference_output +++ /dev/null @@ -1,8 +0,0 @@ -00000000 -11111111 -0000010f -00000000 -00000003 -00000000 -000003a0 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/ecall.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/ecall.reference_output deleted file mode 100644 index 12e14f72b..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/ecall.reference_output +++ /dev/null @@ -1,8 +0,0 @@ -00000000 -11111111 -0000010f -00000000 -0000000b -00000000 -000003a0 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign-beq-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign-beq-01.reference_output deleted file mode 100644 index 091dcebed..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign-beq-01.reference_output +++ /dev/null @@ -1,132 +0,0 @@ -00000001 -00000000 -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -00000000 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign-bge-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign-bge-01.reference_output deleted file mode 100644 index 25fb03a8c..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign-bge-01.reference_output +++ /dev/null @@ -1,132 +0,0 @@ -00000003 -00000000 -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -00000000 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign-bgeu-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign-bgeu-01.reference_output deleted file mode 100644 index 25fb03a8c..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign-bgeu-01.reference_output +++ /dev/null @@ -1,132 +0,0 @@ -00000003 -00000000 -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -00000000 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign-blt-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign-blt-01.reference_output deleted file mode 100644 index 091dcebed..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign-blt-01.reference_output +++ /dev/null @@ -1,132 +0,0 @@ -00000001 -00000000 -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -00000000 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign-bltu-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign-bltu-01.reference_output deleted file mode 100644 index 25fb03a8c..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign-bltu-01.reference_output +++ /dev/null @@ -1,132 +0,0 @@ -00000003 -00000000 -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -00000000 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign-bne-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign-bne-01.reference_output deleted file mode 100644 index 091dcebed..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign-bne-01.reference_output +++ /dev/null @@ -1,132 +0,0 @@ -00000001 -00000000 -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -00000000 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign-jal-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign-jal-01.reference_output deleted file mode 100644 index c48a73dfe..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign-jal-01.reference_output +++ /dev/null @@ -1,132 +0,0 @@ -00000029 -00000000 -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -00000000 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign-ld-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign-ld-01.reference_output deleted file mode 100644 index c0ec8248b..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign-ld-01.reference_output +++ /dev/null @@ -1,144 +0,0 @@ -ab7fbb6f -ab7fbb6f -ab7fbb6f -ab7fbb6f -ab7fbb6f -ab7fbb6f -ab7fbb6f -ab7fbb6f -ab7fbb6f -ab7fbb6f -ab7fbb6f -ab7fbb6f -ab7fbb6f -ab7fbb6f -0000010f -00000000 -00000004 -00000000 -000003a0 -00000000 -ffffffb9 -ffffffff -0000010f -00000000 -00000004 -00000000 -000003b8 -00000000 -ffffffba -ffffffff -0000010f -00000000 -00000004 -00000000 -000003d0 -00000000 -ffffffbb -ffffffff -0000010f -00000000 -00000004 -00000000 -000003e8 -00000000 -ffffffbc -ffffffff -0000010f -00000000 -00000004 -00000000 -00000400 -00000000 -ffffffbd -ffffffff -0000010f -00000000 -00000004 -00000000 -00000418 -00000000 -ffffffbe -ffffffff -0000010f -00000000 -00000004 -00000000 -00000430 -00000000 -ffffffbf -ffffffff -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -00000000 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign-lh-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign-lh-01.reference_output deleted file mode 100644 index 156ac16e0..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign-lh-01.reference_output +++ /dev/null @@ -1,132 +0,0 @@ -ab7fbb6f -ab7fbb6f -0000010f -00000000 -00000004 -00000000 -000003a0 -00000000 -ffffffe9 -ffffffff -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -00000000 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign-lhu-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign-lhu-01.reference_output deleted file mode 100644 index 156ac16e0..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign-lhu-01.reference_output +++ /dev/null @@ -1,132 +0,0 @@ -ab7fbb6f -ab7fbb6f -0000010f -00000000 -00000004 -00000000 -000003a0 -00000000 -ffffffe9 -ffffffff -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -00000000 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign-lw-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign-lw-01.reference_output deleted file mode 100644 index bd374bf5f..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign-lw-01.reference_output +++ /dev/null @@ -1,136 +0,0 @@ -ab7fbb6f -ab7fbb6f -ab7fbb6f -ab7fbb6f -ab7fbb6f -ab7fbb6f -0000010f -00000000 -00000004 -00000000 -000003a0 -00000000 -ffffffd9 -ffffffff -0000010f -00000000 -00000004 -00000000 -000003b8 -00000000 -ffffffda -ffffffff -0000010f -00000000 -00000004 -00000000 -000003d0 -00000000 -ffffffdb -ffffffff -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -00000000 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign-lwu-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign-lwu-01.reference_output deleted file mode 100644 index bd374bf5f..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign-lwu-01.reference_output +++ /dev/null @@ -1,136 +0,0 @@ -ab7fbb6f -ab7fbb6f -ab7fbb6f -ab7fbb6f -ab7fbb6f -ab7fbb6f -0000010f -00000000 -00000004 -00000000 -000003a0 -00000000 -ffffffd9 -ffffffff -0000010f -00000000 -00000004 -00000000 -000003b8 -00000000 -ffffffda -ffffffff -0000010f -00000000 -00000004 -00000000 -000003d0 -00000000 -ffffffdb -ffffffff -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -00000000 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign-sd-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign-sd-01.reference_output deleted file mode 100644 index 9c8548129..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign-sd-01.reference_output +++ /dev/null @@ -1,144 +0,0 @@ -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -0000010f -00000000 -00000006 -00000000 -000003b0 -00000000 -ffffffc9 -ffffffff -0000010f -00000000 -00000006 -00000000 -000003d0 -00000000 -ffffffd2 -ffffffff -0000010f -00000000 -00000006 -00000000 -000003f0 -00000000 -ffffffdb -ffffffff -0000010f -00000000 -00000006 -00000000 -00000428 -00000000 -ffffffe4 -ffffffff -0000010f -00000000 -00000006 -00000000 -00000444 -00000000 -ffffffed -ffffffff -0000010f -00000000 -00000006 -00000000 -00000460 -00000000 -fffffff6 -ffffffff -0000010f -00000000 -00000006 -00000000 -0000047c -00000000 -ffffffff -ffffffff -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -00000000 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign-sh-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign-sh-01.reference_output deleted file mode 100644 index bc44c9d33..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign-sh-01.reference_output +++ /dev/null @@ -1,132 +0,0 @@ -deadbeef -deadbeef -0000010f -00000000 -00000006 -00000000 -000003a8 -00000000 -fffffff9 -ffffffff -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -00000000 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign-sw-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign-sw-01.reference_output deleted file mode 100644 index 6e075a3e0..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign-sw-01.reference_output +++ /dev/null @@ -1,136 +0,0 @@ -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -0000010f -00000000 -00000006 -00000000 -000003ac -00000000 -ffffffe9 -ffffffff -0000010f -00000000 -00000006 -00000000 -000003cc -00000000 -fffffff2 -ffffffff -0000010f -00000000 -00000006 -00000000 -000003e8 -00000000 -fffffffb -ffffffff -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -00000000 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign1-jalr-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign1-jalr-01.reference_output deleted file mode 100644 index e30551993..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign1-jalr-01.reference_output +++ /dev/null @@ -1,132 +0,0 @@ -00000017 -00000000 -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -00000000 -00000000 diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign2-jalr-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign2-jalr-01.reference_output deleted file mode 100644 index e30551993..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/misalign2-jalr-01.reference_output +++ /dev/null @@ -1,132 +0,0 @@ -00000017 -00000000 -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -00000000 -00000000 diff --git a/wally-pipelined/testbench/tests.vh b/wally-pipelined/testbench/tests.vh index a82e22830..d109b6dc2 100644 --- a/wally-pipelined/testbench/tests.vh +++ b/wally-pipelined/testbench/tests.vh @@ -668,6 +668,159 @@ string imperas32f[] = '{ "rv32i_m/M/remu-01", "5010" }; + string arch32m[] = '{ + `RISCVARCHTEST, + "rv32i_m/M/div-01", "5010", + "fadd_b1-01", "", + "fadd_b10-01", "", + "fadd_b11-01", "", + "fadd_b12-01", "", + "fadd_b13-01", "", + "fadd_b2-01", "", + "fadd_b3-01", "", + "fadd_b4-01", "", + "fadd_b5-01", "", + "fadd_b7-01", "", + "fadd_b8-01", "", + "fclass_b1-01", "", + "fcvt.s.w_b25-01", "", + "fcvt.s.w_b26-01", "", + "fcvt.s.wu_b25-01", "", + "fcvt.s.wu_b26-01", "", + "fcvt.w.s_b1-01", "", + "fcvt.w.s_b22-01", "", + "fcvt.w.s_b23-01", "", + "fcvt.w.s_b24-01", "", + "fcvt.w.s_b27-01", "", + "fcvt.w.s_b28-01", "", + "fcvt.w.s_b29-01", "", + "fcvt.wu.s_b1-01", "", + "fcvt.wu.s_b22-01", "", + "fcvt.wu.s_b23-01", "", + "fcvt.wu.s_b24-01", "", + "fcvt.wu.s_b27-01", "", + "fcvt.wu.s_b28-01", "", + "fcvt.wu.s_b29-01", "", + "fdiv_b1-01", "", + "fdiv_b2-01", "", + "fdiv_b20-01", "", + "fdiv_b21-01", "", + "fdiv_b3-01", "", + "fdiv_b4-01", "", + "fdiv_b5-01", "", + "fdiv_b6-01", "", + "fdiv_b7-01", "", + "fdiv_b8-01", "", + "fdiv_b9-01", "", + "feq_b1-01", "", + "feq_b19-01", "", + "fle_b1-01", "", + "fle_b19-01", "", + "flt_b1-01", "", + "flt_b19-01", "", + "flw-align-01", "", + "fmadd_b1-01", "", + "fmadd_b14-01", "", + "fmadd_b15-01", "", + "fmadd_b16-01", "", + "fmadd_b17-01", "", + "fmadd_b18-01", "", + "fmadd_b2-01", "", + "fmadd_b3-01", "", + "fmadd_b4-01", "", + "fmadd_b5-01", "", + "fmadd_b6-01", "", + "fmadd_b7-01", "", + "fmadd_b8-01", "", + "fmax_b1-01", "", + "fmax_b19-01", "", + "fmin_b1-01", "", + "fmin_b19-01", "", + "fmsub_b1-01", "", + "fmsub_b14-01", "", + "fmsub_b15-01", "", + "fmsub_b16-01", "", + "fmsub_b17-01", "", + "fmsub_b18-01", "", + "fmsub_b2-01", "", + "fmsub_b3-01", "", + "fmsub_b4-01", "", + "fmsub_b5-01", "", + "fmsub_b6-01", "", + "fmsub_b7-01", "", + "fmsub_b8-01", "", + "fmul_b1-01", "", + "fmul_b2-01", "", + "fmul_b3-01", "", + "fmul_b4-01", "", + "fmul_b5-01", "", + "fmul_b6-01", "", + "fmul_b7-01", "", + "fmul_b8-01", "", + "fmul_b9-01", "", + "fmv.w.x_b25-01", "", + "fmv.w.x_b26-01", "", + "fmv.x.w_b1-01", "", + "fmv.x.w_b22-01", "", + "fmv.x.w_b23-01", "", + "fmv.x.w_b24-01", "", + "fmv.x.w_b27-01", "", + "fmv.x.w_b28-01", "", + "fmv.x.w_b29-01", "", + "fnmadd_b1-01", "", + "fnmadd_b14-01", "", + "fnmadd_b15-01", "", + "fnmadd_b16-01", "", + "fnmadd_b17-01", "", + "fnmadd_b18-01", "", + "fnmadd_b2-01", "", + "fnmadd_b3-01", "", + "fnmadd_b4-01", "", + "fnmadd_b5-01", "", + "fnmadd_b6-01", "", + "fnmadd_b7-01", "", + "fnmadd_b8-01", "", + "fnmsub_b1-01", "", + "fnmsub_b14-01", "", + "fnmsub_b15-01", "", + "fnmsub_b16-01", "", + "fnmsub_b17-01", "", + "fnmsub_b18-01", "", + "fnmsub_b2-01", "", + "fnmsub_b3-01", "", + "fnmsub_b4-01", "", + "fnmsub_b5-01", "", + "fnmsub_b6-01", "", + "fnmsub_b7-01", "", + "fnmsub_b8-01", "", + "fsgnj_b1-01", "", + "fsgnjn_b1-01", "", + "fsgnjx_b1-01", "", + "fsqrt_b1-01", "", + "fsqrt_b2-01", "", + "fsqrt_b20-01", "", + "fsqrt_b3-01", "", + "fsqrt_b4-01", "", + "fsqrt_b5-01", "", + "fsqrt_b7-01", "", + "fsqrt_b8-01", "", + "fsqrt_b9-01", "", + "fsub_b1-01", "", + "fsub_b10-01", "", + "fsub_b11-01", "", + "fsub_b12-01", "", + "fsub_b13-01", "", + "fsub_b2-01", "", + "fsub_b3-01", "", + "fsub_b4-01", "", + "fsub_b5-01", "", + "fsub_b7-01", "", + "fsub_b8-01", "", + "fsw-align-01, "" +}; + + + string arch32c[] = '{ `RISCVARCHTEST, "rv32i_m/C/cadd-01", "4010", From 7d516c65e7090e95ae972a74408436d29c3c63a7 Mon Sep 17 00:00:00 2001 From: David Harris Date: Tue, 26 Oct 2021 08:56:49 -0700 Subject: [PATCH 055/132] commented out nonworking tests --- wally-pipelined/testbench/tests.vh | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/wally-pipelined/testbench/tests.vh b/wally-pipelined/testbench/tests.vh index d109b6dc2..5a8878f36 100644 --- a/wally-pipelined/testbench/tests.vh +++ b/wally-pipelined/testbench/tests.vh @@ -668,11 +668,12 @@ string imperas32f[] = '{ "rv32i_m/M/remu-01", "5010" }; - string arch32m[] = '{ +/* + string arch32f[] = '{ `RISCVARCHTEST, "rv32i_m/M/div-01", "5010", - "fadd_b1-01", "", - "fadd_b10-01", "", + "fadd_b1-01", "", + "fadd_b10-01", "", "fadd_b11-01", "", "fadd_b12-01", "", "fadd_b13-01", "", @@ -818,8 +819,7 @@ string imperas32f[] = '{ "fsub_b8-01", "", "fsw-align-01, "" }; - - +*/ string arch32c[] = '{ `RISCVARCHTEST, From f793dd7a5ecf360ef3ef71f37d9e9a073bbd62ed Mon Sep 17 00:00:00 2001 From: David Harris Date: Tue, 26 Oct 2021 09:02:22 -0700 Subject: [PATCH 056/132] removed unused signal from wave.do --- wally-pipelined/regression/wave-dos/peripheral-waves.do | 1 - 1 file changed, 1 deletion(-) diff --git a/wally-pipelined/regression/wave-dos/peripheral-waves.do b/wally-pipelined/regression/wave-dos/peripheral-waves.do index 594d572ad..6eec4995d 100644 --- a/wally-pipelined/regression/wave-dos/peripheral-waves.do +++ b/wally-pipelined/regression/wave-dos/peripheral-waves.do @@ -50,7 +50,6 @@ add wave -hex /testbench/dut/hart/WriteDataM add wave -hex /testbench/dut/hart/lsu/dcache/MemPAdrM add wave -hex /testbench/dut/hart/lsu/dcache/WriteDataM add wave -hex /testbench/dut/hart/lsu/dcache/ReadDataM -add wave -hex /testbench/dut/hart/ebu/ReadDataM add wave -divider add wave -hex /testbench/PCW #add wave -hex /testbench/InstrW From 1409dc48a8b9ffda6e85a20b0bbeaad1b3bad9a8 Mon Sep 17 00:00:00 2001 From: bbracker Date: Tue, 26 Oct 2021 12:43:42 -0700 Subject: [PATCH 057/132] bugfix argument passing to GDB script; remove outdated GDB script --- .../testvector-generation/checkpoint.gdb | 64 ------------------- .../testvector-generation/genCheckpoint.gdb | 6 +- .../testvector-generation/genCheckpoint.sh | 4 +- 3 files changed, 5 insertions(+), 69 deletions(-) delete mode 100644 wally-pipelined/linux-testgen/testvector-generation/checkpoint.gdb diff --git a/wally-pipelined/linux-testgen/testvector-generation/checkpoint.gdb b/wally-pipelined/linux-testgen/testvector-generation/checkpoint.gdb deleted file mode 100644 index 1d79bc8ab..000000000 --- a/wally-pipelined/linux-testgen/testvector-generation/checkpoint.gdb +++ /dev/null @@ -1,64 +0,0 @@ -define genCheckpoint - # GDB config - set pagination off - set logging overwrite on - set logging redirect on - set confirm off - - # QEMU must also use TCP port 1240 - target extended-remote :1240 - - # QEMU Config - maintenance packet Qqemu.PhyMemMode:1 - - # Symbol file - file ../buildroot-image-output/vmlinux - - # Argument Parsing - set $tcpPort=$arg0 - set $instrCount=$arg1 - set $statePath=$arg2 - set $ramPath=$arg3 - set $checkPC=$arg4 - set $checkPCoccurences=$arg5 - eval "set $statePath = \"%s/stateGDB.txt\"", $statePath - eval "set $ramPath = \"%s/ramGDB.txt\"", $ramPath - - - # Step over reset vector into actual code - stepi 100 - # Set breakpoint for where to stop - b do_idle - # Proceed to checkpoint - printf "GDB proceeding to checkpoint at %d instrs\n", $instrCount - #stepi $instrCount-1000 - b *$checkPC - ignore 2 $checkPCoccurences - c - - printf "Reached checkpoint at %d instrs\n", $instrCount - - # Log all registers to a file - printf "GDB storing state to %s\n", $statePath - eval "set logging file %s", $statePath - set logging on - info all-registers - set logging off - - # Log main memory to a file - printf "GDB storing RAM to %s\n", $ramPath - eval "set logging file %s", $ramPath - set logging on - x/134217728xb 0x80000000 - set logging off - - # Continue to checkpoint; stop on the 3rd time - # Should reach login prompt by then - printf "GDB continuing execution to login prompt\n" - ignore 1 2 - c - - printf "GDB reached login prompt!\n" - kill - q -end diff --git a/wally-pipelined/linux-testgen/testvector-generation/genCheckpoint.gdb b/wally-pipelined/linux-testgen/testvector-generation/genCheckpoint.gdb index 65ce15598..926306982 100755 --- a/wally-pipelined/linux-testgen/testvector-generation/genCheckpoint.gdb +++ b/wally-pipelined/linux-testgen/testvector-generation/genCheckpoint.gdb @@ -1,4 +1,4 @@ -define genCheckpoint +define genCheckpoint # GDB config set pagination off set logging overwrite on @@ -8,7 +8,7 @@ define genCheckpoint # Argument Parsing set $tcpPort=$arg0 set $instrCount=$arg1 - set $statePath=$arg1 + set $statePath=$arg2 set $ramPath=$arg2 set $checkPC=$arg3 set $checkPCoccurences=$arg4 @@ -31,7 +31,7 @@ define genCheckpoint # Proceed to checkpoint printf "GDB proceeding to checkpoint at %d instrs\n", $instrCount #stepi $instrCount-1000 - b *$checkPC + eval "b *0x%s",$checkPC ignore 2 $checkPCoccurences c diff --git a/wally-pipelined/linux-testgen/testvector-generation/genCheckpoint.sh b/wally-pipelined/linux-testgen/testvector-generation/genCheckpoint.sh index 249094ea3..f35420341 100755 --- a/wally-pipelined/linux-testgen/testvector-generation/genCheckpoint.sh +++ b/wally-pipelined/linux-testgen/testvector-generation/genCheckpoint.sh @@ -3,7 +3,7 @@ source genSettings.sh tcpPort=1236 -instrs=50000000 +instrs=10000000 checkOutDir="$outDir/checkpoint$instrs" checkIntermedDir="$checkOutDir/intermediate-outputs" @@ -28,7 +28,7 @@ then -bios $imageDir/fw_jump.elf -kernel $imageDir/Image -append "root=/dev/vda ro" -initrd $imageDir/rootfs.cpio \ -singlestep -rtc clock=vm -icount shift=1,align=off,sleep=on,rr=replay,rrfile="$intermedDir/$recordFile" \ -gdb tcp::$tcpPort -S) \ - & riscv64-unknown-elf-gdb -quiet -x genCheckpoint.gdb -ex "genCheckpoint $tcpPort $instrs \"$checkIntermedDir\" 0x$pc $occurences" + & riscv64-unknown-elf-gdb -x genCheckpoint.gdb -ex "genCheckpoint $tcpPort $instrs \"$checkIntermedDir\" \"$pc\" $occurences" # Post-Process GDB outputs ./parseState.py "$checkOutDir" ./fix_mem.py "$checkIntermedDir/ramGDB.txt" "$checkOutDir/ram.txt" From d98baf90a3bbe487737c4722123176ce72697f2b Mon Sep 17 00:00:00 2001 From: Ross Thompson Date: Wed, 27 Oct 2021 09:57:11 -0500 Subject: [PATCH 058/132] Replaced async reset flip flops with sync reset flip flops in cache and bpread. --- wally-pipelined/src/cache/cachereplacementpolicy.sv | 2 +- wally-pipelined/src/cache/cacheway.sv | 6 +++--- wally-pipelined/src/cache/dcachefsm.sv | 2 +- wally-pipelined/src/cache/icachefsm.sv | 2 +- wally-pipelined/src/ifu/RAsPredictor.sv | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/wally-pipelined/src/cache/cachereplacementpolicy.sv b/wally-pipelined/src/cache/cachereplacementpolicy.sv index d2739a7c3..e02c36753 100644 --- a/wally-pipelined/src/cache/cachereplacementpolicy.sv +++ b/wally-pipelined/src/cache/cachereplacementpolicy.sv @@ -49,7 +49,7 @@ module cachereplacementpolicy logic LRUWriteEnD; /* verilator lint_off BLKLOOPINIT */ - always_ff @(posedge clk, posedge reset) begin + always_ff @(posedge clk) begin if (reset) begin RAdrD <= '0; MemPAdrMD <= '0; diff --git a/wally-pipelined/src/cache/cacheway.sv b/wally-pipelined/src/cache/cacheway.sv index bb760bbab..6f9c08554 100644 --- a/wally-pipelined/src/cache/cacheway.sv +++ b/wally-pipelined/src/cache/cacheway.sv @@ -111,7 +111,7 @@ module cacheway #(parameter NUMLINES=512, parameter BLOCKLEN = 256, TAGLEN = 26, assign VictimTagWay = SelFlush ? FlushThisWay : VicDirtyWay; - always_ff @(posedge clk, posedge reset) begin + always_ff @(posedge clk) begin if (reset) ValidBits <= {NUMLINES{1'b0}}; else if (InvalidateAll) @@ -134,14 +134,14 @@ module cacheway #(parameter NUMLINES=512, parameter BLOCKLEN = 256, TAGLEN = 26, generate if(DIRTY_BITS) begin - always_ff @(posedge clk, posedge reset) begin + always_ff @(posedge clk) begin if (reset) DirtyBits <= {NUMLINES{1'b0}}; else if (SetDirtyD & (WriteEnableD | VDWriteEnableD)) DirtyBits[WAdrD] <= 1'b1; else if (ClearDirtyD & (WriteEnableD | VDWriteEnableD)) DirtyBits[WAdrD] <= 1'b0; end - always_ff @(posedge clk, posedge reset) begin + always_ff @(posedge clk) begin SetDirtyD <= SetDirty; ClearDirtyD <= ClearDirty; end diff --git a/wally-pipelined/src/cache/dcachefsm.sv b/wally-pipelined/src/cache/dcachefsm.sv index 4fba55bd6..59f90462f 100644 --- a/wally-pipelined/src/cache/dcachefsm.sv +++ b/wally-pipelined/src/cache/dcachefsm.sv @@ -144,7 +144,7 @@ module dcachefsm assign CntEn = PreCntEn & AHBAck; - always_ff @(posedge clk, posedge reset) + always_ff @(posedge clk) if (reset) CurrState <= #1 STATE_READY; else CurrState <= #1 NextState; diff --git a/wally-pipelined/src/cache/icachefsm.sv b/wally-pipelined/src/cache/icachefsm.sv index 82590747d..2461e0dd4 100644 --- a/wally-pipelined/src/cache/icachefsm.sv +++ b/wally-pipelined/src/cache/icachefsm.sv @@ -116,7 +116,7 @@ module icachefsm logic PreCntEn; // the FSM is always runing, do not stall. - always_ff @(posedge clk, posedge reset) + always_ff @(posedge clk) if (reset) CurrState <= #1 STATE_READY; else CurrState <= #1 NextState; diff --git a/wally-pipelined/src/ifu/RAsPredictor.sv b/wally-pipelined/src/ifu/RAsPredictor.sv index bde30be54..44929e3c7 100644 --- a/wally-pipelined/src/ifu/RAsPredictor.sv +++ b/wally-pipelined/src/ifu/RAsPredictor.sv @@ -62,7 +62,7 @@ module RASPredictor .q(PtrQ)); // RAS must be reset. - always_ff @ (posedge clk, posedge reset) begin + always_ff @ (posedge clk) begin if(reset) begin for(index=0; index Date: Wed, 27 Oct 2021 10:37:35 -0700 Subject: [PATCH 059/132] Changes for floating point sims --- .../regression/regression-wally.py | 1 + wally-pipelined/regression/sim-wally | 2 +- wally-pipelined/regression/sim-wally-batch | 2 +- .../regression/wave-dos/peripheral-waves.do | 2 +- wally-pipelined/testbench/testbench.sv | 1 + wally-pipelined/testbench/tests.vh | 302 +++++++++--------- 6 files changed, 158 insertions(+), 152 deletions(-) diff --git a/wally-pipelined/regression/regression-wally.py b/wally-pipelined/regression/regression-wally.py index ec06956b3..79532c5c8 100755 --- a/wally-pipelined/regression/regression-wally.py +++ b/wally-pipelined/regression/regression-wally.py @@ -48,6 +48,7 @@ for test in tests64: cmd="vsim > {} -c < Date: Wed, 27 Oct 2021 10:41:37 -0700 Subject: [PATCH 060/132] Added instructions for making rv32if device --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 559c3e0ee..420ea87a1 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,8 @@ cd ../addins git clone https://github.com/riscv-non-isa/riscv-arch-test git clone https://github.com/riscv-software-src/riscv-isa-sim cd riscv-isa-sim +cp -r arch_test_target/spike/device/rv32i_m/I arch_test_target/spike/device/rv32i_m/F + mkdir build cd build set RISCV=/cad/riscv/gcc/bin (or whatever your path is) From 9cfb8deaab36c93f98d72967b87a33c5ceb87846 Mon Sep 17 00:00:00 2001 From: David Harris Date: Wed, 27 Oct 2021 11:02:42 -0700 Subject: [PATCH 061/132] Fixed FResultSelM to select proper flags --- wally-pipelined/src/fpu/fpu.sv | 4 ++-- wally-pipelined/testbench/tests.vh | 28 ++++++++++++++-------------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/wally-pipelined/src/fpu/fpu.sv b/wally-pipelined/src/fpu/fpu.sv index 6ce894be4..91af05095 100755 --- a/wally-pipelined/src/fpu/fpu.sv +++ b/wally-pipelined/src/fpu/fpu.sv @@ -41,7 +41,7 @@ module fpu ( output logic [`XLEN-1:0] FIntResM, // data to be written to integer register output logic FDivBusyE, // Is the divide/sqrt unit busy (stall execute stage) output logic IllegalFPUInstrD, // Is the instruction an illegal fpu instruction - output logic [4:0] SetFflagsM // FMA flags (to privileged unit) + output logic [4:0] SetFflagsM // FPU flags (to privileged unit) ); //*** make everything FLEN at some point @@ -267,7 +267,7 @@ module fpu ( // BEGIN MEMORY STAGE // FPU flag selection - to privileged - mux4 #(5) FPUFlgMux (5'b0, FMAFlgM, FDivFlgM, FFlgM, FResultSelW, SetFflagsM); + mux4 #(5) FPUFlgMux (5'b0, FMAFlgM, FDivFlgM, FFlgM, FResultSelM, SetFflagsM); // M/W pipe registers flopenrc #(64) MWRegFma(clk, reset, FlushW, ~StallW, FMAResM, FMAResW); diff --git a/wally-pipelined/testbench/tests.vh b/wally-pipelined/testbench/tests.vh index fbe0d916c..cdebfcb2a 100644 --- a/wally-pipelined/testbench/tests.vh +++ b/wally-pipelined/testbench/tests.vh @@ -671,28 +671,28 @@ string imperas32f[] = '{ string arch32f[] = '{ `RISCVARCHTEST, // tests repeated up here for basic sanity - //"rv32i_m/F/flw-align-01", "2010", // passes - //"rv32i_m/F/fmv.w.x_b25-01", "2090", // passes + "rv32i_m/F/flw-align-01", "2010", // passes + "rv32i_m/F/fmv.w.x_b25-01", "2090", // passes "rv32i_m/F/fmadd_b14-01", "23d0", // fails test 1 "rv32i_m/F/fcvt.s.w_b25-01", "20a0", // fails test 3 // main tests - "rv32i_m/F/fadd_b1-01", "7220", - "rv32i_m/F/fadd_b10-01", "2270", - "rv32i_m/F/fadd_b11-01", "3fb40", - "rv32i_m/F/fadd_b12-01", "21b0", - "rv32i_m/F/fadd_b13-01", "3660", - "rv32i_m/F/fadd_b2-01", "38b0", - "rv32i_m/F/fadd_b3-01", "b320", - "rv32i_m/F/fadd_b4-01", "3480", - "rv32i_m/F/fadd_b5-01", "3700", - "rv32i_m/F/fadd_b7-01", "3520", - "rv32i_m/F/fadd_b8-01", "104a0", + // "rv32i_m/F/fadd_b1-01", "7220", + // "rv32i_m/F/fadd_b10-01", "2270", + // "rv32i_m/F/fadd_b11-01", "3fb40", + // "rv32i_m/F/fadd_b12-01", "21b0", + // "rv32i_m/F/fadd_b13-01", "3660", + // "rv32i_m/F/fadd_b2-01", "38b0", + // "rv32i_m/F/fadd_b3-01", "b320", + // "rv32i_m/F/fadd_b4-01", "3480", + // "rv32i_m/F/fadd_b5-01", "3700", + // "rv32i_m/F/fadd_b7-01", "3520", + // "rv32i_m/F/fadd_b8-01", "104a0", "rv32i_m/F/fclass_b1-01", "2090", "rv32i_m/F/fcvt.s.w_b25-01", "20a0", "rv32i_m/F/fcvt.s.w_b26-01", "3290", "rv32i_m/F/fcvt.s.wu_b25-01", "20a0", "rv32i_m/F/fcvt.s.wu_b26-01", "3290", - "rv32i_m/F/fcvt.w.s_b1-01", "2090", +// "rv32i_m/F/fcvt.w.s_b1-01", "2090", "rv32i_m/F/fcvt.w.s_b22-01", "20b0", "rv32i_m/F/fcvt.w.s_b23-01", "20c0", "rv32i_m/F/fcvt.w.s_b24-01", "21b0", From e62b57e2c2d367920f2b2427aa9ffb61a794b040 Mon Sep 17 00:00:00 2001 From: David Harris Date: Wed, 27 Oct 2021 11:27:34 -0700 Subject: [PATCH 062/132] commented out some failing FPU tests --- wally-pipelined/testbench/tests.vh | 91 ++++++++++++++---------------- 1 file changed, 43 insertions(+), 48 deletions(-) diff --git a/wally-pipelined/testbench/tests.vh b/wally-pipelined/testbench/tests.vh index cdebfcb2a..57de30760 100644 --- a/wally-pipelined/testbench/tests.vh +++ b/wally-pipelined/testbench/tests.vh @@ -669,13 +669,8 @@ string imperas32f[] = '{ }; string arch32f[] = '{ + `RISCVARCHTEST, - // tests repeated up here for basic sanity - "rv32i_m/F/flw-align-01", "2010", // passes - "rv32i_m/F/fmv.w.x_b25-01", "2090", // passes - "rv32i_m/F/fmadd_b14-01", "23d0", // fails test 1 - "rv32i_m/F/fcvt.s.w_b25-01", "20a0", // fails test 3 - // main tests // "rv32i_m/F/fadd_b1-01", "7220", // "rv32i_m/F/fadd_b10-01", "2270", // "rv32i_m/F/fadd_b11-01", "3fb40", @@ -693,57 +688,57 @@ string imperas32f[] = '{ "rv32i_m/F/fcvt.s.wu_b25-01", "20a0", "rv32i_m/F/fcvt.s.wu_b26-01", "3290", // "rv32i_m/F/fcvt.w.s_b1-01", "2090", - "rv32i_m/F/fcvt.w.s_b22-01", "20b0", - "rv32i_m/F/fcvt.w.s_b23-01", "20c0", - "rv32i_m/F/fcvt.w.s_b24-01", "21b0", - "rv32i_m/F/fcvt.w.s_b27-01", "2090", - "rv32i_m/F/fcvt.w.s_b28-01", "2090", - "rv32i_m/F/fcvt.w.s_b29-01", "2150", - "rv32i_m/F/fcvt.wu.s_b1-01", "2090", - "rv32i_m/F/fcvt.wu.s_b22-01", "20b0", - "rv32i_m/F/fcvt.wu.s_b23-01", "20c0", - "rv32i_m/F/fcvt.wu.s_b24-01", "21b0", - "rv32i_m/F/fcvt.wu.s_b27-01", "2090", - "rv32i_m/F/fcvt.wu.s_b28-01", "2090", - "rv32i_m/F/fcvt.wu.s_b29-01", "2150", - "rv32i_m/F/fdiv_b1-01", "7220", - "rv32i_m/F/fdiv_b2-01", "2350", - "rv32i_m/F/fdiv_b20-01", "38c0", - "rv32i_m/F/fdiv_b21-01", "7540", - "rv32i_m/F/fdiv_b3-01", "b320", - "rv32i_m/F/fdiv_b4-01", "3480", - "rv32i_m/F/fdiv_b5-01", "3700", - "rv32i_m/F/fdiv_b6-01", "3480", - "rv32i_m/F/fdiv_b7-01", "3520", - "rv32i_m/F/fdiv_b8-01", "104a0", - "rv32i_m/F/fdiv_b9-01", "d960", - "rv32i_m/F/feq_b1-01", "6220", - "rv32i_m/F/feq_b19-01", "a190", - "rv32i_m/F/fle_b1-01", "6220", - "rv32i_m/F/fle_b19-01", "a190", - "rv32i_m/F/flt_b1-01", "6220", - "rv32i_m/F/flt_b19-01", "8ee0", +// "rv32i_m/F/fcvt.w.s_b22-01", "20b0", + // "rv32i_m/F/fcvt.w.s_b23-01", "20c0", + // "rv32i_m/F/fcvt.w.s_b24-01", "21b0", + // "rv32i_m/F/fcvt.w.s_b27-01", "2090", + // "rv32i_m/F/fcvt.w.s_b28-01", "2090", + // "rv32i_m/F/fcvt.w.s_b29-01", "2150", + // "rv32i_m/F/fcvt.wu.s_b1-01", "2090", + // "rv32i_m/F/fcvt.wu.s_b22-01", "20b0", + // "rv32i_m/F/fcvt.wu.s_b23-01", "20c0", + // "rv32i_m/F/fcvt.wu.s_b24-01", "21b0", + // "rv32i_m/F/fcvt.wu.s_b27-01", "2090", + // "rv32i_m/F/fcvt.wu.s_b28-01", "2090", + // "rv32i_m/F/fcvt.wu.s_b29-01", "2150", + // "rv32i_m/F/fdiv_b1-01", "7220", + // "rv32i_m/F/fdiv_b2-01", "2350", + // "rv32i_m/F/fdiv_b20-01", "38c0", + // "rv32i_m/F/fdiv_b21-01", "7540", + // "rv32i_m/F/fdiv_b3-01", "b320", + // "rv32i_m/F/fdiv_b4-01", "3480", + // "rv32i_m/F/fdiv_b5-01", "3700", + // "rv32i_m/F/fdiv_b6-01", "3480", + // "rv32i_m/F/fdiv_b7-01", "3520", + // "rv32i_m/F/fdiv_b8-01", "104a0", + // "rv32i_m/F/fdiv_b9-01", "d960", + // "rv32i_m/F/feq_b1-01", "6220", + // "rv32i_m/F/feq_b19-01", "a190", + // "rv32i_m/F/fle_b1-01", "6220", + // "rv32i_m/F/fle_b19-01", "a190", + // "rv32i_m/F/flt_b1-01", "6220", + // "rv32i_m/F/flt_b19-01", "8ee0", "rv32i_m/F/flw-align-01", "2010", - "rv32i_m/F/fmadd_b1-01", "96860", +// "rv32i_m/F/fmadd_b1-01", "96860", "rv32i_m/F/fmadd_b14-01", "23d0", - "rv32i_m/F/fmadd_b15-01", "19bb30", +//--passes but is timeconsuming "rv32i_m/F/fmadd_b15-01", "19bb30", "rv32i_m/F/fmadd_b16-01", "39d0", "rv32i_m/F/fmadd_b17-01", "39d0", - "rv32i_m/F/fmadd_b18-01", "4d10", +// "rv32i_m/F/fmadd_b18-01", "4d10", "rv32i_m/F/fmadd_b2-01", "4d60", "rv32i_m/F/fmadd_b3-01", "d4f0", "rv32i_m/F/fmadd_b4-01", "3700", "rv32i_m/F/fmadd_b5-01", "3ac0", "rv32i_m/F/fmadd_b6-01", "3700", - "rv32i_m/F/fmadd_b7-01", "d7f0", - "rv32i_m/F/fmadd_b8-01", "13f30", - "rv32i_m/F/fmax_b1-01", "7220", - "rv32i_m/F/fmax_b19-01", "9e00", - "rv32i_m/F/fmin_b1-01", "7220", - "rv32i_m/F/fmin_b19-01", "9f20", +// "rv32i_m/F/fmadd_b7-01", "d7f0", +// "rv32i_m/F/fmadd_b8-01", "13f30", + // "rv32i_m/F/fmax_b1-01", "7220", + // "rv32i_m/F/fmax_b19-01", "9e00", + // "rv32i_m/F/fmin_b1-01", "7220", + // "rv32i_m/F/fmin_b19-01", "9f20", "rv32i_m/F/fmsub_b1-01", "96860", "rv32i_m/F/fmsub_b14-01", "23d0", - "rv32i_m/F/fmsub_b15-01", "19bb30", +// "rv32i_m/F/fmsub_b15-01", "19bb30", "rv32i_m/F/fmsub_b16-01", "39d0", "rv32i_m/F/fmsub_b17-01", "39d0", "rv32i_m/F/fmsub_b18-01", "42d0", @@ -774,7 +769,7 @@ string imperas32f[] = '{ "rv32i_m/F/fmv.x.w_b29-01", "2090", "rv32i_m/F/fnmadd_b1-01", "96870", "rv32i_m/F/fnmadd_b14-01", "23d0", - "rv32i_m/F/fnmadd_b15-01", "19bb40", +// timeconsuming "rv32i_m/F/fnmadd_b15-01", "19bb40", "rv32i_m/F/fnmadd_b16-01", "39d0", "rv32i_m/F/fnmadd_b17-01", "39d0", "rv32i_m/F/fnmadd_b18-01", "4d10", @@ -787,7 +782,7 @@ string imperas32f[] = '{ "rv32i_m/F/fnmadd_b8-01", "13f30", "rv32i_m/F/fnmsub_b1-01", "96870", "rv32i_m/F/fnmsub_b14-01", "23d0", - "rv32i_m/F/fnmsub_b15-01", "19bb30", +// timeconsuming "rv32i_m/F/fnmsub_b15-01", "19bb30", "rv32i_m/F/fnmsub_b16-01", "39d0", "rv32i_m/F/fnmsub_b17-01", "39d0", "rv32i_m/F/fnmsub_b18-01", "4d10", From 0a33b0904d4aff32ec65f93fee14dff5625d5444 Mon Sep 17 00:00:00 2001 From: koooo142857 Date: Wed, 27 Oct 2021 12:43:55 -0700 Subject: [PATCH 063/132] aligned all files in ifu folder --- wally-pipelined/src/ifu/BTBPredictor.sv | 60 ++--- wally-pipelined/src/ifu/CodeAligner.py | 98 ++++++++ wally-pipelined/src/ifu/RAsPredictor.sv | 28 +-- wally-pipelined/src/ifu/SRAM2P1R1W.sv | 56 ++--- wally-pipelined/src/ifu/bpred.sv | 216 +++++++++--------- wally-pipelined/src/ifu/decompress.sv | 18 +- .../src/ifu/globalHistoryPredictor.sv | 70 +++--- wally-pipelined/src/ifu/gsharePredictor.sv | 70 +++--- wally-pipelined/src/ifu/ifu.sv | 214 ++++++++--------- .../src/ifu/localHistoryPredictor.sv | 72 +++--- wally-pipelined/src/ifu/satCounter2.sv | 20 +- wally-pipelined/src/ifu/twoBitPredictor.sv | 48 ++-- 12 files changed, 534 insertions(+), 436 deletions(-) create mode 100644 wally-pipelined/src/ifu/CodeAligner.py diff --git a/wally-pipelined/src/ifu/BTBPredictor.sv b/wally-pipelined/src/ifu/BTBPredictor.sv index 07a39c162..ad94b6ff6 100644 --- a/wally-pipelined/src/ifu/BTBPredictor.sv +++ b/wally-pipelined/src/ifu/BTBPredictor.sv @@ -31,25 +31,25 @@ module BTBPredictor #(parameter int Depth = 10 ) - (input logic clk, - input logic reset, - input logic StallF, StallE, + (input logic clk, + input logic reset, + input logic StallF, StallE, input logic [`XLEN-1:0] LookUpPC, output logic [`XLEN-1:0] TargetPC, - output logic [4:0] InstrClass, - output logic Valid, + output logic [4:0] InstrClass, + output logic Valid, // update - input logic UpdateEN, + input logic UpdateEN, input logic [`XLEN-1:0] UpdatePC, input logic [`XLEN-1:0] UpdateTarget, - input logic [4:0] UpdateInstrClass, - input logic UpdateInvalid + input logic [4:0] UpdateInstrClass, + input logic UpdateInvalid ); localparam TotalDepth = 2 ** Depth; logic [TotalDepth-1:0] ValidBits; - logic [Depth-1:0] LookUpPCIndex, UpdatePCIndex, LookUpPCIndexQ, UpdatePCIndexQ; - logic UpdateENQ; + logic [Depth-1:0] LookUpPCIndex, UpdatePCIndex, LookUpPCIndexQ, UpdatePCIndexQ; + logic UpdateENQ; // hashing function for indexing the PC @@ -61,10 +61,10 @@ module BTBPredictor flopenr #(Depth) UpdatePCIndexReg(.clk(clk), - .reset(reset), - .en(~StallE), - .d(UpdatePCIndex), - .q(UpdatePCIndexQ)); + .reset(reset), + .en(~StallE), + .d(UpdatePCIndex), + .q(UpdatePCIndexQ)); // The valid bit must be resetable. always_ff @ (posedge clk) begin @@ -79,17 +79,17 @@ module BTBPredictor flopenr #(1) UpdateENReg(.clk(clk), - .reset(reset), - .en(~StallF), - .d(UpdateEN), - .q(UpdateENQ)); + .reset(reset), + .en(~StallF), + .d(UpdateEN), + .q(UpdateENQ)); flopenr #(Depth) LookupPCIndexReg(.clk(clk), - .reset(reset), - .en(~StallF), - .d(LookUpPCIndex), - .q(LookUpPCIndexQ)); + .reset(reset), + .en(~StallF), + .d(LookUpPCIndex), + .q(LookUpPCIndexQ)); @@ -98,14 +98,14 @@ module BTBPredictor // *** need to add forwarding. SRAM2P1R1W #(Depth, `XLEN+5) memory(.clk(clk), - .reset(reset), - .RA1(LookUpPCIndex), - .RD1({{InstrClass, TargetPC}}), - .REN1(~StallF), - .WA1(UpdatePCIndex), - .WD1({UpdateInstrClass, UpdateTarget}), - .WEN1(UpdateEN), - .BitWEN1({5'h1F, {`XLEN{1'b1}}})); // *** definitely not right. + .reset(reset), + .RA1(LookUpPCIndex), + .RD1({{InstrClass, TargetPC}}), + .REN1(~StallF), + .WA1(UpdatePCIndex), + .WD1({UpdateInstrClass, UpdateTarget}), + .WEN1(UpdateEN), + .BitWEN1({5'h1F, {`XLEN{1'b1}}})); // *** definitely not right. endmodule diff --git a/wally-pipelined/src/ifu/CodeAligner.py b/wally-pipelined/src/ifu/CodeAligner.py new file mode 100644 index 000000000..59f9de4e8 --- /dev/null +++ b/wally-pipelined/src/ifu/CodeAligner.py @@ -0,0 +1,98 @@ +import os + +# Kevin Wan kewan@hmc.edu 10/27/2021 +def read_input(filename): #1 + """Takes in a string filename and outputs the parsed verilog code by line into a list + such that each element of the list is one line of verilog code as a string.""" + lineOfCode = [] + input_file = open(filename, 'r') + for line in input_file: + lineOfCode.append(line) + return lineOfCode +################################################################################### +def ID_start(GiantString):#2 + """takes in the list of sv file lines, outputs the location that variable names should start""" + VarLoc = 0 + VarLineNum = None + for lines in GiantString: + if ' logic ' in lines and (lines.find("//") == -1 or lines.find("//") > lines.find(' logic ')): # // logic does not proceed. logic proceeds. logic // proceeds. + if "[" in lines and "]" in lines:# need to account for these space + NowLoc = lines.find(']') + 3# column number in sv code when 1st char of the var name should appear. + if NowLoc>VarLoc: + VarLoc = NowLoc + VarLineNum = GiantString.index(lines) # Update this number if new record is made. + else: + NowLoc = lines.find('logic') + 7 # same as before. + if NowLoc>VarLoc: + VarLoc = NowLoc + VarLineNum = GiantString.index(lines) + #print("Furthest variable appears on line", VarLineNum + 1,VarLoc) # Disable this line after debugging. + return VarLoc +################################################################################## +def modified_logNew(GS,SOV): #3 + Ind = SOV - 1 # SOV is for human readability, Ind is the character's index in computer, since computers count from 0's we need to correct it. + Out = [] + for l in GS: + lines = l.replace('\t',' ') + + if ' logic ' in lines and (lines.find("//") == -1 or lines.find("//") > lines.find(' logic ')): # // logic does not proceed. logic proceeds. logic // proceeds. + if "[" in lines and "]" in lines: # the line is an extended declaration. + EditLoc = lines.find("]") # Re-finds the string index number of ]. + VarLoc = FindCharRel(lines[EditLoc+1::]) + EditLoc + 1 # Checks where variable declaration currently is at. + #print(VarLoc,lines[VarLoc])# VERIFIED + NewLine = Mod_Space_at(lines,VarLoc,VarLoc-Ind) + Out.append(NewLine)# Verified0957 10272021 + else: + EditLoc1 = lines.find('c') # Hopefully sees the c in 'logic' + + VarLoc1 = FindCharRel(lines[EditLoc1+1::]) + EditLoc1 + 1 + NewLine1 = Mod_Space_at(lines,VarLoc1,VarLoc1-Ind) + + Out.append(NewLine1)# Verified 1005 10272021 + else: + Out.append(lines) + return Out +################################################################################ +def write_to_output(filename,GiantString,OW=True,Lines_editted=None): #4 + """Filename is preferrably passed from the early function calls""" + """GiantString has all the corrected features in the code, each line is a good verilog code line""" + newname = filename + if not OW or OW =='f': #which means no overwrite (create a new file) + Decomposed=filename.split('.') + newname = Decomposed[0] + "_AL." + Decomposed[1] # AL for aligned. + + OutFile = open(newname,'w') # This step should create a new file. + OutFile.writelines(GiantString) + OutFile.close() + print("Success! " + newname + " Now contains an aligned file!") + return newname +################################################################################# + +def FindCharRel(Ln): + #returns the computer location of a character's first occurence + for num in range(len(Ln)): + if Ln[num] != " ": + return num + + +def Mod_Space_at(Ln,loc,diff): + #loc is the varLoc from mln, diff is varLoc - Ind + if diff > 0: # to delete + NewString = Ln[:(loc-diff)] + Ln[loc:] + + if diff < 0: # to add + NewString = Ln[:loc] + (-diff)*" " + Ln[loc:] + if diff == 0: + NewString = Ln + + return NewString + +def main_filehandler(overwrite=False): + for filename in os.listdir(): + if ".py" not in filename: + GiantString = read_input(filename) + SOV = ID_start(GiantString) + ModifiedGS = modified_logNew(GiantString,SOV) + Newname = write_to_output(filename,ModifiedGS,overwrite) + +main_filehandler(True) \ No newline at end of file diff --git a/wally-pipelined/src/ifu/RAsPredictor.sv b/wally-pipelined/src/ifu/RAsPredictor.sv index 44929e3c7..31f4568d0 100644 --- a/wally-pipelined/src/ifu/RAsPredictor.sv +++ b/wally-pipelined/src/ifu/RAsPredictor.sv @@ -30,21 +30,21 @@ module RASPredictor #(parameter int StackSize = 16 ) - (input logic clk, - input logic reset, - input logic pop, + (input logic clk, + input logic reset, + input logic pop, output logic [`XLEN-1:0] popPC, - input logic push, - input logic incr, + input logic push, + input logic incr, input logic [`XLEN-1:0] pushPC ); - logic CounterEn; + logic CounterEn; localparam Depth = $clog2(StackSize); - logic [Depth-1:0] PtrD, PtrQ, PtrP1, PtrM1; - logic [StackSize-1:0] [`XLEN-1:0] memory; - integer index; + logic [Depth-1:0] PtrD, PtrQ, PtrP1, PtrM1; + logic [StackSize-1:0] [`XLEN-1:0] memory; + integer index; assign CounterEn = pop | push | incr; @@ -56,16 +56,16 @@ module RASPredictor // *** what happens if jal is executing and there is a return being flushed in Decode? flopenr #(Depth) PTR(.clk(clk), - .reset(reset), - .en(CounterEn), - .d(PtrD), - .q(PtrQ)); + .reset(reset), + .en(CounterEn), + .d(PtrD), + .q(PtrQ)); // RAS must be reset. always_ff @ (posedge clk) begin if(reset) begin for(index=0; index Date: Wed, 27 Oct 2021 13:45:37 -0700 Subject: [PATCH 064/132] Have replaced .* with signal names in ifu --- .../src/wally/wallypipelinedhart.sv | 27 ++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/wally-pipelined/src/wally/wallypipelinedhart.sv b/wally-pipelined/src/wally/wallypipelinedhart.sv index 980166d95..ede4460e0 100644 --- a/wally-pipelined/src/wally/wallypipelinedhart.sv +++ b/wally-pipelined/src/wally/wallypipelinedhart.sv @@ -154,9 +154,30 @@ module wallypipelinedhart ( logic BreakpointFaultM, EcallFaultM; - ifu ifu(.InstrInF(InstrRData), - .WalkerInstrPageFaultF(WalkerInstrPageFaultF), - .*); // instruction fetch unit: PC, branch prediction, instruction cache + ifu ifu( + .clk, .reset, + .StallF, .StallD, .StallE, .StallM, .StallW, + .FlushF, .FlushD, .FlushE, .FlushM, .FlushW, + .InstrInF(InstrRData), .InstrAckF, .PCF, .InstrPAdrF, .InstrReadF, .ICacheStallF, + .PCLinkE, .PCSrcE, .PCTargetE, .PCE, + .BPPredWrongE, + .RetM, .TrapM, + .PrivilegedNextPCM, .InvalidateICacheM, + .InstrD, .InstrM, + .PCM, .InstrClassM, + .BPPredDirWrongM,.BTBPredPCWrongM,.RASPredPCWrongM, .BPPredClassNonCFIWrongM, + .IllegalBaseInstrFaultD, .ITLBInstrPageFaultF, .IllegalIEUInstrFaultD, + .InstrMisalignedFaultM, .InstrMisalignedAdrM, + .PrivilegeModeW, .PTE, .PageType, .SATP_REGW, + .STATUS_MXR, .STATUS_SUM, .STATUS_MPRV, .STATUS_MPP, + .ITLBWriteF, .ITLBFlushF, + .WalkerInstrPageFaultF, + .ITLBMissF, + .PMPCFG_ARRAY_REGW, .PMPADDR_ARRAY_REGW, + .InstrAccessFaultF + + ); // instruction fetch unit: PC, branch prediction, instruction cache + ieu ieu(.*); // integer execution unit: integer register file, datapath and controller From b425cefd52a0ebc9984b99c7b1bd964f76bf81b8 Mon Sep 17 00:00:00 2001 From: slmnemo Date: Wed, 27 Oct 2021 13:45:56 -0700 Subject: [PATCH 065/132] Added instructions to enable buildroot tests and updated some paths in README.md --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 420ea87a1..fd3052948 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,7 @@ To use Wally on Linux: ``` git clone https://github.com/davidharrishmc/riscv-wally cd riscv-wally +cd tests cd imperas-riscv-tests make cd ../addins @@ -30,6 +31,8 @@ edit Makefile.include make make XLEN=32 exe2memfile.pl work/*/*/*.elf # converts ELF files to a format that can be read by Modelsim +cd ../../wally-pipelined/linux-testgen/linux-testvectors +./tvLinker.sh ``` Notes: From d14fa074ecce0acba2146e1eff85e400bac5af2a Mon Sep 17 00:00:00 2001 From: bbracker Date: Wed, 27 Oct 2021 14:10:29 -0700 Subject: [PATCH 066/132] checkpoint generator off-by-one error fix --- .../linux-testgen/testvector-generation/genCheckpoint.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wally-pipelined/linux-testgen/testvector-generation/genCheckpoint.sh b/wally-pipelined/linux-testgen/testvector-generation/genCheckpoint.sh index f35420341..fc22dd282 100755 --- a/wally-pipelined/linux-testgen/testvector-generation/genCheckpoint.sh +++ b/wally-pipelined/linux-testgen/testvector-generation/genCheckpoint.sh @@ -3,7 +3,7 @@ source genSettings.sh tcpPort=1236 -instrs=10000000 +instrs=480000000 checkOutDir="$outDir/checkpoint$instrs" checkIntermedDir="$checkOutDir/intermediate-outputs" @@ -32,7 +32,7 @@ then # Post-Process GDB outputs ./parseState.py "$checkOutDir" ./fix_mem.py "$checkIntermedDir/ramGDB.txt" "$checkOutDir/ram.txt" - tail -n+$instrs "$outDir/$traceFile" > "$checkOutDir/$traceFile" + tail -n+$($instrs+1) "$outDir/$traceFile" > "$checkOutDir/$traceFile" else echo "You can change the number of instructions by editing the \"instrs\" variable in this script." echo "Have a nice day!" From 54c714d222d487aaabd31e02ecae0d1ceb048f11 Mon Sep 17 00:00:00 2001 From: Ross Thompson Date: Thu, 28 Oct 2021 11:07:18 -0500 Subject: [PATCH 067/132] Applied batch from fpga branch which fixes the dcache fence bug. The should cause the dcache to flush all dirty cache lines to main memory. The bug caused the dirty reset to clear each way for a particular line. --- wally-pipelined/src/cache/dcache.sv | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/wally-pipelined/src/cache/dcache.sv b/wally-pipelined/src/cache/dcache.sv index bf943169c..b51e77e73 100644 --- a/wally-pipelined/src/cache/dcache.sv +++ b/wally-pipelined/src/cache/dcache.sv @@ -142,6 +142,8 @@ module dcache logic LRUWriteEn; + logic [NUMWAYS-1:0] VDWriteEnableWay; + // Read Path CPU (IEU) side mux4 #(INDEXLEN) @@ -167,7 +169,7 @@ module dcache .WAdr, .PAdr(MemPAdrM), .WriteEnable(SRAMWayWriteEnable), - .VDWriteEnable, + .VDWriteEnable(VDWriteEnableWay), .WriteWordEnable(SRAMWordEnable), .TagWriteEnable(SRAMBlockWayWriteEnableM), .WriteData(SRAMWriteData), @@ -329,6 +331,8 @@ module dcache .d(NextFlushWay), .q(FlushWay)); + assign VDWriteEnableWay = FlushWay & {NUMWAYS{VDWriteEnable}}; + assign NextFlushWay = {FlushWay[NUMWAYS-2:0], FlushWay[NUMWAYS-1]}; assign FlushAdrFlag = FlushAdr == FlushAdrThreshold[INDEXLEN-1:0] & FlushWay[NUMWAYS-1]; From aaef7977f6f3d5f4ecc78e4baadfe82f64d76964 Mon Sep 17 00:00:00 2001 From: kipmacsaigoren Date: Thu, 28 Oct 2021 22:37:25 -0500 Subject: [PATCH 068/132] made make also save the netlist and log file to outputs From 220c58045d2b6aca207d718fe2014975055ff214 Mon Sep 17 00:00:00 2001 From: kipmacsaigoren Date: Thu, 28 Oct 2021 22:43:58 -0500 Subject: [PATCH 069/132] added timing through redundant multiplier to mdu timing report. From f61fcd25a9cec5221a3ceccae4118c5e6ba9a0a0 Mon Sep 17 00:00:00 2001 From: Ross Thompson Date: Fri, 29 Oct 2021 11:03:37 -0500 Subject: [PATCH 070/132] Possible fix for the incorrect behavior of the pseudo LRU replacement policy for 4 ways set associative caches. --- .../src/cache/cachereplacementpolicy.sv | 29 ++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/wally-pipelined/src/cache/cachereplacementpolicy.sv b/wally-pipelined/src/cache/cachereplacementpolicy.sv index e02c36753..47e521a87 100644 --- a/wally-pipelined/src/cache/cachereplacementpolicy.sv +++ b/wally-pipelined/src/cache/cachereplacementpolicy.sv @@ -82,7 +82,31 @@ module cachereplacementpolicy assign VictimWay[1] = ~BlockReplacementBits[0]; assign VictimWay[0] = BlockReplacementBits[0]; - end else if (NUMWAYS == 4) begin : FourWay + end else if (NUMWAYS == 4) begin : FourWay + + + // VictimWay is a function only of the current value of the LRU. + // binary encoding + //assign VictimWay[0] = BlockReplacementBits[2] ? BlockReplacementBits[1] : BlockReplacementBits[0]; + //assign VictimWay[1] = BlockReplacementBits[2]; + + // 1 hot encoding + assign VictimWay[0] = ~BlockReplacementBits[2] & ~BlockReplacementBits[0]; + assign VictimWay[1] = ~BlockReplacementBits[2] & BlockReplacementBits[0]; + assign VictimWay[2] = BlockReplacementBits[2] & ~BlockReplacementBits[1]; + assign VictimWay[3] = BlockReplacementBits[2] & BlockReplacementBits[1]; + + // New LRU bits which are updated is function only of the WayHit. + // However the not updated bits come from the old LRU. + assign LRUEn[2] = |WayHit; + assign LRUEn[1] = WayHit[3] | WayHit[2]; + assign LRUEn[0] = WayHit[1] | WayHit[0]; + + assign LRUMask[2] = WayHit[1] | WayHit[0]; + assign LRUMask[1] = WayHit[2]; + assign LRUMask[0] = WayHit[0]; + +/* -----\/----- EXCLUDED -----\/----- // selects assign LRUEn[2] = 1'b1; @@ -93,16 +117,19 @@ module cachereplacementpolicy assign LRUMask[0] = WayHit[1]; assign LRUMask[1] = WayHit[3]; assign LRUMask[2] = WayHit[3] | WayHit[2]; + -----/\----- EXCLUDED -----/\----- */ for(index = 0; index < NUMWAYS-1; index++) assign NewReplacement[index] = LRUEn[index] ? LRUMask[index] : BlockReplacementBits[index]; +/* -----\/----- EXCLUDED -----\/----- assign EncVicWay[1] = BlockReplacementBits[2]; assign EncVicWay[0] = BlockReplacementBits[2] ? BlockReplacementBits[0] : BlockReplacementBits[1]; onehotdecoder #(2) waydec(.bin(EncVicWay), .decoded({VictimWay[0], VictimWay[1], VictimWay[2], VictimWay[3]})); + -----/\----- EXCLUDED -----/\----- */ end else if (NUMWAYS == 8) begin : EightWay From 8db0b5c06fecadfca3ab6ae1c77527ea917982fc Mon Sep 17 00:00:00 2001 From: kipmacsaigoren Date: Fri, 29 Oct 2021 11:46:18 -0500 Subject: [PATCH 071/132] added missing destination for copy command From 8aad95366d80402bd499bf908bb8235b66451c2f Mon Sep 17 00:00:00 2001 From: Ross Thompson Date: Fri, 29 Oct 2021 12:46:02 -0500 Subject: [PATCH 072/132] Fixed the 4 way set associative pseudo LRU replacement policy. --- wally-pipelined/src/cache/cachereplacementpolicy.sv | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/wally-pipelined/src/cache/cachereplacementpolicy.sv b/wally-pipelined/src/cache/cachereplacementpolicy.sv index 47e521a87..a0b774745 100644 --- a/wally-pipelined/src/cache/cachereplacementpolicy.sv +++ b/wally-pipelined/src/cache/cachereplacementpolicy.sv @@ -59,7 +59,7 @@ module cachereplacementpolicy ReplacementBits[index] <= '0; end else begin RAdrD <= RAdr; - MemPAdrMD <= MemPAdrMD; + MemPAdrMD <= MemPAdrM; LRUWriteEnD <= LRUWriteEn; NewReplacementD <= NewReplacement; if (LRUWriteEnD) begin @@ -91,6 +91,14 @@ module cachereplacementpolicy //assign VictimWay[1] = BlockReplacementBits[2]; // 1 hot encoding + //| WayHit | LRU 2 | LRU 1 | LRU 0 | + //|--------+-------+-------+-------| + //| 0000 | - | - | - | + //| 0001 | 1 | - | 1 | + //| 0010 | 1 | - | 0 | + //| 0100 | 0 | 1 | - | + //| 1000 | 0 | 0 | - | + assign VictimWay[0] = ~BlockReplacementBits[2] & ~BlockReplacementBits[0]; assign VictimWay[1] = ~BlockReplacementBits[2] & BlockReplacementBits[0]; assign VictimWay[2] = BlockReplacementBits[2] & ~BlockReplacementBits[1]; From f7acd31bcb453565362a498c244409eca1f6bb31 Mon Sep 17 00:00:00 2001 From: David Harris Date: Fri, 29 Oct 2021 22:28:37 -0700 Subject: [PATCH 073/132] rearranging testgen --- {wally-pipelined => tests}/testgen/privileged/README.md | 0 {wally-pipelined => tests}/testgen/privileged/run.sh | 0 {wally-pipelined => tests}/testgen/privileged/testgen-CAUSE.py | 0 .../testgen/privileged/testgen-CSR-PERMISSIONS.py | 0 {wally-pipelined => tests}/testgen/privileged/testgen-DELEG.py | 0 {wally-pipelined => tests}/testgen/privileged/testgen-EPC.py | 0 {wally-pipelined => tests}/testgen/privileged/testgen-IE.py | 0 {wally-pipelined => tests}/testgen/privileged/testgen-IP.py | 0 {wally-pipelined => tests}/testgen/privileged/testgen-READONLY.py | 0 {wally-pipelined => tests}/testgen/privileged/testgen-RET.py | 0 {wally-pipelined => tests}/testgen/privileged/testgen-TVAL.py | 0 {wally-pipelined => tests}/testgen/privileged/testgen-TVEC.py | 0 .../testgen/testgen-ADD-SUB-SLT-SLTU-XOR-OR-AND.py | 0 .../testgen/testgen-ADDI-XORI-ORI-ANDI-SLTI.py | 0 .../testgen/testgen-ADDIW-SLLIW-SRLIW-SRAIW.py | 0 .../testgen/testgen-ADDW-SUBW-SLLW-SRLW-SRAW.py | 0 {wally-pipelined => tests}/testgen/testgen-BRANCH.py | 0 {wally-pipelined => tests}/testgen/testgen-CSR.py | 0 {wally-pipelined => tests}/testgen/testgen-JAL-JALR.py | 0 {wally-pipelined => tests}/testgen/testgen-LOAD.py | 0 {wally-pipelined => tests}/testgen/testgen-PIPELINE.py | 0 {wally-pipelined => tests}/testgen/testgen-SLL-SRL-SRA.py | 0 {wally-pipelined => tests}/testgen/testgen-SLLI-SRLI-SRAI.py | 0 {wally-pipelined => tests}/testgen/testgen-SLTIU.py | 0 {wally-pipelined => tests}/testgen/testgen-STORE.py | 0 {wally-pipelined => tests}/testgen/testgen-VIRTUALMEMORY.py | 0 {wally-pipelined => tests}/testgen/testgen_footer.S | 0 {wally-pipelined => tests}/testgen/testgen_header.S | 0 {wally-pipelined => tests}/testgen/virtual_memory_util.py | 0 29 files changed, 0 insertions(+), 0 deletions(-) rename {wally-pipelined => tests}/testgen/privileged/README.md (100%) rename {wally-pipelined => tests}/testgen/privileged/run.sh (100%) rename {wally-pipelined => tests}/testgen/privileged/testgen-CAUSE.py (100%) rename {wally-pipelined => tests}/testgen/privileged/testgen-CSR-PERMISSIONS.py (100%) rename {wally-pipelined => tests}/testgen/privileged/testgen-DELEG.py (100%) rename {wally-pipelined => tests}/testgen/privileged/testgen-EPC.py (100%) rename {wally-pipelined => tests}/testgen/privileged/testgen-IE.py (100%) rename {wally-pipelined => tests}/testgen/privileged/testgen-IP.py (100%) rename {wally-pipelined => tests}/testgen/privileged/testgen-READONLY.py (100%) rename {wally-pipelined => tests}/testgen/privileged/testgen-RET.py (100%) rename {wally-pipelined => tests}/testgen/privileged/testgen-TVAL.py (100%) rename {wally-pipelined => tests}/testgen/privileged/testgen-TVEC.py (100%) rename {wally-pipelined => tests}/testgen/testgen-ADD-SUB-SLT-SLTU-XOR-OR-AND.py (100%) rename {wally-pipelined => tests}/testgen/testgen-ADDI-XORI-ORI-ANDI-SLTI.py (100%) rename {wally-pipelined => tests}/testgen/testgen-ADDIW-SLLIW-SRLIW-SRAIW.py (100%) rename {wally-pipelined => tests}/testgen/testgen-ADDW-SUBW-SLLW-SRLW-SRAW.py (100%) rename {wally-pipelined => tests}/testgen/testgen-BRANCH.py (100%) rename {wally-pipelined => tests}/testgen/testgen-CSR.py (100%) rename {wally-pipelined => tests}/testgen/testgen-JAL-JALR.py (100%) rename {wally-pipelined => tests}/testgen/testgen-LOAD.py (100%) rename {wally-pipelined => tests}/testgen/testgen-PIPELINE.py (100%) rename {wally-pipelined => tests}/testgen/testgen-SLL-SRL-SRA.py (100%) rename {wally-pipelined => tests}/testgen/testgen-SLLI-SRLI-SRAI.py (100%) rename {wally-pipelined => tests}/testgen/testgen-SLTIU.py (100%) rename {wally-pipelined => tests}/testgen/testgen-STORE.py (100%) rename {wally-pipelined => tests}/testgen/testgen-VIRTUALMEMORY.py (100%) rename {wally-pipelined => tests}/testgen/testgen_footer.S (100%) rename {wally-pipelined => tests}/testgen/testgen_header.S (100%) rename {wally-pipelined => tests}/testgen/virtual_memory_util.py (100%) diff --git a/wally-pipelined/testgen/privileged/README.md b/tests/testgen/privileged/README.md similarity index 100% rename from wally-pipelined/testgen/privileged/README.md rename to tests/testgen/privileged/README.md diff --git a/wally-pipelined/testgen/privileged/run.sh b/tests/testgen/privileged/run.sh similarity index 100% rename from wally-pipelined/testgen/privileged/run.sh rename to tests/testgen/privileged/run.sh diff --git a/wally-pipelined/testgen/privileged/testgen-CAUSE.py b/tests/testgen/privileged/testgen-CAUSE.py similarity index 100% rename from wally-pipelined/testgen/privileged/testgen-CAUSE.py rename to tests/testgen/privileged/testgen-CAUSE.py diff --git a/wally-pipelined/testgen/privileged/testgen-CSR-PERMISSIONS.py b/tests/testgen/privileged/testgen-CSR-PERMISSIONS.py similarity index 100% rename from wally-pipelined/testgen/privileged/testgen-CSR-PERMISSIONS.py rename to tests/testgen/privileged/testgen-CSR-PERMISSIONS.py diff --git a/wally-pipelined/testgen/privileged/testgen-DELEG.py b/tests/testgen/privileged/testgen-DELEG.py similarity index 100% rename from wally-pipelined/testgen/privileged/testgen-DELEG.py rename to tests/testgen/privileged/testgen-DELEG.py diff --git a/wally-pipelined/testgen/privileged/testgen-EPC.py b/tests/testgen/privileged/testgen-EPC.py similarity index 100% rename from wally-pipelined/testgen/privileged/testgen-EPC.py rename to tests/testgen/privileged/testgen-EPC.py diff --git a/wally-pipelined/testgen/privileged/testgen-IE.py b/tests/testgen/privileged/testgen-IE.py similarity index 100% rename from wally-pipelined/testgen/privileged/testgen-IE.py rename to tests/testgen/privileged/testgen-IE.py diff --git a/wally-pipelined/testgen/privileged/testgen-IP.py b/tests/testgen/privileged/testgen-IP.py similarity index 100% rename from wally-pipelined/testgen/privileged/testgen-IP.py rename to tests/testgen/privileged/testgen-IP.py diff --git a/wally-pipelined/testgen/privileged/testgen-READONLY.py b/tests/testgen/privileged/testgen-READONLY.py similarity index 100% rename from wally-pipelined/testgen/privileged/testgen-READONLY.py rename to tests/testgen/privileged/testgen-READONLY.py diff --git a/wally-pipelined/testgen/privileged/testgen-RET.py b/tests/testgen/privileged/testgen-RET.py similarity index 100% rename from wally-pipelined/testgen/privileged/testgen-RET.py rename to tests/testgen/privileged/testgen-RET.py diff --git a/wally-pipelined/testgen/privileged/testgen-TVAL.py b/tests/testgen/privileged/testgen-TVAL.py similarity index 100% rename from wally-pipelined/testgen/privileged/testgen-TVAL.py rename to tests/testgen/privileged/testgen-TVAL.py diff --git a/wally-pipelined/testgen/privileged/testgen-TVEC.py b/tests/testgen/privileged/testgen-TVEC.py similarity index 100% rename from wally-pipelined/testgen/privileged/testgen-TVEC.py rename to tests/testgen/privileged/testgen-TVEC.py diff --git a/wally-pipelined/testgen/testgen-ADD-SUB-SLT-SLTU-XOR-OR-AND.py b/tests/testgen/testgen-ADD-SUB-SLT-SLTU-XOR-OR-AND.py similarity index 100% rename from wally-pipelined/testgen/testgen-ADD-SUB-SLT-SLTU-XOR-OR-AND.py rename to tests/testgen/testgen-ADD-SUB-SLT-SLTU-XOR-OR-AND.py diff --git a/wally-pipelined/testgen/testgen-ADDI-XORI-ORI-ANDI-SLTI.py b/tests/testgen/testgen-ADDI-XORI-ORI-ANDI-SLTI.py similarity index 100% rename from wally-pipelined/testgen/testgen-ADDI-XORI-ORI-ANDI-SLTI.py rename to tests/testgen/testgen-ADDI-XORI-ORI-ANDI-SLTI.py diff --git a/wally-pipelined/testgen/testgen-ADDIW-SLLIW-SRLIW-SRAIW.py b/tests/testgen/testgen-ADDIW-SLLIW-SRLIW-SRAIW.py similarity index 100% rename from wally-pipelined/testgen/testgen-ADDIW-SLLIW-SRLIW-SRAIW.py rename to tests/testgen/testgen-ADDIW-SLLIW-SRLIW-SRAIW.py diff --git a/wally-pipelined/testgen/testgen-ADDW-SUBW-SLLW-SRLW-SRAW.py b/tests/testgen/testgen-ADDW-SUBW-SLLW-SRLW-SRAW.py similarity index 100% rename from wally-pipelined/testgen/testgen-ADDW-SUBW-SLLW-SRLW-SRAW.py rename to tests/testgen/testgen-ADDW-SUBW-SLLW-SRLW-SRAW.py diff --git a/wally-pipelined/testgen/testgen-BRANCH.py b/tests/testgen/testgen-BRANCH.py similarity index 100% rename from wally-pipelined/testgen/testgen-BRANCH.py rename to tests/testgen/testgen-BRANCH.py diff --git a/wally-pipelined/testgen/testgen-CSR.py b/tests/testgen/testgen-CSR.py similarity index 100% rename from wally-pipelined/testgen/testgen-CSR.py rename to tests/testgen/testgen-CSR.py diff --git a/wally-pipelined/testgen/testgen-JAL-JALR.py b/tests/testgen/testgen-JAL-JALR.py similarity index 100% rename from wally-pipelined/testgen/testgen-JAL-JALR.py rename to tests/testgen/testgen-JAL-JALR.py diff --git a/wally-pipelined/testgen/testgen-LOAD.py b/tests/testgen/testgen-LOAD.py similarity index 100% rename from wally-pipelined/testgen/testgen-LOAD.py rename to tests/testgen/testgen-LOAD.py diff --git a/wally-pipelined/testgen/testgen-PIPELINE.py b/tests/testgen/testgen-PIPELINE.py similarity index 100% rename from wally-pipelined/testgen/testgen-PIPELINE.py rename to tests/testgen/testgen-PIPELINE.py diff --git a/wally-pipelined/testgen/testgen-SLL-SRL-SRA.py b/tests/testgen/testgen-SLL-SRL-SRA.py similarity index 100% rename from wally-pipelined/testgen/testgen-SLL-SRL-SRA.py rename to tests/testgen/testgen-SLL-SRL-SRA.py diff --git a/wally-pipelined/testgen/testgen-SLLI-SRLI-SRAI.py b/tests/testgen/testgen-SLLI-SRLI-SRAI.py similarity index 100% rename from wally-pipelined/testgen/testgen-SLLI-SRLI-SRAI.py rename to tests/testgen/testgen-SLLI-SRLI-SRAI.py diff --git a/wally-pipelined/testgen/testgen-SLTIU.py b/tests/testgen/testgen-SLTIU.py similarity index 100% rename from wally-pipelined/testgen/testgen-SLTIU.py rename to tests/testgen/testgen-SLTIU.py diff --git a/wally-pipelined/testgen/testgen-STORE.py b/tests/testgen/testgen-STORE.py similarity index 100% rename from wally-pipelined/testgen/testgen-STORE.py rename to tests/testgen/testgen-STORE.py diff --git a/wally-pipelined/testgen/testgen-VIRTUALMEMORY.py b/tests/testgen/testgen-VIRTUALMEMORY.py similarity index 100% rename from wally-pipelined/testgen/testgen-VIRTUALMEMORY.py rename to tests/testgen/testgen-VIRTUALMEMORY.py diff --git a/wally-pipelined/testgen/testgen_footer.S b/tests/testgen/testgen_footer.S similarity index 100% rename from wally-pipelined/testgen/testgen_footer.S rename to tests/testgen/testgen_footer.S diff --git a/wally-pipelined/testgen/testgen_header.S b/tests/testgen/testgen_header.S similarity index 100% rename from wally-pipelined/testgen/testgen_header.S rename to tests/testgen/testgen_header.S diff --git a/wally-pipelined/testgen/virtual_memory_util.py b/tests/testgen/virtual_memory_util.py similarity index 100% rename from wally-pipelined/testgen/virtual_memory_util.py rename to tests/testgen/virtual_memory_util.py From 717f9d48e970db7baaa54bd090e5d948581dbea5 Mon Sep 17 00:00:00 2001 From: David Harris Date: Fri, 29 Oct 2021 22:31:48 -0700 Subject: [PATCH 074/132] tesgen cleanup, added riscv-arch-test D tests --- .../testgen-ADD-SUB-SLT-SLTU-XOR-OR-AND.py | 0 .../testgen-ADDI-XORI-ORI-ANDI-SLTI.py | 0 .../testgen-ADDIW-SLLIW-SRLIW-SRAIW.py | 0 .../testgen-ADDW-SUBW-SLLW-SRLW-SRAW.py | 0 tests/testgen/{ => imperas}/testgen-BRANCH.py | 0 tests/testgen/{ => imperas}/testgen-CSR.py | 0 .../testgen/{ => imperas}/testgen-JAL-JALR.py | 0 tests/testgen/{ => imperas}/testgen-LOAD.py | 0 .../testgen/{ => imperas}/testgen-PIPELINE.py | 0 .../{ => imperas}/testgen-SLL-SRL-SRA.py | 0 .../{ => imperas}/testgen-SLLI-SRLI-SRAI.py | 0 tests/testgen/{ => imperas}/testgen-SLTIU.py | 0 tests/testgen/{ => imperas}/testgen-STORE.py | 0 .../{ => imperas}/testgen-VIRTUALMEMORY.py | 0 tests/testgen/imperas/testgen_footer.S | 18 ++ tests/testgen/imperas/testgen_header.S | 38 ++++ tests/testgen/testgen_footer.S | 54 ++++-- tests/testgen/testgen_header.S | 29 ++- tests/testgen/wally-I.py | 153 +++++++++++++++ .../riscv-test-suite/rv32i_m/I/Makefrag | 2 +- wally-pipelined/regression/sim-wally-batch | 2 +- wally-pipelined/testbench/testbench.sv | 1 + wally-pipelined/testbench/tests.vh | 176 +++++++++++++++++- 23 files changed, 439 insertions(+), 34 deletions(-) rename tests/testgen/{ => imperas}/testgen-ADD-SUB-SLT-SLTU-XOR-OR-AND.py (100%) rename tests/testgen/{ => imperas}/testgen-ADDI-XORI-ORI-ANDI-SLTI.py (100%) rename tests/testgen/{ => imperas}/testgen-ADDIW-SLLIW-SRLIW-SRAIW.py (100%) rename tests/testgen/{ => imperas}/testgen-ADDW-SUBW-SLLW-SRLW-SRAW.py (100%) rename tests/testgen/{ => imperas}/testgen-BRANCH.py (100%) rename tests/testgen/{ => imperas}/testgen-CSR.py (100%) rename tests/testgen/{ => imperas}/testgen-JAL-JALR.py (100%) rename tests/testgen/{ => imperas}/testgen-LOAD.py (100%) rename tests/testgen/{ => imperas}/testgen-PIPELINE.py (100%) rename tests/testgen/{ => imperas}/testgen-SLL-SRL-SRA.py (100%) rename tests/testgen/{ => imperas}/testgen-SLLI-SRLI-SRAI.py (100%) rename tests/testgen/{ => imperas}/testgen-SLTIU.py (100%) rename tests/testgen/{ => imperas}/testgen-STORE.py (100%) rename tests/testgen/{ => imperas}/testgen-VIRTUALMEMORY.py (100%) create mode 100644 tests/testgen/imperas/testgen_footer.S create mode 100644 tests/testgen/imperas/testgen_header.S create mode 100755 tests/testgen/wally-I.py diff --git a/tests/testgen/testgen-ADD-SUB-SLT-SLTU-XOR-OR-AND.py b/tests/testgen/imperas/testgen-ADD-SUB-SLT-SLTU-XOR-OR-AND.py similarity index 100% rename from tests/testgen/testgen-ADD-SUB-SLT-SLTU-XOR-OR-AND.py rename to tests/testgen/imperas/testgen-ADD-SUB-SLT-SLTU-XOR-OR-AND.py diff --git a/tests/testgen/testgen-ADDI-XORI-ORI-ANDI-SLTI.py b/tests/testgen/imperas/testgen-ADDI-XORI-ORI-ANDI-SLTI.py similarity index 100% rename from tests/testgen/testgen-ADDI-XORI-ORI-ANDI-SLTI.py rename to tests/testgen/imperas/testgen-ADDI-XORI-ORI-ANDI-SLTI.py diff --git a/tests/testgen/testgen-ADDIW-SLLIW-SRLIW-SRAIW.py b/tests/testgen/imperas/testgen-ADDIW-SLLIW-SRLIW-SRAIW.py similarity index 100% rename from tests/testgen/testgen-ADDIW-SLLIW-SRLIW-SRAIW.py rename to tests/testgen/imperas/testgen-ADDIW-SLLIW-SRLIW-SRAIW.py diff --git a/tests/testgen/testgen-ADDW-SUBW-SLLW-SRLW-SRAW.py b/tests/testgen/imperas/testgen-ADDW-SUBW-SLLW-SRLW-SRAW.py similarity index 100% rename from tests/testgen/testgen-ADDW-SUBW-SLLW-SRLW-SRAW.py rename to tests/testgen/imperas/testgen-ADDW-SUBW-SLLW-SRLW-SRAW.py diff --git a/tests/testgen/testgen-BRANCH.py b/tests/testgen/imperas/testgen-BRANCH.py similarity index 100% rename from tests/testgen/testgen-BRANCH.py rename to tests/testgen/imperas/testgen-BRANCH.py diff --git a/tests/testgen/testgen-CSR.py b/tests/testgen/imperas/testgen-CSR.py similarity index 100% rename from tests/testgen/testgen-CSR.py rename to tests/testgen/imperas/testgen-CSR.py diff --git a/tests/testgen/testgen-JAL-JALR.py b/tests/testgen/imperas/testgen-JAL-JALR.py similarity index 100% rename from tests/testgen/testgen-JAL-JALR.py rename to tests/testgen/imperas/testgen-JAL-JALR.py diff --git a/tests/testgen/testgen-LOAD.py b/tests/testgen/imperas/testgen-LOAD.py similarity index 100% rename from tests/testgen/testgen-LOAD.py rename to tests/testgen/imperas/testgen-LOAD.py diff --git a/tests/testgen/testgen-PIPELINE.py b/tests/testgen/imperas/testgen-PIPELINE.py similarity index 100% rename from tests/testgen/testgen-PIPELINE.py rename to tests/testgen/imperas/testgen-PIPELINE.py diff --git a/tests/testgen/testgen-SLL-SRL-SRA.py b/tests/testgen/imperas/testgen-SLL-SRL-SRA.py similarity index 100% rename from tests/testgen/testgen-SLL-SRL-SRA.py rename to tests/testgen/imperas/testgen-SLL-SRL-SRA.py diff --git a/tests/testgen/testgen-SLLI-SRLI-SRAI.py b/tests/testgen/imperas/testgen-SLLI-SRLI-SRAI.py similarity index 100% rename from tests/testgen/testgen-SLLI-SRLI-SRAI.py rename to tests/testgen/imperas/testgen-SLLI-SRLI-SRAI.py diff --git a/tests/testgen/testgen-SLTIU.py b/tests/testgen/imperas/testgen-SLTIU.py similarity index 100% rename from tests/testgen/testgen-SLTIU.py rename to tests/testgen/imperas/testgen-SLTIU.py diff --git a/tests/testgen/testgen-STORE.py b/tests/testgen/imperas/testgen-STORE.py similarity index 100% rename from tests/testgen/testgen-STORE.py rename to tests/testgen/imperas/testgen-STORE.py diff --git a/tests/testgen/testgen-VIRTUALMEMORY.py b/tests/testgen/imperas/testgen-VIRTUALMEMORY.py similarity index 100% rename from tests/testgen/testgen-VIRTUALMEMORY.py rename to tests/testgen/imperas/testgen-VIRTUALMEMORY.py diff --git a/tests/testgen/imperas/testgen_footer.S b/tests/testgen/imperas/testgen_footer.S new file mode 100644 index 000000000..f7cc0b18b --- /dev/null +++ b/tests/testgen/imperas/testgen_footer.S @@ -0,0 +1,18 @@ + # --------------------------------------------------------------------------------------------- + + RVTEST_IO_WRITE_STR(x31, "Test End\n") + + # --------------------------------------------------------------------------------------------- + + RV_COMPLIANCE_HALT + +RV_COMPLIANCE_CODE_END + +# Input data section. + .data + + +# Output data section. +RV_COMPLIANCE_DATA_BEGIN + +test_1_res: diff --git a/tests/testgen/imperas/testgen_header.S b/tests/testgen/imperas/testgen_header.S new file mode 100644 index 000000000..118042a5c --- /dev/null +++ b/tests/testgen/imperas/testgen_header.S @@ -0,0 +1,38 @@ +// +// Copyright (C) 2021 Harvey Mudd College & Oklahoma State University +// Adapted from Imperas RISCV-TEST_SUITE +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, +// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software +// is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +// BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT +// OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +/////////////////////////////////////////// + +#include "riscv_test_macros.h" +#include "compliance_test.h" +#include "compliance_io.h" + +RV_COMPLIANCE_RV64M + +RV_COMPLIANCE_CODE_BEGIN + + + RVTEST_IO_INIT + RVTEST_IO_ASSERT_GPR_EQ(x31, x0, 0x00000000) + RVTEST_IO_WRITE_STR(x31, "Test Begin\n") + + # --------------------------------------------------------------------------------------------- + + #RVTEST_IO_WRITE_STR(x31, "# Test group 1\n") + + + # address for test results + la x6, test_1_res + \ No newline at end of file diff --git a/tests/testgen/testgen_footer.S b/tests/testgen/testgen_footer.S index f7cc0b18b..b0137b792 100644 --- a/tests/testgen/testgen_footer.S +++ b/tests/testgen/testgen_footer.S @@ -1,18 +1,46 @@ - # --------------------------------------------------------------------------------------------- - - RVTEST_IO_WRITE_STR(x31, "Test End\n") +RVTEST_CODE_END +RVMODEL_HALT - # --------------------------------------------------------------------------------------------- +RVTEST_DATA_BEGIN +.align 4 +rvtest_data: +.word 0xbabecafe +RVTEST_DATA_END - RV_COMPLIANCE_HALT - -RV_COMPLIANCE_CODE_END - -# Input data section. - .data +RVMODEL_DATA_BEGIN -# Output data section. -RV_COMPLIANCE_DATA_BEGIN +signature_x8_0: + .fill 0*(XLEN/32),4,0xdeadbeef -test_1_res: + +signature_x8_1: + .fill 19*(XLEN/32),4,0xdeadbeef + + +signature_x1_0: + .fill 256*(XLEN/32),4,0xdeadbeef + + +signature_x1_1: + .fill 256*(XLEN/32),4,0xdeadbeef + + +signature_x1_2: + .fill 148*(XLEN/32),4,0xdeadbeef + +#ifdef rvtest_mtrap_routine + +mtrap_sigptr: + .fill 64*(XLEN/32),4,0xdeadbeef + +#endif + +#ifdef rvtest_gpr_save + +gpr_save: + .fill 32*(XLEN/32),4,0xdeadbeef + +#endif + +RVMODEL_DATA_END diff --git a/tests/testgen/testgen_header.S b/tests/testgen/testgen_header.S index 118042a5c..3b3bd6876 100644 --- a/tests/testgen/testgen_header.S +++ b/tests/testgen/testgen_header.S @@ -1,6 +1,5 @@ // // Copyright (C) 2021 Harvey Mudd College & Oklahoma State University -// Adapted from Imperas RISCV-TEST_SUITE // // Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation // files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, @@ -15,24 +14,18 @@ // OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. /////////////////////////////////////////// -#include "riscv_test_macros.h" -#include "compliance_test.h" -#include "compliance_io.h" +#include "model_test.h" +#include "arch_test.h" +RVTEST_ISA("RV64I") -RV_COMPLIANCE_RV64M +.section .text.init +.globl rvtest_entry_point +rvtest_entry_point: +RVMODEL_BOOT +RVTEST_CODE_BEGIN -RV_COMPLIANCE_CODE_BEGIN +#ifdef TEST_CASE_1 +RVTEST_CASE(0,"//check ISA:=regex(.*64.*);check ISA:=regex(.*I.*);def TEST_CASE_1=True;",add) - RVTEST_IO_INIT - RVTEST_IO_ASSERT_GPR_EQ(x31, x0, 0x00000000) - RVTEST_IO_WRITE_STR(x31, "Test Begin\n") - - # --------------------------------------------------------------------------------------------- - - #RVTEST_IO_WRITE_STR(x31, "# Test group 1\n") - - - # address for test results - la x6, test_1_res - \ No newline at end of file +RVTEST_SIGBASE( x8,signature_x8_1) diff --git a/tests/testgen/wally-I.py b/tests/testgen/wally-I.py new file mode 100755 index 000000000..b186e21c5 --- /dev/null +++ b/tests/testgen/wally-I.py @@ -0,0 +1,153 @@ +#!/usr/bin/python3 +################################## +# wally-I.py +# +# David_Harris@hmc.edu 27 October 2021 +# +# Generate directed and random test vectors for RISC-V Design Validation. +################################## + +################################## +# libraries +################################## +from datetime import datetime +from random import randint +from random import seed +from random import getrandbits + +################################## +# functions +################################## + +def twoscomp(a): + amsb = a >> (xlen-1) + alsbs = ((1 << (xlen-1)) - 1) & a + if (amsb): + asigned = a - (1<> 32) + "\n" + r.write(line) + testnum = testnum+1 + +################################## +# main body +################################## + +# change these to suite your tests +instrs = ["ADD", "SUB", "SLT", "SLTU", "XOR", "OR", "AND"] +author = "David_Harris@hmc.edu" +xlens = [32, 64] +numrand = 100 + +# setup +seed(0) # make tests reproducible + +# generate files for each test +for xlen in xlens: + formatstrlen = str(int(xlen/4)) + formatstr = "0x{:0" + formatstrlen + "x}" # format as xlen-bit hexadecimal number + formatrefstr = "{:08x}" # format as xlen-bit hexadecimal number with no leading 0x + if (xlen == 32): + storecmd = "sw" + wordsize = 4 + else: + storecmd = "sd" + wordsize = 8 + pathname = "../wally-riscv-arch-test/riscv-test-suite/rv" + str(xlen) + "i_m/I/" + fname = pathname + "src/WALLY-PIPELINE.S" + testnum = 0 + + # print custom header part + f = open(fname, "w") +# r = open(refname, "w") + line = "///////////////////////////////////////////\n" + f.write(line) + lines="// "+fname+ "\n// " + author + "\n" + f.write(lines) + line ="// Created " + str(datetime.now()) + f.write(line) + + # insert generic header + h = open("testgen_header.S", "r") + for line in h: + f.write(line) + + # print directed and random test vectors + # for a in corners: + # for b in corners: + # writeVector(a, b, storecmd, xlen) + # for i in range(0,numrand): + # a = getrandbits(xlen) + # b = getrandbits(xlen) + # writeVector(a, b, storecmd, xlen) + + + # print footer + h = open("testgen_footer.S", "r") + for line in h: + f.write(line) + + # Finish +# lines = ".fill " + str(testnum) + ", " + str(wordsize) + ", -1\n" +# lines = lines + "\nRV_COMPLIANCE_DATA_END\n" + f.write(lines) + f.close() +# r.close() + + + + diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv32i_m/I/Makefrag b/tests/wally-riscv-arch-test/riscv-test-suite/rv32i_m/I/Makefrag index 9331e7e14..e2cdf44da 100644 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv32i_m/I/Makefrag +++ b/tests/wally-riscv-arch-test/riscv-test-suite/rv32i_m/I/Makefrag @@ -28,7 +28,7 @@ # Description: Makefrag for RV32I architectural tests rv32i_sc_tests = \ - + WALLY-PIPELINE \ rv32i_tests = $(addsuffix .elf, $(rv32i_sc_tests)) diff --git a/wally-pipelined/regression/sim-wally-batch b/wally-pipelined/regression/sim-wally-batch index 4b627b768..c603b8432 100755 --- a/wally-pipelined/regression/sim-wally-batch +++ b/wally-pipelined/regression/sim-wally-batch @@ -1,3 +1,3 @@ vsim -c < Date: Sat, 30 Oct 2021 07:26:18 -0700 Subject: [PATCH 075/132] Fixed exe2memfile parsing of weird line in arch64d test --- wally-pipelined/bin/exe2memfile.pl | 3 +- wally-pipelined/testbench/tests.vh | 156 ++++++++++++++--------------- 2 files changed, 80 insertions(+), 79 deletions(-) diff --git a/wally-pipelined/bin/exe2memfile.pl b/wally-pipelined/bin/exe2memfile.pl index e681f8419..26d0d2f42 100755 --- a/wally-pipelined/bin/exe2memfile.pl +++ b/wally-pipelined/bin/exe2memfile.pl @@ -62,7 +62,8 @@ for(my $i=0; $i<=$#ARGV; $i++) { } if (/Disassembly of section .data:/) { $mode = 1;} } elsif ($mode == 1) { # Parse data segment - if (/^\s*(\S\S\S\S\S\S\S\S):\s+(.*)/) { +# if (/^\s*(\S\S\S\S\S\S\S\S):\s+(.*)/) { # changed to \t 30 Oct 2021 dmh to fix parsing issue in d_fmadd_b17 + if (/^\s*(\S\S\S\S\S\S\S\S):\t+(.*)/) { $address = &fixadr($1); # print "addresss $address maxaddress $maxaddress\n"; if ($address > $maxaddress) { $maxaddress = $address; } diff --git a/wally-pipelined/testbench/tests.vh b/wally-pipelined/testbench/tests.vh index c99d64b62..42b1fc0b5 100644 --- a/wally-pipelined/testbench/tests.vh +++ b/wally-pipelined/testbench/tests.vh @@ -640,85 +640,85 @@ string imperas32f[] = '{ string arch64d[] = '{ `RISCVARCHTEST, "rv64i_m/D/d_fadd_b10-01", "8690", - "rv64i_m/D/d_fadd_b1-01", "8430", - "rv64i_m/D/d_fadd_b11-01", "74da0", - "rv64i_m/D/d_fadd_b12-01", "2350", - "rv64i_m/D/d_fadd_b13-01", "3cb0", - "rv64i_m/D/d_fadd_b2-01", "5160", - "rv64i_m/D/d_fadd_b3-01", "d640", - "rv64i_m/D/d_fadd_b4-01", "3900", - "rv64i_m/D/d_fadd_b5-01", "3d50", - "rv64i_m/D/d_fadd_b7-01", "5530", - "rv64i_m/D/d_fadd_b8-01", "11c10", +// "rv64i_m/D/d_fadd_b1-01", "8430", +// "rv64i_m/D/d_fadd_b11-01", "74da0", +// "rv64i_m/D/d_fadd_b12-01", "2350", +// "rv64i_m/D/d_fadd_b13-01", "3cb0", +// "rv64i_m/D/d_fadd_b2-01", "5160", +// "rv64i_m/D/d_fadd_b3-01", "d640", +// "rv64i_m/D/d_fadd_b4-01", "3900", +// "rv64i_m/D/d_fadd_b5-01", "3d50", +// "rv64i_m/D/d_fadd_b7-01", "5530", +// "rv64i_m/D/d_fadd_b8-01", "11c10", "rv64i_m/D/d_fclass_b1-01", "2110", - "rv64i_m/D/d_fcvt.d.l_b25-01", "2110", - "rv64i_m/D/d_fcvt.d.l_b26-01", "2220", - "rv64i_m/D/d_fcvt.d.lu_b25-01", "2110", - "rv64i_m/D/d_fcvt.d.lu_b26-01", "2220", - "rv64i_m/D/d_fcvt.d.s_b1-01", "2110", - "rv64i_m/D/d_fcvt.d.s_b22-01", "2110", - "rv64i_m/D/d_fcvt.d.s_b23-01", "2110", - "rv64i_m/D/d_fcvt.d.s_b24-01", "2110", - "rv64i_m/D/d_fcvt.d.s_b27-01", "2110", - "rv64i_m/D/d_fcvt.d.s_b28-01", "2110", - "rv64i_m/D/d_fcvt.d.s_b29-01", "2110", - "rv64i_m/D/d_fcvt.d.w_b25-01", "2120", - "rv64i_m/D/d_fcvt.d.w_b26-01", "2220", - "rv64i_m/D/d_fcvt.d.wu_b25-01", "2110", - "rv64i_m/D/d_fcvt.d.wu_b26-01", "2220", - "rv64i_m/D/d_fcvt.l.d_b1-01", "2120", - "rv64i_m/D/d_fcvt.l.d_b22-01", "2260", - "rv64i_m/D/d_fcvt.l.d_b23-01", "2180", - "rv64i_m/D/d_fcvt.l.d_b24-01", "2360", - "rv64i_m/D/d_fcvt.l.d_b27-01", "2110", - "rv64i_m/D/d_fcvt.l.d_b28-01", "2120", - "rv64i_m/D/d_fcvt.l.d_b29-01", "22a0", - "rv64i_m/D/d_fcvt.lu.d_b1-01", "2120", - "rv64i_m/D/d_fcvt.lu.d_b22-01", "2260", - "rv64i_m/D/d_fcvt.lu.d_b23-01", "2180", - "rv64i_m/D/d_fcvt.lu.d_b24-01", "2360", - "rv64i_m/D/d_fcvt.lu.d_b27-01", "2120", - "rv64i_m/D/d_fcvt.lu.d_b28-01", "2120", - "rv64i_m/D/d_fcvt.lu.d_b29-01", "22a0", - "rv64i_m/D/d_fcvt.s.d_b1-01", "2110", - "rv64i_m/D/d_fcvt.s.d_b22-01", "2110", - "rv64i_m/D/d_fcvt.s.d_b23-01", "2180", - "rv64i_m/D/d_fcvt.s.d_b24-01", "2360", - "rv64i_m/D/d_fcvt.s.d_b27-01", "2110", - "rv64i_m/D/d_fcvt.s.d_b28-01", "2110", - "rv64i_m/D/d_fcvt.s.d_b29-01", "22a0", - "rv64i_m/D/d_fcvt.w.d_b1-01", "2120", - "rv64i_m/D/d_fcvt.w.d_b22-01", "2160", - "rv64i_m/D/d_fcvt.w.d_b23-01", "2180", - "rv64i_m/D/d_fcvt.w.d_b24-01", "2360", - "rv64i_m/D/d_fcvt.w.d_b27-01", "2120", - "rv64i_m/D/d_fcvt.w.d_b28-01", "2120", - "rv64i_m/D/d_fcvt.w.d_b29-01", "22a0", - "rv64i_m/D/d_fcvt.wu.d_b1-01", "2120", - "rv64i_m/D/d_fcvt.wu.d_b22-01", "2160", - "rv64i_m/D/d_fcvt.wu.d_b23-01", "2180", - "rv64i_m/D/d_fcvt.wu.d_b24-01", "2360", - "rv64i_m/D/d_fcvt.wu.d_b27-01", "2120", - "rv64i_m/D/d_fcvt.wu.d_b28-01", "2120", - "rv64i_m/D/d_fcvt.wu.d_b29-01", "22a0", - "rv64i_m/D/d_fdiv_b1-01", "8430", - "rv64i_m/D/d_fdiv_b20-01", "3fa0", - "rv64i_m/D/d_fdiv_b2-01", "5170", - "rv64i_m/D/d_fdiv_b21-01", "8a70", - "rv64i_m/D/d_fdiv_b3-01", "d630", - "rv64i_m/D/d_fdiv_b4-01", "38f0", - "rv64i_m/D/d_fdiv_b5-01", "3d50", - "rv64i_m/D/d_fdiv_b6-01", "38f0", - "rv64i_m/D/d_fdiv_b7-01", "5530", - "rv64i_m/D/d_fdiv_b8-01", "11c10", - "rv64i_m/D/d_fdiv_b9-01", "1b0f0", - "rv64i_m/D/d_feq_b1-01", "7430", - "rv64i_m/D/d_feq_b19-01", "c4c0", - "rv64i_m/D/d_fld-align-01", "2010", - "rv64i_m/D/d_fle_b1-01", "7430", - "rv64i_m/D/d_fle_b19-01", "c4c0", - "rv64i_m/D/d_flt_b1-01", "7430", - "rv64i_m/D/d_flt_b19-01", "d800", + // "rv64i_m/D/d_fcvt.d.l_b25-01", "2110", + // "rv64i_m/D/d_fcvt.d.l_b26-01", "2220", + // "rv64i_m/D/d_fcvt.d.lu_b25-01", "2110", + // "rv64i_m/D/d_fcvt.d.lu_b26-01", "2220", + // "rv64i_m/D/d_fcvt.d.s_b1-01", "2110", + // "rv64i_m/D/d_fcvt.d.s_b22-01", "2110", + // "rv64i_m/D/d_fcvt.d.s_b23-01", "2110", + // "rv64i_m/D/d_fcvt.d.s_b24-01", "2110", + // "rv64i_m/D/d_fcvt.d.s_b27-01", "2110", + // "rv64i_m/D/d_fcvt.d.s_b28-01", "2110", + // "rv64i_m/D/d_fcvt.d.s_b29-01", "2110", + // "rv64i_m/D/d_fcvt.d.w_b25-01", "2120", + // "rv64i_m/D/d_fcvt.d.w_b26-01", "2220", + // "rv64i_m/D/d_fcvt.d.wu_b25-01", "2110", + // "rv64i_m/D/d_fcvt.d.wu_b26-01", "2220", + // "rv64i_m/D/d_fcvt.l.d_b1-01", "2120", + // "rv64i_m/D/d_fcvt.l.d_b22-01", "2260", + // "rv64i_m/D/d_fcvt.l.d_b23-01", "2180", + // "rv64i_m/D/d_fcvt.l.d_b24-01", "2360", + // "rv64i_m/D/d_fcvt.l.d_b27-01", "2110", + // "rv64i_m/D/d_fcvt.l.d_b28-01", "2120", + // "rv64i_m/D/d_fcvt.l.d_b29-01", "22a0", + // "rv64i_m/D/d_fcvt.lu.d_b1-01", "2120", + // "rv64i_m/D/d_fcvt.lu.d_b22-01", "2260", + // "rv64i_m/D/d_fcvt.lu.d_b23-01", "2180", + // "rv64i_m/D/d_fcvt.lu.d_b24-01", "2360", + // "rv64i_m/D/d_fcvt.lu.d_b27-01", "2120", + // "rv64i_m/D/d_fcvt.lu.d_b28-01", "2120", + // "rv64i_m/D/d_fcvt.lu.d_b29-01", "22a0", + // "rv64i_m/D/d_fcvt.s.d_b1-01", "2110", + // "rv64i_m/D/d_fcvt.s.d_b22-01", "2110", + // "rv64i_m/D/d_fcvt.s.d_b23-01", "2180", + // "rv64i_m/D/d_fcvt.s.d_b24-01", "2360", + // "rv64i_m/D/d_fcvt.s.d_b27-01", "2110", + // "rv64i_m/D/d_fcvt.s.d_b28-01", "2110", + // "rv64i_m/D/d_fcvt.s.d_b29-01", "22a0", + // "rv64i_m/D/d_fcvt.w.d_b1-01", "2120", + // "rv64i_m/D/d_fcvt.w.d_b22-01", "2160", + // "rv64i_m/D/d_fcvt.w.d_b23-01", "2180", + // "rv64i_m/D/d_fcvt.w.d_b24-01", "2360", + // "rv64i_m/D/d_fcvt.w.d_b27-01", "2120", + // "rv64i_m/D/d_fcvt.w.d_b28-01", "2120", + // "rv64i_m/D/d_fcvt.w.d_b29-01", "22a0", + // "rv64i_m/D/d_fcvt.wu.d_b1-01", "2120", + // "rv64i_m/D/d_fcvt.wu.d_b22-01", "2160", + // "rv64i_m/D/d_fcvt.wu.d_b23-01", "2180", + // "rv64i_m/D/d_fcvt.wu.d_b24-01", "2360", + // "rv64i_m/D/d_fcvt.wu.d_b27-01", "2120", + // "rv64i_m/D/d_fcvt.wu.d_b28-01", "2120", + // "rv64i_m/D/d_fcvt.wu.d_b29-01", "22a0", + // "rv64i_m/D/d_fdiv_b1-01", "8430", + // "rv64i_m/D/d_fdiv_b20-01", "3fa0", + // "rv64i_m/D/d_fdiv_b2-01", "5170", + // "rv64i_m/D/d_fdiv_b21-01", "8a70", + // "rv64i_m/D/d_fdiv_b3-01", "d630", + // "rv64i_m/D/d_fdiv_b4-01", "38f0", + // "rv64i_m/D/d_fdiv_b5-01", "3d50", + // "rv64i_m/D/d_fdiv_b6-01", "38f0", + // "rv64i_m/D/d_fdiv_b7-01", "5530", + // "rv64i_m/D/d_fdiv_b8-01", "11c10", + // "rv64i_m/D/d_fdiv_b9-01", "1b0f0", + // "rv64i_m/D/d_feq_b1-01", "7430", + // "rv64i_m/D/d_feq_b19-01", "c4c0", + // "rv64i_m/D/d_fld-align-01", "2010", + // "rv64i_m/D/d_fle_b1-01", "7430", + // "rv64i_m/D/d_fle_b19-01", "c4c0", + // "rv64i_m/D/d_flt_b1-01", "7430", + // "rv64i_m/D/d_flt_b19-01", "d800", "rv64i_m/D/d_fmadd_b14-01", "3fd0", "rv64i_m/D/d_fmadd_b16-01", "43b0", "rv64i_m/D/d_fmadd_b17-01", "43b0", From e29c5776277e8ba1b67d7f39bc4258106e403504 Mon Sep 17 00:00:00 2001 From: davidharrishmc <74973295+davidharrishmc@users.noreply.github.com> Date: Sat, 30 Oct 2021 07:34:53 -0700 Subject: [PATCH 076/132] Added instructions for rv64i_m/D --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 420ea87a1..975b8f141 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,8 @@ git clone https://github.com/riscv-software-src/riscv-isa-sim cd riscv-isa-sim cp -r arch_test_target/spike/device/rv32i_m/I arch_test_target/spike/device/rv32i_m/F +cp -r arch_test_target/spike/device/rv32i_m/I arch_test_target/spike/device/rv64i_m/D + mkdir build cd build set RISCV=/cad/riscv/gcc/bin (or whatever your path is) From 38d26e857bc7468a3f101def7d207d984ea255cc Mon Sep 17 00:00:00 2001 From: bbracker Date: Sun, 31 Oct 2021 18:33:43 -0700 Subject: [PATCH 077/132] fix buildroot graphical sim --- wally-pipelined/regression/sim-buildroot | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wally-pipelined/regression/sim-buildroot b/wally-pipelined/regression/sim-buildroot index 04c9919cd..8814ca6f3 100755 --- a/wally-pipelined/regression/sim-buildroot +++ b/wally-pipelined/regression/sim-buildroot @@ -30,4 +30,4 @@ echo "INSTR_LIMIT = ${INSTR_LIMIT}" echo "INSTR_WAVEON = ${INSTR_WAVEON}" echo "CHECKPOINT = ${CHECKPOINT}" -vsim -do wally-buildroot.do $INSTR_LIMIT $INSTR_WAVEON $CHECKPOINT +vsim -do "do ./wally-buildroot.do $INSTR_LIMIT $INSTR_WAVEON $CHECKPOINT" From c306884e2c08e66aab6ff944a42a58b7a2ec51d0 Mon Sep 17 00:00:00 2001 From: David Harris Date: Mon, 1 Nov 2021 08:48:46 -0700 Subject: [PATCH 078/132] Adding custom Wally test infrastructure --- .../{wally-I.py => wally-I-PIPELINE.py} | 2 +- .../rv32i_m/I/src/WALLY-PIPELINE.S | 82 +++++++++++++++++++ .../riscv-test-suite/rv64i_m/D/Makefile | 3 + .../riscv-test-suite/rv64i_m/D/Makefrag | 35 ++++++++ .../rv64i_m/I/src/WALLY-PIPELINE.S | 82 +++++++++++++++++++ .../regression/regression-wally.py | 2 +- wally-pipelined/testbench/testbench.sv | 51 ++---------- wally-pipelined/testbench/tests.vh | 30 ++++++- 8 files changed, 242 insertions(+), 45 deletions(-) rename tests/testgen/{wally-I.py => wally-I-PIPELINE.py} (99%) create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32i_m/I/src/WALLY-PIPELINE.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/D/Makefile create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/D/Makefrag create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/I/src/WALLY-PIPELINE.S diff --git a/tests/testgen/wally-I.py b/tests/testgen/wally-I-PIPELINE.py similarity index 99% rename from tests/testgen/wally-I.py rename to tests/testgen/wally-I-PIPELINE.py index b186e21c5..80ac853b1 100755 --- a/tests/testgen/wally-I.py +++ b/tests/testgen/wally-I-PIPELINE.py @@ -1,6 +1,6 @@ #!/usr/bin/python3 ################################## -# wally-I.py +# wally-I-PIPELINE.py # # David_Harris@hmc.edu 27 October 2021 # diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv32i_m/I/src/WALLY-PIPELINE.S b/tests/wally-riscv-arch-test/riscv-test-suite/rv32i_m/I/src/WALLY-PIPELINE.S new file mode 100644 index 000000000..28d36e3ed --- /dev/null +++ b/tests/wally-riscv-arch-test/riscv-test-suite/rv32i_m/I/src/WALLY-PIPELINE.S @@ -0,0 +1,82 @@ +/////////////////////////////////////////// +// ../wally-riscv-arch-test/riscv-test-suite/rv32i_m/I/src/WALLY-PIPELINE.S +// David_Harris@hmc.edu +// Created 2021-11-01 08:46:04.665699// +// Copyright (C) 2021 Harvey Mudd College & Oklahoma State University +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, +// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software +// is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +// BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT +// OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +/////////////////////////////////////////// + +#include "model_test.h" +#include "arch_test.h" +RVTEST_ISA("RV64I") + +.section .text.init +.globl rvtest_entry_point +rvtest_entry_point: +RVMODEL_BOOT +RVTEST_CODE_BEGIN + +#ifdef TEST_CASE_1 + +RVTEST_CASE(0,"//check ISA:=regex(.*64.*);check ISA:=regex(.*I.*);def TEST_CASE_1=True;",add) + +RVTEST_SIGBASE( x8,signature_x8_1) +RVTEST_CODE_END +RVMODEL_HALT + +RVTEST_DATA_BEGIN +.align 4 +rvtest_data: +.word 0xbabecafe +RVTEST_DATA_END + +RVMODEL_DATA_BEGIN + + +signature_x8_0: + .fill 0*(XLEN/32),4,0xdeadbeef + + +signature_x8_1: + .fill 19*(XLEN/32),4,0xdeadbeef + + +signature_x1_0: + .fill 256*(XLEN/32),4,0xdeadbeef + + +signature_x1_1: + .fill 256*(XLEN/32),4,0xdeadbeef + + +signature_x1_2: + .fill 148*(XLEN/32),4,0xdeadbeef + +#ifdef rvtest_mtrap_routine + +mtrap_sigptr: + .fill 64*(XLEN/32),4,0xdeadbeef + +#endif + +#ifdef rvtest_gpr_save + +gpr_save: + .fill 32*(XLEN/32),4,0xdeadbeef + +#endif + +RVMODEL_DATA_END +// ../wally-riscv-arch-test/riscv-test-suite/rv32i_m/I/src/WALLY-PIPELINE.S +// David_Harris@hmc.edu diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/D/Makefile b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/D/Makefile new file mode 100644 index 000000000..a474441d6 --- /dev/null +++ b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/D/Makefile @@ -0,0 +1,3 @@ +include ../../Makefile.include + +$(eval $(call compile_template,-march=rv64id -mabi=lp64 -DXLEN=$(XLEN))) diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/D/Makefrag b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/D/Makefrag new file mode 100644 index 000000000..261a9a852 --- /dev/null +++ b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/D/Makefrag @@ -0,0 +1,35 @@ +# RISC-V Architecture Test RV64IM Makefrag +# +# Copyright (c) 2018, Imperas Software Ltd. +# Copyright (c) 2020, InCore Semiconductors. Pvt. Ltd. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of the Imperas Software Ltd. nor the +# names of its contributors may be used to endorse or promote products +# derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +# IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Imperas Software Ltd. BE LIABLE FOR ANY +# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# Description: Makefrag for RV64IM architectural tests + +rv64im_sc_tests = \ + +rv64im_tests = $(addsuffix .elf, $(rv64im_sc_tests)) + +target_tests += $(rv64im_tests) diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/I/src/WALLY-PIPELINE.S b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/I/src/WALLY-PIPELINE.S new file mode 100644 index 000000000..e7d29cc8d --- /dev/null +++ b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/I/src/WALLY-PIPELINE.S @@ -0,0 +1,82 @@ +/////////////////////////////////////////// +// ../wally-riscv-arch-test/riscv-test-suite/rv64i_m/I/src/WALLY-PIPELINE.S +// David_Harris@hmc.edu +// Created 2021-11-01 08:46:04.668632// +// Copyright (C) 2021 Harvey Mudd College & Oklahoma State University +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, +// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software +// is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +// BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT +// OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +/////////////////////////////////////////// + +#include "model_test.h" +#include "arch_test.h" +RVTEST_ISA("RV64I") + +.section .text.init +.globl rvtest_entry_point +rvtest_entry_point: +RVMODEL_BOOT +RVTEST_CODE_BEGIN + +#ifdef TEST_CASE_1 + +RVTEST_CASE(0,"//check ISA:=regex(.*64.*);check ISA:=regex(.*I.*);def TEST_CASE_1=True;",add) + +RVTEST_SIGBASE( x8,signature_x8_1) +RVTEST_CODE_END +RVMODEL_HALT + +RVTEST_DATA_BEGIN +.align 4 +rvtest_data: +.word 0xbabecafe +RVTEST_DATA_END + +RVMODEL_DATA_BEGIN + + +signature_x8_0: + .fill 0*(XLEN/32),4,0xdeadbeef + + +signature_x8_1: + .fill 19*(XLEN/32),4,0xdeadbeef + + +signature_x1_0: + .fill 256*(XLEN/32),4,0xdeadbeef + + +signature_x1_1: + .fill 256*(XLEN/32),4,0xdeadbeef + + +signature_x1_2: + .fill 148*(XLEN/32),4,0xdeadbeef + +#ifdef rvtest_mtrap_routine + +mtrap_sigptr: + .fill 64*(XLEN/32),4,0xdeadbeef + +#endif + +#ifdef rvtest_gpr_save + +gpr_save: + .fill 32*(XLEN/32),4,0xdeadbeef + +#endif + +RVMODEL_DATA_END +// ../wally-riscv-arch-test/riscv-test-suite/rv64i_m/I/src/WALLY-PIPELINE.S +// David_Harris@hmc.edu diff --git a/wally-pipelined/regression/regression-wally.py b/wally-pipelined/regression/regression-wally.py index 79532c5c8..49ca87129 100755 --- a/wally-pipelined/regression/regression-wally.py +++ b/wally-pipelined/regression/regression-wally.py @@ -41,7 +41,7 @@ def getBuildrootTC(short): BRgrepstr=str(MAX_EXPECTED)+" instructions" return TestCase(name="buildroot",cmd=BRcmd,grepstr=BRgrepstr) -tests64 = ["arch64i", "arch64priv", "arch64c", "arch64m", "imperas64i", "imperas64p", "imperas64mmu", "imperas64f", "imperas64d", "imperas64m", "imperas64a", "imperas64c"] #, "testsBP64"] +tests64 = ["wally64i", "arch64i", "arch64priv", "arch64c", "arch64m", "imperas64i", "imperas64p", "imperas64mmu", "imperas64f", "imperas64d", "imperas64m", "imperas64a", "imperas64c"] #, "testsBP64"] for test in tests64: tc = TestCase( name=test, diff --git a/wally-pipelined/testbench/testbench.sv b/wally-pipelined/testbench/testbench.sv index 8c25f1549..13ba7e16a 100644 --- a/wally-pipelined/testbench/testbench.sv +++ b/wally-pipelined/testbench/testbench.sv @@ -94,7 +94,9 @@ logic [3:0] dummy; "imperas64c": if (`C_SUPPORTED) tests = imperas64c; else tests = imperas64iNOc; "testsBP64": tests = testsBP64; - // *** add arch f and d tests, peripheral tests + "wally64i": tests = wally64i; + "wally64priv": tests = wally64priv; + "wally64periph": tests = wally64periph; endcase end else begin // RV32 case (TEST) @@ -111,51 +113,15 @@ logic [3:0] dummy; "imperas32a": if (`A_SUPPORTED) tests = imperas32a; "imperas32c": if (`C_SUPPORTED) tests = imperas32c; else tests = imperas32iNOc; - // ***add arch f and d tests + "wally32i": tests = wally32i; + "wally32priv": tests = wally32priv; + "wally32periph": tests = wally32periph; endcase end if (tests.size() == 1) begin $display("TEST %s not supported in this configuration", TEST); $stop; end - //if (TEST == "arch-64m") //tests = {archtests64m}; - /* if (`XLEN == 64) begin // RV64 - if (`TESTSBP) begin - tests = testsBP64; - // testsbp should not run the other tests. It starts at address 0 rather than - // 0x8000_0000, the next if must remain an else if. - end else if (TESTSPERIPH) - tests = imperastests64periph; - else if (TESTSPRIV) - tests = imperastests64p; - else begin - tests = {imperastests64p,imperastests64i, imperastests64periph}; - if (`C_SUPPORTED) tests = {tests, imperastests64ic}; - else tests = {tests, imperastests64iNOc}; - if (`F_SUPPORTED) tests = {imperastests64f, tests}; - if (`D_SUPPORTED) tests = {imperastests64d, tests}; - if (`MEM_VIRTMEM) tests = {imperastests64mmu, tests}; - if (`A_SUPPORTED) tests = {imperastests64a, tests}; - if (`M_SUPPORTED) tests = {imperastests64m, tests}; - end - //tests = {imperastests64a, tests}; - end else begin // RV32 - // *** add the 32 bit bp tests - if (TESTSPERIPH) - tests = imperastests32periph; - else if (TESTSPRIV) - tests = imperastests32p; - else begin - tests = {archtests32i, imperastests32i, imperastests32p};//,imperastests32periph}; *** broken at the moment - if (`C_SUPPORTED) tests = {tests, imperastests32ic}; - else tests = {tests, imperastests32iNOc}; - if (`F_SUPPORTED) tests = {imperastests32f, tests}; - if (`MEM_VIRTMEM) tests = {imperastests32mmu, tests}; - if (`A_SUPPORTED) tests = {imperastests32a, tests}; - if (`M_SUPPORTED) tests = {imperastests32m, tests}; - tests = {archtests32i}; - end - end */ end string signame, memfilename, pathname; @@ -203,9 +169,10 @@ logic [3:0] dummy; end end // read test vectors into memory - if (tests[0] == `IMPERASTEST) + pathname = tvpaths[tests[0].atoi()]; +/* if (tests[0] == `IMPERASTEST) pathname = tvpaths[0]; - else pathname = tvpaths[1]; + else pathname = tvpaths[1]; */ memfilename = {pathname, tests[test], ".elf.memfile"}; $readmemh(memfilename, dut.uncore.dtim.RAM); ProgramAddrMapFile = {pathname, tests[test], ".elf.objdump.addr"}; diff --git a/wally-pipelined/testbench/tests.vh b/wally-pipelined/testbench/tests.vh index 42b1fc0b5..b10be8765 100644 --- a/wally-pipelined/testbench/tests.vh +++ b/wally-pipelined/testbench/tests.vh @@ -25,10 +25,12 @@ `define IMPERASTEST "0" `define RISCVARCHTEST "1" +`define WALLYTEST "2" string tvpaths[] = '{ "../../tests/imperas-riscv-tests/work/", - "../../addins/riscv-arch-test/work/" + "../../addins/riscv-arch-test/work/", + "../../tests/wally-riscv-arch-test/work/" }; string imperas32mmu[] = '{ @@ -1067,4 +1069,30 @@ string imperas32f[] = '{ "rv32i_m/I/xori-01", "4010" }; + string wally64i[] = '{ + `WALLYTEST, + "rv64i_m/I/add-01", "9010" +// "rv64i_m/I/pipeline-01", "9010" + }; + + string wally64priv[] = '{ + `WALLYTEST + }; + + string wally64periph[] = '{ + `WALLYTEST + }; + +string wally32i[] = '{ + `WALLYTEST, + "rv64i_m/I/pipeline-01", "9010" + }; + + string wally32priv[] = '{ + `WALLYTEST + }; + + string wally32periph[] = '{ + `WALLYTEST + }; From 4b57af9cffa49964ad2dab7688bc423aa520cbc5 Mon Sep 17 00:00:00 2001 From: David Harris Date: Mon, 1 Nov 2021 12:44:35 -0700 Subject: [PATCH 079/132] PIPELINE test running --- .../{wally-I-PIPELINE.py => PIPELINE.py} | 17 +++- tests/testgen/testgen_footer.S | 1 + tests/wally-riscv-arch-test/Makefile | 2 +- .../rv32i_m/I/src/WALLY-PIPELINE.S | 9 +- .../riscv-test-suite/rv64i_m/I/Makefrag | 1 + .../rv64i_m/I/src/WALLY-PIPELINE.S | 82 ------------------- wally-pipelined/src/fpu/fpudivsqrtrecur.sv | 2 +- wally-pipelined/src/muldiv/div.sv | 9 +- wally-pipelined/testbench/tests.vh | 4 +- 9 files changed, 36 insertions(+), 91 deletions(-) rename tests/testgen/{wally-I-PIPELINE.py => PIPELINE.py} (90%) delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/I/src/WALLY-PIPELINE.S diff --git a/tests/testgen/wally-I-PIPELINE.py b/tests/testgen/PIPELINE.py similarity index 90% rename from tests/testgen/wally-I-PIPELINE.py rename to tests/testgen/PIPELINE.py index 80ac853b1..e6b8bde29 100755 --- a/tests/testgen/wally-I-PIPELINE.py +++ b/tests/testgen/PIPELINE.py @@ -1,6 +1,6 @@ #!/usr/bin/python3 ################################## -# wally-I-PIPELINE.py +# PIPELINE.py # # David_Harris@hmc.edu 27 October 2021 # @@ -108,7 +108,7 @@ for xlen in xlens: storecmd = "sd" wordsize = 8 pathname = "../wally-riscv-arch-test/riscv-test-suite/rv" + str(xlen) + "i_m/I/" - fname = pathname + "src/WALLY-PIPELINE.S" + fname = pathname + "src/PIPELINE.S" testnum = 0 # print custom header part @@ -126,6 +126,19 @@ for xlen in xlens: for line in h: f.write(line) + maxreg = 5 + for i in range(1): + instr = instrs[randint(0,len(instrs)-1)] + reg1 = randint(0,maxreg) + reg2 = randint(0,maxreg) + reg3 = randint(1,maxreg) + line = instr + " x" +str(reg3) + ", x" + str(reg1) + ", x" + str(reg2) + "\n" + f.write(line) + + for i in range(1,maxreg+1): + line = storecmd + " x" + str(i) + ", " + str(wordsize*(i-1)) + "(x8)\n" + f.write(line) + # print directed and random test vectors # for a in corners: # for b in corners: diff --git a/tests/testgen/testgen_footer.S b/tests/testgen/testgen_footer.S index b0137b792..5f72c5b49 100644 --- a/tests/testgen/testgen_footer.S +++ b/tests/testgen/testgen_footer.S @@ -1,3 +1,4 @@ +#endif RVTEST_CODE_END RVMODEL_HALT diff --git a/tests/wally-riscv-arch-test/Makefile b/tests/wally-riscv-arch-test/Makefile index 8e817231d..0f6f2be08 100644 --- a/tests/wally-riscv-arch-test/Makefile +++ b/tests/wally-riscv-arch-test/Makefile @@ -87,7 +87,7 @@ simulate: run -C $(SUITEDIR) verify: simulate - riscv-test-env/verify.sh +# riscv-test-env/verify.sh # dmh 1 November 2021 removed because these tests don't have expected values postverify: ifeq ($(wildcard $(TARGETDIR)/$(RISCV_TARGET)/postverify.sh),) diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv32i_m/I/src/WALLY-PIPELINE.S b/tests/wally-riscv-arch-test/riscv-test-suite/rv32i_m/I/src/WALLY-PIPELINE.S index 28d36e3ed..1fd7866e1 100644 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv32i_m/I/src/WALLY-PIPELINE.S +++ b/tests/wally-riscv-arch-test/riscv-test-suite/rv32i_m/I/src/WALLY-PIPELINE.S @@ -1,7 +1,7 @@ /////////////////////////////////////////// // ../wally-riscv-arch-test/riscv-test-suite/rv32i_m/I/src/WALLY-PIPELINE.S // David_Harris@hmc.edu -// Created 2021-11-01 08:46:04.665699// +// Created 2021-11-01 11:43:39.219968// // Copyright (C) 2021 Harvey Mudd College & Oklahoma State University // // Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation @@ -32,6 +32,13 @@ RVTEST_CODE_BEGIN RVTEST_CASE(0,"//check ISA:=regex(.*64.*);check ISA:=regex(.*I.*);def TEST_CASE_1=True;",add) RVTEST_SIGBASE( x8,signature_x8_1) +AND x1, x3, x3 +sw x1, 0(x8) +sw x2, 4(x8) +sw x3, 8(x8) +sw x4, 12(x8) +sw x5, 16(x8) +#endif RVTEST_CODE_END RVMODEL_HALT diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/I/Makefrag b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/I/Makefrag index f85d344df..d14e2c26b 100644 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/I/Makefrag +++ b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/I/Makefrag @@ -29,6 +29,7 @@ rv64i_sc_tests = \ add-01 \ + PIPELINE \ diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/I/src/WALLY-PIPELINE.S b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/I/src/WALLY-PIPELINE.S deleted file mode 100644 index e7d29cc8d..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/I/src/WALLY-PIPELINE.S +++ /dev/null @@ -1,82 +0,0 @@ -/////////////////////////////////////////// -// ../wally-riscv-arch-test/riscv-test-suite/rv64i_m/I/src/WALLY-PIPELINE.S -// David_Harris@hmc.edu -// Created 2021-11-01 08:46:04.668632// -// Copyright (C) 2021 Harvey Mudd College & Oklahoma State University -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation -// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, -// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software -// is furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS -// BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT -// OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -/////////////////////////////////////////// - -#include "model_test.h" -#include "arch_test.h" -RVTEST_ISA("RV64I") - -.section .text.init -.globl rvtest_entry_point -rvtest_entry_point: -RVMODEL_BOOT -RVTEST_CODE_BEGIN - -#ifdef TEST_CASE_1 - -RVTEST_CASE(0,"//check ISA:=regex(.*64.*);check ISA:=regex(.*I.*);def TEST_CASE_1=True;",add) - -RVTEST_SIGBASE( x8,signature_x8_1) -RVTEST_CODE_END -RVMODEL_HALT - -RVTEST_DATA_BEGIN -.align 4 -rvtest_data: -.word 0xbabecafe -RVTEST_DATA_END - -RVMODEL_DATA_BEGIN - - -signature_x8_0: - .fill 0*(XLEN/32),4,0xdeadbeef - - -signature_x8_1: - .fill 19*(XLEN/32),4,0xdeadbeef - - -signature_x1_0: - .fill 256*(XLEN/32),4,0xdeadbeef - - -signature_x1_1: - .fill 256*(XLEN/32),4,0xdeadbeef - - -signature_x1_2: - .fill 148*(XLEN/32),4,0xdeadbeef - -#ifdef rvtest_mtrap_routine - -mtrap_sigptr: - .fill 64*(XLEN/32),4,0xdeadbeef - -#endif - -#ifdef rvtest_gpr_save - -gpr_save: - .fill 32*(XLEN/32),4,0xdeadbeef - -#endif - -RVMODEL_DATA_END -// ../wally-riscv-arch-test/riscv-test-suite/rv64i_m/I/src/WALLY-PIPELINE.S -// David_Harris@hmc.edu diff --git a/wally-pipelined/src/fpu/fpudivsqrtrecur.sv b/wally-pipelined/src/fpu/fpudivsqrtrecur.sv index 0d1b89ff2..c5a646456 100644 --- a/wally-pipelined/src/fpu/fpudivsqrtrecur.sv +++ b/wally-pipelined/src/fpu/fpudivsqrtrecur.sv @@ -55,7 +55,7 @@ module fpudivsqrtrecur ( // Special Cases // *** shift to handle denorms in hardware - assign FDivSqrtResSign = FDivE & (XSgnE ^ YSgnE); // Sign is negative for division if inputs have opposite signs + assign FDivSqrtResSgn = FDivE & (XSgnE ^ YSgnE); // Sign is negative for division if inputs have opposite signs always_comb begin if (FSqrtE & XSgnE | FDivE & XZeroE & YZeroE | XNaNE | FDivE & YNaNE) FDivSqrtResM = 0; // ***replace with NAN; // *** which one diff --git a/wally-pipelined/src/muldiv/div.sv b/wally-pipelined/src/muldiv/div.sv index b299af032..d7f311a3f 100755 --- a/wally-pipelined/src/muldiv/div.sv +++ b/wally-pipelined/src/muldiv/div.sv @@ -64,7 +64,10 @@ module intdiv #(parameter WIDTH=64) logic [WIDTH-1:0] QT, remT; logic D_NegOne; logic Max_N; - + + logic otfzerov; + logic tcQ; + logic tcR; // Check if negative (two's complement) // If so, convert to positive @@ -182,7 +185,9 @@ module divide4 #(parameter WIDTH=64) logic CshiftQ, CshiftQM; logic [WIDTH+3:0] rem1, rem2, rem3; logic [WIDTH+3:0] SumR, CarryR; - logic [WIDTH:0] Qt; + logic [WIDTH:0] Qt; + + logic ulp; // Create one's complement values of Divisor (for q*D) assign divi1 = {3'h0, op2, 1'b0}; diff --git a/wally-pipelined/testbench/tests.vh b/wally-pipelined/testbench/tests.vh index b10be8765..e897819f7 100644 --- a/wally-pipelined/testbench/tests.vh +++ b/wally-pipelined/testbench/tests.vh @@ -1071,8 +1071,8 @@ string imperas32f[] = '{ string wally64i[] = '{ `WALLYTEST, - "rv64i_m/I/add-01", "9010" -// "rv64i_m/I/pipeline-01", "9010" + "rv64i_m/I/add-01", "9010", + "rv64i_m/I/PIPELINE", "2010" }; string wally64priv[] = '{ From 910957704b26638233c79954e91f6e3b2e5a15e3 Mon Sep 17 00:00:00 2001 From: David Harris Date: Mon, 1 Nov 2021 13:17:49 -0700 Subject: [PATCH 080/132] Add3d wally32i test --- tests/testgen/PIPELINE.py | 8 +- .../riscv-test-suite/rv32i_m/I/Makefrag | 2 +- .../rv32i_m/I/src/WALLY-PIPELINE.S | 89 ------------------- .../regression/regression-wally.py | 2 +- wally-pipelined/testbench/tests.vh | 4 +- 5 files changed, 8 insertions(+), 97 deletions(-) delete mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32i_m/I/src/WALLY-PIPELINE.S diff --git a/tests/testgen/PIPELINE.py b/tests/testgen/PIPELINE.py index e6b8bde29..6432bb023 100755 --- a/tests/testgen/PIPELINE.py +++ b/tests/testgen/PIPELINE.py @@ -88,10 +88,10 @@ def writeVector(a, b, storecmd, xlen): ################################## # change these to suite your tests -instrs = ["ADD", "SUB", "SLT", "SLTU", "XOR", "OR", "AND"] +instrs = ["ADD"] # "SUB", "XOR", "OR", "AND", "SLT", "SLTU", ] author = "David_Harris@hmc.edu" xlens = [32, 64] -numrand = 100 +numrand = 1000 # setup seed(0) # make tests reproducible @@ -127,10 +127,10 @@ for xlen in xlens: f.write(line) maxreg = 5 - for i in range(1): + for i in range(numrand): instr = instrs[randint(0,len(instrs)-1)] reg1 = randint(0,maxreg) - reg2 = randint(0,maxreg) + reg2 = randint(1,maxreg) reg3 = randint(1,maxreg) line = instr + " x" +str(reg3) + ", x" + str(reg1) + ", x" + str(reg2) + "\n" f.write(line) diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv32i_m/I/Makefrag b/tests/wally-riscv-arch-test/riscv-test-suite/rv32i_m/I/Makefrag index e2cdf44da..49f87b201 100644 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv32i_m/I/Makefrag +++ b/tests/wally-riscv-arch-test/riscv-test-suite/rv32i_m/I/Makefrag @@ -28,7 +28,7 @@ # Description: Makefrag for RV32I architectural tests rv32i_sc_tests = \ - WALLY-PIPELINE \ + PIPELINE \ rv32i_tests = $(addsuffix .elf, $(rv32i_sc_tests)) diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv32i_m/I/src/WALLY-PIPELINE.S b/tests/wally-riscv-arch-test/riscv-test-suite/rv32i_m/I/src/WALLY-PIPELINE.S deleted file mode 100644 index 1fd7866e1..000000000 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv32i_m/I/src/WALLY-PIPELINE.S +++ /dev/null @@ -1,89 +0,0 @@ -/////////////////////////////////////////// -// ../wally-riscv-arch-test/riscv-test-suite/rv32i_m/I/src/WALLY-PIPELINE.S -// David_Harris@hmc.edu -// Created 2021-11-01 11:43:39.219968// -// Copyright (C) 2021 Harvey Mudd College & Oklahoma State University -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation -// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, -// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software -// is furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS -// BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT -// OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -/////////////////////////////////////////// - -#include "model_test.h" -#include "arch_test.h" -RVTEST_ISA("RV64I") - -.section .text.init -.globl rvtest_entry_point -rvtest_entry_point: -RVMODEL_BOOT -RVTEST_CODE_BEGIN - -#ifdef TEST_CASE_1 - -RVTEST_CASE(0,"//check ISA:=regex(.*64.*);check ISA:=regex(.*I.*);def TEST_CASE_1=True;",add) - -RVTEST_SIGBASE( x8,signature_x8_1) -AND x1, x3, x3 -sw x1, 0(x8) -sw x2, 4(x8) -sw x3, 8(x8) -sw x4, 12(x8) -sw x5, 16(x8) -#endif -RVTEST_CODE_END -RVMODEL_HALT - -RVTEST_DATA_BEGIN -.align 4 -rvtest_data: -.word 0xbabecafe -RVTEST_DATA_END - -RVMODEL_DATA_BEGIN - - -signature_x8_0: - .fill 0*(XLEN/32),4,0xdeadbeef - - -signature_x8_1: - .fill 19*(XLEN/32),4,0xdeadbeef - - -signature_x1_0: - .fill 256*(XLEN/32),4,0xdeadbeef - - -signature_x1_1: - .fill 256*(XLEN/32),4,0xdeadbeef - - -signature_x1_2: - .fill 148*(XLEN/32),4,0xdeadbeef - -#ifdef rvtest_mtrap_routine - -mtrap_sigptr: - .fill 64*(XLEN/32),4,0xdeadbeef - -#endif - -#ifdef rvtest_gpr_save - -gpr_save: - .fill 32*(XLEN/32),4,0xdeadbeef - -#endif - -RVMODEL_DATA_END -// ../wally-riscv-arch-test/riscv-test-suite/rv32i_m/I/src/WALLY-PIPELINE.S -// David_Harris@hmc.edu diff --git a/wally-pipelined/regression/regression-wally.py b/wally-pipelined/regression/regression-wally.py index 49ca87129..ada9fe383 100755 --- a/wally-pipelined/regression/regression-wally.py +++ b/wally-pipelined/regression/regression-wally.py @@ -49,7 +49,7 @@ for test in tests64: grepstr="All tests ran without failures") configs.append(tc) #tests32 = ["arch32i", "arch32priv", "arch32c", "arch32m", "arch32f", "imperas32i", "imperas32p", "imperas32mmu", "imperas32f", "imperas32m", "imperas32a", "imperas32c"] -tests32 = ["arch32i", "arch32priv", "arch32c", "arch32m", "imperas32i", "imperas32p", "imperas32mmu", "imperas32f", "imperas32m", "imperas32a", "imperas32c"] +tests32 = ["wally32i", "arch32i", "arch32priv", "arch32c", "arch32m", "imperas32i", "imperas32p", "imperas32mmu", "imperas32f", "imperas32m", "imperas32a", "imperas32c"] for test in tests32: tc = TestCase( name=test, diff --git a/wally-pipelined/testbench/tests.vh b/wally-pipelined/testbench/tests.vh index e897819f7..7e33ef68c 100644 --- a/wally-pipelined/testbench/tests.vh +++ b/wally-pipelined/testbench/tests.vh @@ -1072,7 +1072,7 @@ string imperas32f[] = '{ string wally64i[] = '{ `WALLYTEST, "rv64i_m/I/add-01", "9010", - "rv64i_m/I/PIPELINE", "2010" + "rv64i_m/I/PIPELINE", "3010" }; string wally64priv[] = '{ @@ -1085,7 +1085,7 @@ string imperas32f[] = '{ string wally32i[] = '{ `WALLYTEST, - "rv64i_m/I/pipeline-01", "9010" + "rv32i_m/I/PIPELINE", "3010" }; string wally32priv[] = '{ From 0c829dd62cd103a113f60f89dcaf563f09b94870 Mon Sep 17 00:00:00 2001 From: David Harris Date: Mon, 1 Nov 2021 13:24:18 -0700 Subject: [PATCH 081/132] simplified header and footer --- tests/testgen/testgen_footer.S | 1 - tests/testgen/testgen_header.S | 5 ----- 2 files changed, 6 deletions(-) diff --git a/tests/testgen/testgen_footer.S b/tests/testgen/testgen_footer.S index 5f72c5b49..b0137b792 100644 --- a/tests/testgen/testgen_footer.S +++ b/tests/testgen/testgen_footer.S @@ -1,4 +1,3 @@ -#endif RVTEST_CODE_END RVMODEL_HALT diff --git a/tests/testgen/testgen_header.S b/tests/testgen/testgen_header.S index 3b3bd6876..df9f0dcfd 100644 --- a/tests/testgen/testgen_header.S +++ b/tests/testgen/testgen_header.S @@ -16,7 +16,6 @@ #include "model_test.h" #include "arch_test.h" -RVTEST_ISA("RV64I") .section .text.init .globl rvtest_entry_point @@ -24,8 +23,4 @@ rvtest_entry_point: RVMODEL_BOOT RVTEST_CODE_BEGIN -#ifdef TEST_CASE_1 - -RVTEST_CASE(0,"//check ISA:=regex(.*64.*);check ISA:=regex(.*I.*);def TEST_CASE_1=True;",add) - RVTEST_SIGBASE( x8,signature_x8_1) From db268471b6e6ca734ce90378433ce27c6a3c4e9f Mon Sep 17 00:00:00 2001 From: David Harris Date: Mon, 1 Nov 2021 13:36:07 -0700 Subject: [PATCH 082/132] added some missing files --- .../riscv-test-suite/rv32i_m/I/src/PIPELINE.S | 1082 +++++++++++++++++ .../riscv-test-suite/rv64i_m/I/src/PIPELINE.S | 1082 +++++++++++++++++ 2 files changed, 2164 insertions(+) create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv32i_m/I/src/PIPELINE.S create mode 100644 tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/I/src/PIPELINE.S diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv32i_m/I/src/PIPELINE.S b/tests/wally-riscv-arch-test/riscv-test-suite/rv32i_m/I/src/PIPELINE.S new file mode 100644 index 000000000..370fb8f29 --- /dev/null +++ b/tests/wally-riscv-arch-test/riscv-test-suite/rv32i_m/I/src/PIPELINE.S @@ -0,0 +1,1082 @@ +/////////////////////////////////////////// +// ../wally-riscv-arch-test/riscv-test-suite/rv32i_m/I/src/PIPELINE.S +// David_Harris@hmc.edu +// Created 2021-11-01 13:22:54.967257// +// Copyright (C) 2021 Harvey Mudd College & Oklahoma State University +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, +// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software +// is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +// BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT +// OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +/////////////////////////////////////////// + +#include "model_test.h" +#include "arch_test.h" + +.section .text.init +.globl rvtest_entry_point +rvtest_entry_point: +RVMODEL_BOOT +RVTEST_CODE_BEGIN + +RVTEST_SIGBASE( x8,signature_x8_1) +ADD x3, x3, x1 +ADD x4, x3, x3 +ADD x5, x4, x2 +ADD x1, x2, x2 +ADD x2, x4, x5 +ADD x3, x0, x1 +ADD x3, x4, x1 +ADD x2, x2, x5 +ADD x3, x3, x5 +ADD x1, x4, x1 +ADD x5, x5, x1 +ADD x3, x2, x2 +ADD x2, x1, x5 +ADD x4, x1, x5 +ADD x5, x0, x3 +ADD x5, x0, x3 +ADD x5, x5, x1 +ADD x5, x4, x2 +ADD x5, x3, x1 +ADD x2, x2, x5 +ADD x2, x1, x2 +ADD x4, x4, x3 +ADD x2, x0, x2 +ADD x4, x0, x5 +ADD x2, x4, x2 +ADD x4, x4, x3 +ADD x1, x5, x3 +ADD x4, x4, x1 +ADD x1, x1, x2 +ADD x3, x0, x2 +ADD x1, x2, x4 +ADD x1, x1, x2 +ADD x2, x0, x1 +ADD x3, x3, x1 +ADD x1, x0, x5 +ADD x4, x1, x1 +ADD x1, x5, x1 +ADD x3, x4, x1 +ADD x3, x1, x1 +ADD x1, x3, x2 +ADD x1, x0, x5 +ADD x3, x1, x3 +ADD x2, x4, x2 +ADD x2, x5, x2 +ADD x1, x4, x3 +ADD x1, x5, x2 +ADD x5, x5, x4 +ADD x4, x5, x3 +ADD x1, x1, x5 +ADD x3, x5, x1 +ADD x2, x4, x3 +ADD x5, x3, x3 +ADD x5, x5, x3 +ADD x4, x5, x3 +ADD x1, x5, x1 +ADD x2, x5, x3 +ADD x4, x1, x4 +ADD x5, x0, x4 +ADD x2, x5, x1 +ADD x2, x0, x3 +ADD x5, x4, x4 +ADD x3, x0, x4 +ADD x4, x3, x1 +ADD x2, x4, x1 +ADD x3, x3, x4 +ADD x1, x1, x1 +ADD x5, x1, x1 +ADD x2, x2, x3 +ADD x1, x3, x4 +ADD x1, x2, x4 +ADD x3, x1, x5 +ADD x1, x1, x3 +ADD x3, x0, x2 +ADD x1, x2, x5 +ADD x4, x5, x4 +ADD x2, x4, x2 +ADD x1, x4, x3 +ADD x3, x1, x3 +ADD x3, x2, x1 +ADD x2, x0, x3 +ADD x3, x4, x3 +ADD x3, x4, x2 +ADD x1, x3, x2 +ADD x1, x1, x5 +ADD x3, x3, x3 +ADD x5, x0, x1 +ADD x3, x3, x3 +ADD x4, x3, x1 +ADD x3, x0, x3 +ADD x4, x1, x5 +ADD x2, x0, x1 +ADD x1, x0, x4 +ADD x5, x3, x5 +ADD x5, x3, x4 +ADD x3, x3, x1 +ADD x2, x2, x5 +ADD x1, x1, x3 +ADD x5, x5, x1 +ADD x1, x5, x2 +ADD x2, x3, x3 +ADD x2, x1, x5 +ADD x4, x1, x4 +ADD x1, x4, x2 +ADD x4, x1, x5 +ADD x3, x4, x4 +ADD x5, x3, x2 +ADD x3, x0, x3 +ADD x2, x0, x5 +ADD x4, x4, x2 +ADD x1, x5, x4 +ADD x1, x4, x1 +ADD x3, x1, x1 +ADD x2, x3, x3 +ADD x3, x5, x4 +ADD x1, x4, x5 +ADD x5, x5, x5 +ADD x2, x5, x4 +ADD x4, x4, x5 +ADD x5, x3, x5 +ADD x2, x0, x1 +ADD x3, x4, x5 +ADD x3, x0, x4 +ADD x4, x3, x4 +ADD x2, x1, x2 +ADD x1, x5, x3 +ADD x2, x3, x4 +ADD x2, x4, x1 +ADD x5, x3, x1 +ADD x1, x3, x4 +ADD x1, x3, x2 +ADD x2, x4, x5 +ADD x3, x0, x5 +ADD x1, x3, x4 +ADD x5, x4, x4 +ADD x5, x5, x1 +ADD x3, x1, x4 +ADD x1, x4, x2 +ADD x2, x3, x3 +ADD x1, x2, x1 +ADD x1, x3, x3 +ADD x5, x1, x1 +ADD x1, x4, x3 +ADD x4, x3, x5 +ADD x1, x0, x4 +ADD x1, x3, x2 +ADD x1, x3, x4 +ADD x1, x2, x3 +ADD x3, x0, x1 +ADD x2, x2, x3 +ADD x1, x1, x3 +ADD x2, x1, x1 +ADD x3, x5, x1 +ADD x5, x5, x1 +ADD x4, x1, x2 +ADD x3, x3, x3 +ADD x3, x0, x2 +ADD x3, x3, x3 +ADD x1, x1, x5 +ADD x3, x4, x5 +ADD x2, x3, x2 +ADD x2, x2, x5 +ADD x3, x1, x3 +ADD x2, x5, x1 +ADD x1, x3, x1 +ADD x5, x3, x3 +ADD x5, x5, x2 +ADD x1, x2, x3 +ADD x5, x3, x3 +ADD x1, x3, x4 +ADD x4, x5, x3 +ADD x4, x2, x3 +ADD x3, x1, x1 +ADD x2, x4, x5 +ADD x4, x3, x2 +ADD x4, x1, x2 +ADD x3, x4, x2 +ADD x4, x5, x1 +ADD x4, x2, x1 +ADD x3, x0, x2 +ADD x5, x5, x3 +ADD x1, x3, x4 +ADD x4, x1, x5 +ADD x1, x5, x1 +ADD x1, x5, x1 +ADD x5, x3, x5 +ADD x3, x3, x1 +ADD x5, x2, x2 +ADD x3, x0, x1 +ADD x1, x4, x3 +ADD x4, x1, x1 +ADD x2, x2, x5 +ADD x4, x4, x1 +ADD x3, x5, x3 +ADD x2, x2, x5 +ADD x4, x0, x1 +ADD x2, x4, x4 +ADD x4, x2, x4 +ADD x5, x3, x4 +ADD x4, x3, x1 +ADD x1, x1, x4 +ADD x4, x0, x3 +ADD x1, x0, x5 +ADD x1, x5, x4 +ADD x5, x0, x1 +ADD x2, x2, x3 +ADD x2, x4, x3 +ADD x3, x3, x4 +ADD x4, x1, x3 +ADD x2, x1, x4 +ADD x2, x1, x2 +ADD x4, x2, x4 +ADD x2, x3, x2 +ADD x1, x1, x5 +ADD x1, x0, x2 +ADD x2, x2, x1 +ADD x5, x4, x3 +ADD x3, x5, x5 +ADD x1, x3, x4 +ADD x4, x4, x4 +ADD x2, x5, x4 +ADD x1, x2, x1 +ADD x1, x1, x3 +ADD x2, x5, x1 +ADD x5, x3, x2 +ADD x4, x4, x2 +ADD x1, x2, x5 +ADD x5, x2, x3 +ADD x1, x2, x3 +ADD x1, x1, x3 +ADD x2, x4, x3 +ADD x3, x2, x3 +ADD x3, x2, x4 +ADD x5, x0, x3 +ADD x4, x0, x4 +ADD x4, x0, x4 +ADD x1, x3, x1 +ADD x2, x1, x1 +ADD x5, x1, x4 +ADD x4, x3, x5 +ADD x4, x1, x2 +ADD x3, x1, x3 +ADD x5, x3, x1 +ADD x2, x4, x5 +ADD x5, x3, x5 +ADD x3, x4, x3 +ADD x5, x0, x1 +ADD x2, x1, x4 +ADD x5, x2, x1 +ADD x4, x0, x1 +ADD x3, x0, x5 +ADD x3, x5, x5 +ADD x1, x5, x2 +ADD x2, x5, x3 +ADD x3, x5, x4 +ADD x5, x1, x1 +ADD x1, x2, x5 +ADD x2, x3, x2 +ADD x4, x1, x2 +ADD x2, x1, x2 +ADD x5, x2, x5 +ADD x1, x5, x4 +ADD x3, x4, x5 +ADD x1, x3, x3 +ADD x4, x4, x2 +ADD x1, x4, x3 +ADD x4, x1, x5 +ADD x4, x2, x3 +ADD x3, x1, x1 +ADD x2, x2, x4 +ADD x3, x2, x2 +ADD x5, x2, x5 +ADD x3, x5, x2 +ADD x1, x3, x1 +ADD x2, x0, x1 +ADD x3, x0, x1 +ADD x4, x1, x2 +ADD x3, x1, x3 +ADD x4, x5, x3 +ADD x3, x0, x4 +ADD x1, x0, x5 +ADD x1, x3, x2 +ADD x2, x4, x5 +ADD x2, x2, x2 +ADD x5, x0, x2 +ADD x4, x5, x1 +ADD x2, x4, x4 +ADD x4, x2, x3 +ADD x4, x5, x1 +ADD x2, x2, x3 +ADD x3, x1, x5 +ADD x3, x5, x4 +ADD x1, x3, x4 +ADD x5, x4, x3 +ADD x5, x0, x5 +ADD x4, x5, x1 +ADD x4, x5, x1 +ADD x1, x3, x1 +ADD x3, x5, x1 +ADD x5, x5, x2 +ADD x2, x3, x3 +ADD x2, x4, x3 +ADD x3, x1, x2 +ADD x5, x4, x1 +ADD x3, x2, x3 +ADD x4, x2, x4 +ADD x2, x1, x1 +ADD x3, x3, x2 +ADD x3, x5, x4 +ADD x4, x0, x5 +ADD x2, x1, x5 +ADD x5, x5, x2 +ADD x5, x4, x5 +ADD x3, x3, x3 +ADD x3, x0, x4 +ADD x5, x4, x5 +ADD x4, x2, x2 +ADD x2, x0, x5 +ADD x1, x2, x4 +ADD x2, x5, x5 +ADD x2, x2, x5 +ADD x4, x5, x3 +ADD x5, x5, x2 +ADD x4, x2, x2 +ADD x2, x4, x4 +ADD x2, x4, x1 +ADD x4, x3, x1 +ADD x4, x2, x3 +ADD x1, x4, x3 +ADD x1, x0, x4 +ADD x4, x1, x4 +ADD x1, x5, x4 +ADD x2, x2, x5 +ADD x4, x2, x1 +ADD x1, x4, x2 +ADD x3, x4, x3 +ADD x1, x0, x2 +ADD x1, x0, x3 +ADD x3, x3, x2 +ADD x5, x5, x2 +ADD x5, x3, x3 +ADD x2, x1, x2 +ADD x5, x5, x1 +ADD x2, x4, x4 +ADD x1, x4, x1 +ADD x3, x2, x2 +ADD x3, x5, x3 +ADD x5, x1, x4 +ADD x2, x0, x5 +ADD x2, x2, x1 +ADD x4, x4, x2 +ADD x2, x5, x3 +ADD x5, x4, x1 +ADD x1, x4, x3 +ADD x5, x0, x4 +ADD x3, x4, x4 +ADD x1, x4, x3 +ADD x2, x2, x1 +ADD x5, x0, x3 +ADD x1, x0, x4 +ADD x5, x3, x1 +ADD x4, x2, x1 +ADD x5, x3, x3 +ADD x5, x5, x3 +ADD x1, x3, x2 +ADD x4, x2, x2 +ADD x1, x2, x1 +ADD x2, x2, x1 +ADD x3, x4, x1 +ADD x4, x4, x4 +ADD x4, x0, x5 +ADD x1, x0, x5 +ADD x1, x2, x3 +ADD x5, x0, x2 +ADD x4, x0, x1 +ADD x2, x1, x5 +ADD x2, x1, x2 +ADD x4, x0, x4 +ADD x3, x1, x2 +ADD x3, x1, x2 +ADD x4, x1, x4 +ADD x4, x4, x2 +ADD x1, x1, x5 +ADD x2, x5, x2 +ADD x5, x0, x3 +ADD x1, x0, x1 +ADD x1, x1, x4 +ADD x3, x3, x5 +ADD x5, x1, x3 +ADD x1, x4, x4 +ADD x3, x3, x5 +ADD x2, x3, x4 +ADD x4, x3, x2 +ADD x4, x5, x4 +ADD x5, x2, x3 +ADD x5, x4, x1 +ADD x1, x1, x3 +ADD x5, x3, x1 +ADD x1, x1, x4 +ADD x4, x5, x4 +ADD x5, x5, x4 +ADD x3, x1, x2 +ADD x5, x3, x2 +ADD x3, x4, x1 +ADD x4, x1, x3 +ADD x2, x1, x3 +ADD x1, x2, x4 +ADD x1, x4, x4 +ADD x2, x2, x4 +ADD x1, x1, x2 +ADD x4, x1, x1 +ADD x1, x3, x1 +ADD x2, x4, x5 +ADD x2, x1, x2 +ADD x2, x0, x5 +ADD x3, x2, x5 +ADD x4, x5, x1 +ADD x5, x1, x3 +ADD x4, x4, x2 +ADD x3, x1, x4 +ADD x3, x3, x5 +ADD x2, x3, x1 +ADD x5, x0, x5 +ADD x5, x5, x2 +ADD x2, x2, x5 +ADD x1, x0, x1 +ADD x3, x2, x4 +ADD x3, x5, x4 +ADD x2, x5, x4 +ADD x1, x4, x5 +ADD x5, x0, x2 +ADD x4, x4, x2 +ADD x5, x2, x1 +ADD x4, x3, x2 +ADD x5, x3, x1 +ADD x5, x2, x2 +ADD x5, x0, x4 +ADD x4, x2, x5 +ADD x2, x3, x3 +ADD x2, x4, x3 +ADD x4, x4, x2 +ADD x4, x0, x4 +ADD x3, x4, x1 +ADD x3, x1, x1 +ADD x2, x2, x1 +ADD x5, x5, x2 +ADD x4, x0, x1 +ADD x4, x5, x1 +ADD x1, x2, x1 +ADD x3, x1, x4 +ADD x4, x1, x1 +ADD x1, x4, x3 +ADD x4, x2, x5 +ADD x4, x5, x3 +ADD x2, x1, x3 +ADD x3, x5, x3 +ADD x1, x4, x2 +ADD x4, x2, x5 +ADD x3, x5, x3 +ADD x4, x2, x3 +ADD x3, x0, x4 +ADD x3, x3, x2 +ADD x3, x5, x2 +ADD x4, x1, x1 +ADD x4, x3, x5 +ADD x5, x5, x4 +ADD x3, x3, x2 +ADD x3, x0, x4 +ADD x1, x1, x4 +ADD x3, x3, x1 +ADD x2, x5, x3 +ADD x1, x1, x3 +ADD x4, x0, x1 +ADD x5, x1, x1 +ADD x2, x0, x4 +ADD x4, x4, x5 +ADD x2, x4, x2 +ADD x4, x3, x4 +ADD x4, x3, x2 +ADD x1, x4, x3 +ADD x3, x5, x3 +ADD x5, x5, x2 +ADD x1, x2, x1 +ADD x5, x0, x2 +ADD x5, x3, x2 +ADD x5, x1, x4 +ADD x4, x4, x1 +ADD x4, x4, x4 +ADD x3, x3, x5 +ADD x4, x3, x3 +ADD x3, x4, x5 +ADD x3, x3, x2 +ADD x4, x3, x1 +ADD x4, x4, x4 +ADD x3, x3, x2 +ADD x2, x3, x2 +ADD x4, x2, x3 +ADD x2, x4, x1 +ADD x1, x4, x1 +ADD x3, x2, x1 +ADD x2, x3, x4 +ADD x2, x3, x2 +ADD x5, x0, x3 +ADD x2, x5, x3 +ADD x4, x1, x5 +ADD x1, x4, x4 +ADD x3, x3, x5 +ADD x1, x0, x1 +ADD x5, x1, x4 +ADD x5, x5, x1 +ADD x3, x5, x3 +ADD x2, x5, x2 +ADD x4, x4, x3 +ADD x4, x3, x3 +ADD x1, x1, x2 +ADD x5, x3, x4 +ADD x1, x2, x1 +ADD x4, x1, x1 +ADD x1, x4, x2 +ADD x3, x4, x4 +ADD x1, x4, x5 +ADD x1, x4, x4 +ADD x3, x3, x5 +ADD x2, x0, x1 +ADD x3, x4, x5 +ADD x1, x3, x3 +ADD x4, x2, x2 +ADD x3, x5, x5 +ADD x1, x4, x3 +ADD x5, x1, x3 +ADD x4, x0, x5 +ADD x1, x2, x4 +ADD x2, x3, x5 +ADD x4, x0, x1 +ADD x3, x0, x3 +ADD x3, x0, x3 +ADD x5, x4, x2 +ADD x5, x2, x5 +ADD x1, x1, x4 +ADD x3, x2, x2 +ADD x4, x4, x5 +ADD x1, x2, x5 +ADD x4, x4, x2 +ADD x3, x4, x2 +ADD x2, x4, x2 +ADD x5, x3, x2 +ADD x3, x2, x2 +ADD x2, x4, x2 +ADD x3, x2, x2 +ADD x3, x0, x3 +ADD x5, x0, x1 +ADD x2, x2, x1 +ADD x5, x1, x5 +ADD x4, x3, x1 +ADD x5, x0, x1 +ADD x3, x2, x2 +ADD x3, x5, x4 +ADD x3, x0, x1 +ADD x3, x5, x3 +ADD x5, x0, x2 +ADD x1, x2, x5 +ADD x5, x3, x3 +ADD x5, x2, x3 +ADD x4, x3, x1 +ADD x1, x1, x5 +ADD x4, x5, x4 +ADD x3, x1, x1 +ADD x4, x1, x2 +ADD x4, x2, x5 +ADD x4, x4, x2 +ADD x4, x2, x4 +ADD x2, x5, x1 +ADD x2, x1, x2 +ADD x2, x2, x2 +ADD x2, x4, x1 +ADD x2, x5, x4 +ADD x5, x4, x2 +ADD x5, x5, x2 +ADD x4, x5, x1 +ADD x2, x0, x4 +ADD x2, x4, x4 +ADD x4, x4, x5 +ADD x5, x1, x1 +ADD x2, x0, x1 +ADD x4, x3, x3 +ADD x3, x5, x4 +ADD x2, x1, x5 +ADD x5, x0, x1 +ADD x2, x5, x4 +ADD x5, x5, x2 +ADD x2, x0, x5 +ADD x3, x5, x3 +ADD x2, x4, x3 +ADD x5, x3, x2 +ADD x3, x2, x4 +ADD x3, x1, x4 +ADD x4, x2, x5 +ADD x5, x4, x4 +ADD x2, x5, x5 +ADD x3, x3, x2 +ADD x5, x4, x2 +ADD x4, x2, x3 +ADD x1, x3, x5 +ADD x1, x2, x4 +ADD x1, x1, x5 +ADD x2, x0, x2 +ADD x5, x5, x3 +ADD x1, x0, x1 +ADD x4, x2, x2 +ADD x3, x5, x3 +ADD x1, x4, x4 +ADD x5, x1, x1 +ADD x4, x2, x2 +ADD x2, x2, x2 +ADD x5, x5, x2 +ADD x1, x4, x2 +ADD x1, x3, x5 +ADD x4, x4, x1 +ADD x2, x2, x5 +ADD x3, x2, x2 +ADD x5, x3, x4 +ADD x4, x2, x1 +ADD x3, x0, x5 +ADD x4, x4, x4 +ADD x2, x4, x4 +ADD x2, x4, x1 +ADD x4, x2, x1 +ADD x3, x2, x1 +ADD x5, x0, x1 +ADD x4, x1, x1 +ADD x3, x3, x1 +ADD x5, x0, x4 +ADD x4, x0, x2 +ADD x4, x0, x5 +ADD x4, x4, x3 +ADD x4, x4, x1 +ADD x2, x4, x2 +ADD x4, x0, x5 +ADD x2, x2, x3 +ADD x1, x5, x1 +ADD x2, x0, x3 +ADD x1, x4, x2 +ADD x2, x0, x3 +ADD x1, x4, x1 +ADD x4, x1, x3 +ADD x4, x5, x4 +ADD x4, x0, x3 +ADD x4, x3, x5 +ADD x2, x4, x1 +ADD x5, x5, x4 +ADD x2, x1, x1 +ADD x5, x0, x4 +ADD x5, x5, x1 +ADD x3, x4, x3 +ADD x3, x3, x5 +ADD x2, x4, x3 +ADD x3, x5, x4 +ADD x2, x4, x1 +ADD x3, x3, x1 +ADD x5, x4, x2 +ADD x1, x4, x5 +ADD x1, x4, x3 +ADD x3, x1, x3 +ADD x1, x3, x4 +ADD x3, x5, x4 +ADD x5, x0, x4 +ADD x5, x3, x3 +ADD x4, x1, x1 +ADD x3, x4, x4 +ADD x2, x3, x5 +ADD x3, x3, x2 +ADD x2, x2, x2 +ADD x5, x1, x5 +ADD x5, x3, x2 +ADD x3, x4, x2 +ADD x5, x1, x3 +ADD x1, x4, x5 +ADD x2, x3, x2 +ADD x1, x4, x2 +ADD x4, x1, x3 +ADD x3, x4, x2 +ADD x1, x2, x1 +ADD x2, x1, x5 +ADD x5, x0, x3 +ADD x4, x5, x4 +ADD x1, x5, x4 +ADD x2, x0, x3 +ADD x4, x4, x5 +ADD x4, x4, x4 +ADD x1, x1, x1 +ADD x5, x4, x1 +ADD x1, x5, x5 +ADD x1, x0, x1 +ADD x4, x0, x5 +ADD x5, x4, x5 +ADD x2, x2, x3 +ADD x2, x4, x2 +ADD x4, x1, x3 +ADD x3, x1, x5 +ADD x4, x0, x2 +ADD x1, x1, x5 +ADD x2, x4, x4 +ADD x3, x0, x5 +ADD x2, x0, x2 +ADD x2, x3, x2 +ADD x5, x4, x1 +ADD x4, x1, x2 +ADD x2, x5, x4 +ADD x1, x5, x2 +ADD x3, x3, x3 +ADD x5, x1, x3 +ADD x4, x0, x2 +ADD x5, x4, x1 +ADD x2, x5, x4 +ADD x2, x2, x5 +ADD x3, x5, x1 +ADD x5, x2, x4 +ADD x4, x2, x4 +ADD x5, x5, x5 +ADD x3, x5, x1 +ADD x4, x4, x5 +ADD x4, x3, x2 +ADD x4, x0, x5 +ADD x2, x4, x4 +ADD x2, x1, x2 +ADD x4, x4, x4 +ADD x5, x4, x2 +ADD x1, x1, x4 +ADD x2, x0, x5 +ADD x5, x4, x5 +ADD x3, x4, x4 +ADD x1, x5, x5 +ADD x1, x2, x2 +ADD x5, x3, x2 +ADD x2, x0, x2 +ADD x5, x3, x1 +ADD x4, x5, x3 +ADD x1, x5, x3 +ADD x5, x3, x3 +ADD x4, x1, x2 +ADD x3, x0, x4 +ADD x2, x4, x3 +ADD x3, x4, x3 +ADD x2, x2, x2 +ADD x4, x4, x4 +ADD x4, x0, x2 +ADD x5, x2, x2 +ADD x3, x4, x4 +ADD x5, x4, x2 +ADD x1, x2, x2 +ADD x5, x1, x4 +ADD x3, x1, x1 +ADD x3, x4, x1 +ADD x2, x0, x4 +ADD x1, x0, x5 +ADD x3, x2, x5 +ADD x1, x1, x2 +ADD x1, x3, x2 +ADD x2, x1, x5 +ADD x2, x4, x5 +ADD x1, x0, x3 +ADD x5, x4, x4 +ADD x1, x4, x4 +ADD x1, x1, x4 +ADD x4, x2, x3 +ADD x2, x0, x3 +ADD x2, x0, x5 +ADD x4, x4, x2 +ADD x4, x0, x3 +ADD x5, x5, x3 +ADD x1, x1, x3 +ADD x2, x5, x3 +ADD x3, x2, x1 +ADD x4, x3, x1 +ADD x5, x0, x3 +ADD x5, x3, x5 +ADD x3, x1, x1 +ADD x2, x3, x3 +ADD x5, x3, x3 +ADD x4, x1, x5 +ADD x2, x1, x1 +ADD x1, x2, x1 +ADD x5, x2, x3 +ADD x2, x2, x4 +ADD x4, x1, x3 +ADD x4, x1, x3 +ADD x5, x3, x3 +ADD x4, x0, x5 +ADD x5, x0, x1 +ADD x2, x5, x4 +ADD x4, x5, x1 +ADD x5, x5, x3 +ADD x5, x2, x3 +ADD x1, x4, x3 +ADD x3, x0, x1 +ADD x2, x3, x2 +ADD x4, x5, x5 +ADD x4, x4, x2 +ADD x1, x0, x1 +ADD x3, x2, x2 +ADD x1, x4, x3 +ADD x3, x4, x5 +ADD x2, x1, x1 +ADD x4, x1, x2 +ADD x4, x5, x2 +ADD x1, x4, x4 +ADD x1, x0, x3 +ADD x4, x1, x3 +ADD x5, x3, x5 +ADD x1, x1, x4 +ADD x3, x4, x2 +ADD x4, x4, x3 +ADD x3, x5, x3 +ADD x2, x1, x2 +ADD x3, x2, x1 +ADD x2, x4, x3 +ADD x5, x0, x4 +ADD x5, x1, x4 +ADD x1, x4, x2 +ADD x4, x3, x4 +ADD x5, x0, x2 +ADD x2, x0, x4 +ADD x5, x5, x5 +ADD x2, x4, x3 +ADD x5, x3, x1 +ADD x1, x5, x3 +ADD x4, x4, x3 +ADD x3, x5, x5 +ADD x3, x0, x1 +ADD x4, x5, x4 +ADD x4, x2, x4 +ADD x3, x5, x4 +ADD x4, x1, x4 +ADD x5, x5, x5 +ADD x3, x3, x5 +ADD x2, x3, x5 +ADD x4, x0, x4 +ADD x2, x2, x1 +ADD x1, x1, x4 +ADD x4, x1, x2 +ADD x5, x0, x2 +ADD x1, x1, x2 +ADD x2, x5, x4 +ADD x3, x3, x4 +ADD x2, x1, x4 +ADD x4, x5, x1 +ADD x3, x5, x3 +ADD x3, x0, x5 +ADD x1, x3, x1 +ADD x3, x1, x4 +ADD x4, x3, x1 +ADD x3, x0, x1 +ADD x1, x2, x3 +ADD x1, x0, x5 +ADD x4, x4, x2 +ADD x1, x4, x2 +ADD x1, x0, x1 +ADD x4, x1, x1 +ADD x4, x0, x1 +ADD x5, x4, x2 +ADD x4, x1, x3 +ADD x1, x0, x5 +ADD x3, x0, x4 +ADD x5, x4, x5 +ADD x5, x2, x2 +ADD x4, x1, x5 +ADD x3, x5, x3 +ADD x1, x0, x1 +ADD x2, x2, x2 +ADD x4, x0, x4 +ADD x2, x2, x3 +ADD x3, x1, x3 +ADD x5, x5, x1 +ADD x3, x1, x3 +ADD x5, x5, x1 +ADD x1, x2, x4 +ADD x3, x3, x5 +ADD x2, x5, x3 +ADD x5, x0, x4 +ADD x1, x1, x3 +ADD x3, x5, x1 +ADD x2, x0, x3 +ADD x5, x2, x3 +ADD x2, x1, x4 +ADD x1, x3, x3 +ADD x5, x0, x1 +ADD x4, x2, x2 +ADD x2, x4, x5 +ADD x2, x5, x5 +ADD x5, x4, x4 +ADD x1, x2, x3 +ADD x2, x3, x3 +ADD x5, x1, x4 +ADD x5, x5, x2 +ADD x2, x3, x4 +ADD x4, x5, x4 +ADD x3, x5, x2 +ADD x5, x5, x2 +ADD x1, x2, x2 +ADD x4, x2, x2 +ADD x3, x4, x4 +ADD x1, x3, x4 +ADD x3, x4, x3 +ADD x4, x5, x3 +ADD x5, x3, x5 +ADD x4, x3, x3 +ADD x5, x0, x4 +ADD x1, x2, x1 +ADD x5, x5, x4 +ADD x5, x4, x4 +ADD x5, x4, x4 +ADD x5, x4, x1 +ADD x4, x1, x3 +ADD x2, x1, x1 +ADD x4, x5, x2 +ADD x4, x3, x2 +ADD x5, x3, x3 +ADD x5, x0, x3 +ADD x5, x3, x5 +ADD x5, x2, x2 +ADD x3, x1, x1 +ADD x4, x0, x1 +ADD x5, x0, x5 +ADD x5, x1, x4 +ADD x1, x4, x3 +ADD x4, x2, x2 +ADD x1, x0, x3 +ADD x3, x4, x1 +ADD x2, x4, x3 +ADD x4, x5, x4 +ADD x1, x5, x2 +ADD x4, x2, x4 +ADD x4, x3, x2 +ADD x3, x3, x2 +ADD x3, x1, x4 +ADD x3, x2, x4 +ADD x2, x1, x4 +ADD x2, x1, x4 +ADD x5, x4, x5 +ADD x2, x5, x3 +ADD x2, x5, x3 +ADD x1, x2, x1 +ADD x3, x2, x3 +ADD x3, x0, x2 +ADD x2, x1, x5 +ADD x5, x1, x1 +ADD x1, x5, x1 +ADD x4, x5, x1 +ADD x2, x3, x2 +ADD x1, x0, x2 +ADD x3, x4, x1 +ADD x1, x4, x5 +ADD x4, x5, x3 +ADD x3, x4, x4 +ADD x4, x5, x2 +ADD x1, x1, x2 +ADD x3, x5, x5 +ADD x3, x5, x1 +ADD x1, x2, x4 +ADD x4, x2, x2 +ADD x2, x1, x1 +ADD x3, x3, x1 +ADD x2, x0, x3 +ADD x5, x1, x5 +ADD x3, x5, x4 +ADD x3, x4, x3 +ADD x2, x4, x5 +ADD x5, x1, x5 +ADD x2, x2, x4 +ADD x5, x0, x4 +ADD x5, x3, x3 +ADD x4, x1, x3 +ADD x4, x4, x1 +ADD x5, x0, x1 +ADD x1, x1, x1 +ADD x1, x2, x2 +ADD x3, x1, x2 +ADD x5, x5, x5 +ADD x4, x3, x2 +ADD x5, x4, x2 +ADD x4, x3, x1 +ADD x5, x1, x1 +ADD x3, x2, x3 +ADD x4, x2, x5 +ADD x5, x2, x3 +ADD x3, x3, x5 +ADD x4, x5, x3 +ADD x2, x5, x1 +ADD x4, x2, x4 +ADD x2, x1, x4 +ADD x1, x4, x2 +ADD x2, x4, x5 +ADD x1, x5, x4 +ADD x2, x1, x4 +ADD x1, x0, x5 +ADD x5, x5, x1 +ADD x2, x1, x5 +ADD x1, x2, x1 +ADD x3, x3, x2 +ADD x5, x4, x2 +ADD x1, x4, x3 +sw x1, 0(x8) +sw x2, 4(x8) +sw x3, 8(x8) +sw x4, 12(x8) +sw x5, 16(x8) +RVTEST_CODE_END +RVMODEL_HALT + +RVTEST_DATA_BEGIN +.align 4 +rvtest_data: +.word 0xbabecafe +RVTEST_DATA_END + +RVMODEL_DATA_BEGIN + + +signature_x8_0: + .fill 0*(XLEN/32),4,0xdeadbeef + + +signature_x8_1: + .fill 19*(XLEN/32),4,0xdeadbeef + + +signature_x1_0: + .fill 256*(XLEN/32),4,0xdeadbeef + + +signature_x1_1: + .fill 256*(XLEN/32),4,0xdeadbeef + + +signature_x1_2: + .fill 148*(XLEN/32),4,0xdeadbeef + +#ifdef rvtest_mtrap_routine + +mtrap_sigptr: + .fill 64*(XLEN/32),4,0xdeadbeef + +#endif + +#ifdef rvtest_gpr_save + +gpr_save: + .fill 32*(XLEN/32),4,0xdeadbeef + +#endif + +RVMODEL_DATA_END +// ../wally-riscv-arch-test/riscv-test-suite/rv32i_m/I/src/PIPELINE.S +// David_Harris@hmc.edu diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/I/src/PIPELINE.S b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/I/src/PIPELINE.S new file mode 100644 index 000000000..8ecc6a5a8 --- /dev/null +++ b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/I/src/PIPELINE.S @@ -0,0 +1,1082 @@ +/////////////////////////////////////////// +// ../wally-riscv-arch-test/riscv-test-suite/rv64i_m/I/src/PIPELINE.S +// David_Harris@hmc.edu +// Created 2021-11-01 13:22:54.989066// +// Copyright (C) 2021 Harvey Mudd College & Oklahoma State University +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, +// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software +// is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +// BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT +// OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +/////////////////////////////////////////// + +#include "model_test.h" +#include "arch_test.h" + +.section .text.init +.globl rvtest_entry_point +rvtest_entry_point: +RVMODEL_BOOT +RVTEST_CODE_BEGIN + +RVTEST_SIGBASE( x8,signature_x8_1) +ADD x2, x3, x1 +ADD x3, x1, x3 +ADD x3, x1, x4 +ADD x1, x0, x4 +ADD x4, x1, x3 +ADD x5, x2, x4 +ADD x4, x2, x1 +ADD x4, x2, x2 +ADD x2, x2, x3 +ADD x4, x4, x3 +ADD x2, x4, x2 +ADD x1, x5, x4 +ADD x3, x2, x4 +ADD x4, x3, x1 +ADD x3, x1, x3 +ADD x4, x4, x2 +ADD x3, x0, x5 +ADD x3, x3, x1 +ADD x1, x4, x2 +ADD x5, x4, x4 +ADD x2, x3, x3 +ADD x1, x4, x2 +ADD x2, x1, x1 +ADD x1, x5, x2 +ADD x3, x2, x3 +ADD x1, x3, x5 +ADD x2, x3, x4 +ADD x5, x0, x5 +ADD x2, x5, x3 +ADD x2, x2, x2 +ADD x3, x1, x1 +ADD x3, x1, x3 +ADD x1, x3, x1 +ADD x1, x3, x4 +ADD x2, x5, x5 +ADD x4, x1, x3 +ADD x5, x1, x2 +ADD x2, x3, x3 +ADD x1, x3, x1 +ADD x2, x4, x2 +ADD x5, x5, x2 +ADD x1, x4, x5 +ADD x1, x2, x5 +ADD x5, x5, x3 +ADD x1, x4, x3 +ADD x3, x2, x1 +ADD x3, x2, x1 +ADD x1, x2, x1 +ADD x2, x0, x4 +ADD x3, x4, x4 +ADD x4, x1, x5 +ADD x1, x5, x1 +ADD x4, x1, x4 +ADD x5, x5, x2 +ADD x4, x0, x1 +ADD x4, x2, x2 +ADD x4, x5, x3 +ADD x5, x4, x3 +ADD x4, x5, x1 +ADD x2, x4, x1 +ADD x5, x3, x2 +ADD x2, x1, x1 +ADD x3, x2, x3 +ADD x5, x1, x2 +ADD x4, x2, x1 +ADD x2, x4, x4 +ADD x4, x1, x4 +ADD x5, x4, x4 +ADD x5, x0, x5 +ADD x4, x1, x5 +ADD x1, x1, x5 +ADD x3, x1, x2 +ADD x2, x2, x1 +ADD x3, x4, x4 +ADD x1, x2, x2 +ADD x5, x5, x4 +ADD x2, x3, x1 +ADD x1, x1, x3 +ADD x3, x3, x3 +ADD x3, x2, x1 +ADD x2, x1, x3 +ADD x4, x1, x2 +ADD x2, x4, x3 +ADD x5, x3, x1 +ADD x1, x4, x4 +ADD x5, x5, x2 +ADD x1, x5, x1 +ADD x3, x5, x5 +ADD x3, x1, x1 +ADD x3, x1, x4 +ADD x2, x4, x5 +ADD x3, x3, x2 +ADD x1, x2, x3 +ADD x5, x3, x3 +ADD x4, x0, x4 +ADD x3, x2, x5 +ADD x1, x1, x3 +ADD x4, x5, x1 +ADD x4, x0, x1 +ADD x4, x2, x1 +ADD x5, x4, x1 +ADD x5, x3, x4 +ADD x2, x1, x2 +ADD x5, x0, x5 +ADD x4, x2, x3 +ADD x5, x3, x2 +ADD x1, x2, x2 +ADD x5, x1, x1 +ADD x1, x4, x2 +ADD x5, x5, x4 +ADD x5, x2, x3 +ADD x4, x1, x1 +ADD x2, x4, x3 +ADD x4, x2, x1 +ADD x4, x0, x1 +ADD x4, x2, x3 +ADD x2, x2, x3 +ADD x3, x5, x3 +ADD x4, x1, x1 +ADD x1, x3, x5 +ADD x4, x2, x1 +ADD x1, x0, x2 +ADD x2, x1, x3 +ADD x3, x1, x4 +ADD x4, x0, x1 +ADD x2, x5, x4 +ADD x1, x5, x4 +ADD x5, x0, x2 +ADD x1, x0, x3 +ADD x3, x1, x4 +ADD x5, x4, x3 +ADD x5, x5, x4 +ADD x2, x1, x2 +ADD x1, x0, x2 +ADD x1, x4, x5 +ADD x4, x3, x4 +ADD x5, x5, x5 +ADD x2, x5, x5 +ADD x5, x4, x3 +ADD x5, x5, x4 +ADD x5, x3, x5 +ADD x5, x3, x3 +ADD x3, x5, x1 +ADD x3, x5, x5 +ADD x5, x3, x1 +ADD x4, x2, x1 +ADD x1, x5, x1 +ADD x5, x4, x1 +ADD x1, x4, x1 +ADD x1, x2, x4 +ADD x3, x3, x2 +ADD x4, x2, x2 +ADD x3, x3, x3 +ADD x5, x4, x5 +ADD x1, x0, x3 +ADD x3, x3, x4 +ADD x2, x2, x5 +ADD x4, x4, x4 +ADD x1, x3, x1 +ADD x3, x4, x1 +ADD x1, x2, x3 +ADD x2, x5, x3 +ADD x5, x3, x1 +ADD x5, x2, x3 +ADD x1, x0, x3 +ADD x3, x4, x2 +ADD x4, x5, x3 +ADD x2, x3, x2 +ADD x1, x1, x1 +ADD x5, x3, x4 +ADD x1, x2, x1 +ADD x2, x2, x2 +ADD x5, x0, x4 +ADD x2, x2, x1 +ADD x4, x0, x3 +ADD x4, x0, x3 +ADD x2, x2, x3 +ADD x2, x5, x5 +ADD x4, x4, x1 +ADD x2, x0, x5 +ADD x1, x4, x2 +ADD x5, x1, x2 +ADD x4, x4, x4 +ADD x2, x3, x3 +ADD x3, x2, x3 +ADD x1, x1, x4 +ADD x2, x5, x1 +ADD x1, x4, x2 +ADD x5, x4, x2 +ADD x2, x0, x2 +ADD x1, x3, x4 +ADD x5, x2, x3 +ADD x1, x1, x5 +ADD x1, x2, x3 +ADD x4, x2, x1 +ADD x3, x2, x5 +ADD x2, x1, x5 +ADD x3, x4, x1 +ADD x3, x4, x2 +ADD x4, x3, x3 +ADD x3, x3, x4 +ADD x3, x2, x2 +ADD x1, x2, x4 +ADD x3, x2, x3 +ADD x2, x3, x2 +ADD x5, x4, x4 +ADD x2, x5, x5 +ADD x1, x2, x2 +ADD x1, x3, x5 +ADD x5, x3, x3 +ADD x5, x3, x1 +ADD x4, x3, x5 +ADD x4, x4, x4 +ADD x2, x0, x3 +ADD x5, x2, x1 +ADD x4, x1, x5 +ADD x3, x5, x2 +ADD x4, x3, x3 +ADD x3, x4, x2 +ADD x3, x3, x2 +ADD x3, x2, x1 +ADD x1, x5, x2 +ADD x2, x4, x4 +ADD x5, x5, x5 +ADD x5, x1, x4 +ADD x5, x2, x4 +ADD x4, x0, x5 +ADD x2, x2, x3 +ADD x4, x3, x3 +ADD x2, x3, x2 +ADD x4, x3, x1 +ADD x4, x4, x3 +ADD x2, x2, x3 +ADD x2, x1, x3 +ADD x5, x2, x2 +ADD x2, x0, x1 +ADD x3, x4, x3 +ADD x5, x0, x3 +ADD x3, x0, x4 +ADD x5, x5, x5 +ADD x5, x0, x5 +ADD x4, x0, x3 +ADD x2, x2, x5 +ADD x1, x3, x4 +ADD x2, x4, x3 +ADD x4, x0, x2 +ADD x3, x0, x3 +ADD x1, x4, x1 +ADD x5, x1, x3 +ADD x1, x1, x1 +ADD x2, x5, x3 +ADD x4, x4, x1 +ADD x1, x2, x1 +ADD x2, x2, x2 +ADD x2, x3, x4 +ADD x3, x0, x5 +ADD x5, x5, x2 +ADD x3, x4, x3 +ADD x4, x4, x2 +ADD x5, x4, x1 +ADD x1, x2, x4 +ADD x3, x0, x3 +ADD x1, x4, x3 +ADD x1, x2, x5 +ADD x2, x3, x4 +ADD x2, x1, x2 +ADD x1, x0, x5 +ADD x5, x3, x5 +ADD x2, x3, x2 +ADD x3, x2, x2 +ADD x2, x3, x4 +ADD x2, x2, x4 +ADD x5, x5, x2 +ADD x3, x4, x4 +ADD x2, x2, x4 +ADD x5, x5, x5 +ADD x5, x0, x2 +ADD x3, x5, x5 +ADD x2, x2, x4 +ADD x5, x1, x3 +ADD x1, x0, x3 +ADD x5, x5, x1 +ADD x1, x5, x1 +ADD x4, x4, x3 +ADD x5, x5, x1 +ADD x3, x0, x4 +ADD x1, x2, x1 +ADD x5, x5, x1 +ADD x1, x5, x5 +ADD x5, x1, x5 +ADD x1, x2, x1 +ADD x5, x0, x2 +ADD x5, x1, x4 +ADD x1, x3, x2 +ADD x2, x0, x2 +ADD x1, x5, x4 +ADD x2, x1, x1 +ADD x4, x5, x4 +ADD x5, x4, x2 +ADD x2, x4, x4 +ADD x2, x5, x5 +ADD x5, x2, x4 +ADD x5, x5, x4 +ADD x2, x2, x5 +ADD x5, x2, x5 +ADD x2, x2, x3 +ADD x4, x2, x3 +ADD x2, x5, x3 +ADD x2, x2, x3 +ADD x5, x1, x4 +ADD x4, x2, x2 +ADD x5, x1, x3 +ADD x5, x3, x1 +ADD x2, x3, x1 +ADD x3, x4, x3 +ADD x2, x3, x4 +ADD x1, x4, x2 +ADD x4, x3, x3 +ADD x4, x0, x3 +ADD x2, x0, x1 +ADD x4, x1, x3 +ADD x4, x4, x3 +ADD x3, x5, x1 +ADD x2, x4, x2 +ADD x4, x0, x1 +ADD x1, x2, x5 +ADD x2, x3, x5 +ADD x5, x1, x1 +ADD x3, x2, x1 +ADD x5, x5, x4 +ADD x1, x2, x4 +ADD x2, x3, x4 +ADD x5, x5, x1 +ADD x5, x4, x2 +ADD x2, x2, x3 +ADD x1, x2, x3 +ADD x1, x0, x4 +ADD x4, x2, x3 +ADD x2, x0, x5 +ADD x3, x3, x2 +ADD x1, x0, x2 +ADD x5, x2, x4 +ADD x3, x2, x5 +ADD x4, x1, x1 +ADD x2, x5, x1 +ADD x2, x2, x4 +ADD x3, x5, x3 +ADD x5, x4, x1 +ADD x1, x5, x4 +ADD x1, x3, x1 +ADD x4, x5, x2 +ADD x1, x3, x5 +ADD x3, x3, x3 +ADD x4, x0, x5 +ADD x5, x4, x2 +ADD x5, x1, x4 +ADD x5, x1, x5 +ADD x3, x5, x2 +ADD x5, x2, x1 +ADD x4, x5, x3 +ADD x5, x0, x2 +ADD x3, x1, x4 +ADD x4, x0, x4 +ADD x1, x5, x2 +ADD x3, x3, x2 +ADD x5, x4, x3 +ADD x3, x5, x1 +ADD x4, x5, x1 +ADD x2, x2, x3 +ADD x5, x4, x5 +ADD x2, x3, x2 +ADD x4, x1, x2 +ADD x2, x0, x1 +ADD x1, x3, x4 +ADD x3, x4, x3 +ADD x3, x4, x2 +ADD x5, x3, x1 +ADD x3, x0, x4 +ADD x1, x4, x5 +ADD x2, x2, x4 +ADD x1, x2, x1 +ADD x4, x5, x5 +ADD x4, x3, x2 +ADD x2, x4, x4 +ADD x4, x0, x5 +ADD x2, x3, x3 +ADD x3, x4, x5 +ADD x4, x4, x2 +ADD x3, x0, x2 +ADD x4, x4, x3 +ADD x1, x5, x4 +ADD x5, x2, x4 +ADD x1, x3, x5 +ADD x4, x1, x4 +ADD x4, x3, x2 +ADD x5, x0, x3 +ADD x5, x4, x2 +ADD x2, x5, x1 +ADD x5, x4, x5 +ADD x3, x4, x4 +ADD x3, x0, x4 +ADD x1, x3, x1 +ADD x1, x1, x4 +ADD x5, x3, x4 +ADD x1, x0, x3 +ADD x1, x3, x5 +ADD x2, x0, x3 +ADD x2, x1, x2 +ADD x1, x4, x1 +ADD x2, x3, x3 +ADD x1, x0, x5 +ADD x4, x5, x2 +ADD x3, x0, x4 +ADD x1, x4, x2 +ADD x5, x5, x3 +ADD x5, x4, x5 +ADD x3, x4, x5 +ADD x3, x1, x2 +ADD x4, x0, x3 +ADD x5, x4, x3 +ADD x4, x0, x3 +ADD x4, x1, x1 +ADD x5, x4, x3 +ADD x1, x1, x1 +ADD x3, x0, x2 +ADD x3, x5, x1 +ADD x1, x3, x1 +ADD x3, x1, x3 +ADD x1, x1, x5 +ADD x3, x2, x3 +ADD x3, x0, x4 +ADD x2, x2, x1 +ADD x2, x2, x2 +ADD x5, x3, x3 +ADD x5, x1, x2 +ADD x3, x4, x1 +ADD x2, x0, x3 +ADD x2, x4, x5 +ADD x4, x4, x1 +ADD x3, x2, x5 +ADD x5, x5, x5 +ADD x3, x3, x1 +ADD x2, x3, x3 +ADD x4, x2, x4 +ADD x2, x5, x2 +ADD x2, x3, x2 +ADD x4, x0, x3 +ADD x5, x0, x5 +ADD x2, x2, x2 +ADD x3, x3, x4 +ADD x4, x2, x3 +ADD x4, x3, x2 +ADD x3, x3, x5 +ADD x2, x0, x1 +ADD x1, x2, x2 +ADD x1, x2, x5 +ADD x5, x5, x4 +ADD x4, x0, x4 +ADD x2, x1, x1 +ADD x2, x5, x5 +ADD x3, x2, x1 +ADD x3, x5, x1 +ADD x4, x2, x2 +ADD x5, x5, x4 +ADD x4, x5, x4 +ADD x1, x0, x3 +ADD x1, x3, x4 +ADD x1, x4, x1 +ADD x2, x0, x4 +ADD x3, x4, x5 +ADD x1, x0, x5 +ADD x2, x1, x5 +ADD x2, x1, x4 +ADD x5, x4, x1 +ADD x3, x3, x4 +ADD x5, x2, x5 +ADD x1, x1, x5 +ADD x3, x3, x4 +ADD x1, x1, x1 +ADD x2, x3, x4 +ADD x5, x4, x2 +ADD x3, x1, x2 +ADD x1, x3, x5 +ADD x1, x3, x2 +ADD x4, x3, x2 +ADD x4, x0, x3 +ADD x3, x2, x4 +ADD x1, x5, x3 +ADD x2, x3, x3 +ADD x4, x2, x1 +ADD x4, x1, x5 +ADD x3, x5, x4 +ADD x3, x0, x2 +ADD x1, x1, x3 +ADD x5, x1, x2 +ADD x3, x5, x3 +ADD x4, x1, x5 +ADD x5, x1, x4 +ADD x4, x0, x3 +ADD x5, x1, x5 +ADD x3, x5, x3 +ADD x4, x1, x3 +ADD x4, x2, x4 +ADD x4, x1, x5 +ADD x4, x2, x4 +ADD x4, x0, x3 +ADD x3, x5, x1 +ADD x1, x2, x4 +ADD x3, x5, x5 +ADD x3, x4, x4 +ADD x4, x0, x3 +ADD x4, x4, x1 +ADD x3, x5, x1 +ADD x5, x4, x4 +ADD x3, x1, x1 +ADD x2, x4, x5 +ADD x1, x4, x4 +ADD x3, x2, x3 +ADD x5, x3, x2 +ADD x5, x4, x5 +ADD x3, x2, x4 +ADD x2, x2, x2 +ADD x2, x3, x2 +ADD x5, x2, x2 +ADD x4, x1, x1 +ADD x5, x1, x5 +ADD x4, x3, x2 +ADD x1, x4, x1 +ADD x1, x1, x1 +ADD x3, x0, x4 +ADD x3, x3, x4 +ADD x3, x5, x5 +ADD x4, x5, x3 +ADD x2, x0, x5 +ADD x4, x4, x5 +ADD x2, x2, x5 +ADD x1, x0, x2 +ADD x5, x0, x2 +ADD x5, x5, x4 +ADD x5, x5, x1 +ADD x5, x0, x2 +ADD x4, x0, x4 +ADD x3, x0, x1 +ADD x2, x4, x3 +ADD x5, x3, x2 +ADD x4, x4, x5 +ADD x3, x0, x1 +ADD x5, x3, x2 +ADD x4, x0, x1 +ADD x5, x3, x3 +ADD x1, x1, x5 +ADD x4, x4, x2 +ADD x3, x0, x5 +ADD x2, x3, x3 +ADD x5, x3, x4 +ADD x5, x4, x5 +ADD x3, x2, x1 +ADD x3, x0, x5 +ADD x1, x4, x3 +ADD x3, x2, x2 +ADD x3, x1, x4 +ADD x5, x2, x3 +ADD x4, x1, x4 +ADD x4, x3, x4 +ADD x1, x1, x4 +ADD x1, x0, x4 +ADD x5, x0, x2 +ADD x1, x5, x1 +ADD x1, x1, x5 +ADD x1, x3, x2 +ADD x2, x2, x5 +ADD x1, x0, x1 +ADD x1, x4, x1 +ADD x1, x4, x1 +ADD x5, x2, x4 +ADD x5, x2, x3 +ADD x2, x2, x3 +ADD x2, x1, x3 +ADD x4, x1, x5 +ADD x5, x3, x1 +ADD x3, x4, x1 +ADD x1, x0, x4 +ADD x1, x1, x3 +ADD x4, x0, x5 +ADD x2, x3, x4 +ADD x3, x5, x1 +ADD x5, x3, x3 +ADD x1, x5, x1 +ADD x4, x3, x2 +ADD x1, x2, x2 +ADD x3, x2, x5 +ADD x2, x3, x3 +ADD x1, x1, x3 +ADD x2, x0, x1 +ADD x5, x4, x1 +ADD x2, x2, x2 +ADD x2, x3, x4 +ADD x2, x4, x5 +ADD x2, x2, x5 +ADD x4, x5, x3 +ADD x1, x1, x2 +ADD x3, x5, x2 +ADD x2, x0, x1 +ADD x1, x2, x2 +ADD x5, x1, x5 +ADD x4, x1, x2 +ADD x4, x3, x5 +ADD x5, x2, x4 +ADD x5, x0, x4 +ADD x4, x4, x2 +ADD x5, x5, x5 +ADD x3, x5, x2 +ADD x1, x4, x4 +ADD x1, x4, x4 +ADD x2, x1, x3 +ADD x1, x2, x4 +ADD x5, x2, x5 +ADD x4, x1, x1 +ADD x4, x5, x2 +ADD x3, x4, x3 +ADD x3, x5, x5 +ADD x1, x5, x1 +ADD x2, x3, x1 +ADD x3, x0, x3 +ADD x2, x0, x1 +ADD x3, x5, x3 +ADD x5, x0, x5 +ADD x3, x5, x4 +ADD x3, x1, x3 +ADD x2, x1, x4 +ADD x3, x0, x1 +ADD x5, x2, x2 +ADD x3, x5, x4 +ADD x5, x0, x1 +ADD x5, x5, x4 +ADD x3, x1, x5 +ADD x5, x5, x4 +ADD x2, x4, x4 +ADD x3, x2, x1 +ADD x2, x4, x3 +ADD x3, x2, x5 +ADD x1, x3, x4 +ADD x2, x3, x2 +ADD x5, x2, x3 +ADD x5, x5, x4 +ADD x4, x1, x5 +ADD x5, x0, x2 +ADD x1, x2, x5 +ADD x2, x0, x1 +ADD x5, x5, x3 +ADD x3, x0, x4 +ADD x3, x3, x1 +ADD x4, x2, x5 +ADD x2, x5, x5 +ADD x2, x3, x5 +ADD x1, x4, x2 +ADD x3, x0, x4 +ADD x5, x2, x2 +ADD x4, x3, x2 +ADD x3, x1, x1 +ADD x1, x5, x4 +ADD x2, x2, x5 +ADD x5, x0, x2 +ADD x1, x2, x2 +ADD x4, x0, x5 +ADD x5, x1, x3 +ADD x2, x0, x2 +ADD x3, x4, x2 +ADD x2, x1, x3 +ADD x3, x5, x4 +ADD x1, x3, x3 +ADD x2, x0, x5 +ADD x5, x4, x1 +ADD x3, x4, x5 +ADD x4, x1, x5 +ADD x5, x5, x4 +ADD x3, x4, x2 +ADD x2, x1, x2 +ADD x4, x2, x5 +ADD x2, x3, x3 +ADD x4, x1, x2 +ADD x2, x1, x5 +ADD x2, x3, x3 +ADD x4, x5, x3 +ADD x4, x5, x4 +ADD x5, x3, x2 +ADD x5, x2, x5 +ADD x5, x5, x4 +ADD x5, x3, x5 +ADD x5, x0, x1 +ADD x1, x1, x1 +ADD x3, x2, x1 +ADD x4, x0, x4 +ADD x2, x1, x2 +ADD x4, x3, x3 +ADD x3, x4, x1 +ADD x2, x4, x1 +ADD x5, x4, x2 +ADD x5, x5, x4 +ADD x4, x0, x3 +ADD x2, x0, x2 +ADD x2, x2, x2 +ADD x5, x2, x3 +ADD x1, x1, x5 +ADD x3, x4, x4 +ADD x4, x3, x4 +ADD x4, x3, x5 +ADD x5, x1, x1 +ADD x3, x3, x5 +ADD x2, x0, x1 +ADD x2, x3, x5 +ADD x5, x3, x2 +ADD x2, x1, x1 +ADD x1, x1, x5 +ADD x3, x2, x4 +ADD x3, x4, x3 +ADD x1, x2, x4 +ADD x5, x4, x3 +ADD x1, x3, x1 +ADD x5, x1, x5 +ADD x1, x1, x1 +ADD x4, x5, x3 +ADD x4, x2, x3 +ADD x3, x1, x3 +ADD x1, x2, x1 +ADD x5, x0, x3 +ADD x3, x5, x1 +ADD x5, x4, x2 +ADD x2, x4, x2 +ADD x4, x4, x4 +ADD x4, x0, x3 +ADD x3, x5, x3 +ADD x1, x2, x2 +ADD x1, x1, x3 +ADD x2, x1, x5 +ADD x1, x2, x5 +ADD x5, x5, x4 +ADD x4, x5, x5 +ADD x2, x4, x5 +ADD x5, x5, x4 +ADD x1, x4, x2 +ADD x4, x2, x5 +ADD x5, x1, x2 +ADD x2, x4, x5 +ADD x2, x5, x1 +ADD x2, x4, x1 +ADD x2, x0, x1 +ADD x3, x1, x2 +ADD x1, x4, x4 +ADD x3, x4, x1 +ADD x3, x0, x5 +ADD x3, x0, x1 +ADD x2, x5, x1 +ADD x3, x2, x3 +ADD x2, x3, x4 +ADD x4, x0, x1 +ADD x5, x3, x5 +ADD x2, x4, x5 +ADD x1, x5, x1 +ADD x3, x1, x2 +ADD x5, x0, x5 +ADD x3, x1, x3 +ADD x1, x0, x4 +ADD x4, x4, x3 +ADD x1, x3, x3 +ADD x1, x3, x2 +ADD x2, x1, x3 +ADD x2, x5, x5 +ADD x4, x4, x3 +ADD x5, x3, x4 +ADD x1, x1, x2 +ADD x3, x2, x2 +ADD x4, x0, x5 +ADD x2, x4, x3 +ADD x2, x2, x1 +ADD x2, x2, x1 +ADD x1, x4, x1 +ADD x4, x0, x2 +ADD x1, x0, x4 +ADD x5, x4, x5 +ADD x1, x1, x2 +ADD x5, x2, x3 +ADD x4, x4, x5 +ADD x1, x0, x2 +ADD x1, x3, x2 +ADD x1, x2, x2 +ADD x4, x2, x4 +ADD x5, x2, x5 +ADD x4, x3, x3 +ADD x4, x4, x5 +ADD x2, x3, x4 +ADD x5, x5, x3 +ADD x5, x5, x1 +ADD x3, x0, x4 +ADD x3, x5, x2 +ADD x4, x0, x1 +ADD x4, x2, x3 +ADD x2, x3, x5 +ADD x2, x0, x1 +ADD x3, x2, x5 +ADD x4, x3, x2 +ADD x4, x2, x5 +ADD x4, x4, x5 +ADD x1, x4, x5 +ADD x5, x2, x2 +ADD x5, x2, x2 +ADD x3, x2, x4 +ADD x4, x4, x1 +ADD x2, x4, x3 +ADD x3, x4, x5 +ADD x4, x3, x3 +ADD x4, x5, x5 +ADD x1, x2, x1 +ADD x4, x4, x5 +ADD x2, x3, x3 +ADD x3, x2, x3 +ADD x1, x2, x3 +ADD x3, x2, x3 +ADD x4, x3, x5 +ADD x2, x4, x1 +ADD x3, x3, x2 +ADD x1, x2, x1 +ADD x1, x2, x3 +ADD x3, x5, x1 +ADD x2, x3, x2 +ADD x3, x0, x1 +ADD x4, x3, x3 +ADD x2, x4, x5 +ADD x4, x0, x2 +ADD x5, x0, x5 +ADD x4, x4, x2 +ADD x3, x1, x3 +ADD x3, x2, x2 +ADD x4, x0, x3 +ADD x1, x2, x4 +ADD x2, x4, x2 +ADD x3, x1, x5 +ADD x1, x0, x2 +ADD x5, x3, x3 +ADD x2, x5, x3 +ADD x2, x4, x3 +ADD x1, x3, x4 +ADD x1, x5, x4 +ADD x2, x3, x4 +ADD x4, x1, x5 +ADD x4, x0, x3 +ADD x4, x3, x4 +ADD x1, x4, x3 +ADD x2, x0, x1 +ADD x5, x3, x1 +ADD x5, x5, x1 +ADD x5, x1, x4 +ADD x2, x1, x3 +ADD x2, x3, x4 +ADD x4, x2, x2 +ADD x3, x5, x2 +ADD x3, x5, x1 +ADD x5, x2, x2 +ADD x5, x3, x4 +ADD x5, x2, x4 +ADD x5, x2, x3 +ADD x1, x2, x3 +ADD x3, x5, x2 +ADD x1, x0, x2 +ADD x4, x0, x3 +ADD x1, x2, x1 +ADD x3, x2, x4 +ADD x3, x3, x3 +ADD x5, x3, x4 +ADD x4, x4, x4 +ADD x4, x5, x2 +ADD x5, x1, x1 +ADD x3, x1, x3 +ADD x1, x0, x3 +ADD x5, x1, x1 +ADD x3, x4, x1 +ADD x2, x3, x1 +ADD x2, x5, x2 +ADD x1, x1, x1 +ADD x1, x1, x1 +ADD x2, x0, x3 +ADD x2, x5, x4 +ADD x5, x5, x5 +ADD x2, x3, x4 +ADD x5, x4, x5 +ADD x2, x4, x4 +ADD x5, x4, x5 +ADD x2, x1, x5 +ADD x5, x4, x2 +ADD x4, x2, x5 +ADD x4, x2, x2 +ADD x5, x4, x4 +ADD x1, x5, x4 +ADD x4, x5, x5 +ADD x3, x2, x3 +ADD x3, x5, x5 +ADD x3, x0, x1 +ADD x1, x2, x2 +ADD x1, x4, x2 +ADD x1, x3, x3 +ADD x2, x0, x2 +ADD x5, x3, x2 +ADD x2, x0, x2 +ADD x5, x4, x1 +ADD x2, x4, x4 +ADD x2, x4, x3 +ADD x4, x0, x3 +ADD x4, x3, x2 +ADD x4, x4, x2 +ADD x5, x4, x1 +ADD x3, x4, x5 +ADD x5, x1, x1 +ADD x4, x1, x2 +ADD x4, x1, x1 +ADD x2, x5, x2 +ADD x3, x4, x4 +ADD x3, x1, x3 +ADD x2, x2, x2 +ADD x4, x3, x2 +ADD x1, x1, x2 +ADD x5, x5, x3 +ADD x4, x2, x2 +ADD x2, x5, x1 +ADD x4, x2, x4 +ADD x2, x4, x2 +ADD x2, x4, x5 +ADD x4, x4, x1 +ADD x5, x0, x2 +ADD x1, x1, x4 +ADD x1, x4, x5 +ADD x3, x3, x1 +ADD x2, x0, x4 +ADD x3, x5, x5 +ADD x1, x2, x1 +ADD x1, x4, x1 +ADD x1, x2, x2 +ADD x4, x1, x3 +ADD x2, x4, x2 +ADD x4, x0, x4 +ADD x1, x3, x2 +ADD x5, x1, x3 +ADD x5, x0, x4 +ADD x1, x3, x2 +ADD x4, x0, x1 +ADD x4, x0, x2 +ADD x5, x2, x1 +ADD x3, x4, x5 +ADD x3, x5, x3 +ADD x1, x2, x1 +ADD x4, x2, x1 +ADD x2, x1, x2 +ADD x4, x2, x4 +ADD x2, x1, x3 +ADD x2, x5, x2 +ADD x4, x2, x4 +ADD x2, x5, x1 +ADD x1, x2, x2 +ADD x5, x2, x2 +ADD x3, x3, x3 +ADD x3, x5, x4 +ADD x4, x3, x3 +ADD x5, x2, x2 +ADD x2, x5, x4 +ADD x3, x0, x3 +ADD x4, x4, x5 +ADD x1, x3, x2 +ADD x2, x4, x3 +ADD x3, x2, x5 +ADD x1, x5, x3 +ADD x5, x5, x3 +ADD x2, x5, x5 +ADD x5, x2, x1 +ADD x2, x2, x5 +ADD x4, x2, x2 +ADD x3, x4, x4 +ADD x4, x5, x4 +ADD x1, x1, x5 +ADD x4, x0, x3 +ADD x5, x4, x4 +ADD x2, x2, x2 +ADD x5, x2, x3 +ADD x1, x2, x5 +ADD x1, x2, x4 +ADD x3, x3, x2 +ADD x3, x0, x5 +ADD x5, x2, x1 +ADD x2, x4, x4 +ADD x3, x5, x4 +ADD x2, x3, x1 +ADD x1, x3, x1 +ADD x2, x0, x3 +ADD x2, x0, x1 +ADD x2, x1, x2 +ADD x2, x0, x5 +ADD x5, x5, x2 +ADD x2, x2, x1 +ADD x5, x1, x1 +ADD x3, x0, x5 +ADD x5, x1, x1 +ADD x5, x5, x5 +sd x1, 0(x8) +sd x2, 8(x8) +sd x3, 16(x8) +sd x4, 24(x8) +sd x5, 32(x8) +RVTEST_CODE_END +RVMODEL_HALT + +RVTEST_DATA_BEGIN +.align 4 +rvtest_data: +.word 0xbabecafe +RVTEST_DATA_END + +RVMODEL_DATA_BEGIN + + +signature_x8_0: + .fill 0*(XLEN/32),4,0xdeadbeef + + +signature_x8_1: + .fill 19*(XLEN/32),4,0xdeadbeef + + +signature_x1_0: + .fill 256*(XLEN/32),4,0xdeadbeef + + +signature_x1_1: + .fill 256*(XLEN/32),4,0xdeadbeef + + +signature_x1_2: + .fill 148*(XLEN/32),4,0xdeadbeef + +#ifdef rvtest_mtrap_routine + +mtrap_sigptr: + .fill 64*(XLEN/32),4,0xdeadbeef + +#endif + +#ifdef rvtest_gpr_save + +gpr_save: + .fill 32*(XLEN/32),4,0xdeadbeef + +#endif + +RVMODEL_DATA_END +// ../wally-riscv-arch-test/riscv-test-suite/rv64i_m/I/src/PIPELINE.S +// David_Harris@hmc.edu From 8563c0f016c41404c5e963c2594bc1516e9c9a9a Mon Sep 17 00:00:00 2001 From: bbracker Date: Mon, 1 Nov 2021 14:09:49 -0700 Subject: [PATCH 083/132] linux testgen refactor --- .gitignore | 26 +- .../buildroot-config-src/busybox.config | 0 .../buildroot-config-src/linux.config | 0 .../buildroot-config-src/main.config | 0 .../buildroot-config-src/make-buildroot.sh | 0 .../linux-testvectors/tvCopier.py | 0 .../linux-testvectors/tvLinker.sh | 0 .../linux-testvectors/tvUnlinker.sh | 0 .../testvector-generation/analyzeTrace.py | 0 .../testvector-generation/analyzeTrace.sh | 0 .../testvector-generation/combineGDBs.py | 0 .../testvector-generation/debug.gdb | 0 .../testvector-generation/debug.sh | 1 + .../testvector-generation/fix_mem.py | 0 .../testvector-generation/genCheckpoint.gdb | 0 .../testvector-generation/genCheckpoint.sh | 2 +- .../testvector-generation/genInitMem.gdb | 0 .../testvector-generation/genInitMem.sh | 0 .../testvector-generation/genSettings.sh | 0 .../testvector-generation/genTrace.gdb | 0 .../testvector-generation/genTrace.sh | 0 .../testvector-generation/parseGDBtoTrace.py | 0 .../testvector-generation/parseQemuToGDB.py | 0 .../testvector-generation/parseState.py | 0 .../testvector-generation/remove_dup.awk | 0 .../config/buildroot/wally-config.vh | 7 +- .../config/busybear/BTBPredictor.txt | 1024 ----------------- .../config/busybear/twoBitPredictor.txt | 1024 ----------------- .../config/busybear/wally-config.vh | 127 -- .../linux-testgen/WALLY-README-UPDATES.txt | 38 - .../linux-testgen/WALLY-README.txt | 57 - .../intermediate-outputs/git_create_dir.txt | 1 - 32 files changed, 14 insertions(+), 2293 deletions(-) rename {wally-pipelined => tests}/linux-testgen/buildroot-config-src/busybox.config (100%) rename {wally-pipelined => tests}/linux-testgen/buildroot-config-src/linux.config (100%) rename {wally-pipelined => tests}/linux-testgen/buildroot-config-src/main.config (100%) rename {wally-pipelined => tests}/linux-testgen/buildroot-config-src/make-buildroot.sh (100%) rename {wally-pipelined => tests}/linux-testgen/linux-testvectors/tvCopier.py (100%) rename {wally-pipelined => tests}/linux-testgen/linux-testvectors/tvLinker.sh (100%) rename {wally-pipelined => tests}/linux-testgen/linux-testvectors/tvUnlinker.sh (100%) rename {wally-pipelined => tests}/linux-testgen/testvector-generation/analyzeTrace.py (100%) rename {wally-pipelined => tests}/linux-testgen/testvector-generation/analyzeTrace.sh (100%) rename {wally-pipelined => tests}/linux-testgen/testvector-generation/combineGDBs.py (100%) rename {wally-pipelined => tests}/linux-testgen/testvector-generation/debug.gdb (100%) rename {wally-pipelined => tests}/linux-testgen/testvector-generation/debug.sh (98%) rename {wally-pipelined => tests}/linux-testgen/testvector-generation/fix_mem.py (100%) rename {wally-pipelined => tests}/linux-testgen/testvector-generation/genCheckpoint.gdb (100%) rename {wally-pipelined => tests}/linux-testgen/testvector-generation/genCheckpoint.sh (98%) rename {wally-pipelined => tests}/linux-testgen/testvector-generation/genInitMem.gdb (100%) rename {wally-pipelined => tests}/linux-testgen/testvector-generation/genInitMem.sh (100%) rename {wally-pipelined => tests}/linux-testgen/testvector-generation/genSettings.sh (100%) rename {wally-pipelined => tests}/linux-testgen/testvector-generation/genTrace.gdb (100%) rename {wally-pipelined => tests}/linux-testgen/testvector-generation/genTrace.sh (100%) rename {wally-pipelined => tests}/linux-testgen/testvector-generation/parseGDBtoTrace.py (100%) rename {wally-pipelined => tests}/linux-testgen/testvector-generation/parseQemuToGDB.py (100%) rename {wally-pipelined => tests}/linux-testgen/testvector-generation/parseState.py (100%) rename {wally-pipelined => tests}/linux-testgen/testvector-generation/remove_dup.awk (100%) delete mode 100644 wally-pipelined/config/busybear/BTBPredictor.txt delete mode 100644 wally-pipelined/config/busybear/twoBitPredictor.txt delete mode 100644 wally-pipelined/config/busybear/wally-config.vh delete mode 100644 wally-pipelined/linux-testgen/WALLY-README-UPDATES.txt delete mode 100644 wally-pipelined/linux-testgen/WALLY-README.txt delete mode 100644 wally-pipelined/linux-testgen/linux-testvectors/intermediate-outputs/git_create_dir.txt diff --git a/.gitignore b/.gitignore index 501874d09..2542dd881 100644 --- a/.gitignore +++ b/.gitignore @@ -19,27 +19,19 @@ wlft* /imperas-riscv-tests/FunctionRadix.addr /imperas-riscv-tests/ProgramMap.txt /imperas-riscv-tests/logs -/wally-pipelined/linux-testgen/qemu_output.txt -/wally-pipelined/linux-testgen/qemu_in_gdb_format.txt *.o *.d testsBP/*/*/*.elf* testsBP/*/OBJ/* testsBP/*/*.a -wally-pipelined/linux-testgen/linux-testvectors/* -wally-pipelined/linux-testgen/nohup* -wally-pipelined/linux-testgen/x* -!wally-pipelined/linux-testgen/linux-testvectors/tvCopier.py -!wally-pipelined/linux-testgen/linux-testvectors/tvLinker.sh -!wally-pipelined/linux-testgen/linux-testvectors/tvUnlinker.sh -!wally-pipelined/linux-testgen/linux-testvectors/intermediate-outputs -wally-pipelined/linux-testgen/linux-testvectors/intermediate-outputs/* -!wally-pipelined/linux-testgen/linux-testvectors/intermediate-outputs/git_create_dir.txt -wally-pipelined/linux-testgen/buildroot/ -wally-pipelined/linux-testgen/buildroot-image-output -wally-pipelined/linux-testgen/buildroot-config-src/main.config.old -wally-pipelined/linux-testgen/buildroot-config-src/linux.config.old -wally-pipelined/linux-testgen/buildroot-config-src/busybox.config.old +tests/linux-testgen/linux-testvectors/* +!tests/linux-testgen/linux-testvectors/tvCopier.py +!tests/linux-testgen/linux-testvectors/tvLinker.sh +!tests/linux-testgen/linux-testvectors/tvUnlinker.sh +tests/linux-testgen/buildroot +tests/linux-testgen/buildroot-image-output +tests/linux-testgen/buildroot-config-src/main.config.old +tests/linux-testgen/buildroot-config-src/linux.config.old +tests/linux-testgen/buildroot-config-src/busybox.config.old wally-pipelined/regression/slack-notifier/slack-webhook-url.txt wally-pipelined/regression/logs - diff --git a/wally-pipelined/linux-testgen/buildroot-config-src/busybox.config b/tests/linux-testgen/buildroot-config-src/busybox.config similarity index 100% rename from wally-pipelined/linux-testgen/buildroot-config-src/busybox.config rename to tests/linux-testgen/buildroot-config-src/busybox.config diff --git a/wally-pipelined/linux-testgen/buildroot-config-src/linux.config b/tests/linux-testgen/buildroot-config-src/linux.config similarity index 100% rename from wally-pipelined/linux-testgen/buildroot-config-src/linux.config rename to tests/linux-testgen/buildroot-config-src/linux.config diff --git a/wally-pipelined/linux-testgen/buildroot-config-src/main.config b/tests/linux-testgen/buildroot-config-src/main.config similarity index 100% rename from wally-pipelined/linux-testgen/buildroot-config-src/main.config rename to tests/linux-testgen/buildroot-config-src/main.config diff --git a/wally-pipelined/linux-testgen/buildroot-config-src/make-buildroot.sh b/tests/linux-testgen/buildroot-config-src/make-buildroot.sh similarity index 100% rename from wally-pipelined/linux-testgen/buildroot-config-src/make-buildroot.sh rename to tests/linux-testgen/buildroot-config-src/make-buildroot.sh diff --git a/wally-pipelined/linux-testgen/linux-testvectors/tvCopier.py b/tests/linux-testgen/linux-testvectors/tvCopier.py similarity index 100% rename from wally-pipelined/linux-testgen/linux-testvectors/tvCopier.py rename to tests/linux-testgen/linux-testvectors/tvCopier.py diff --git a/wally-pipelined/linux-testgen/linux-testvectors/tvLinker.sh b/tests/linux-testgen/linux-testvectors/tvLinker.sh similarity index 100% rename from wally-pipelined/linux-testgen/linux-testvectors/tvLinker.sh rename to tests/linux-testgen/linux-testvectors/tvLinker.sh diff --git a/wally-pipelined/linux-testgen/linux-testvectors/tvUnlinker.sh b/tests/linux-testgen/linux-testvectors/tvUnlinker.sh similarity index 100% rename from wally-pipelined/linux-testgen/linux-testvectors/tvUnlinker.sh rename to tests/linux-testgen/linux-testvectors/tvUnlinker.sh diff --git a/wally-pipelined/linux-testgen/testvector-generation/analyzeTrace.py b/tests/linux-testgen/testvector-generation/analyzeTrace.py similarity index 100% rename from wally-pipelined/linux-testgen/testvector-generation/analyzeTrace.py rename to tests/linux-testgen/testvector-generation/analyzeTrace.py diff --git a/wally-pipelined/linux-testgen/testvector-generation/analyzeTrace.sh b/tests/linux-testgen/testvector-generation/analyzeTrace.sh similarity index 100% rename from wally-pipelined/linux-testgen/testvector-generation/analyzeTrace.sh rename to tests/linux-testgen/testvector-generation/analyzeTrace.sh diff --git a/wally-pipelined/linux-testgen/testvector-generation/combineGDBs.py b/tests/linux-testgen/testvector-generation/combineGDBs.py similarity index 100% rename from wally-pipelined/linux-testgen/testvector-generation/combineGDBs.py rename to tests/linux-testgen/testvector-generation/combineGDBs.py diff --git a/wally-pipelined/linux-testgen/testvector-generation/debug.gdb b/tests/linux-testgen/testvector-generation/debug.gdb similarity index 100% rename from wally-pipelined/linux-testgen/testvector-generation/debug.gdb rename to tests/linux-testgen/testvector-generation/debug.gdb diff --git a/wally-pipelined/linux-testgen/testvector-generation/debug.sh b/tests/linux-testgen/testvector-generation/debug.sh similarity index 98% rename from wally-pipelined/linux-testgen/testvector-generation/debug.sh rename to tests/linux-testgen/testvector-generation/debug.sh index fc5549a20..e6c96f8bc 100755 --- a/wally-pipelined/linux-testgen/testvector-generation/debug.sh +++ b/tests/linux-testgen/testvector-generation/debug.sh @@ -5,6 +5,7 @@ tcpPort=1237 # Run without GDB ($customQemu \ -M virt \ +-m 128M \ -nographic \ -bios $imageDir/fw_jump.elf -kernel $imageDir/Image -append "root=/dev/vda ro" -initrd $imageDir/rootfs.cpio \ -singlestep -rtc clock=vm -icount shift=1,align=off,sleep=on) diff --git a/wally-pipelined/linux-testgen/testvector-generation/fix_mem.py b/tests/linux-testgen/testvector-generation/fix_mem.py similarity index 100% rename from wally-pipelined/linux-testgen/testvector-generation/fix_mem.py rename to tests/linux-testgen/testvector-generation/fix_mem.py diff --git a/wally-pipelined/linux-testgen/testvector-generation/genCheckpoint.gdb b/tests/linux-testgen/testvector-generation/genCheckpoint.gdb similarity index 100% rename from wally-pipelined/linux-testgen/testvector-generation/genCheckpoint.gdb rename to tests/linux-testgen/testvector-generation/genCheckpoint.gdb diff --git a/wally-pipelined/linux-testgen/testvector-generation/genCheckpoint.sh b/tests/linux-testgen/testvector-generation/genCheckpoint.sh similarity index 98% rename from wally-pipelined/linux-testgen/testvector-generation/genCheckpoint.sh rename to tests/linux-testgen/testvector-generation/genCheckpoint.sh index fc22dd282..4883ef3f0 100755 --- a/wally-pipelined/linux-testgen/testvector-generation/genCheckpoint.sh +++ b/tests/linux-testgen/testvector-generation/genCheckpoint.sh @@ -3,7 +3,7 @@ source genSettings.sh tcpPort=1236 -instrs=480000000 +instrs=450000000 checkOutDir="$outDir/checkpoint$instrs" checkIntermedDir="$checkOutDir/intermediate-outputs" diff --git a/wally-pipelined/linux-testgen/testvector-generation/genInitMem.gdb b/tests/linux-testgen/testvector-generation/genInitMem.gdb similarity index 100% rename from wally-pipelined/linux-testgen/testvector-generation/genInitMem.gdb rename to tests/linux-testgen/testvector-generation/genInitMem.gdb diff --git a/wally-pipelined/linux-testgen/testvector-generation/genInitMem.sh b/tests/linux-testgen/testvector-generation/genInitMem.sh similarity index 100% rename from wally-pipelined/linux-testgen/testvector-generation/genInitMem.sh rename to tests/linux-testgen/testvector-generation/genInitMem.sh diff --git a/wally-pipelined/linux-testgen/testvector-generation/genSettings.sh b/tests/linux-testgen/testvector-generation/genSettings.sh similarity index 100% rename from wally-pipelined/linux-testgen/testvector-generation/genSettings.sh rename to tests/linux-testgen/testvector-generation/genSettings.sh diff --git a/wally-pipelined/linux-testgen/testvector-generation/genTrace.gdb b/tests/linux-testgen/testvector-generation/genTrace.gdb similarity index 100% rename from wally-pipelined/linux-testgen/testvector-generation/genTrace.gdb rename to tests/linux-testgen/testvector-generation/genTrace.gdb diff --git a/wally-pipelined/linux-testgen/testvector-generation/genTrace.sh b/tests/linux-testgen/testvector-generation/genTrace.sh similarity index 100% rename from wally-pipelined/linux-testgen/testvector-generation/genTrace.sh rename to tests/linux-testgen/testvector-generation/genTrace.sh diff --git a/wally-pipelined/linux-testgen/testvector-generation/parseGDBtoTrace.py b/tests/linux-testgen/testvector-generation/parseGDBtoTrace.py similarity index 100% rename from wally-pipelined/linux-testgen/testvector-generation/parseGDBtoTrace.py rename to tests/linux-testgen/testvector-generation/parseGDBtoTrace.py diff --git a/wally-pipelined/linux-testgen/testvector-generation/parseQemuToGDB.py b/tests/linux-testgen/testvector-generation/parseQemuToGDB.py similarity index 100% rename from wally-pipelined/linux-testgen/testvector-generation/parseQemuToGDB.py rename to tests/linux-testgen/testvector-generation/parseQemuToGDB.py diff --git a/wally-pipelined/linux-testgen/testvector-generation/parseState.py b/tests/linux-testgen/testvector-generation/parseState.py similarity index 100% rename from wally-pipelined/linux-testgen/testvector-generation/parseState.py rename to tests/linux-testgen/testvector-generation/parseState.py diff --git a/wally-pipelined/linux-testgen/testvector-generation/remove_dup.awk b/tests/linux-testgen/testvector-generation/remove_dup.awk similarity index 100% rename from wally-pipelined/linux-testgen/testvector-generation/remove_dup.awk rename to tests/linux-testgen/testvector-generation/remove_dup.awk diff --git a/wally-pipelined/config/buildroot/wally-config.vh b/wally-pipelined/config/buildroot/wally-config.vh index 5ccac7dea..6b4ccb82a 100644 --- a/wally-pipelined/config/buildroot/wally-config.vh +++ b/wally-pipelined/config/buildroot/wally-config.vh @@ -31,8 +31,7 @@ `define BUILDROOT 1 `define BUSYBEAR 0 `define LINUX_FIX_READ {'h10000005} -`define LINUX_TEST_VECTORS "../linux-testgen/linux-testvectors/" -//`define LINUX_TEST_VECTORS "/courses/e190ax/buildroot_boot/" +`define LINUX_TEST_VECTORS "../../tests/linux-testgen/linux-testvectors/" // RV32 or RV64: XLEN = 32 or 64 `define XLEN 64 @@ -114,8 +113,8 @@ `define PLIC_NUM_SRC 53 `define PLIC_UART_ID 4 -`define TWO_BIT_PRELOAD "../config/busybear/twoBitPredictor.txt" -`define BTB_PRELOAD "../config/busybear/BTBPredictor.txt" +`define TWO_BIT_PRELOAD "../config/buildroot/twoBitPredictor.txt" +`define BTB_PRELOAD "../config/buildroot/BTBPredictor.txt" `define BPRED_ENABLED 1 `define BPTYPE "BPGSHARE" // BPLOCALPAg or BPGLOBAL or BPTWOBIT or BPGSHARE `define TESTSBP 0 diff --git a/wally-pipelined/config/busybear/BTBPredictor.txt b/wally-pipelined/config/busybear/BTBPredictor.txt deleted file mode 100644 index b761147c6..000000000 --- a/wally-pipelined/config/busybear/BTBPredictor.txt +++ /dev/null @@ -1,1024 +0,0 @@ -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000 diff --git a/wally-pipelined/config/busybear/twoBitPredictor.txt b/wally-pipelined/config/busybear/twoBitPredictor.txt deleted file mode 100644 index ff57bd473..000000000 --- a/wally-pipelined/config/busybear/twoBitPredictor.txt +++ /dev/null @@ -1,1024 +0,0 @@ -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 diff --git a/wally-pipelined/config/busybear/wally-config.vh b/wally-pipelined/config/busybear/wally-config.vh deleted file mode 100644 index 9ab21baed..000000000 --- a/wally-pipelined/config/busybear/wally-config.vh +++ /dev/null @@ -1,127 +0,0 @@ -////////////////////////////////////////// -// busybear-config.vh -// -// Written: David_Harris@hmc.edu 4 January 2021 -// Modified: -// -// Purpose: Specify which features are configured -// Macros to determine which modes are supported based on MISA -// -// A component of the Wally configurable RISC-V project. -// -// Copyright (C) 2021 Harvey Mudd College & Oklahoma State University -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation -// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, -// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software -// is furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS -// BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT -// OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -/////////////////////////////////////////// - -// include shared configuration -`include "wally-shared.vh" - -`define QEMU 0 -`define BUILDROOT 0 -`define BUSYBEAR 1 -`define LINUX_FIX_READ {'h10000005} -`define LINUX_TEST_VECTORS "/courses/e190ax/busybear_boot/" -//`define LINUX_TEST_VECTORS "../../../busybear_boot/" -// RV32 or RV64: XLEN = 32 or 64 -`define XLEN 64 - -`define MISA (32'h0014112D) -`define ZICSR_SUPPORTED 1 -`define ZIFENCEI_SUPPORTED 1 -`define ZICOUNTERS_SUPPORTED 1 -`define COUNTERS 32 -`define DESIGN_COMPILER 0 - -// Microarchitectural Features -`define UARCH_PIPELINED 1 -`define UARCH_SUPERSCALR 0 -`define UARCH_SINGLECYCLE 0 -`define MEM_DCACHE 1 -`define MEM_DTIM 1 -`define MEM_ICACHE 1 -`define MEM_VIRTMEM 1 -`define VECTORED_INTERRUPTS_SUPPORTED 1 // Domenico Ottolia 4/15: Support for vectored interrupts in _tvec csrs. Just implemented in src/privileged/trap.sv around line 75. Pretty sure this should be 1. - -// TLB configuration. Entries should be a power of 2 -`define ITLB_ENTRIES 32 -`define DTLB_ENTRIES 32 - -// Cache configuration. Sizes should be a power of two -// typical configuration 4 ways, 4096 bytes per way, 256 bit or more blocks -`define DCACHE_NUMWAYS 4 -`define DCACHE_WAYSIZEINBYTES 2048 -`define DCACHE_BLOCKLENINBITS 256 -`define DCACHE_REPLBITS 3 -`define ICACHE_NUMWAYS 1 -`define ICACHE_WAYSIZEINBYTES 4096 -`define ICACHE_BLOCKLENINBITS 256 - -// Integer Divider Configuration -// DIV_BITSPERCYCLE must be 1, 2, or 4 -`define DIV_BITSPERCYCLE 4 - -// Legal number of PMP entries are 0, 16, or 64 -`define PMP_ENTRIES 16 - -// Address space -`define RESET_VECTOR 64'h0000000000001000 - -// Peripheral Addresses -// Peripheral memory space extends from BASE to BASE+RANGE -// Range should be a thermometer code with 0's in the upper bits and 1s in the lower bits - -`define BOOTTIM_SUPPORTED 1'b1 -//`define BOOTTIM_BASE 56'h00000000 // spec had been 0x1000 to 0x2FFF, but dh truncated to 0x1000 to 0x1FFF because upper half seems to be all zeros and this is easier for decoder -//`define BOOTTIM_RANGE 56'h00003FFF -`define BOOTTIM_BASE 56'h00001000 // spec had been 0x1000 to 0x2FFF, but dh truncated to 0x1000 to 0x1FFF because upper half seems to be all zeros and this is easier for decoder -`define BOOTTIM_RANGE 56'h00000FFF -`define TIM_SUPPORTED 1'b1 -`define TIM_BASE 56'h80000000 -`define TIM_RANGE 56'h07FFFFFF -`define CLINT_SUPPORTED 1'b1 -`define CLINT_BASE 56'h02000000 -`define CLINT_RANGE 56'h0000FFFF -`define GPIO_SUPPORTED 1'b1 -`define GPIO_BASE 56'h10012000 -`define GPIO_RANGE 56'h000000FF -`define UART_SUPPORTED 1'b1 -`define UART_BASE 56'h10000000 -`define UART_RANGE 56'h00000007 -`define PLIC_SUPPORTED 1'b1 -`define PLIC_BASE 56'h0C000000 -`define PLIC_RANGE 56'h03FFFFFF - -// Bus Interface width -`define AHBW 64 - -// Test modes - -// Tie GPIO outputs back to inputs -`define GPIO_LOOPBACK_TEST 0 - -// Hardware configuration -//`define UART_PRESCALE 1 -`define UART_PRESCALE 0 - -// Interrupt configuration -`define PLIC_NUM_SRC 53 -`define PLIC_UART_ID 4 - -`define TWO_BIT_PRELOAD "../config/busybear/twoBitPredictor.txt" -`define BTB_PRELOAD "../config/busybear/BTBPredictor.txt" -`define BPTYPE "BPGSHARE" // BPGLOBAL or BPTWOBIT or BPGSHARE -`define BPRED_ENABLED 1 - - - diff --git a/wally-pipelined/linux-testgen/WALLY-README-UPDATES.txt b/wally-pipelined/linux-testgen/WALLY-README-UPDATES.txt deleted file mode 100644 index a3c0390b4..000000000 --- a/wally-pipelined/linux-testgen/WALLY-README-UPDATES.txt +++ /dev/null @@ -1,38 +0,0 @@ -Many of the scripts to build the linux ram.txt and trace files have changed over the Summer. -Specifically the parsed*.txt files have all been replaced by a single all.txt file which contains -all of the changes concurrent with a specific instruction. -Each line of all.txt is encoded in the following way. - -The tokens are space deliminted (limitation the parsing function in system verilog). This could be -improved with some effort. - - denotes a required token. - -()? is an optional set of tokens. Exactly 0 or 1 of this pattern will occur. -The register update, memory operation, and CSR update are all possilbe but not present on all operations. -()+ is used to denote a variable number of this pattern with at least 1 instance of the pattern. -All integers are in hex and not zero extended. - - ( )? (
)? ( ( )+)? - -Example - -1010 182b283 ld_t0,24(t0) GPR 5 80000000 MemR 1018 0 80000000 - -PC = 0x1010 -Instruction encoding = 0x182_b283 -instruction pneumonic (text) = ld_t0,24(t0) -Updating x5 to 0x8000_0000 -Memory read at address 0x8000_0000 with read data of 0x8000_0000 - -CSR updates can occur in more than once for a single instruction. The multiple sets will appear as pairs of regsiter name followed by value. - -**** This trace is generated using the CreateTrace.sh script. - -Generation of ram.txt has not changed. Still use logBuildrootMem.sh - -Only the all.txt and ram.txt are required to run modelsim's linux simulation. However there are three additional files will aid -in the debugging process. logBuildrootMem.sh was modified to also create an object dump from the vmlinux image. Using -extractFunctionRadix.sh the objdump is converted into two files vmlinux.objdump.addr and vmlinux.objdump.lab which contain -the addresses and labels of global functions in the linux binarary. The linux test bench is configured to uses these two files -to tell the user which function is currently being executed in modelsim. diff --git a/wally-pipelined/linux-testgen/WALLY-README.txt b/wally-pipelined/linux-testgen/WALLY-README.txt deleted file mode 100644 index 5e1228a04..000000000 --- a/wally-pipelined/linux-testgen/WALLY-README.txt +++ /dev/null @@ -1,57 +0,0 @@ -If you do not need to update the Linux image, then go to ./linux-testvectors and -use tvCopier.py or tvLinker.sh to copy/link premade RAMs and testvectors from Tera. -The RAMs are needed for Wally to run the Linux code, and the testvectors are needed -to verify Wally is executing the code correctly. - -If you instead wish to regenerate the RAMs and testvectors from a new Linux image, -you'll need to build the new Linux image, simulate it, and parse its output, -as described below. - -*To build a new Linux image: - 1. Git clone the Buildroot repository to ./buildroot: - git clone https://github.com/buildroot/buildroot.git - For reference, Wally (*** will) be proven to work on an image built using - Buildroot when the following was the most recent commit to the Buildroot repo: - commit 4047e10ed6e20492bae572d4929eaa5d67eed746 - Author: Gwenhael Goavec-Merou - Date: Wed Jun 30 06:27:10 2021 +0200 - - 2. If you wish to modify the configs, then in ./buildroot: - a. Run "make menuconfig" or "make linux-menuconfig" or "make busybox-menuconfig". - b. Use the TUI (terminal UI) to load in the existing configs. - - For menuconfig, you can load in the source file from - "../buildroot-config-src/main.config" - - For linux-menuconfig or busybox-menuconfig, load in from - "../../../../buildroot-config-src/.config" - because for linux and busybox, make traverses down to - ./buildroot/output/build/. - - One annoying thing about the TUI is that if it has a path already loaded, - then before you can enter the new path to buildroot-config-src, you need to - delete the existing one from the textbox. Doing so requires more than backspace. - Once you've deleted as much of the existing path as you can see, arrow left to - check if there is more text you need to delete. - - c. Likewise, when you are done editing, tell the TUI to save to the same location. - - 3. Finally go to ./buildroot-config-src and run make-buildroot.sh. - This script copies ./buildroot-config-src/main.config to ./buildroot/.config - and then invokes make. This is clumsy but effective because buildroot - sometimes does weird things to .config, like moving it to .config.old and - making a new .config -- doing so can really mess up symbolic/hard links. - - 4. If you'd like debugging symbols, then reconfigure Buildroot to output "vmlinux" - and run make-buildroot again. - -*To generate new RAMs and testvectors from a Linux image: - 1. sym link ./buildroot-image-output to either your new image in ./buildroot/output/image - or the existing image at /courses/e190ax/buildroot-image-output on Tera. - This might require first deleting the empty buildroot-image-output directory. - 2. Then run ./testvector-generation/logBuildrootMem.sh to generate RAMs. - 3. Then run ./testvector-generation/logAllBuildroot.sh to generate testvectors. - - These latter two steps require QEMU. - Note that you can only have one instance of QEMU open at a time! - At least on Tera, it seems. Check "ps -ef" to see if anybody else is running QEMU. diff --git a/wally-pipelined/linux-testgen/linux-testvectors/intermediate-outputs/git_create_dir.txt b/wally-pipelined/linux-testgen/linux-testvectors/intermediate-outputs/git_create_dir.txt deleted file mode 100644 index 8b0068e81..000000000 --- a/wally-pipelined/linux-testgen/linux-testvectors/intermediate-outputs/git_create_dir.txt +++ /dev/null @@ -1 +0,0 @@ -This file only exists so that git will create ./. From 730c52da237a90e45e12fa4589a4f1f854648506 Mon Sep 17 00:00:00 2001 From: bbracker Date: Mon, 1 Nov 2021 15:31:38 -0700 Subject: [PATCH 084/132] genCheckpoint syntax fix --- tests/linux-testgen/testvector-generation/genCheckpoint.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/linux-testgen/testvector-generation/genCheckpoint.sh b/tests/linux-testgen/testvector-generation/genCheckpoint.sh index 4883ef3f0..cca7486e1 100755 --- a/tests/linux-testgen/testvector-generation/genCheckpoint.sh +++ b/tests/linux-testgen/testvector-generation/genCheckpoint.sh @@ -32,7 +32,7 @@ then # Post-Process GDB outputs ./parseState.py "$checkOutDir" ./fix_mem.py "$checkIntermedDir/ramGDB.txt" "$checkOutDir/ram.txt" - tail -n+$($instrs+1) "$outDir/$traceFile" > "$checkOutDir/$traceFile" + tail -n+$(($instrs+1)) "$outDir/$traceFile" > "$checkOutDir/$traceFile" else echo "You can change the number of instructions by editing the \"instrs\" variable in this script." echo "Have a nice day!" From e4cf044932a63d9758e2c5dcc54a4cea7e520184 Mon Sep 17 00:00:00 2001 From: bbracker Date: Tue, 2 Nov 2021 21:19:12 -0700 Subject: [PATCH 085/132] fix testbench interrupt timing --- wally-pipelined/regression/linux-wave.do | 39 +-- wally-pipelined/testbench/testbench-linux.sv | 302 ++++++++++++------- 2 files changed, 210 insertions(+), 131 deletions(-) diff --git a/wally-pipelined/regression/linux-wave.do b/wally-pipelined/regression/linux-wave.do index 30c2b0365..d2350d0ec 100644 --- a/wally-pipelined/regression/linux-wave.do +++ b/wally-pipelined/regression/linux-wave.do @@ -60,20 +60,26 @@ add wave -noupdate -group {Decode Stage} /testbench/dut/hart/ieu/c/RegWriteD add wave -noupdate -group {Decode Stage} /testbench/dut/hart/ieu/dp/RdD add wave -noupdate -group {Decode Stage} /testbench/dut/hart/ieu/dp/Rs1D add wave -noupdate -group {Decode Stage} /testbench/dut/hart/ieu/dp/Rs2D -add wave -noupdate -group {Execution Stage} /testbench/dut/hart/ifu/PCE -add wave -noupdate -group {Execution Stage} /testbench/InstrEName -add wave -noupdate -group {Execution Stage} /testbench/dut/hart/ifu/InstrE -add wave -noupdate -group {Execution Stage} -color {Cornflower Blue} /testbench/FunctionName/FunctionName -add wave -noupdate -group {Memory Stage} /testbench/dut/hart/priv/trap/InstrValidM -add wave -noupdate -group {Memory Stage} /testbench/dut/hart/PCM -add wave -noupdate -group {Memory Stage} /testbench/InstrMName -add wave -noupdate -group {Memory Stage} /testbench/dut/hart/InstrM -add wave -noupdate -group {Memory Stage} /testbench/dut/hart/lsu/MemAdrM -add wave -noupdate -group {WriteBack stage} /testbench/PCW -add wave -noupdate -group {WriteBack stage} /testbench/InstrW -add wave -noupdate -group {WriteBack stage} /testbench/InstrWName -add wave -noupdate -group {WriteBack stage} /testbench/InstrValidW -add wave -noupdate -group {WriteBack stage} /testbench/checkInstrW +add wave -noupdate -expand -group {Execution Stage} /testbench/dut/hart/ifu/PCE +add wave -noupdate -expand -group {Execution Stage} /testbench/dut/hart/ifu/InstrE +add wave -noupdate -expand -group {Execution Stage} /testbench/InstrEName +add wave -noupdate -expand -group {Execution Stage} /testbench/textE +add wave -noupdate -expand -group {Execution Stage} -color {Cornflower Blue} /testbench/FunctionName/FunctionName +add wave -noupdate -expand -group {Memory Stage} /testbench/checkInstrM +add wave -noupdate -expand -group {Memory Stage} /testbench/dut/hart/priv/trap/InstrValidM +add wave -noupdate -expand -group {Memory Stage} /testbench/dut/hart/PCM +add wave -noupdate -expand -group {Memory Stage} /testbench/ExpectedPCM +add wave -noupdate -expand -group {Memory Stage} /testbench/dut/hart/InstrM +add wave -noupdate -expand -group {Memory Stage} /testbench/InstrMName +add wave -noupdate -expand -group {Memory Stage} /testbench/textM +add wave -noupdate -expand -group {Memory Stage} /testbench/dut/hart/lsu/MemAdrM +add wave -noupdate -expand -group {WriteBack stage} /testbench/checkInstrW +add wave -noupdate -expand -group {WriteBack stage} /testbench/InstrValidW +add wave -noupdate -expand -group {WriteBack stage} /testbench/PCW +add wave -noupdate -expand -group {WriteBack stage} /testbench/ExpectedPCW +add wave -noupdate -expand -group {WriteBack stage} /testbench/InstrW +add wave -noupdate -expand -group {WriteBack stage} /testbench/InstrWName +add wave -noupdate -expand -group {WriteBack stage} /testbench/textW add wave -noupdate -group Bpred -color Orange /testbench/dut/hart/ifu/bpred/bpred/Predictor/DirPredictor/GHR add wave -noupdate -group Bpred -expand -group {branch update selection inputs} /testbench/dut/hart/ifu/bpred/bpred/Predictor/DirPredictor/BPPredF add wave -noupdate -group Bpred -expand -group {branch update selection inputs} {/testbench/dut/hart/ifu/bpred/bpred/Predictor/DirPredictor/InstrClassE[0]} @@ -484,7 +490,6 @@ add wave -noupdate -group {debug trace} -expand -group mem /testbench/dut/hart/p add wave -noupdate -group {debug trace} -expand -group mem /testbench/checkInstrM add wave -noupdate -group {debug trace} -expand -group mem /testbench/dut/hart/PCM add wave -noupdate -group {debug trace} -expand -group mem /testbench/ExpectedPCM -add wave -noupdate -group {debug trace} -expand -group mem /testbench/line add wave -noupdate -group {debug trace} -expand -group mem /testbench/textM add wave -noupdate -group {debug trace} -expand -group mem -color Brown /testbench/dut/hart/hzu/TrapM add wave -noupdate -group {debug trace} -expand -group wb /testbench/checkInstrW @@ -510,7 +515,7 @@ add wave -noupdate /testbench/dut/uncore/dtim/memwrite add wave -noupdate /testbench/dut/uncore/dtim/HWDATA add wave -noupdate /testbench/dut/uncore/dtim/risingHREADYTim TreeUpdate [SetDefaultTree] -WaveRestoreCursors {{Cursor 23} {209183247 ns} 0} {{Cursor 5} {229 ns} 0} +WaveRestoreCursors {{Cursor 23} {209183247 ns} 0} {{Cursor 5} {5672440 ns} 0} quietly wave cursor active 2 configure wave -namecolwidth 250 configure wave -valuecolwidth 314 @@ -526,4 +531,4 @@ configure wave -griddelta 40 configure wave -timeline 0 configure wave -timelineunits ns update -WaveRestoreZoom {182 ns} {330 ns} +WaveRestoreZoom {5672937 ns} {5673085 ns} diff --git a/wally-pipelined/testbench/testbench-linux.sv b/wally-pipelined/testbench/testbench-linux.sv index 72adf589b..72061f9ea 100644 --- a/wally-pipelined/testbench/testbench-linux.sv +++ b/wally-pipelined/testbench/testbench-linux.sv @@ -103,30 +103,35 @@ module testbench(); string checkpointDir; logic [1:0] initPriv; // Signals used to parse the trace file - integer data_file_all; - string name; - integer matchCount; - string line; - logic [`XLEN-1:0] ExpectedPCM; - logic [31:0] ExpectedInstrM; - string textM; - string token; - string ExpectedTokens [31:0]; - integer index; - integer StartIndex, EndIndex; - integer TokenIndex; - integer MarkerIndex; - integer NumCSRM; + `define DECLARE_TRACE_SCANNER_SIGNALS(STAGE) \ + integer traceFile``STAGE; \ + integer matchCount``STAGE; \ + string line``STAGE; \ + string token``STAGE; \ + string ExpectedTokens``STAGE [31:0]; \ + integer index``STAGE; \ + integer StartIndex``STAGE, EndIndex``STAGE; \ + integer TokenIndex``STAGE; \ + integer MarkerIndex``STAGE; \ + integer NumCSR``STAGE; \ + logic [`XLEN-1:0] ExpectedPC``STAGE; \ + logic [31:0] ExpectedInstr``STAGE; \ + string text``STAGE; \ + string MemOp``STAGE; \ + string RegWrite``STAGE; \ + integer ExpectedRegAdr``STAGE; \ + logic [`XLEN-1:0] ExpectedRegValue``STAGE; \ + logic [`XLEN-1:0] ExpectedMemAdr``STAGE, ExpectedMemReadData``STAGE, ExpectedMemWriteData``STAGE; \ + string ExpectedCSRArray``STAGE[10:0]; \ + logic [`XLEN-1:0] ExpectedCSRArrayValue``STAGE[10:0]; + `DECLARE_TRACE_SCANNER_SIGNALS(E) + `DECLARE_TRACE_SCANNER_SIGNALS(M) + integer NextMIPexpected; + integer NextMepcExpected; // Memory stage expected values from trace logic checkInstrM; integer MIPexpected; - string RegWriteM; - integer ExpectedRegAdrM; - logic [`XLEN-1:0] ExpectedRegValueM; - string MemOpM; - logic [`XLEN-1:0] ExpectedMemAdrM, ExpectedMemReadDataM, ExpectedMemWriteDataM; - string ExpectedCSRArrayM[10:0]; - logic [`XLEN-1:0] ExpectedCSRArrayValueM[10:0]; + string name; logic [`AHBW-1:0] readDataExpected; // Write back stage expected values from trace logic checkInstrW; @@ -148,6 +153,11 @@ module testbench(); integer NumCSRPostWIndex; logic [`XLEN-1:0] InstrCountW; integer RequestDelayedMIP; + integer ForceMIPFuture; + integer CSRIndex; + longint MepcExpected; + integer CheckMIPFutureE; + integer CheckMIPFutureM; // Useful Aliases `define RF dut.hart.ieu.dp.regf.rf `define PC dut.hart.ifu.pcreg.q @@ -292,13 +302,15 @@ module testbench(); ProgramLabelMapFile = {`LINUX_TEST_VECTORS,"vmlinux.objdump.lab"}; if (CHECKPOINT==0) begin // normal $readmemh({`LINUX_TEST_VECTORS,"ram.txt"}, dut.uncore.dtim.RAM); - data_file_all = $fopen({`LINUX_TEST_VECTORS,"all.txt"}, "r"); + traceFileM = $fopen({`LINUX_TEST_VECTORS,"all.txt"}, "r"); + traceFileE = $fopen({`LINUX_TEST_VECTORS,"all.txt"}, "r"); InstrCountW = '0; end else begin // checkpoint $sformat(checkpointDir,"checkpoint%0d/",CHECKPOINT); checkpointDir = {`LINUX_TEST_VECTORS,checkpointDir}; $readmemh({checkpointDir,"ram.txt"}, dut.uncore.dtim.RAM); - data_file_all = $fopen({checkpointDir,"all.txt"}, "r"); + traceFileE = $fopen({checkpointDir,"all.txt"}, "r"); + traceFileM = $fopen({checkpointDir,"all.txt"}, "r"); InstrCountW = CHECKPOINT; // manual checkpoint initializations that don't neatly fit into MACRO force {`STATUS_TSR,`STATUS_TW,`STATUS_TVM,`STATUS_MXR,`STATUS_SUM,`STATUS_MPRV} = initMSTATUS[0][22:17]; @@ -319,8 +331,12 @@ module testbench(); release `INSTRET; release `CURR_PRIV; end + // Get the E-stage trace reader ahead of the M-stage trace reader + matchCountE = $fgets(lineE,traceFileE); end + + /////////////////////////////////////////////////////////////////////////////// //////////////////////////////////// CORE ///////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// @@ -332,94 +348,158 @@ module testbench(); // on the next falling edge the expected state is compared to the wally state. // step 0: read the expected state - assign checkInstrM = dut.hart.ieu.InstrValidM & ~dut.hart.priv.trap.InstrPageFaultM & ~dut.hart.priv.trap.InterruptM & ~dut.hart.StallM; + assign checkInstrM = dut.hart.ieu.InstrValidM & ~dut.hart.priv.trap.InstrPageFaultM & ~dut.hart.priv.trap.InterruptM & ~dut.hart.StallM; + `define SCAN_NEW_INSTR_FROM_TRACE(STAGE) \ + // always check PC, instruction bits \ + if (checkInstrM) begin \ + // read 1 line of the trace file \ + matchCount``STAGE = $fgets(line``STAGE, traceFile``STAGE); \ + if(`DEBUG_TRACE >= 5) $display("Time %t, line %x", $time, line``STAGE); \ + // extract PC, Instr \ + matchCount``STAGE = $sscanf(line``STAGE, "%x %x %s", ExpectedPC``STAGE, ExpectedInstr``STAGE, text``STAGE); \ + \ + // for the life of me I cannot get any build in C or C++ string parsing functions/methods to work. \ + // strtok was the best idea but it cannot be used correctly as system verilog does not have null \ + // terminated strings. \ + \ + // Just going to do this char by char. \ + StartIndex``STAGE = 0; \ + TokenIndex``STAGE = 0; \ + //$display("len = %d", line``STAGE.len()); \ + for(index``STAGE = 0; index``STAGE < line``STAGE.len(); index``STAGE++) begin \ + //$display("char = %s", line``STAGE[index]); \ + if (line``STAGE[index``STAGE] == " " || line``STAGE[index``STAGE] == "\n") begin \ + EndIndex``STAGE = index``STAGE; \ + ExpectedTokens``STAGE[TokenIndex``STAGE] = line``STAGE.substr(StartIndex``STAGE, EndIndex``STAGE-1); \ + //$display("In Tokenizer %s", line``STAGE.substr(StartIndex, EndIndex-1)); \ + StartIndex``STAGE = EndIndex``STAGE + 1; \ + TokenIndex``STAGE++; \ + end \ + end \ + \ + MarkerIndex``STAGE = 3; \ + NumCSR``STAGE = 0; \ + MemOp``STAGE = ""; \ + RegWrite``STAGE = ""; \ + \ + #2; \ + \ + while(TokenIndex``STAGE > MarkerIndex``STAGE) begin \ + // parse the GPR \ + if (ExpectedTokens``STAGE[MarkerIndex``STAGE] == "GPR") begin \ + RegWrite``STAGE = ExpectedTokens``STAGE[MarkerIndex``STAGE]; \ + matchCount``STAGE = $sscanf(ExpectedTokens``STAGE[MarkerIndex``STAGE+1], "%d", ExpectedRegAdr``STAGE); \ + matchCount``STAGE = $sscanf(ExpectedTokens``STAGE[MarkerIndex``STAGE+2], "%x", ExpectedRegValue``STAGE); \ + MarkerIndex``STAGE += 3; \ + // parse memory address, read data, and/or write data \ + end else if(ExpectedTokens``STAGE[MarkerIndex``STAGE].substr(0, 2) == "Mem") begin \ + MemOp``STAGE = ExpectedTokens``STAGE[MarkerIndex``STAGE]; \ + matchCount``STAGE = $sscanf(ExpectedTokens``STAGE[MarkerIndex``STAGE+1], "%x", ExpectedMemAdr``STAGE); \ + matchCount``STAGE = $sscanf(ExpectedTokens``STAGE[MarkerIndex``STAGE+2], "%x", ExpectedMemWriteData``STAGE); \ + matchCount``STAGE = $sscanf(ExpectedTokens``STAGE[MarkerIndex``STAGE+3], "%x", ExpectedMemReadData``STAGE); \ + MarkerIndex``STAGE += 4; \ + // parse CSRs, because there are 1 or more CSRs after the CSR token \ + // we check if the CSR token or the number of CSRs is greater than 0. \ + // if so then we want to parse for a CSR. \ + end else if(ExpectedTokens``STAGE[MarkerIndex``STAGE] == "CSR" || NumCSR``STAGE > 0) begin \ + if(ExpectedTokens``STAGE[MarkerIndex``STAGE] == "CSR") begin \ + // all additional CSR's won't have this token. \ + MarkerIndex``STAGE++; \ + end \ + matchCount``STAGE = $sscanf(ExpectedTokens``STAGE[MarkerIndex``STAGE], "%s", ExpectedCSRArray``STAGE[NumCSR``STAGE]); \ + matchCount``STAGE = $sscanf(ExpectedTokens``STAGE[MarkerIndex``STAGE+1], "%x", ExpectedCSRArrayValue``STAGE[NumCSR``STAGE]); \ + MarkerIndex``STAGE += 2; \ + if(`"STAGE`"=="E") begin \ + // match MIP to QEMU's because interrupts are imprecise \ + if(ExpectedCSRArrayE[NumCSRE].substr(0, 2) == "mip") begin \ + CheckMIPFutureE = 1; \ + NextMIPexpected = ExpectedCSRArrayValueE[NumCSRE]; \ + end \ + // $display("%tn: ExpectedCSRArrayM[7] (MEPC) = %x",$time,ExpectedCSRArrayM[7]); \ + // $display("%tn: ExpectedPCM = %x",$time,ExpectedPCM); \ + // // if PC does not equal MEPC, request delayed MIP is True \ + // if(ExpectedPCM != ExpectedCSRArrayM[7]) begin \ + // RequestDelayedMIP = 1; \ + // end else begin \ + // $display("%tns: Updating MIP to %x",$time,ExpectedCSRArrayValueM[NumCSRM]); \ + // MIPexpected = ExpectedCSRArrayValueM[NumCSRM]; \ + // force dut.hart.priv.csr.genblk1.csri.MIP_REGW = MIPexpected; \ + // end \ + // end \ + // $display("%tns: ExpectedCSRArrayM::: %p",$time,ExpectedCSRArrayM); \ + if(ExpectedCSRArrayE[NumCSRE].substr(0,3) == "mepc") begin \ + $display("hello! we are here."); \ + MepcExpected = ExpectedCSRArrayValueE[NumCSRE]; \ + $display("%tns: MepcExpected: %x",$time,MepcExpected); \ + end \ + end \ + \ + NumCSR``STAGE++; \ + end \ + end \ + if(`"STAGE`"=="M") begin \ + // override on special conditions \ + if (ExpectedMemAdrM == 'h10000005) begin \ + //$display("%tns, %d instrs: Overwriting read data from CLINT.", $time, InstrCountW); \ + force dut.hart.ieu.dp.ReadDataM = ExpectedMemReadDataM; \ + end \ + if(textM.substr(0,5) == "rdtime") begin \ + //$display("%tns, %d instrs: Overwrite MTIME_CLINT on read of MTIME in memory stage.", $time, InstrCountW); \ + force dut.uncore.clint.clint.MTIME = ExpectedRegValueM; \ + end \ + end \ + end \ + always @(negedge clk) begin - // always check PC, instruction bits - if (checkInstrM) begin - // read 1 line of the trace file - matchCount = $fgets(line, data_file_all); - if(`DEBUG_TRACE >= 5) $display("Time %t, line %x", $time, line); - // extract PC, Instr - matchCount = $sscanf(line, "%x %x %s", ExpectedPCM, ExpectedInstrM, textM); - //$display("matchCount %d, PCM %x ExpectedInstrM %x textM %x", matchCount, ExpectedPCM, ExpectedInstrM, textM); + `SCAN_NEW_INSTR_FROM_TRACE(E) + end - // for the life of me I cannot get any build in C or C++ string parsing functions/methods to work. - // strtok was the best idea but it cannot be used correctly as system verilog does not have null - // terminated strings. - - // Just going to do this char by char. - StartIndex = 0; - TokenIndex = 0; - //$display("len = %d", line.len()); - for(index = 0; index < line.len(); index++) begin - //$display("char = %s", line[index]); - if (line[index] == " " || line[index] == "\n") begin - EndIndex = index; - ExpectedTokens[TokenIndex] = line.substr(StartIndex, EndIndex-1); - //$display("In Tokenizer %s", line.substr(StartIndex, EndIndex-1)); - StartIndex = EndIndex + 1; - TokenIndex++; - end + always @(negedge clk) begin + `SCAN_NEW_INSTR_FROM_TRACE(M) + end + + // MIP spoofing + always @(posedge clk) begin + #1; + if(CheckMIPFutureE) CheckMIPFutureE <= 0; + CheckMIPFutureM <= CheckMIPFutureE; + if(CheckMIPFutureM) begin + if((ExpectedPCM != MepcExpected) & ((MepcExpected - ExpectedPCM) * (MepcExpected - ExpectedPCM) <= 16)) begin + RequestDelayedMIP = 1; + $display("%tns: Requesting Delayed MIP. Current MEPC value is %x",$time,MepcExpected); + end else begin // update MIP immediately + $display("%tns: Updating MIP to %x",$time,NextMIPexpected); + MIPexpected = NextMIPexpected; + force dut.hart.priv.csr.genblk1.csri.MIP_REGW = MIPexpected; end - - MarkerIndex = 3; - NumCSRM = 0; - MemOpM = ""; - RegWriteM = ""; - - #2; - - while(TokenIndex > MarkerIndex) begin - // parse the GPR - if (ExpectedTokens[MarkerIndex] == "GPR") begin - RegWriteM = ExpectedTokens[MarkerIndex]; - matchCount = $sscanf(ExpectedTokens[MarkerIndex+1], "%d", ExpectedRegAdrM); - matchCount = $sscanf(ExpectedTokens[MarkerIndex+2], "%x", ExpectedRegValueM); - MarkerIndex += 3; - // parse memory address, read data, and/or write data - end else if(ExpectedTokens[MarkerIndex].substr(0, 2) == "Mem") begin - MemOpM = ExpectedTokens[MarkerIndex]; - matchCount = $sscanf(ExpectedTokens[MarkerIndex+1], "%x", ExpectedMemAdrM); - matchCount = $sscanf(ExpectedTokens[MarkerIndex+2], "%x", ExpectedMemWriteDataM); - matchCount = $sscanf(ExpectedTokens[MarkerIndex+3], "%x", ExpectedMemReadDataM); - MarkerIndex += 4; - // parse CSRs, because there are 1 or more CSRs after the CSR token - // we check if the CSR token or the number of CSRs is greater than 0. - // if so then we want to parse for a CSR. - end else if(ExpectedTokens[MarkerIndex] == "CSR" || NumCSRM > 0) begin - if(ExpectedTokens[MarkerIndex] == "CSR") begin - // all additional CSR's won't have this token. - MarkerIndex++; - end - matchCount = $sscanf(ExpectedTokens[MarkerIndex], "%s", ExpectedCSRArrayM[NumCSRM]); - matchCount = $sscanf(ExpectedTokens[MarkerIndex+1], "%x", ExpectedCSRArrayValueM[NumCSRM]); - MarkerIndex += 2; - // match MIP to QEMU's because interrupts are imprecise - if(ExpectedCSRArrayM[NumCSRM].substr(0, 2) == "mip") begin - $display("%tn: ExpectedCSRArrayM[7] (MEPC) = %x",$time,ExpectedCSRArrayM[7]); - $display("%tn: ExpectedPCM = %x",$time,ExpectedPCM); - // if PC does not equal MEPC, request delayed MIP is True - if(ExpectedPCM != ExpectedCSRArrayM[7]) begin - RequestDelayedMIP = 1; - end else begin - $display("%tns: Updating MIP to %x",$time,ExpectedCSRArrayValueM[NumCSRM]); - MIPexpected = ExpectedCSRArrayValueM[NumCSRM]; - force dut.hart.priv.csr.genblk1.csri.MIP_REGW = MIPexpected; - end - end - NumCSRM++; - end - end - // override on special conditions - if (ExpectedMemAdrM == 'h10000005) begin - //$display("%tns, %d instrs: Overwriting read data from CLINT.", $time, InstrCountW); - force dut.hart.ieu.dp.ReadDataM = ExpectedMemReadDataM; - end - if(textM.substr(0,5) == "rdtime") begin - //$display("%tns, %d instrs: Overwrite MTIME_CLINT on read of MTIME in memory stage.", $time, InstrCountW); - force dut.uncore.clint.clint.MTIME = ExpectedRegValueM; + $display("%tn: ExpectedCSRArrayM = %p",$time,ExpectedCSRArrayM); + $display("%tn: ExpectedCSRArrayValueM = %p",$time,ExpectedCSRArrayValueM); + $display("%tn: ExpectedTokens = %p",$time,ExpectedTokensM); + $display("%tn: MepcExpected = %x",$time,MepcExpected); + $display("%tn: ExpectedPCM = %x",$time,ExpectedPCM); + // if PC does not equal MEPC, request delayed MIP is True + $display("%tns: Difference/multiplication thing: %x",$time,(MepcExpected - ExpectedPCM) * (MepcExpected - ExpectedPCM)); + $display("%tn: ExpectedCSRArrayM[NumCSRM] %x",$time,ExpectedCSRArrayM[NumCSRM]); + $display("%tn: ExpectedCSRArrayValueM[NumCSRM] %x",$time,ExpectedCSRArrayValueM[NumCSRM]); + + if((ExpectedPCM != MepcExpected) & ((MepcExpected - ExpectedPCM) * (MepcExpected - ExpectedPCM) <= 16)) begin + RequestDelayedMIP = 1; + $display("%tns: Requesting Delayed MIP. Current MEPC value is %x",$time,MepcExpected); + end else begin + $display("%tns: Updating MIP to %x",$time,NextMIPexpected); + MIPexpected = NextMIPexpected; + force dut.hart.priv.csr.genblk1.csri.MIP_REGW = MIPexpected; end end + if(RequestDelayedMIP) begin + $display("%tns: Executing Delayed MIP. Current MEPC value is %x",$time,dut.hart.priv.csr.genblk1.csrm.MEPC_REGW); + $display("%tns: Updating MIP to %x",$time,NextMIPexpected); + $display("%tns: MepcExpected %x",$time,MepcExpected); + MIPexpected = NextMIPexpected; + force dut.hart.priv.csr.genblk1.csri.MIP_REGW = MIPexpected; + $display("%tns: Finished Executing Delayed MIP. Current MEPC value is %x",$time,dut.hart.priv.csr.genblk1.csrm.MEPC_REGW); + RequestDelayedMIP = 0; + end end // step 1: register expected state into the write back stage. @@ -449,7 +529,7 @@ module testbench(); ExpectedMemWriteDataW <= '0; ExpectedMemReadDataW <= '0; NumCSRW <= '0; - end else begin + end else if (dut.hart.ieu.c.InstrValidM) begin ExpectedPCW <= ExpectedPCM; ExpectedInstrW <= ExpectedInstrM; textW <= textM; @@ -484,12 +564,6 @@ module testbench(); // step2: make all checks in the write back stage. assign checkInstrW = InstrValidW & ~dut.hart.StallW; // trapW will already be invalid in there was an InstrPageFault in the previous instruction. always @(negedge clk) begin - if(RequestDelayedMIP) begin - $display("%tns: Updating MIP to %x",$time,ExpectedCSRArrayValueW[NumCSRM]); - MIPexpected = ExpectedCSRArrayValueW[NumCSRM]; - force dut.hart.priv.csr.genblk1.csri.MIP_REGW = MIPexpected; - RequestDelayedMIP = 0; - end // always check PC, instruction bits if (checkInstrW) begin InstrCountW += 1; @@ -521,7 +595,7 @@ module testbench(); if(MemOpW == "MemR" || MemOpW == "MemRW") begin if(`DEBUG_TRACE >= 4) $display("\tReadDataW: %016x ? expected: %016x", dut.hart.ieu.dp.ReadDataW, ExpectedMemReadDataW); `checkEQ("ReadDataW",dut.hart.ieu.dp.ReadDataW,ExpectedMemReadDataW) - end else if(ExpectedTokens[MarkerIndex] == "MemW" || ExpectedTokens[MarkerIndex] == "MemRW") begin + end else if(MemOpW == "MemW" || MemOpW == "MemRW") begin if(`DEBUG_TRACE >= 4) $display("\tWriteDataW: %016x ? expected: %016x", WriteDataW, ExpectedMemWriteDataW); `checkEQ("WriteDataW",ExpectedMemWriteDataW,ExpectedMemWriteDataW) end From 5fc12d4ae938b822ba18f55c0c54d6200e06202b Mon Sep 17 00:00:00 2001 From: slmnemo Date: Wed, 3 Nov 2021 01:50:00 -0700 Subject: [PATCH 086/132] edited to include missing instructions added cd tests before cd imperas-riscv-tests to reflect new tests folder modified cd ../addins so we can point to it from the new imperas-riscv-tests within the tests folder added instructions so the buildroot test exists --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 975b8f141..36fbbb4f9 100644 --- a/README.md +++ b/README.md @@ -8,9 +8,10 @@ To use Wally on Linux: ``` git clone https://github.com/davidharrishmc/riscv-wally cd riscv-wally +cd tests cd imperas-riscv-tests make -cd ../addins +cd ../../addins git clone https://github.com/riscv-non-isa/riscv-arch-test git clone https://github.com/riscv-software-src/riscv-isa-sim cd riscv-isa-sim @@ -32,6 +33,8 @@ edit Makefile.include make make XLEN=32 exe2memfile.pl work/*/*/*.elf # converts ELF files to a format that can be read by Modelsim +cd ../../wally-pipelined/linux-testgen/linux-testvectors +./tvLinker.sh ``` Notes: From b34569c358de566a280efb8eb7704f4309d34f4a Mon Sep 17 00:00:00 2001 From: Kevin Date: Wed, 3 Nov 2021 10:49:34 -0700 Subject: [PATCH 087/132] changed code aligner to run recursively on a root directory -only runs the aligner on .sv files -runs recursively on sub-directories --- wally-pipelined/src/ifu/CodeAligner.py | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/wally-pipelined/src/ifu/CodeAligner.py b/wally-pipelined/src/ifu/CodeAligner.py index 59f9de4e8..579fd6237 100644 --- a/wally-pipelined/src/ifu/CodeAligner.py +++ b/wally-pipelined/src/ifu/CodeAligner.py @@ -87,12 +87,26 @@ def Mod_Space_at(Ln,loc,diff): return NewString -def main_filehandler(overwrite=False): +'''def main_filehandler(overwrite=False): for filename in os.listdir(): - if ".py" not in filename: + if ".sv" in filename: GiantString = read_input(filename) SOV = ID_start(GiantString) ModifiedGS = modified_logNew(GiantString,SOV) - Newname = write_to_output(filename,ModifiedGS,overwrite) + Newname = write_to_output(filename,ModifiedGS,overwrite)''' +def root_filehandler(path,overwrite=False): + for f in os.listdir(path): + if os.path.isdir(f): + root_filehandler(path+"/"+f) + else: + if ".sv" in f: + GiantString = read_input(f) + SOV = ID_start(GiantString) + ModifiedGS = modified_logNew(GiantString,SOV) + Newname = write_to_output(f,ModifiedGS,overwrite) + + +def driver(overwrite=False): + root_filehandler(os.getcwd()) -main_filehandler(True) \ No newline at end of file +driver(True) \ No newline at end of file From d957d86f3bf6c4e7588ce1827ed8c00be1ed8891 Mon Sep 17 00:00:00 2001 From: davidharrishmc <74973295+davidharrishmc@users.noreply.github.com> Date: Wed, 3 Nov 2021 13:30:21 -0700 Subject: [PATCH 088/132] added wally-riscv-arch-test compile commands --- README.md | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 36fbbb4f9..2de55cbc5 100644 --- a/README.md +++ b/README.md @@ -8,10 +8,8 @@ To use Wally on Linux: ``` git clone https://github.com/davidharrishmc/riscv-wally cd riscv-wally -cd tests -cd imperas-riscv-tests -make -cd ../../addins +cd addins +*** can these clones be replaced with git submodule commands? git clone https://github.com/riscv-non-isa/riscv-arch-test git clone https://github.com/riscv-software-src/riscv-isa-sim cd riscv-isa-sim @@ -33,6 +31,13 @@ edit Makefile.include make make XLEN=32 exe2memfile.pl work/*/*/*.elf # converts ELF files to a format that can be read by Modelsim +cd ../../tests +cd imperas-riscv-tests +make +cd ../wally-riscv-arch-test +make +make XLEN=32 +exe2memfile.pl work/*/*/*.elf # converts ELF files to a format that can be read by Modelsim cd ../../wally-pipelined/linux-testgen/linux-testvectors ./tvLinker.sh ``` From 099c4e8b6bef9cd9e8e6b001e190a2447a05981b Mon Sep 17 00:00:00 2001 From: davidharrishmc <74973295+davidharrishmc@users.noreply.github.com> Date: Wed, 3 Nov 2021 13:40:23 -0700 Subject: [PATCH 089/132] fixed 64i --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2de55cbc5..740f985fd 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ git clone https://github.com/riscv-software-src/riscv-isa-sim cd riscv-isa-sim cp -r arch_test_target/spike/device/rv32i_m/I arch_test_target/spike/device/rv32i_m/F -cp -r arch_test_target/spike/device/rv32i_m/I arch_test_target/spike/device/rv64i_m/D +cp -r arch_test_target/spike/device/rv64i_m/I arch_test_target/spike/device/rv64i_m/D mkdir build cd build From f540bb13c0afe70a4966c6d1906352d188589d06 Mon Sep 17 00:00:00 2001 From: davidharrishmc <74973295+davidharrishmc@users.noreply.github.com> Date: Wed, 3 Nov 2021 13:49:07 -0700 Subject: [PATCH 090/132] fixed 64i --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 740f985fd..db4818723 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,7 @@ cd addins git clone https://github.com/riscv-non-isa/riscv-arch-test git clone https://github.com/riscv-software-src/riscv-isa-sim cd riscv-isa-sim +*** replace these with a copy from ../install/F and ../install/D containing the Makefile.includes already updated cp -r arch_test_target/spike/device/rv32i_m/I arch_test_target/spike/device/rv32i_m/F cp -r arch_test_target/spike/device/rv64i_m/I arch_test_target/spike/device/rv64i_m/D From e7b25f7c953c41b74957769c46a00b8a5a11ed44 Mon Sep 17 00:00:00 2001 From: kipmacsaigoren Date: Fri, 5 Nov 2021 11:59:33 -0500 Subject: [PATCH 091/132] changed number of critical paths reported to 1, added lots of internal signals and new report files. From 3077769cbd1c4c1503618edeaea6c3f0b5e42a24 Mon Sep 17 00:00:00 2001 From: bbracker Date: Fri, 5 Nov 2021 22:37:05 -0700 Subject: [PATCH 092/132] checkpoints now use binary ram files --- .../testvector-generation/Makefile | 13 +++++++ .../testvector-generation/fixBinMem | Bin 0 -> 8784 bytes .../testvector-generation/fixBinMem.c | 33 ++++++++++++++++++ .../{fix_mem.py => fixTxtMem.py} | 0 .../testvector-generation/genCheckpoint.gdb | 7 ++-- .../testvector-generation/genCheckpoint.sh | 23 ++++++++---- .../testvector-generation/genInitMem.sh | 4 +-- .../testvector-generation/genSettings.sh | 2 +- wally-pipelined/testbench/testbench-linux.sv | 9 +++-- 9 files changed, 75 insertions(+), 16 deletions(-) create mode 100644 tests/linux-testgen/testvector-generation/Makefile create mode 100755 tests/linux-testgen/testvector-generation/fixBinMem create mode 100644 tests/linux-testgen/testvector-generation/fixBinMem.c rename tests/linux-testgen/testvector-generation/{fix_mem.py => fixTxtMem.py} (100%) diff --git a/tests/linux-testgen/testvector-generation/Makefile b/tests/linux-testgen/testvector-generation/Makefile new file mode 100644 index 000000000..8f9bff4bb --- /dev/null +++ b/tests/linux-testgen/testvector-generation/Makefile @@ -0,0 +1,13 @@ +SHELL = /bin/sh + +CFLAG = -Wall -g +CC = clang + +all: fixBinMem + +fixBinMem: fixBinMem.c + ${CC} ${CFLAGS} fixBinMem.c -o fixBinMem + chmod +x fixBinMem + +clean: + -rm -f fixBinMem diff --git a/tests/linux-testgen/testvector-generation/fixBinMem b/tests/linux-testgen/testvector-generation/fixBinMem new file mode 100755 index 0000000000000000000000000000000000000000..563ed988d78611241ac015f656c16c9483981703 GIT binary patch literal 8784 zcmeHMZ){W76~DI09|AZI&=O!YuN|oZQ;ZWr6ev(TiNj0hK$bsr(-vNw_&IUs*p~g= zgci1-6oi%1@?jsCrb&~gNlcoiPMS1SRU;Wy1KWqDovNX&9~gqwp+n7D#yqXyopawk zdCxD7R%x2F4_xcLbI%U4AC#?Fe6GHBE|ZQV~TL7pMHU-;22DCr@KdUZmtPUsPx7mg97_F>!b=@a()>|WrI_ab5K z{B2N_#ngRU3t_%{HD`f(d4_0{4l|;p_chQ%Kfh>l3Bevw-%9 zzGC**tblJ@0e>9uDz=4ny9Obrx0z?4e}}O;A{mKkVWudkqNKE7Qd7o)kr*H&WAT_k6m}@k+1jQwx*Oelum(H-5f#%E`Wt_+ zPPh|{rME<2CfZrA;B%FOJcnaKa}NRXAJ-5>N(5|dBQXeHT~p+uf~yZnkSk>B$v6y^Lai3s=^_a%oV0 z69whd?}M_Oc}Lg3DfA}~JPH1?bX7lSX1@cD47^j~1jzQ;73?p0>cG`95YV1ja$#ft zWeIjokk8K#EW8XVl{IW3rBgHmV=_4B{~T-0oXp9Y^x~ zugRc1-Jb=c4TjNQX4{3)F2kq`>|6(<*Rz{+qw{nAx6rEmYnt)$n>5GebN;LHbk_|z zGnc*e0DLGa(>3GE%(Q3xZ^_djKAUB7Z5|EI-e`e}0Qsa`KJ}3fedLi>=LG69&^iOH zHc-hxB?GNC&^iNk8K}oV%MG-}KpCPL{|xv$FK6DBGqc&9*t(4W;;ECoGb&Hth2GHz zf9mbQfh%EmWz8$tO?*B1p7&+)zN4L)`@a6p%m=={z`5G9B@#@@bM;7j13PXv{7IgD z;J}rd?fM*ypT4U-K{f)JJAusocCeA(_@O*?#U}6lIDH2f@HYp1-|`Lkj`@@;=Z!i) zgLTczw-G>pk8Q1H&74s z)J32YO#Q1sas9i*gu(A2CfiFr%r@b&ZCzVde%@B*LL5JIS+IrQC`!fU8N&sG@+}~r zKw+n=!&&`Y<(l#GN%riPXLj!1{uII}(+}~6455=+&Jl!yuDp1zy zbiHo(JF8!F_?^-8(Un|6ib zT4Q|}KGD$~-1QY-4v0ir?A~SN4wwafMR5nyisGx5=BL@117_644a#7rf;|t|!_cKsj_p8|7@MvF+7p4*m*(NvDQ1jg8Zw1O9h_j%ntysvb$K$ zvVJcj4xZAwUL|yY1vvHtUQ=M=F$2&)z~h4XHfU*ALderSGwNWP103b8{qTDsKPk>7 zJZ1s;>m28*1+R}+z#puDSHZwl**7oUW0A30F28*L+=lYS?(K$?T1rcY!|q|Ye|xU2 zM+tQH_9+U3i#v5BlG4nZ}Oi!@k_*f#ULQv{% z-o0l}aUlghbP*+(Oa_lD5VIza!);)2OjRIY9Xk#xCQboKtxz;F(He<$sbk#9jvil^ zU-2Jq2QPJ(DPN!%VoLir4*R+~+d#@x!Y>>Fg73cKmlfTb+}^{KLxCf$zJPM1qodc~ zr}X(+1AeT5UsDdJ(!2@!C8pPFzMNFlP*4k!q;a8Xky21fzulxuP^(12{U>yGDz1zM zW1*Q7GjFh*VQI^SHHe3 zENAZ2@i8qp1XN4vbd+*%ud5~#%njEJs@vDvSr11Z!HvYy?xA!9?%yLJ=0Om7 z(D4}9)2Wu!OT@XUfKi|Qk)BZ98)PgX8$<|FFdcH zDCyHV*(3BRKBM}r?SDn+w*tjP@!p`&r}z-{vCpjfuK|XBp?{d@+`TCDDel!vm(QOJ z6qxnteC`qsCrD9HmxX@MqEF}eNuf{vk{K)iLyJCrpU(^Zo~6K9w?Oriy&qfjDK5Ar zDx$cUgCS zi@vq~Yfz4V6;n6S`I7!$waODu^aIeXH0e`(Q;kL;k(|yMJmG(a0-QfoKgB`Pf6ym; ze}N3nUDBs`iT?kdN8^xaep9_P4=zBNxqgbPa@Z(HB(HM@PxvQLVAfxXzeEKxDGEw@ zL~|B>ItR-_-#Xq_{vqh2Eowjh;e;t5^r@X3gcsFIyaSv^|2+f +#include +#include +int main(int argc, char *argv[]) { + if (argc < 3){ + fprintf(stderr, "Expected 2 arguments: \n"); + exit(1); + } + char* rawGDBfilePath = argv[1]; + FILE* rawGDBfile; + if ((rawGDBfile = fopen(rawGDBfilePath,"rb"))==NULL) { + fprintf(stderr, "File not found: %s\n",rawGDBfilePath); + exit(1); + } + char* outFilePath = argv[2]; + FILE* outFile = fopen(outFilePath,"w"); + uint64_t qemuWord; + uint64_t verilogWord; + int bytesReturned=0; + do { + bytesReturned=fread(&qemuWord, 8, 1, rawGDBfile); + verilogWord = (((qemuWord>>0 )&0xff)<<56 | + ((qemuWord>>8 )&0xff)<<48 | + ((qemuWord>>16)&0xff)<<40 | + ((qemuWord>>24)&0xff)<<32 | + ((qemuWord>>32)&0xff)<<24 | + ((qemuWord>>40)&0xff)<<16 | + ((qemuWord>>48)&0xff)<<8 | + ((qemuWord>>56)&0xff)<<0); + fwrite(&verilogWord, 8, 1, outFile); + } while(bytesReturned!=0); + return 0; +} diff --git a/tests/linux-testgen/testvector-generation/fix_mem.py b/tests/linux-testgen/testvector-generation/fixTxtMem.py similarity index 100% rename from tests/linux-testgen/testvector-generation/fix_mem.py rename to tests/linux-testgen/testvector-generation/fixTxtMem.py diff --git a/tests/linux-testgen/testvector-generation/genCheckpoint.gdb b/tests/linux-testgen/testvector-generation/genCheckpoint.gdb index 926306982..a77441398 100755 --- a/tests/linux-testgen/testvector-generation/genCheckpoint.gdb +++ b/tests/linux-testgen/testvector-generation/genCheckpoint.gdb @@ -13,7 +13,7 @@ define genCheckpoint set $checkPC=$arg3 set $checkPCoccurences=$arg4 eval "set $statePath = \"%s/stateGDB.txt\"", $statePath - eval "set $ramPath = \"%s/ramGDB.txt\"", $ramPath + eval "set $ramPath = \"%s/ramGDB.bin\"", $ramPath # Connect to QEMU session eval "target extended-remote :%d",$tcpPort @@ -46,10 +46,7 @@ define genCheckpoint # Log main memory to a file printf "GDB storing RAM to %s\n", $ramPath - eval "set logging file %s", $ramPath - set logging on - x/134217728xb 0x80000000 - set logging off + eval "dump binary memory %s 0x80000000 0xffffffff", $ramPath kill q diff --git a/tests/linux-testgen/testvector-generation/genCheckpoint.sh b/tests/linux-testgen/testvector-generation/genCheckpoint.sh index cca7486e1..ca4bcf49d 100755 --- a/tests/linux-testgen/testvector-generation/genCheckpoint.sh +++ b/tests/linux-testgen/testvector-generation/genCheckpoint.sh @@ -3,7 +3,7 @@ source genSettings.sh tcpPort=1236 -instrs=450000000 +instrs=8500000 checkOutDir="$outDir/checkpoint$instrs" checkIntermedDir="$checkOutDir/intermediate-outputs" @@ -15,24 +15,35 @@ if [[ $REPLY =~ ^[Yy]$ ]] then mkdir -p $checkOutDir mkdir -p $checkIntermedDir + + # Identify instruction in trace instr=$(sed "${instrs}q;d" "../linux-testvectors/all.txt") - echo "Found ${instrs}th instr: ${instr}." + echo "Found ${instrs}th instr: ${instr}" pc=$(echo $instr | cut -d " " -f1) asm=$(echo $instr | cut -d " " -f2) occurences=$(($(head -$instrs "../linux-testvectors/all.txt" | grep -c "${pc} ${asm}")-1)) echo "It occurs ${occurences} times before the ${instrs}th instr." - # Simulate QEMU, parse QEMU trace, run GDB script which logs a bunch of data at the checkpoint + + # GDB+QEMU + echo "Starting QEMU with attached GDB script at $(date +%H:%M:%S)" ($customQemu \ -M virt \ -nographic \ -bios $imageDir/fw_jump.elf -kernel $imageDir/Image -append "root=/dev/vda ro" -initrd $imageDir/rootfs.cpio \ -singlestep -rtc clock=vm -icount shift=1,align=off,sleep=on,rr=replay,rrfile="$intermedDir/$recordFile" \ -gdb tcp::$tcpPort -S) \ - & riscv64-unknown-elf-gdb -x genCheckpoint.gdb -ex "genCheckpoint $tcpPort $instrs \"$checkIntermedDir\" \"$pc\" $occurences" + & riscv64-unknown-elf-gdb --quiet \ + -x genCheckpoint.gdb -ex "genCheckpoint $tcpPort $instrs \"$checkIntermedDir\" \"$pc\" $occurences" + echo "Completed GDB script completed at $(date +%H:%M:%S)" + # Post-Process GDB outputs ./parseState.py "$checkOutDir" - ./fix_mem.py "$checkIntermedDir/ramGDB.txt" "$checkOutDir/ram.txt" - tail -n+$(($instrs+1)) "$outDir/$traceFile" > "$checkOutDir/$traceFile" + echo "Changing Endianness at $(date +%H:%M:%S)" + make + ./fixBinMem "$checkIntermedDir/ramGDB.bin" "$checkOutDir/ram.bin" + echo "Creating truncated trace at $(date +%H:%M:%S)" + tail -n+$instrs "$outDir/$traceFile" > "$checkOutDir/$traceFile" + echo "Checkpoint completed at $(date +%H:%M:%S)" else echo "You can change the number of instructions by editing the \"instrs\" variable in this script." echo "Have a nice day!" diff --git a/tests/linux-testgen/testvector-generation/genInitMem.sh b/tests/linux-testgen/testvector-generation/genInitMem.sh index 56b30a45e..f82556f58 100755 --- a/tests/linux-testgen/testvector-generation/genInitMem.sh +++ b/tests/linux-testgen/testvector-generation/genInitMem.sh @@ -16,8 +16,8 @@ then & riscv64-unknown-elf-gdb -quiet -x genInitMem.gdb -ex "genInitMem $tcpPort \"$intermedDir\"" echo "Translating Mem from GDB to Questa format" - ./fix_mem.py "$intermedDir/bootmemGDB.txt" "$outDir/bootmem.txt" - ./fix_mem.py "$intermedDir/ramGDB.txt" "$outDir/ram.txt" + ./fixTxtMem.py "$intermedDir/bootmemGDB.txt" "$outDir/bootmem.txt" + ./fixTxtMem.py "$intermedDir/ramGDB.txt" "$outDir/ram.txt" echo "Done" echo "Creating debugging objdump of linux image" diff --git a/tests/linux-testgen/testvector-generation/genSettings.sh b/tests/linux-testgen/testvector-generation/genSettings.sh index 57bd77659..59490e358 100755 --- a/tests/linux-testgen/testvector-generation/genSettings.sh +++ b/tests/linux-testgen/testvector-generation/genSettings.sh @@ -4,7 +4,7 @@ # *** on the long term we'll want to include QEMU in the addins folder export customQemu="/courses/e190ax/qemu_sim/rv64_initrd/qemu_experimental/qemu/build/qemu-system-riscv64" export imageDir="../buildroot-image-output" -export outDir="../linux-testvectors-experimental" +export outDir="../linux-testvectors" export intermedDir="$outDir/intermediate-outputs" export traceFile="all.txt" export recordFile="all.qemu" diff --git a/wally-pipelined/testbench/testbench-linux.sv b/wally-pipelined/testbench/testbench-linux.sv index 72adf589b..68bf64ad5 100644 --- a/wally-pipelined/testbench/testbench-linux.sv +++ b/wally-pipelined/testbench/testbench-linux.sv @@ -280,7 +280,9 @@ module testbench(); `INIT_CHECKPOINT_VAL(SATP, [`XLEN-1:0]); `MAKE_CHECKPOINT_INIT_SIGNAL(MSTATUS, [`XLEN-1:0],0,0); - assign initPriv = (initPC[0][`XLEN-1]) ? 2'h2 : 2'h3; // *** a hacky way to detect initial privilege level + integer ramFile; + integer readResult; + assign initPriv = (initPC[0][`XLEN-1]) ? 2'h1 : 2'h3; // *** a hacky way to detect initial privilege level initial begin force dut.hart.priv.SwIntM = 0; force dut.hart.priv.TimerIntM = 0; @@ -297,7 +299,10 @@ module testbench(); end else begin // checkpoint $sformat(checkpointDir,"checkpoint%0d/",CHECKPOINT); checkpointDir = {`LINUX_TEST_VECTORS,checkpointDir}; - $readmemh({checkpointDir,"ram.txt"}, dut.uncore.dtim.RAM); + //$readmemh({checkpointDir,"ram.txt"}, dut.uncore.dtim.RAM); + ramFile = $fopen({checkpointDir,"ram.bin"}, "rb"); + readResult = $fread(dut.uncore.dtim.RAM,ramFile); + $fclose(ramFile); data_file_all = $fopen({checkpointDir,"all.txt"}, "r"); InstrCountW = CHECKPOINT; // manual checkpoint initializations that don't neatly fit into MACRO From 24d3244cfe9a3ac4c48f0b4d9f15db46b0118c5e Mon Sep 17 00:00:00 2001 From: bbracker Date: Sat, 6 Nov 2021 03:44:23 -0700 Subject: [PATCH 093/132] checkpoint MIDELEG support --- wally-pipelined/testbench/testbench-linux.sv | 1 + 1 file changed, 1 insertion(+) diff --git a/wally-pipelined/testbench/testbench-linux.sv b/wally-pipelined/testbench/testbench-linux.sv index e6896aff0..249cf3902 100644 --- a/wally-pipelined/testbench/testbench-linux.sv +++ b/wally-pipelined/testbench/testbench-linux.sv @@ -275,6 +275,7 @@ module testbench(); endgenerate `INIT_CHECKPOINT_VAL(PC, [`XLEN-1:0]); `INIT_CHECKPOINT_VAL(MEDELEG, [`XLEN-1:0]); + `INIT_CHECKPOINT_VAL(MIDELEG, [`XLEN-1:0]); `INIT_CHECKPOINT_VAL(MIE, [11:0]); `INIT_CHECKPOINT_VAL(MIP, [11:0]); `INIT_CHECKPOINT_VAL(MCAUSE, [`XLEN-1:0]); From 31d38286da2d4b7d63b864fdfaf2e4ba8d366bf8 Mon Sep 17 00:00:00 2001 From: bbracker Date: Sat, 6 Nov 2021 14:14:15 -0700 Subject: [PATCH 094/132] make genCheckpoint accept instr count as argument --- .../testvector-generation/genCheckpoint.sh | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/tests/linux-testgen/testvector-generation/genCheckpoint.sh b/tests/linux-testgen/testvector-generation/genCheckpoint.sh index ca4bcf49d..7671d752f 100755 --- a/tests/linux-testgen/testvector-generation/genCheckpoint.sh +++ b/tests/linux-testgen/testvector-generation/genCheckpoint.sh @@ -2,11 +2,20 @@ source genSettings.sh tcpPort=1236 - -instrs=8500000 checkOutDir="$outDir/checkpoint$instrs" checkIntermedDir="$checkOutDir/intermediate-outputs" +# Parse Commandline Arg +if [ "$#" -ne 1 ]; then + echo "genCheckpoint requires 1 argument: " >&2 + exit 1 +fi +instrs=$1 +if ! [ "$instrs" -eq "$instrs" ] 2> /dev/null +then + echo "Error expected integer number of instructions, got $instrs" >&2 + exit 1 +fi read -p "This scripts is going to create a checkpoint at $instrs instrs. Is that what you wanted? (y/n) " -n 1 -r From d0ad8d3ae3fc207ab9983a7f63d865d87f160c4f Mon Sep 17 00:00:00 2001 From: bbracker Date: Sat, 6 Nov 2021 14:15:16 -0700 Subject: [PATCH 095/132] update tvLinker to new shared dir --- tests/linux-testgen/linux-testvectors/tvLinker.sh | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/tests/linux-testgen/linux-testvectors/tvLinker.sh b/tests/linux-testgen/linux-testvectors/tvLinker.sh index f1004919c..ff7dc3e5e 100755 --- a/tests/linux-testgen/linux-testvectors/tvLinker.sh +++ b/tests/linux-testgen/linux-testvectors/tvLinker.sh @@ -1,9 +1,3 @@ echo "Warning: this script will only work if your repo is on Tera" -ln -s /courses/e190ax/buildroot_boot/all.txt all.txt -ln -s /courses/e190ax/buildroot_boot/bootmem.txt bootmem.txt -ln -s /courses/e190ax/buildroot_boot/ram.txt ram.txt -ln -s /courses/e190ax/buildroot_boot/vmlinux.objdump vmlinux.objdump -ln -s /courses/e190ax/buildroot_boot/vmlinux.objdump.addr vmlinux.objdump.addr -ln -s /courses/e190ax/buildroot_boot/vmlinux.objdump.lab vmlinux.objdump.lab -ln -s /courses/e190ax/buildroot_boot/checkpoint8500000 ./checkpoint8500000 +ln -s /courses/e190ax/linux-testvectors-shared/* ./ echo "Done!" From e585a173e526bbd2df4c26d0fe96a8bea8524d57 Mon Sep 17 00:00:00 2001 From: bbracker Date: Sat, 6 Nov 2021 14:37:49 -0700 Subject: [PATCH 096/132] automated checkpoint generator --- tests/linux-testgen/testvector-generation/checkpointSweep.sh | 5 +++++ tests/linux-testgen/testvector-generation/genCheckpoint.sh | 1 + 2 files changed, 6 insertions(+) create mode 100755 tests/linux-testgen/testvector-generation/checkpointSweep.sh diff --git a/tests/linux-testgen/testvector-generation/checkpointSweep.sh b/tests/linux-testgen/testvector-generation/checkpointSweep.sh new file mode 100755 index 000000000..bc04bbf78 --- /dev/null +++ b/tests/linux-testgen/testvector-generation/checkpointSweep.sh @@ -0,0 +1,5 @@ +for index in {0..105} +do + instrs=$(((400+$index)*1000000)) + echo "y" | ./genCheckpoint.sh $instrs +done diff --git a/tests/linux-testgen/testvector-generation/genCheckpoint.sh b/tests/linux-testgen/testvector-generation/genCheckpoint.sh index 7671d752f..97cdf8a0f 100755 --- a/tests/linux-testgen/testvector-generation/genCheckpoint.sh +++ b/tests/linux-testgen/testvector-generation/genCheckpoint.sh @@ -22,6 +22,7 @@ Is that what you wanted? (y/n) " -n 1 -r echo if [[ $REPLY =~ ^[Yy]$ ]] then + echo "Creating checkpoint at $instrs instructions!" mkdir -p $checkOutDir mkdir -p $checkIntermedDir From 1597e0dac6eff17b83151cf1dfa9eef2cd976be8 Mon Sep 17 00:00:00 2001 From: bbracker Date: Sat, 6 Nov 2021 14:57:29 -0700 Subject: [PATCH 097/132] increase expectations for buildroot and timeout count --- wally-pipelined/regression/regression-wally.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wally-pipelined/regression/regression-wally.py b/wally-pipelined/regression/regression-wally.py index ada9fe383..d1008532b 100755 --- a/wally-pipelined/regression/regression-wally.py +++ b/wally-pipelined/regression/regression-wally.py @@ -32,7 +32,7 @@ configs = [ ] def getBuildrootTC(short): INSTR_LIMIT = 100000 # multiple of 100000 - MAX_EXPECTED = 3000000 + MAX_EXPECTED = 14000000 if short: BRcmd="vsim > {} -c < Date: Sat, 6 Nov 2021 15:02:16 -0700 Subject: [PATCH 098/132] update README.md to reflect new tvLinker location --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index db4818723..b97a5efd3 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,7 @@ cd ../wally-riscv-arch-test make make XLEN=32 exe2memfile.pl work/*/*/*.elf # converts ELF files to a format that can be read by Modelsim -cd ../../wally-pipelined/linux-testgen/linux-testvectors +cd ../../tests/linux-testgen/linux-testvectors ./tvLinker.sh ``` From 24c57966801f33f71610f7a388063a9a6188cecb Mon Sep 17 00:00:00 2001 From: bbracker Date: Sat, 6 Nov 2021 15:25:10 -0700 Subject: [PATCH 099/132] genCheckpoint path bugfix --- tests/linux-testgen/testvector-generation/genCheckpoint.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/linux-testgen/testvector-generation/genCheckpoint.sh b/tests/linux-testgen/testvector-generation/genCheckpoint.sh index 97cdf8a0f..85102f877 100755 --- a/tests/linux-testgen/testvector-generation/genCheckpoint.sh +++ b/tests/linux-testgen/testvector-generation/genCheckpoint.sh @@ -2,8 +2,6 @@ source genSettings.sh tcpPort=1236 -checkOutDir="$outDir/checkpoint$instrs" -checkIntermedDir="$checkOutDir/intermediate-outputs" # Parse Commandline Arg if [ "$#" -ne 1 ]; then @@ -16,6 +14,8 @@ then echo "Error expected integer number of instructions, got $instrs" >&2 exit 1 fi +checkOutDir="$outDir/checkpoint$instrs" +checkIntermedDir="$checkOutDir/intermediate-outputs" read -p "This scripts is going to create a checkpoint at $instrs instrs. Is that what you wanted? (y/n) " -n 1 -r From a7684f1b591e738f78c21a20be7f71a61953d034 Mon Sep 17 00:00:00 2001 From: Kevin Kim Date: Tue, 9 Nov 2021 10:55:48 -0800 Subject: [PATCH 100/132] Makefile added in regression directory: -cd's into imperas then runs make commands, finally running the tvLinker script --- wally-pipelined/regression/Makefile | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 wally-pipelined/regression/Makefile diff --git a/wally-pipelined/regression/Makefile b/wally-pipelined/regression/Makefile new file mode 100644 index 000000000..cdebb5c08 --- /dev/null +++ b/wally-pipelined/regression/Makefile @@ -0,0 +1,6 @@ +make all: + make ../../tests/imperas-riscv-tests/ + make ../../tests/wally-riscv-arch-test/ + make XLEN=32 ../../tests/wally-riscv-arch-test/ + exe2memfile.pl ../../tests/wally-riscv-arch-test/work/*/*/*.elf + cd ../../tests/linux-testgen/linux-testvectors/;./tvLinker.sh From e90d0eee7298cf9055f240d2886cfc4917c4c3d8 Mon Sep 17 00:00:00 2001 From: kipmacsaigoren Date: Wed, 10 Nov 2021 13:01:09 -0600 Subject: [PATCH 101/132] fixed small errors causing overwrites in timing reports From f96152fa3117ea4452966108668effd7da94980b Mon Sep 17 00:00:00 2001 From: David Harris Date: Wed, 10 Nov 2021 12:43:31 -0800 Subject: [PATCH 102/132] bringing Coremark back to life --- tests/riscv-coremark/transferobjdump.sh | 8 ++++++++ tests/riscv-coremark/transferobjump.sh | 8 -------- .../regression/{old => }/wally-coremark_bare.do | 0 wally-pipelined/testbench/testbench.sv | 1 - 4 files changed, 8 insertions(+), 9 deletions(-) create mode 100755 tests/riscv-coremark/transferobjdump.sh delete mode 100755 tests/riscv-coremark/transferobjump.sh rename wally-pipelined/regression/{old => }/wally-coremark_bare.do (100%) diff --git a/tests/riscv-coremark/transferobjdump.sh b/tests/riscv-coremark/transferobjdump.sh new file mode 100755 index 000000000..69578566a --- /dev/null +++ b/tests/riscv-coremark/transferobjdump.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash +./build-coremark.sh + +riscv64-unknown-elf-objdump -D coremark.bare.riscv > coremarkcodemod.bare.riscv.objdump +cp coremarkcodemod.bare.riscv.objdump ~/riscv-wally/tests/imperas-riscv-tests/riscv-ovpsim-plus/examples/CoreMark/. +pushd ~/riscv-wally/tests/imperas-riscv-tests/riscv-ovpsim-plus/examples/CoreMark +./exe2memfile.pl coremarkcodemod.bare.riscv +popd diff --git a/tests/riscv-coremark/transferobjump.sh b/tests/riscv-coremark/transferobjump.sh deleted file mode 100755 index f27f73f5b..000000000 --- a/tests/riscv-coremark/transferobjump.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env bash -./build-coremark.sh - -riscv64-unknown-elf-objdump -D coremark.bare.riscv > coremarkcodemod.bare.riscv.objdump -cp coremarkcodemod.bare.riscv.objdump ~/riscv-wally/imperas-riscv-tests/riscv-ovpsim-plus/examples/CoreMark/. -pushd ~/riscv-wally/imperas-riscv-tests/riscv-ovpsim-plus/examples/CoreMark -./exe2memfile.pl coremarkcodemod.bare.riscv -popd diff --git a/wally-pipelined/regression/old/wally-coremark_bare.do b/wally-pipelined/regression/wally-coremark_bare.do similarity index 100% rename from wally-pipelined/regression/old/wally-coremark_bare.do rename to wally-pipelined/regression/wally-coremark_bare.do diff --git a/wally-pipelined/testbench/testbench.sv b/wally-pipelined/testbench/testbench.sv index 13ba7e16a..ee806286c 100644 --- a/wally-pipelined/testbench/testbench.sv +++ b/wally-pipelined/testbench/testbench.sv @@ -317,7 +317,6 @@ module riscvassertions; assert (2**$clog2(`DCACHE_WAYSIZEINBYTES) == `DCACHE_WAYSIZEINBYTES) else $error("DCACHE_WAYSIZEINBYTES must be a power of 2"); assert (2**$clog2(`ICACHE_BLOCKLENINBITS) == `ICACHE_BLOCKLENINBITS) else $error("ICACHE_BLOCKLENINBITS must be a power of 2"); assert (2**$clog2(`ICACHE_WAYSIZEINBYTES) == `ICACHE_WAYSIZEINBYTES) else $error("ICACHE_WAYSIZEINBYTES must be a power of 2"); - assert (`ICACHE_NUMWAYS == 1 || `MEM_ICACHE == 0) else $warning("Multiple Instruction Cache ways not yet implemented"); assert (2**$clog2(`ITLB_ENTRIES) == `ITLB_ENTRIES) else $error("ITLB_ENTRIES must be a power of 2"); assert (2**$clog2(`DTLB_ENTRIES) == `DTLB_ENTRIES) else $error("DTLB_ENTRIES must be a power of 2"); assert (`TIM_RANGE >= 56'h07FFFFFF) else $warning("Some regression tests will fail if TIM_RANGE is less than 56'h07FFFFFF"); From 99a15e7897e46fffdbc6f3bfd1a28f1c9c5dd229 Mon Sep 17 00:00:00 2001 From: Skylar Litz Date: Thu, 11 Nov 2021 09:35:51 -0800 Subject: [PATCH 103/132] fix timing of delayed interrupt --- wally-pipelined/testbench/testbench-linux.sv | 24 ++++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/wally-pipelined/testbench/testbench-linux.sv b/wally-pipelined/testbench/testbench-linux.sv index 249cf3902..2ca31e582 100644 --- a/wally-pipelined/testbench/testbench-linux.sv +++ b/wally-pipelined/testbench/testbench-linux.sv @@ -470,8 +470,12 @@ module testbench(); if(CheckMIPFutureE) CheckMIPFutureE <= 0; CheckMIPFutureM <= CheckMIPFutureE; if(CheckMIPFutureM) begin - if((ExpectedPCM != MepcExpected) & ((MepcExpected - ExpectedPCM) * (MepcExpected - ExpectedPCM) <= 16)) begin - RequestDelayedMIP = 1; + $display("%tns: ExpectedPCM %x",$time,ExpectedPCM); + $display("%tns: ExpectedPCE %x",$time,ExpectedPCE); + $display("%tns: ExpectedPCW %x",$time,ExpectedPCW); + if((ExpectedPCE != MepcExpected) & ((MepcExpected - ExpectedPCE) * (MepcExpected - ExpectedPCE) <= 16)) begin + // if((ExpectedPCM != MepcExpected) & ((MepcExpected - ExpectedPCM) * (MepcExpected - ExpectedPCM) <= 16)) begin + RequestDelayedMIP <= 1; $display("%tns: Requesting Delayed MIP. Current MEPC value is %x",$time,MepcExpected); end else begin // update MIP immediately $display("%tns: Updating MIP to %x",$time,NextMIPexpected); @@ -488,14 +492,14 @@ module testbench(); $display("%tn: ExpectedCSRArrayM[NumCSRM] %x",$time,ExpectedCSRArrayM[NumCSRM]); $display("%tn: ExpectedCSRArrayValueM[NumCSRM] %x",$time,ExpectedCSRArrayValueM[NumCSRM]); - if((ExpectedPCM != MepcExpected) & ((MepcExpected - ExpectedPCM) * (MepcExpected - ExpectedPCM) <= 16)) begin - RequestDelayedMIP = 1; - $display("%tns: Requesting Delayed MIP. Current MEPC value is %x",$time,MepcExpected); - end else begin - $display("%tns: Updating MIP to %x",$time,NextMIPexpected); - MIPexpected = NextMIPexpected; - force dut.hart.priv.csr.genblk1.csri.MIP_REGW = MIPexpected; - end + // if((ExpectedPCM != MepcExpected) & ((MepcExpected - ExpectedPCM) * (MepcExpected - ExpectedPCM) <= 16)) begin + // RequestDelayedMIP = 1; + // $display("%tns: Requesting Delayed MIP. Current MEPC value is %x",$time,MepcExpected); + // end else begin + // $display("%tns: Updating MIP to %x",$time,NextMIPexpected); + // MIPexpected = NextMIPexpected; + // force dut.hart.priv.csr.genblk1.csri.MIP_REGW = MIPexpected; + // end end if(RequestDelayedMIP) begin $display("%tns: Executing Delayed MIP. Current MEPC value is %x",$time,dut.hart.priv.csr.genblk1.csrm.MEPC_REGW); From 23bd24323bfccd35768320a3c0c8dd67c41db661 Mon Sep 17 00:00:00 2001 From: bbracker Date: Mon, 15 Nov 2021 14:49:00 -0800 Subject: [PATCH 104/132] get current privilege level from GDB for checkpoints --- tests/linux-testgen/testvector-generation/parseState.py | 5 +++-- wally-pipelined/testbench/testbench-linux.sv | 6 ++---- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/tests/linux-testgen/testvector-generation/parseState.py b/tests/linux-testgen/testvector-generation/parseState.py index 9a2173b04..bbbf535ba 100755 --- a/tests/linux-testgen/testvector-generation/parseState.py +++ b/tests/linux-testgen/testvector-generation/parseState.py @@ -34,7 +34,8 @@ stateGDBpath = outDir+'intermediate-outputs/stateGDB.txt' if not os.path.exists(stateGDBpath): sys.exit('Error input file '+stateGDBpath+'not found') -singleCSRs = ['pc','mip','mie','mscratch','mcause','mepc','mtvec','medeleg','mideleg','sscratch','scause','sepc','stvec','sedeleg','sideleg','satp','mstatus'] +singleCSRs = ['pc','mip','mie','mscratch','mcause','mepc','mtvec','medeleg','mideleg','sscratch','scause','sepc','stvec','sedeleg','sideleg','satp','mstatus','priv'] +# priv (current privilege mode) isn't technically a CSR but we can log it with the same machinery thirtyTwoBitCSRs = ['mcounteren','scounteren'] listCSRs = ['hpmcounter','pmpaddr'] pmpcfg = ['pmpcfg'] @@ -75,7 +76,7 @@ with open(stateGDBpath, 'r') as stateGDB: outFile = open(outDir+outFileName, 'w') outFile.write(val+'\n') outFile.close() - if name in thirtyTwoBitCSRs: + elif name in thirtyTwoBitCSRs: outFileName = 'checkpoint-'+name.upper() outFile = open(outDir+outFileName, 'w') val = int(val,16) & 0xffffffff diff --git a/wally-pipelined/testbench/testbench-linux.sv b/wally-pipelined/testbench/testbench-linux.sv index 2ca31e582..eb820c131 100644 --- a/wally-pipelined/testbench/testbench-linux.sv +++ b/wally-pipelined/testbench/testbench-linux.sv @@ -197,7 +197,7 @@ module testbench(); `define STATUS_MIE `CSR_BASE.csrsr.STATUS_MIE `define STATUS_SIE `CSR_BASE.csrsr.STATUS_SIE `define STATUS_UIE `CSR_BASE.csrsr.STATUS_UIE - `define CURR_PRIV dut.hart.priv.privmodereg.q + `define PRIV dut.hart.priv.privmodereg.q `define INSTRET dut.hart.priv.csr.genblk1.counters.genblk1.genblk2.INSTRETreg.q // Common Macros `define checkCSR(CSR) \ @@ -289,11 +289,11 @@ module testbench(); `INIT_CHECKPOINT_VAL(MTVEC, [`XLEN-1:0]); `INIT_CHECKPOINT_VAL(STVEC, [`XLEN-1:0]); `INIT_CHECKPOINT_VAL(SATP, [`XLEN-1:0]); + `INIT_CHECKPOINT_VAL(PRIV, [1:0]); `MAKE_CHECKPOINT_INIT_SIGNAL(MSTATUS, [`XLEN-1:0],0,0); integer ramFile; integer readResult; - assign initPriv = (initPC[0][`XLEN-1]) ? 2'h1 : 2'h3; // *** a hacky way to detect initial privilege level initial begin force dut.hart.priv.SwIntM = 0; force dut.hart.priv.TimerIntM = 0; @@ -325,7 +325,6 @@ module testbench(); force {`STATUS_SPIE,`STATUS_UPIE,`STATUS_MIE} = initMSTATUS[0][5:3]; force {`STATUS_SIE,`STATUS_UIE} = initMSTATUS[0][1:0]; force `INSTRET = CHECKPOINT; - force `CURR_PRIV = initPriv; while (reset!==1) #1; while (reset!==0) #1; #1; @@ -335,7 +334,6 @@ module testbench(); release {`STATUS_SPIE,`STATUS_UPIE,`STATUS_MIE}; release {`STATUS_SIE,`STATUS_UIE}; release `INSTRET; - release `CURR_PRIV; end // Get the E-stage trace reader ahead of the M-stage trace reader matchCountE = $fgets(lineE,traceFileE); From 984a7a6ccdc4ed8ff0eec30ee4195761b5a4f183 Mon Sep 17 00:00:00 2001 From: davidharrishmc <74973295+davidharrishmc@users.noreply.github.com> Date: Tue, 16 Nov 2021 12:33:47 -0800 Subject: [PATCH 105/132] Update README.md updated linux_testvectors path --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b97a5efd3..bbde26148 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,7 @@ cd ../wally-riscv-arch-test make make XLEN=32 exe2memfile.pl work/*/*/*.elf # converts ELF files to a format that can be read by Modelsim -cd ../../tests/linux-testgen/linux-testvectors +cd ../linux-testgen/linux-testvectors ./tvLinker.sh ``` From e35faa9b8a0557d180898951a613e3facd666657 Mon Sep 17 00:00:00 2001 From: Skylar Litz Date: Tue, 16 Nov 2021 16:46:17 -0800 Subject: [PATCH 106/132] fixed interrupt timing bug --- wally-pipelined/testbench/testbench-linux.sv | 48 +++++--------------- 1 file changed, 12 insertions(+), 36 deletions(-) diff --git a/wally-pipelined/testbench/testbench-linux.sv b/wally-pipelined/testbench/testbench-linux.sv index eb820c131..3db2f8cbc 100644 --- a/wally-pipelined/testbench/testbench-linux.sv +++ b/wally-pipelined/testbench/testbench-linux.sv @@ -419,18 +419,6 @@ module testbench(); CheckMIPFutureE = 1; \ NextMIPexpected = ExpectedCSRArrayValueE[NumCSRE]; \ end \ - // $display("%tn: ExpectedCSRArrayM[7] (MEPC) = %x",$time,ExpectedCSRArrayM[7]); \ - // $display("%tn: ExpectedPCM = %x",$time,ExpectedPCM); \ - // // if PC does not equal MEPC, request delayed MIP is True \ - // if(ExpectedPCM != ExpectedCSRArrayM[7]) begin \ - // RequestDelayedMIP = 1; \ - // end else begin \ - // $display("%tns: Updating MIP to %x",$time,ExpectedCSRArrayValueM[NumCSRM]); \ - // MIPexpected = ExpectedCSRArrayValueM[NumCSRM]; \ - // force dut.hart.priv.csr.genblk1.csri.MIP_REGW = MIPexpected; \ - // end \ - // end \ - // $display("%tns: ExpectedCSRArrayM::: %p",$time,ExpectedCSRArrayM); \ if(ExpectedCSRArrayE[NumCSRE].substr(0,3) == "mepc") begin \ $display("hello! we are here."); \ MepcExpected = ExpectedCSRArrayValueE[NumCSRE]; \ @@ -468,11 +456,10 @@ module testbench(); if(CheckMIPFutureE) CheckMIPFutureE <= 0; CheckMIPFutureM <= CheckMIPFutureE; if(CheckMIPFutureM) begin - $display("%tns: ExpectedPCM %x",$time,ExpectedPCM); - $display("%tns: ExpectedPCE %x",$time,ExpectedPCE); - $display("%tns: ExpectedPCW %x",$time,ExpectedPCW); + // $display("%tns: ExpectedPCM %x",$time,ExpectedPCM); + // $display("%tns: ExpectedPCE %x",$time,ExpectedPCE); + // $display("%tns: ExpectedPCW %x",$time,ExpectedPCW); if((ExpectedPCE != MepcExpected) & ((MepcExpected - ExpectedPCE) * (MepcExpected - ExpectedPCE) <= 16)) begin - // if((ExpectedPCM != MepcExpected) & ((MepcExpected - ExpectedPCM) * (MepcExpected - ExpectedPCM) <= 16)) begin RequestDelayedMIP <= 1; $display("%tns: Requesting Delayed MIP. Current MEPC value is %x",$time,MepcExpected); end else begin // update MIP immediately @@ -480,29 +467,18 @@ module testbench(); MIPexpected = NextMIPexpected; force dut.hart.priv.csr.genblk1.csri.MIP_REGW = MIPexpected; end - $display("%tn: ExpectedCSRArrayM = %p",$time,ExpectedCSRArrayM); - $display("%tn: ExpectedCSRArrayValueM = %p",$time,ExpectedCSRArrayValueM); - $display("%tn: ExpectedTokens = %p",$time,ExpectedTokensM); - $display("%tn: MepcExpected = %x",$time,MepcExpected); - $display("%tn: ExpectedPCM = %x",$time,ExpectedPCM); - // if PC does not equal MEPC, request delayed MIP is True - $display("%tns: Difference/multiplication thing: %x",$time,(MepcExpected - ExpectedPCM) * (MepcExpected - ExpectedPCM)); - $display("%tn: ExpectedCSRArrayM[NumCSRM] %x",$time,ExpectedCSRArrayM[NumCSRM]); - $display("%tn: ExpectedCSRArrayValueM[NumCSRM] %x",$time,ExpectedCSRArrayValueM[NumCSRM]); - - // if((ExpectedPCM != MepcExpected) & ((MepcExpected - ExpectedPCM) * (MepcExpected - ExpectedPCM) <= 16)) begin - // RequestDelayedMIP = 1; - // $display("%tns: Requesting Delayed MIP. Current MEPC value is %x",$time,MepcExpected); - // end else begin - // $display("%tns: Updating MIP to %x",$time,NextMIPexpected); - // MIPexpected = NextMIPexpected; - // force dut.hart.priv.csr.genblk1.csri.MIP_REGW = MIPexpected; - // end + // $display("%tn: ExpectedCSRArrayM = %p",$time,ExpectedCSRArrayM); + // $display("%tn: ExpectedCSRArrayValueM = %p",$time,ExpectedCSRArrayValueM); + // $display("%tn: ExpectedTokens = %p",$time,ExpectedTokensM); + // $display("%tn: MepcExpected = %x",$time,MepcExpected); + // $display("%tn: ExpectedPCE = %x",$time,ExpectedPCE); + // $display("%tns: Difference/multiplication thing: %x",$time,(MepcExpected - ExpectedPCE) * (MepcExpected - ExpectedPCE)); + // $display("%tn: ExpectedCSRArrayM[NumCSRM] %x",$time,ExpectedCSRArrayM[NumCSRM]); + // $display("%tn: ExpectedCSRArrayValueM[NumCSRM] %x",$time,ExpectedCSRArrayValueM[NumCSRM]); end - if(RequestDelayedMIP) begin + if(RequestDelayedMIP & checkInstrM) begin $display("%tns: Executing Delayed MIP. Current MEPC value is %x",$time,dut.hart.priv.csr.genblk1.csrm.MEPC_REGW); $display("%tns: Updating MIP to %x",$time,NextMIPexpected); - $display("%tns: MepcExpected %x",$time,MepcExpected); MIPexpected = NextMIPexpected; force dut.hart.priv.csr.genblk1.csri.MIP_REGW = MIPexpected; $display("%tns: Finished Executing Delayed MIP. Current MEPC value is %x",$time,dut.hart.priv.csr.genblk1.csrm.MEPC_REGW); From 3f76549a7d35fc15187c5c03639014210bab1cf2 Mon Sep 17 00:00:00 2001 From: Kip Macsai-Goren Date: Wed, 17 Nov 2021 10:53:17 -0800 Subject: [PATCH 107/132] renamed presrc to forwardedSrc, replaced SrcAE and SrcBE with Forwarded src in the muldiv --- wally-pipelined/regression/wave-all.do | 2 +- wally-pipelined/src/ieu/datapath.sv | 14 ++++++++------ wally-pipelined/src/ieu/ieu.sv | 1 + wally-pipelined/src/muldiv/intdivrestoring.sv | 13 +++++++------ wally-pipelined/src/muldiv/mul.sv | 15 ++++++++------- wally-pipelined/src/muldiv/muldiv.sv | 5 +++-- wally-pipelined/src/wally/wallypipelinedhart.sv | 2 +- 7 files changed, 29 insertions(+), 23 deletions(-) diff --git a/wally-pipelined/regression/wave-all.do b/wally-pipelined/regression/wave-all.do index f587ec8fc..98e04c473 100644 --- a/wally-pipelined/regression/wave-all.do +++ b/wally-pipelined/regression/wave-all.do @@ -492,7 +492,7 @@ add wave -noupdate -radix hexadecimal /testbench/dut/hart/ieu/dp/RdD add wave -noupdate -radix hexadecimal /testbench/dut/hart/ieu/dp/RD1E add wave -noupdate -radix hexadecimal /testbench/dut/hart/ieu/dp/RD2E add wave -noupdate -radix hexadecimal /testbench/dut/hart/ieu/dp/ExtImmE -add wave -noupdate -radix hexadecimal /testbench/dut/hart/ieu/dp/PreSrcAE +add wave -noupdate -radix hexadecimal /testbench/dut/hart/ieu/dp/ForwardedSrcAE add wave -noupdate -radix hexadecimal /testbench/dut/hart/ieu/dp/SrcAE add wave -noupdate -radix hexadecimal /testbench/dut/hart/ieu/dp/SrcBE add wave -noupdate -radix hexadecimal /testbench/dut/hart/ieu/dp/ALUResultE diff --git a/wally-pipelined/src/ieu/datapath.sv b/wally-pipelined/src/ieu/datapath.sv index 2ebd65d82..838d83a79 100644 --- a/wally-pipelined/src/ieu/datapath.sv +++ b/wally-pipelined/src/ieu/datapath.sv @@ -43,6 +43,7 @@ module datapath ( input logic [`XLEN-1:0] PCLinkE, output logic [2:0] FlagsE, output logic [`XLEN-1:0] PCTargetE, + output logic [`XLEN-1:0] ForwardedSrcAE, ForwardedSrcBE, // *** these are the src outputs before the mux choosing between them and PCE to put in srcA/B output logic [`XLEN-1:0] SrcAE, SrcBE, // Memory stage signals input logic StallM, FlushM, @@ -73,7 +74,8 @@ module datapath ( logic [`XLEN-1:0] RD1E, RD2E; logic [`XLEN-1:0] ExtImmE; - logic [`XLEN-1:0] PreSrcAE, PreSrcBE, SrcAE2, SrcBE2; + // logic [`XLEN-1:0] ForwardedSrcAE, ForwardedSrcBE, SrcAE2, SrcBE2; // *** MAde forwardedsrcae an output to get rid of a mux in the critical path. + logic [`XLEN-1:0] SrcAE2, SrcBE2; logic [`XLEN-1:0] ALUResultE; logic [`XLEN-1:0] WriteDataE; @@ -104,12 +106,12 @@ module datapath ( flopenrc #(5) Rs2EReg(clk, reset, FlushE, ~StallE, Rs2D, Rs2E); flopenrc #(5) RdEReg(clk, reset, FlushE, ~StallE, RdD, RdE); - mux3 #(`XLEN) faemux(RD1E, WriteDataW, ResultM, ForwardAE, PreSrcAE); - mux3 #(`XLEN) fbemux(RD2E, WriteDataW, ResultM, ForwardBE, PreSrcBE); - mux2 #(`XLEN) writedatamux(PreSrcBE, FWriteDataE, ~IllegalFPUInstrE, WriteDataE); - mux2 #(`XLEN) srcamux(PreSrcAE, PCE, ALUSrcAE, SrcAE); + mux3 #(`XLEN) faemux(RD1E, WriteDataW, ResultM, ForwardAE, ForwardedSrcAE); + mux3 #(`XLEN) fbemux(RD2E, WriteDataW, ResultM, ForwardBE, ForwardedSrcBE); + mux2 #(`XLEN) writedatamux(ForwardedSrcBE, FWriteDataE, ~IllegalFPUInstrE, WriteDataE); + mux2 #(`XLEN) srcamux(ForwardedSrcAE, PCE, ALUSrcAE, SrcAE); mux2 #(`XLEN) srcamux2(SrcAE, PCLinkE, JumpE, SrcAE2); - mux2 #(`XLEN) srcbmux(PreSrcBE, ExtImmE, ALUSrcBE, SrcBE); + mux2 #(`XLEN) srcbmux(ForwardedSrcBE, ExtImmE, ALUSrcBE, SrcBE); mux2 #(`XLEN) srcbmux2(SrcBE, {`XLEN{1'b0}}, JumpE, SrcBE2); // *** May be able to remove this mux. alu #(`XLEN) alu(SrcAE2, SrcBE2, ALUControlE, ALUResultE, FlagsE); mux2 #(`XLEN) targetsrcmux(PCE, SrcAE, TargetSrcE, TargetBaseE); diff --git a/wally-pipelined/src/ieu/ieu.sv b/wally-pipelined/src/ieu/ieu.sv index d3babff3c..e9c6d1174 100644 --- a/wally-pipelined/src/ieu/ieu.sv +++ b/wally-pipelined/src/ieu/ieu.sv @@ -40,6 +40,7 @@ module ieu ( output logic [`XLEN-1:0] PCTargetE, output logic MulDivE, W64E, output logic [2:0] Funct3E, + output logic [`XLEN-1:0] ForwardedSrcAE, ForwardedSrcBE, // *** these are the src outputs before the mux choosing between them and PCE to put in srcA/B output logic [`XLEN-1:0] SrcAE, SrcBE, input logic FWriteIntM, diff --git a/wally-pipelined/src/muldiv/intdivrestoring.sv b/wally-pipelined/src/muldiv/intdivrestoring.sv index 806015f1f..516046984 100644 --- a/wally-pipelined/src/muldiv/intdivrestoring.sv +++ b/wally-pipelined/src/muldiv/intdivrestoring.sv @@ -33,7 +33,8 @@ module intdivrestoring ( input logic StallM, input logic DivSignedE, W64E, input logic DivE, - input logic [`XLEN-1:0] SrcAE, SrcBE, + //input logic [`XLEN-1:0] SrcAE, SrcBE, + input logic [`XLEN-1:0] ForwardedSrcAE, ForwardedSrcBE, // *** these are the src outputs before the mux choosing between them and PCE to put in srcA/B output logic DivBusyE, output logic [`XLEN-1:0] QuotM, RemM ); @@ -61,11 +62,11 @@ module intdivrestoring ( // Handle sign extension for W-type instructions generate if (`XLEN == 64) begin // RV64 has W-type instructions - mux2 #(`XLEN) xinmux(SrcAE, {SrcAE[31:0], 32'b0}, W64E, XinE); - mux2 #(`XLEN) dinmux(SrcBE, {{32{SrcBE[31]&DivSignedE}}, SrcBE[31:0]}, W64E, DinE); + mux2 #(`XLEN) xinmux(ForwardedSrcAE, {ForwardedSrcAE[31:0], 32'b0}, W64E, XinE); + mux2 #(`XLEN) dinmux(ForwardedSrcBE, {{32{ForwardedSrcBE[31]&DivSignedE}}, ForwardedSrcBE[31:0]}, W64E, DinE); end else begin // RV32 has no W-type instructions - assign XinE = SrcAE; - assign DinE = SrcBE; + assign XinE = ForwardedSrcAE; + assign DinE = ForwardedSrcBE; end endgenerate @@ -79,7 +80,7 @@ module intdivrestoring ( neg #(`XLEN) negd(DinE, DnE); mux2 #(`XLEN) dabsmux(DnE, DinE, SignDE, DAbsBE); // take absolute value for signed operations, and negate for subtraction setp neg #(`XLEN) negx(XinE, XnE); - mux3 #(`XLEN) xabsmux(XinE, XnE, SrcAE, {Div0E, SignXE}, XInitE); // take absolute value for signed operations, or keep original value for divide by 0 + mux3 #(`XLEN) xabsmux(XinE, XnE, ForwardedSrcAE, {Div0E, SignXE}, XInitE); // take absolute value for signed operations, or keep original value for divide by 0 // initialization multiplexers on first cycle of operation mux2 #(`XLEN) wmux(WM[`DIV_BITSPERCYCLE], {`XLEN{1'b0}}, DivStartE, WNextE); diff --git a/wally-pipelined/src/muldiv/mul.sv b/wally-pipelined/src/muldiv/mul.sv index dee645d39..e1174a9cc 100644 --- a/wally-pipelined/src/muldiv/mul.sv +++ b/wally-pipelined/src/muldiv/mul.sv @@ -29,7 +29,8 @@ module mul ( // Execute Stage interface input logic clk, reset, input logic StallM, FlushM, - input logic [`XLEN-1:0] SrcAE, SrcBE, + // input logic [`XLEN-1:0] SrcAE, SrcBE, + input logic [`XLEN-1:0] ForwardedSrcAE, ForwardedSrcBE, // *** these are the src outputs before the mux choosing between them and PCE to put in srcA/B input logic [2:0] Funct3E, output logic [`XLEN*2-1:0] ProdM ); @@ -59,12 +60,12 @@ module mul ( // Execute Stage: Compute partial products ////////////////////////////// - assign Aprime = {1'b0, SrcAE[`XLEN-2:0]}; - assign Bprime = {1'b0, SrcBE[`XLEN-2:0]}; + assign Aprime = {1'b0, ForwardedSrcAE[`XLEN-2:0]}; + assign Bprime = {1'b0, ForwardedSrcBE[`XLEN-2:0]}; redundantmul #(`XLEN) bigmul(.a(Aprime), .b(Bprime), .out0(PP0E), .out1(PP1E)); - assign PA = {(`XLEN-1){SrcAE[`XLEN-1]}} & SrcBE[`XLEN-2:0]; - assign PB = {(`XLEN-1){SrcBE[`XLEN-1]}} & SrcAE[`XLEN-2:0]; - assign PP = SrcAE[`XLEN-1] & SrcBE[`XLEN-1]; + assign PA = {(`XLEN-1){ForwardedSrcAE[`XLEN-1]}} & ForwardedSrcBE[`XLEN-2:0]; + assign PB = {(`XLEN-1){ForwardedSrcBE[`XLEN-1]}} & ForwardedSrcAE[`XLEN-2:0]; + assign PP = ForwardedSrcAE[`XLEN-1] & ForwardedSrcBE[`XLEN-1]; // flavor of multiplication assign MULH = (Funct3E == 3'b001); @@ -88,6 +89,6 @@ module mul ( flopenrc #(`XLEN*2) PP3Reg(clk, reset, FlushM, ~StallM, PP3E, PP3M); flopenrc #(`XLEN*2) PP4Reg(clk, reset, FlushM, ~StallM, PP4E, PP4M); - assign ProdM = PP0M + PP1M + PP2M + PP3M + PP4M; //SrcAE * SrcBE; + assign ProdM = PP0M + PP1M + PP2M + PP3M + PP4M; //ForwardedSrcAE * ForwardedSrcBE; endmodule diff --git a/wally-pipelined/src/muldiv/muldiv.sv b/wally-pipelined/src/muldiv/muldiv.sv index a98fb4f02..260167e8b 100644 --- a/wally-pipelined/src/muldiv/muldiv.sv +++ b/wally-pipelined/src/muldiv/muldiv.sv @@ -28,7 +28,8 @@ module muldiv ( input logic clk, reset, // Execute Stage interface - input logic [`XLEN-1:0] SrcAE, SrcBE, + // input logic [`XLEN-1:0] SrcAE, SrcBE, + input logic [`XLEN-1:0] ForwardedSrcAE, ForwardedSrcBE, // *** these are the src outputs before the mux choosing between them and PCE to put in srcA/B input logic [2:0] Funct3E, Funct3M, input logic MulDivE, W64E, // Writeback stage @@ -58,7 +59,7 @@ module muldiv ( assign DivE = MulDivE & Funct3E[2]; assign DivSignedE = ~Funct3E[0]; intdivrestoring div(.clk, .reset, .StallM, - .DivSignedE, .W64E, .DivE, .SrcAE, .SrcBE, .DivBusyE, .QuotM, .RemM); + .DivSignedE, .W64E, .DivE, .ForwardedSrcAE, .ForwardedSrcBE, .DivBusyE, .QuotM, .RemM); // Result multiplexer always_comb diff --git a/wally-pipelined/src/wally/wallypipelinedhart.sv b/wally-pipelined/src/wally/wallypipelinedhart.sv index ede4460e0..1cecad7c0 100644 --- a/wally-pipelined/src/wally/wallypipelinedhart.sv +++ b/wally-pipelined/src/wally/wallypipelinedhart.sv @@ -59,7 +59,7 @@ module wallypipelinedhart ( logic CSRReadM, CSRWriteM, PrivilegedM; logic [1:0] AtomicE; logic [1:0] AtomicM; - logic [`XLEN-1:0] SrcAE, SrcBE; + logic [`XLEN-1:0] ForwardedSrcAE, ForwardedSrcBE, SrcAE, SrcBE; logic [`XLEN-1:0] SrcAM; logic [2:0] Funct3E; // logic [31:0] InstrF; From 34b3cc1c8d89304936f0e9321e440eef255980dd Mon Sep 17 00:00:00 2001 From: Kevin Kim Date: Wed, 17 Nov 2021 12:17:56 -0800 Subject: [PATCH 108/132] root level makefile added --- Makefile | 26 ++++++++++++++++++++++++++ wally-pipelined/regression/Makefile | 6 +++--- 2 files changed, 29 insertions(+), 3 deletions(-) create mode 100644 Makefile diff --git a/Makefile b/Makefile new file mode 100644 index 000000000..670409b39 --- /dev/null +++ b/Makefile @@ -0,0 +1,26 @@ +make all: submodules other +submodules: addins/riscv-isa-sim addins/riscv-arch-test + cd addins;git init; git submodule add https://github.com/riscv-non-isa/riscv-arch-test; git submodule add https://github.com/riscv-software-src/riscv-isa-sim + git submodule update --init --recursive + +other: + cp -r addins/riscv-isa-sim/arch_test_target/spike/device/rv32i_m/I addins/riscv-isa-sim/arch_test_target/spike/device/rv32i_m/F + cp -r addins/riscv-isa-sim/arch_test_target/spike/device/rv32i_m/I addins/riscv-isa-sim/arch_test_target/spike/device/rv32i_m/D + sed -i 's/--isa=rv32i /--isa=32if/' addins/riscv-isa-sim/arch_test_target/spike/device/rv32i_m/F/Makefile.include + sed -i 's/--isa=rv32i /--isa=32if/' addins/riscv-isa-sim/arch_test_target/spike/device/rv32i_m/D/Makefile.include +ifneq ("$(wildcard $(addins/riscv-isa-sim/build/.*))",) +else + mkdir addins/riscv-isa-sim/build +endif + cd addins/riscv-isa-sim/build; ../configure --prefix=/cad/riscv/gcc/bin + make -C addins/riscv-isa-sim/ + sed -i '/export TARGETDIR ?=/c\export TARGETDIR ?= /home/harris/riscv-wally/addins/riscv-isa-sim/arch_test_target' tests/wally-riscv-arch-test/Makefile.include + echo export RISCV_PREFIX = riscv64-unknown-elf- >> tests/wally-riscv-arch-test/Makefile.include + make -C tests/wally-riscv-arch-test + make -C tests/wally-riscv-arch-test XLEN=32 + cd tests/wally-riscv-arch-test; exe2memfile.pl work/*/*/*.elf + make -C wally-pipelined/regression + + + + diff --git a/wally-pipelined/regression/Makefile b/wally-pipelined/regression/Makefile index cdebb5c08..ad6e427d7 100644 --- a/wally-pipelined/regression/Makefile +++ b/wally-pipelined/regression/Makefile @@ -1,6 +1,6 @@ make all: - make ../../tests/imperas-riscv-tests/ - make ../../tests/wally-riscv-arch-test/ - make XLEN=32 ../../tests/wally-riscv-arch-test/ + make -C ../../tests/imperas-riscv-tests/ + make -C ../../tests/wally-riscv-arch-test/ + make -C XLEN=32 ../../tests/wally-riscv-arch-test/ exe2memfile.pl ../../tests/wally-riscv-arch-test/work/*/*/*.elf cd ../../tests/linux-testgen/linux-testvectors/;./tvLinker.sh From 832b23b8a4df92cf94216c9939e739a0ff1d5cb1 Mon Sep 17 00:00:00 2001 From: Noah Limpert Date: Wed, 17 Nov 2021 12:39:05 -0800 Subject: [PATCH 109/132] Updated IFU variable naming for clarity --- .../src/wally/wallypipelinedhart.sv | 47 ++++++++++++------- 1 file changed, 31 insertions(+), 16 deletions(-) diff --git a/wally-pipelined/src/wally/wallypipelinedhart.sv b/wally-pipelined/src/wally/wallypipelinedhart.sv index 1cecad7c0..439a764b0 100644 --- a/wally-pipelined/src/wally/wallypipelinedhart.sv +++ b/wally-pipelined/src/wally/wallypipelinedhart.sv @@ -155,26 +155,41 @@ module wallypipelinedhart ( ifu ifu( - .clk, .reset, - .StallF, .StallD, .StallE, .StallM, .StallW, - .FlushF, .FlushD, .FlushE, .FlushM, .FlushW, - .InstrInF(InstrRData), .InstrAckF, .PCF, .InstrPAdrF, .InstrReadF, .ICacheStallF, + .clk, .reset, + .StallF, .StallD, .StallE, .StallM, .StallW, + .FlushF, .FlushD, .FlushE, .FlushM, .FlushW, + + // Fetch + .InstrInF(InstrRData), .InstrAckF, .PCF, .InstrPAdrF, + .InstrReadF, .ICacheStallF, + + // Execute .PCLinkE, .PCSrcE, .PCTargetE, .PCE, .BPPredWrongE, - .RetM, .TrapM, - .PrivilegedNextPCM, .InvalidateICacheM, - .InstrD, .InstrM, - .PCM, .InstrClassM, - .BPPredDirWrongM,.BTBPredPCWrongM,.RASPredPCWrongM, .BPPredClassNonCFIWrongM, - .IllegalBaseInstrFaultD, .ITLBInstrPageFaultF, .IllegalIEUInstrFaultD, - .InstrMisalignedFaultM, .InstrMisalignedAdrM, + + // Mem + .RetM, .TrapM, .PrivilegedNextPCM, .InvalidateICacheM, + .InstrD, .InstrM, . PCM, .InstrClassM, .BPPredDirWrongM, + .BTBPredPCWrongM, .RASPredPCWrongM, .BPPredClassNonCFIWrongM, + + // Writeback + + // output logic + // Faults + .IllegalBaseInstrFaultD, .ITLBInstrPageFaultF, + .IllegalIEUInstrFaultD, .InstrMisalignedFaultM, + .InstrMisalignedAdrM, + + // mmu management .PrivilegeModeW, .PTE, .PageType, .SATP_REGW, - .STATUS_MXR, .STATUS_SUM, .STATUS_MPRV, .STATUS_MPP, - .ITLBWriteF, .ITLBFlushF, - .WalkerInstrPageFaultF, - .ITLBMissF, - .PMPCFG_ARRAY_REGW, .PMPADDR_ARRAY_REGW, + .STATUS_MXR, .STATUS_SUM, .STATUS_MPRV, + .STATUS_MPP, .ITLBWriteF, .ITLBFlushF, + .WalkerInstrPageFaultF, .ITLBMissF, + + // pmp/pma (inside mmu) signals. *** temporarily from AHB bus but eventually replace with internal versions pre H + .PMPCFG_ARRAY_REGW, .PMPADDR_ARRAY_REGW, .InstrAccessFaultF + ); // instruction fetch unit: PC, branch prediction, instruction cache From 573f8b0c42442872907f1bcde830885c46c902c2 Mon Sep 17 00:00:00 2001 From: slmnemo Date: Wed, 17 Nov 2021 13:23:12 -0800 Subject: [PATCH 110/132] Removed .*s from muldiv.sv --- wally-pipelined/src/muldiv/muldiv.sv | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/wally-pipelined/src/muldiv/muldiv.sv b/wally-pipelined/src/muldiv/muldiv.sv index a98fb4f02..d163474bf 100644 --- a/wally-pipelined/src/muldiv/muldiv.sv +++ b/wally-pipelined/src/muldiv/muldiv.sv @@ -51,7 +51,11 @@ module muldiv ( logic W64M; // Multiplier - mul mul(.*); + mul mul( + .clk, .reset, + .StallM, .FlushM, + .SrcAE, .SrcBE, + .Funct3E, .ProdM); // Divide // Start a divide when a new division instruction is received and the divider isn't already busy or finishing From 0ccc7d5fe8bb7f32230cfe9ec8489a9f70fdb50d Mon Sep 17 00:00:00 2001 From: Noah Limpert Date: Wed, 17 Nov 2021 13:24:28 -0800 Subject: [PATCH 111/132] ieu variable naming changed for clarity --- .../src/wally/wallypipelinedhart.sv | 38 ++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/wally-pipelined/src/wally/wallypipelinedhart.sv b/wally-pipelined/src/wally/wallypipelinedhart.sv index 439a764b0..523c0953d 100644 --- a/wally-pipelined/src/wally/wallypipelinedhart.sv +++ b/wally-pipelined/src/wally/wallypipelinedhart.sv @@ -194,7 +194,43 @@ module wallypipelinedhart ( ); // instruction fetch unit: PC, branch prediction, instruction cache - ieu ieu(.*); // integer execution unit: integer register file, datapath and controller + ieu ieu( + .clk, .reset, + + // Decode Stage interface + .InstrD, .IllegalIEUInstrFaultD, + .IllegalBaseInstrFaultD, + + // Execute Stage interface + .PCE, .PCLinkE, .FWriteIntE, .IllegalFPUInstrE, + .FWriteDataE, .PCTargetE, .MulDivE, .W64E, + .Funct3E, .ForwardedSrcAE, .ForwardedSrcBE, // *** these are the src outputs before the mux choosing between them and PCE to put in srcA/B + .SrcAE, .SrcBE, .FWriteIntM, + + // Memory stage interface + .SquashSCW, // from LSU + .MemRWM, // read/write control goes to LSU + .AtomicE, // atomic control goes to LSU + .AtomicM, // atomic control goes to LSU + .MemAdrM, .MemAdrE, .WriteDataM, // Address and write data to LSU + .Funct3M, // size and signedness to LSU + .SrcAM, // to privilege and fpu + .RdM, .FIntResM, .InvalidateICacheM, .FlushDCacheM, + + // Writeback stage + .CSRReadValW, .ReadDataM, .MulDivResultW, + .FWriteIntW, .RdW, .ReadDataW, + .InstrValidM, + + // hazards + .StallD, .StallE, .StallM, .StallW, + .FlushD, .FlushE, .FlushM, .FlushW, + .FPUStallD, .LoadStallD, .MulDivStallD, .CSRRdStallD, + .PCSrcE, + .CSRReadM, .CSRWriteM, .PrivilegedM, + .CSRWritePendingDEM, .StoreStallD + + ); // integer execution unit: integer register file, datapath and controller lsu lsu(.clk(clk), .reset(reset), From f4380faa4e26693daf6e4155164c598062772095 Mon Sep 17 00:00:00 2001 From: slmnemo Date: Wed, 17 Nov 2021 13:37:50 -0800 Subject: [PATCH 112/132] removed .* from muldiv.sv (REAL) --- wally-pipelined/src/muldiv/muldiv.sv | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/wally-pipelined/src/muldiv/muldiv.sv b/wally-pipelined/src/muldiv/muldiv.sv index 6cfd33ebb..55ebc2a31 100644 --- a/wally-pipelined/src/muldiv/muldiv.sv +++ b/wally-pipelined/src/muldiv/muldiv.sv @@ -53,10 +53,12 @@ module muldiv ( // Multiplier mul mul( - .clk, .reset, - .StallM, .FlushM, - .SrcAE, .SrcBE, - .Funct3E, .ProdM); + .clk, .reset, + .StallM, .FlushM, + .ForwardedSrcAE, .ForwardedSrcBE, + .Funct3E, + .ProdM + ); // Divide // Start a divide when a new division instruction is received and the divider isn't already busy or finishing From a98dcd11eed772f3e8c4e3d8fd18c403e142951b Mon Sep 17 00:00:00 2001 From: slmnemo Date: Wed, 17 Nov 2021 14:08:08 -0800 Subject: [PATCH 113/132] Removed .* from hazard hzu(.*) in wallypipelinedhart.sv. --- wally-pipelined/src/muldiv/muldiv.sv | 3 ++- wally-pipelined/src/wally/wallypipelinedhart.sv | 12 +++++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/wally-pipelined/src/muldiv/muldiv.sv b/wally-pipelined/src/muldiv/muldiv.sv index 55ebc2a31..b3bf4e83e 100644 --- a/wally-pipelined/src/muldiv/muldiv.sv +++ b/wally-pipelined/src/muldiv/muldiv.sv @@ -55,7 +55,8 @@ module muldiv ( mul mul( .clk, .reset, .StallM, .FlushM, - .ForwardedSrcAE, .ForwardedSrcBE, + // .SrcAE, .SrcBE, + .ForwardedSrcAE, .ForwardedSrcBE, // *** these are the src outputs before the mux choosing between them and PCE to put in srcA/B .Funct3E, .ProdM ); diff --git a/wally-pipelined/src/wally/wallypipelinedhart.sv b/wally-pipelined/src/wally/wallypipelinedhart.sv index 523c0953d..70cee5a93 100644 --- a/wally-pipelined/src/wally/wallypipelinedhart.sv +++ b/wally-pipelined/src/wally/wallypipelinedhart.sv @@ -318,7 +318,17 @@ module wallypipelinedhart ( muldiv mdu(.*); // multiply and divide unit - hazard hzu(.*); // global stall and flush control + hazard hzu( + .BPPredWrongE, .CSRWritePendingDEM, .RetM, .TrapM, + .LoadStallD, .StoreStallD, .MulDivStallD, .CSRRdStallD, + .LSUStall, .ICacheStallF, + .FPUStallD, .FStallD, + .DivBusyE, .FDivBusyE, + .EcallFaultM, .BreakpointFaultM, + .InvalidateICacheM, + // Stall & flush outputs + .StallF, .StallD, .StallE, .StallM, .StallW, + .FlushF, .FlushD, .FlushE, .FlushM, .FlushW); // global stall and flush control // Priveleged block operates in M and W stages, handling CSRs and exceptions privileged priv(.*); From 870549c01ad052f2a601bd2fbc7788a24ec43bdb Mon Sep 17 00:00:00 2001 From: slmnemo Date: Wed, 17 Nov 2021 14:21:23 -0800 Subject: [PATCH 114/132] Removed .* from hazard hzu(.*). --- wally-pipelined/src/wally/wallypipelinedhart.sv | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/wally-pipelined/src/wally/wallypipelinedhart.sv b/wally-pipelined/src/wally/wallypipelinedhart.sv index 70cee5a93..15cc61ba5 100644 --- a/wally-pipelined/src/wally/wallypipelinedhart.sv +++ b/wally-pipelined/src/wally/wallypipelinedhart.sv @@ -316,7 +316,20 @@ module wallypipelinedhart ( .*); - muldiv mdu(.*); // multiply and divide unit + muldiv mdu( + .clk, .reset, + // Execute Stage interface + // .SrcAE, .SrcBE, + .ForwardedSrcAE, .ForwardedSrcBE, // *** these are the src outputs before the mux choosing between them and PCE to put in srcA/B + .Funct3E, .Funct3M, + .MulDivE, .W64E, + // Writeback stage + .MulDivResultW, + // Divide Done + .DivBusyE, + // hazards + .StallM, .StallW, .FlushM, .FlushW + ); // multiply and divide unit hazard hzu( .BPPredWrongE, .CSRWritePendingDEM, .RetM, .TrapM, From b996598b37e6e39f1b10b6935dcd45e2f7d33381 Mon Sep 17 00:00:00 2001 From: David Harris Date: Thu, 18 Nov 2021 16:14:25 -0800 Subject: [PATCH 115/132] CoreMark testing --- .../riscv64-baremetal/core_portme.c | 7 +- wally-pipelined/regression/sim-wally-batch | 2 +- .../regression/wally-coremark_bare.do | 118 ------------------ .../build/Linux-x86_64-GCC/softfloat.a | Bin 514606 -> 514606 bytes .../testbench/testbench-coremark_bare.sv | 21 +++- wally-pipelined/testbench/tests.vh | 4 +- 6 files changed, 23 insertions(+), 129 deletions(-) delete mode 100644 wally-pipelined/regression/wally-coremark_bare.do diff --git a/tests/riscv-coremark/riscv64-baremetal/core_portme.c b/tests/riscv-coremark/riscv64-baremetal/core_portme.c index 43e204a57..c3b30c492 100755 --- a/tests/riscv-coremark/riscv64-baremetal/core_portme.c +++ b/tests/riscv-coremark/riscv64-baremetal/core_portme.c @@ -195,8 +195,11 @@ void stop_time(void) { */ CORE_TICKS get_time(void) { CORE_TICKS elapsed=(CORE_TICKS)(MYTIMEDIFF(stop_time_val, start_time_val)); - //ee_printf(" Elapsed MTIME: %u\n", elapsed); - //ee_printf(" Elapsed MINSTRET: %lu\n", minstretDiff()); + unsigned long instructions = minstretDiff(); + double CPI = elapsed / instructions; + ee_printf(" Elapsed MTIME: %u\n", elapsed); + ee_printf(" Elapsed MINSTRET: %lu\n", instructions); + ee_printf(" CPI: %lf", CPI); return elapsed; } /* Function: time_in_secs diff --git a/wally-pipelined/regression/sim-wally-batch b/wally-pipelined/regression/sim-wally-batch index c603b8432..4b627b768 100755 --- a/wally-pipelined/regression/sim-wally-batch +++ b/wally-pipelined/regression/sim-wally-batch @@ -1,3 +1,3 @@ vsim -c <" prompt: -# do wally-coremark.do -# or, to run from a shell, type the following at the shell prompt: -# vsim -do wally-coremark.do -c -# (omit the "-c" to see the GUI while running from the shell) - -onbreak {resume} - -# create library -if [file exists work] { - vdel -all -} -vlib work - -# compile source files -# suppress spurious warnngs about -# "Extra checking for conflicts with always_comb done at vopt time" -# because vsim will run vopt - -# default to config/coremark, but allow this to be overridden at the command line. For example: -vlog +incdir+../config/coremark_bare +incdir+../config/shared ../testbench/testbench-coremark_bare.sv ../testbench/common/*.sv ../src/*/*.sv -suppress 2583 - -# start and run simulation -# remove +acc flag for faster sim during regressions if there is no need to access internal signals -vopt +acc work.testbench -o workopt -vsim workopt - -mem load -startaddress 268435456 -endaddress 268566527 -filltype value -fillradix hex -filldata 0 /testbench/dut/uncore/dtim/RAM - -view wave - --- display input and output signals as hexidecimal values -# Diplays All Signals recursively -add wave /testbench/clk -add wave /testbench/reset -add wave -divider -#add wave /testbench/dut/hart/ebu/IReadF -#add wave /testbench/dut/hart/DataStall -#add wave /testbench/dut/hart/InstrStall -#add wave /testbench/dut/hart/StallF -#add wave /testbench/dut/hart/StallD -#add wave /testbench/dut/hart/FlushD -#add wave /testbench/dut/hart/FlushE -#add wave /testbench/dut/hart/FlushM -#add wave /testbench/dut/hart/FlushW - -add wave -divider Fetch -add wave -hex /testbench/dut/hart/ifu/PCF -add wave -hex /testbench/dut/hart/ifu/icache/controller/FinalInstrRawF -add wave /testbench/InstrFName -add wave -divider Decode -add wave -hex /testbench/dut/hart/ifu/PCD -add wave -hex /testbench/dut/hart/ifu/InstrD -add wave /testbench/InstrDName -add wave -divider Execute -add wave -hex /testbench/dut/hart/ifu/PCE -add wave -hex /testbench/dut/hart/ifu/InstrE -add wave /testbench/InstrEName -add wave -divider Memory -add wave -hex /testbench/dut/hart/ifu/PCM -add wave -hex /testbench/dut/hart/ifu/InstrM -add wave /testbench/InstrMName -add wave -divider Write -add wave -hex /testbench/PCW -add wave -hex /testbench/InstrW -add wave /testbench/InstrWName -#add wave -hex /testbench/dut/hart/ieu/dp/SrcAE -#add wave -hex /testbench/dut/hart/ieu/dp/SrcBE -#add wave -hex /testbench/dut/hart/ieu/dp/ALUResultE -#add wave /testbench/dut/hart/ieu/dp/PCSrcE -add wave -divider Regfile_signals -#add wave /testbench/dut/uncore/dtim/memwrite -#add wave -hex /testbench/dut/uncore/HADDR -#add wave -hex /testbench/dut/uncore/HWDATA -#add wave -divider -#add wave -hex /testbench/PCW -#add wave /testbench/InstrWName -#add wave /testbench/dut/hart/ieu/dp/RegWriteW -#add wave -hex /testbench/dut/hart/ieu/dp/ResultW -#add wave -hex /testbench/dut/hart/ieu/dp/RdW -add wave -hex -r /testbench/dut/hart/ieu/dp/regf/* -add wave -divider Regfile_itself -add wave -hex -r /testbench/dut/hart/ieu/dp/regf/rf -add wave -divider RAM -#add wave -hex -r /testbench/dut/uncore/dtim/RAM -add wave -divider Misc -add wave -divider -#add wave -hex -r /testbench/* - --- Set Wave Output Items -TreeUpdate [SetDefaultTree] -WaveRestoreZoom {0 ps} {100 ps} -configure wave -namecolwidth 250 -configure wave -valuecolwidth 120 -configure wave -justifyvalue left -configure wave -signalnamewidth 0 -configure wave -snapdistance 10 -configure wave -datasetprefix 0 -configure wave -rowmargin 4 -configure wave -childrowmargin 2 -set DefaultRadix hexadecimal - --- Run the Simulation -#run 7402000 -#run 12750 -run -all -#run 21400 -#quit diff --git a/wally-pipelined/testbench/fp/SoftFloat-3e/build/Linux-x86_64-GCC/softfloat.a b/wally-pipelined/testbench/fp/SoftFloat-3e/build/Linux-x86_64-GCC/softfloat.a index 6ea94ddadad5c0199d0e76d82bb9fa912d51159f..b4466d620c87eb2f27cca4ea509da998f57c5a2b 100644 GIT binary patch delta 5936 zcmZu#YjjlA6<+5)gF(#d0x}aDK?qo&!DMo0n23akjW$nHkqSyMSJ zF*+rOg)0!0;46gK3)vRU0}$jHo??v)31YMrBe58Cp@r^y@0@)nwEyOQ=iAS-&p!K1 zk zn*Hc}-JU*jK9t|}uo-n|JLxeGA1fs*7CltAXKLtN_aJj?=U;`G&&=;iq>s?yV-K0< zx-Sx7_MROgboiY5`#05ukH_4g7MXAVcrUrR$dtUH-kL14?9zGRh>zF3q85eLc1FQb zne8XtsLl&50~l4R4^t5fmj|&qdU#uXA*@~K7|N)4eLQ`NQUr0oj!pN6V}|oUZ4mtwI06sO(hFfj%QONVLRiH?~_*1O3zq#+8k1%H^x9ugiTO>EdGKUdz_6&&uTB`4F zB&{LBh$E8zE}KRoy!Q!d4oKTr8%1WDI@QKbxTca+4EFd(tVhThyy*)T3#SgVs)6C4 z3@a#(_B1$flARRwV*oM}iNu?7(O%X$2Ev}fZSBMR*e=p;Cs(<|3I>Q1w0XUr%|E|g z8VtL2X@M&%a-IWkTrE8&a&ExzSm{NvyI~6l;-zk~U~d*28Z9j&8H{@!oTw@Xw9e!zg@g(W}g@YIw@*)ZWQX$MI)&yf7WWj`-mpcTQ|SrT;v zTdKK4q8r5zNhhQ=jE|kbVxaXw>AYxOj{UfK5%z750`nsfz%3o+dX(Q)1XWK-`^g(} z;33BA$|Ma&J|`U|3sztC!jKhG4tX5m4M%TA^8A;jfpAMm`p}iKngo<_=@>~_JqrqJ zrLBb6E!*lZQ1!Y*4aRR@XwdnlL^qlp{{hCEwxM^8o2C6^2hh6$p)dgXr=^!fp1%-BSf-n?HrNgwu+yzPiYy((aZT}$h>^YHCwSD1GR*nNxm z^0(z^nEkc%6UkXk3;x_A6^I=P@brt)8EE@KdV)xRkV~+xkgYB9Qj!SYDeu6*DEU(o z;)@5%|ALPP$r}g)gsAKT-0Gu%ee^hKvLU;*@>yf#1Xwvjp6f0))na8LZi*WLCO0bw z8IO@=jdzTbHRw&2ce$xX{UtCwAipeBOt5xjKjZU)n1+>U@<)O@!9L_1kDw1WPLWM< z4ktiiwoJF6{dJkay;J22t|WFw50u|6XOIwYAFUO`utNDJ5jjeh%A1H__mAI}$)l)$ zth=Pd!J`Z065?2$4}1Dzc_%5c&JsstFjOs**AZ;>EC=U^$HA5r@{8^w1`rl%eMMd* zMyb%LCNIofEhkcHtZfeywRQ5>qyTUJBKTvyOb0Y*pPcl!=1(dbj>I7L;WBx zT>rV;5CK`$)$^rWT|tfo<6KBkn#crOwcL@cMMgiZZKz7-IT;Blf;$>ow|u0sZiaZ z#!{@|rr#);f|c5wtk9*NYF~y^Z&JPz5v2l-Ftn?wcF9!DRtCd2zgMVaQlUCep<5x< z+E9+$l*Mi4*lEhM!v9pOEQ9WXCs$D4G%vGpR9KBd5xv=*y z$|}aQDp(9JTc|`qN0~yGMyg#CU5_bGk}BblEx4L&+GPg&7AfP1X*HQr-nT;WL1>wB zfvA8ra?oYrW_qA9q+IQ$sd|k<`|G%{VZG8qBDPaF%+-bwBgv|sB3QOrF$uD&M|4;u z*j9ddU+HlPPQQ6+p`yc%4;4{fMv~nD8uloo!nK2lbszN}QN&qs5gbO&d`gvLBth3n zMT~xEwY^X)hPJO1UpV-%@|bUx3|Bc$gB%-94z%|vpN2~bHPu~G#CV39@FbS<_(AFr z*r=<~6ofrt^Od^l;bnu>48G`kRfWny>Z4@PWdJhXCmfRER8eL|l9f_xKF;CQx;hj( zhO1&6Mo)0qZwa?`gI}I5#X(P^Du#C>nHL_%YqK&%-7A#iyY3^r(;HJ=PhHkV2K#PN zM}}t#6i03eOutPXAfj@_dD>Jp735s?D5Rj+OP-NA6Ba;MFC*KEIsGetILEQ zp96&&)T%2Wd^xm=g7Vo}!ZVx2FP>Jffzs`2g0SNQO!g!6WkmoO!OesK?xpBZhR?}q zL#NtJ1P8(-i4$yCuR|}?{?n}p^mBn$3W?vT=^`sG^f-f@KJ{R@OB+6D&(PN}*mlv) zO&H^dP1^dZw%g_QUZde`yE|G-gLF;nzG4Azf$GW!NNyqf*4HO2R5@ZG@K~+WmBe}A z6KwzSk!Bq1{D>>C+VBl+@H=MebD*b6uV65FysHhLVm@t`u$kh#So4CKc={SHw3k74 zx+aNoNa5wvwELkvOIv~}Z_{=N2i*nnrv@sC;J)#P2rl5lCNdA$eU35sab_d~u~q#T z#~CEuuWgr|*HSpNf`_$ymxa5Dtmhur#Hehf0AlsT;MJX436wvny&C~pgTV47nivF( z6s$H6$GIj8W-Zsw^kaHqcC{wv17up=2rD>;C)I0r!y&HGIZpv>^+Uo}g<&}5_~iyI zo*?_$9oC?w5n_?NfCpX-vtc=o-69LNZPONt@;011d%HHPpD_OIuvZHaiPv4wJaFKU z)*_Cf0hj^te~Dp#c_jGo3++E*9}Va1p886=Bo3;<^JnVCaQpY#ogx_qplUVz3`Z~R z7O<1)8-*c1ln>MkqQz#tWOXvDWAU}4bPwctbV|41N+MvhED(PCovw^bxqa zZapSr`Q%i6AyoMEcSz1o3c{mBQtWq^2bQMm;%#d9t#eHGt^IX^!A-fknByG=p5AZ1 zkYf0CeQFe+HC-PGC-2nvh$Pu!krY76S$7rlC7y(+4!=$?{&TS&4L!yB@qV;5EObw6 z3?DyF9|yG$=w1J35pXeDoIkWY8e0o={z<169mY6f6XEYqxNZiljVrazKOK^QBkyp% z%ObhhcuFC6xjtQNa=>~%6vH*u`i}pFb~9kB^-CRaC3f4jxiJ4N{R5(r66(icy%<6U<5#VdVqonSH`4*Y|7FEH#jwAQFz9QGP-!s` pdwy30X7!~~z~13!q0Ulgli|`n{bzEd`H)*90sJ`1pyC9^^Iw3Z9=HGi delta 5929 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 make` - -Full results are available in the files `run1.log` and `run2.log`. CoreMark result can be found in `run1.log`. - -## Cross Compiling - -For cross compile platforms please adjust `core_portme.mak`, `core_portme.h` (and possibly `core_portme.c`) according to the specific platform used. When porting to a new platform, it is recommended to copy one of the default port folders (e.g. `mkdir && cp linux/* `), adjust the porting files, and run: -~~~ -% make PORT_DIR= -~~~ - -## Make Targets -`run` - Default target, creates `run1.log` and `run2.log`. -`run1.log` - Run the benchmark with performance parameters, and output to `run1.log` -`run2.log` - Run the benchmark with validation parameters, and output to `run2.log` -`run3.log` - Run the benchmark with profile generation parameters, and output to `run3.log` -`compile` - compile the benchmark executable -`link` - link the benchmark executable -`check` - test MD5 of sources that may not be modified -`clean` - clean temporary files - -### Make flag: `ITERATIONS` -By default, the benchmark will run between 10-100 seconds. To override, use `ITERATIONS=N` -~~~ -% make ITERATIONS=10 -~~~ -Will run the benchmark for 10 iterations. It is recommended to set a specific number of iterations in certain situations e.g.: - -* Running with a simulator -* Measuring power/energy -* Timing cannot be restarted - -Minimum required run time: **Results are only valid for reporting if the benchmark ran for at least 10 secs!** - -### Make flag: `XCFLAGS` -To add compiler flags from the command line, use `XCFLAGS` e.g.: - -~~~ -% make XCFLAGS="-g -DMULTITHREAD=4 -DUSE_FORK=1" -~~~ - -### Make flag: `CORE_DEBUG` - -Define to compile for a debug run if you get incorrect CRC. - -~~~ -% make XCFLAGS="-DCORE_DEBUG=1" -~~~ - -### Make flag: `REBUILD` - -Force a rebuild of the executable. - -## Systems Without `make` -The following files need to be compiled: -* `core_list_join.c` -* `core_main.c` -* `core_matrix.c` -* `core_state.c` -* `core_util.c` -* `PORT_DIR/core_portme.c` - -For example: -~~~ -% gcc -O2 -o coremark.exe core_list_join.c core_main.c core_matrix.c core_state.c core_util.c simple/core_portme.c -DPERFORMANCE_RUN=1 -DITERATIONS=1000 -% ./coremark.exe > run1.log -~~~ -The above will compile the benchmark for a performance run and 1000 iterations. Output is redirected to `run1.log`. - -# Parallel Execution -Use `XCFLAGS=-DMULTITHREAD=N` where N is number of threads to run in parallel. Several implementations are available to execute in multiple contexts, or you can implement your own in `core_portme.c`. - -~~~ -% make XCFLAGS="-DMULTITHREAD=4 -DUSE_PTHREAD" -~~~ - -The above will compile the benchmark for execution on 4 cores, using POSIX Threads API. - -Note: linking may fail on the previous command if your linker does not automatically add the `pthread` library. If you encounter `undefined reference` errors, please modify the `core_portme.mak` file for your platform, (e.g. `linux/core_portme.mak`) and add `-lpthread` to the `LFLAGS_END` parameter. - -# Run Parameters for the Benchmark Executable -CoreMark's executable takes several parameters as follows (but only if `main()` accepts arguments): -1st - A seed value used for initialization of data. -2nd - A seed value used for initialization of data. -3rd - A seed value used for initialization of data. -4th - Number of iterations (0 for auto : default value) -5th - Reserved for internal use. -6th - Reserved for internal use. -7th - For malloc users only, ovreride the size of the input data buffer. - -The run target from make will run coremark with 2 different data initialization seeds. - -## Alternative parameters: -If not using `malloc` or command line arguments are not supported, the buffer size -for the algorithms must be defined via the compiler define `TOTAL_DATA_SIZE`. -`TOTAL_DATA_SIZE` must be set to 2000 bytes (default) for standard runs. -The default for such a target when testing different configurations could be: - -~~~ -% make XCFLAGS="-DTOTAL_DATA_SIZE=6000 -DMAIN_HAS_NOARGC=1" -~~~ - -# Submitting Results - -CoreMark results can be submitted on the web. Open a web browser and go to the [submission page](https://www.eembc.org/coremark/submit.php). After registering an account you may enter a score. - -# Run Rules -What is and is not allowed. - -## Required -1. The benchmark needs to run for at least 10 seconds. -2. All validation must succeed for seeds `0,0,0x66` and `0x3415,0x3415,0x66`, buffer size of 2000 bytes total. - * If not using command line arguments to main: -~~~ - % make XCFLAGS="-DPERFORMANCE_RUN=1" REBUILD=1 run1.log - % make XCFLAGS="-DVALIDATION_RUN=1" REBUILD=1 run2.log -~~~ -3. If using profile guided optimization, profile must be generated using seeds of `8,8,8`, and buffer size of 1200 bytes total. -~~~ - % make XCFLAGS="-DTOTAL_DATA_SIZE=1200 -DPROFILE_RUN=1" REBUILD=1 run3.log -~~~ -4. All source files must be compiled with the same flags. -5. All data type sizes must match size in bits such that: - * `ee_u8` is an unsigned 8-bit datatype. - * `ee_s16` is a signed 16-bit datatype. - * `ee_u16` is an unsigned 16-bit datatype. - * `ee_s32` is a signed 32-bit datatype. - * `ee_u32` is an unsigned 32-bit datatype. - -## Allowed - -1. Changing number of iterations -2. Changing toolchain and build/load/run options -3. Changing method of acquiring a data memory block -5. Changing the method of acquiring seed values -6. Changing implementation `in core_portme.c` -7. Changing configuration values in `core_portme.h` -8. Changing `core_portme.mak` - -## NOT ALLOWED -1. Changing of source file other then `core_portme*` (use `make check` to validate) - -# Reporting rules -Use the following syntax to report results on a data sheet: - -CoreMark 1.0 : N / C [/ P] [/ M] - -N - Number of iterations per second with seeds 0,0,0x66,size=2000) - -C - Compiler version and flags - -P - Parameters such as data and code allocation specifics - -* This parameter *may* be omitted if all data was allocated on the heap in RAM. -* This parameter *may not* be omitted when reporting CoreMark/MHz - -M - Type of parallel execution (if used) and number of contexts -* This parameter may be omitted if parallel execution was not used. - -e.g.: - -~~~ -CoreMark 1.0 : 128 / GCC 4.1.2 -O2 -fprofile-use / Heap in TCRAM / FORK:2 -~~~ -or -~~~ -CoreMark 1.0 : 1400 / GCC 3.4 -O4 -~~~ - -If reporting scaling results, the results must be reported as follows: - -CoreMark/MHz 1.0 : N / C / P [/ M] - -P - When reporting scaling results, memory parameter must also indicate memory frequency:core frequency ratio. -1. If the core has cache and cache frequency to core frequency ratio is configurable, that must also be included. - -e.g.: - -~~~ -CoreMark/MHz 1.0 : 1.47 / GCC 4.1.2 -O2 / DDR3(Heap) 30:1 Memory 1:1 Cache -~~~ - -# Log File Format -The log files have the following format - -~~~ -2K performance run parameters for coremark. (Run type) -CoreMark Size : 666 (Buffer size) -Total ticks : 25875 (platform dependent value) -Total time (secs) : 25.875000 (actual time in seconds) -Iterations/Sec : 3864.734300 (Performance value to report) -Iterations : 100000 (number of iterations used) -Compiler version : GCC3.4.4 (Compiler and version) -Compiler flags : -O2 (Compiler and linker flags) -Memory location : Code in flash, data in on chip RAM -seedcrc : 0xe9f5 (identifier for the input seeds) -[0]crclist : 0xe714 (validation for list part) -[0]crcmatrix : 0x1fd7 (validation for matrix part) -[0]crcstate : 0x8e3a (validation for state part) -[0]crcfinal : 0x33ff (iteration dependent output) -Correct operation validated. See README.md for run and reporting rules. (*Only when run is successful*) -CoreMark 1.0 : 6508.490622 / GCC3.4.4 -O2 / Heap (*Only on a successful performance run*) -~~~ - -# Theory of Operation - -This section describes the initial goals of CoreMark and their implementation. - -## Small and easy to understand - -* X number of source code lines for timed portion of the benchmark. -* Meaningful names for variables and functions. -* Comments for each block of code more than 10 lines long. - -## Portability - -A thin abstraction layer will be provided for I/O and timing in a separate file. All I/O and timing of the benchmark will be done through this layer. - -### Code / data size - -* Compile with gcc on x86 and make sure all sizes are according to requirements. -* If dynamic memory allocation is used, take total memory allocated into account as well. -* Avoid recursive functions and keep track of stack usage. -* Use the same memory block as data site for all algorithms, and initialize the data before each algorithm – while this means that initialization with data happens during the timed portion, it will only happen once during the timed portion and so have negligible effect on the results. - -## Controlled output - -This may be the most difficult goal. Compilers are constantly improving and getting better at analyzing code. To create work that cannot be computed at compile time and must be computed at run time, we will rely on two assumptions: - -* Some system functions (e.g. time, scanf) and parameters cannot be computed at compile time. In most cases, marking a variable volatile means the compiler is force to read this variable every time it is read. This will be used to introduce a factor into the input that cannot be precomputed at compile time. Since the results are input dependent, that will make sure that computation has to happen at run time. - -* Either a system function or I/O (e.g. scanf) or command line parameters or volatile variables will be used before the timed portion to generate data which is not available at compile time. Specific method used is not relevant as long as it can be controlled, and that it cannot be computed or eliminated by the compiler at compile time. E.g. if the clock() functions is a compiler stub, it may not be used. The derived values will be reported on the output so that verification can be done on a different machine. - -* We cannot rely on command line parameters since some embedded systems do not have the capability to provide command line parameters. All 3 methods above will be implemented (time based, scanf and command line parameters) and all 3 are valid if the compiler cannot determine the value at compile time. - -* It is important to note that The actual values that are to be supplied at run time will be standardized. The methodology is not intended to provide random data, but simply to provide controlled data that cannot be precomputed at compile time. - -* Printed results must be valid at run time. This will be used to make sure the computation has been executed. - -* Some embedded systems do not provide “printf†or other I/O functionality. All I/O will be done through a thin abstraction interface to allow execution on such systems (e.g. allow output via JTAG). - -## Key Algorithms - -### Linked List - -The following linked list structure will be used: - -~~~ -typedef struct list_data_s { - ee_s16 data16; - ee_s16 idx; -} list_data; - -typedef struct list_head_s { - struct list_head_s *next; - struct list_data_s *info; -} list_head; -~~~ - -While adding a level of indirection accessing the data, this structure is realistic and used in many embedded applications for small to medium lists. - -The list itself will be initialized on a block of memory that will be passed in to the initialization function. While in general linked lists use malloc for new nodes, embedded applications sometime control the memory for small data structures such as arrays and lists directly to avoid the overhead of system calls, so this approach is realistic. - -The linked list will be initialized such that 1/4 of the list pointers point to sequential areas in memory, and 3/4 of the list pointers are distributed in a non sequential manner. This is done to emulate a linked list that had add/remove happen for a while disrupting the neat order, and then a series of adds that are likely to come from sequential memory locations. - -For the benchmark itself: -- Multiple find operations are going to be performed. These find operations may result in the whole list being traversed. The result of each find will become part of the output chain. -- The list will be sorted using merge sort based on the data16 value, and then derive CRC of the data16 item in order for part of the list. The CRC will become part of the output chain. -- The list will be sorted again using merge sort based on the idx value. This sort will guarantee that the list is returned to the primary state before leaving the function, so that multiple iterations of the function will have the same result. CRC of the data16 for part of the list will again be calculated and become part of the output chain. - -The actual `data16` in each cell will be pseudo random based on a single 16b input that cannot be determined at compile time. In addition, the part of the list which is used for CRC will also be passed to the function, and determined based on an input that cannot be determined at run time. - -### Matrix Multiply - -This very simple algorithm forms the basis of many more complex algorithms. The tight inner loop is the focus of many optimizations (compiler as well as hardware based) and is thus relevant for embedded processing. - -The total available data space will be divided to 3 parts: -1. NxN matrix A. -2. NxN matrix B. -3. NxN matrix C. - -E.g. for 2K we will have 3 12x12 matrices (assuming data type of 32b 12(len)*12(wid)*4(size)*3(num) =1728 bytes). - -Matrix A will be initialized with small values (upper 3/4 of the bits all zero). -Matrix B will be initialized with medium values (upper half of the bits all zero). -Matrix C will be used for the result. - -For the benchmark itself: -- Multiple A by a constant into C, add the upper bits of each of the values in the result matrix. The result will become part of the output chain. -- Multiple A by column X of B into C, add the upper bits of each of the values in the result matrix. The result will become part of the output chain. -- Multiple A by B into C, add the upper bits of each of the values in the result matrix. The result will become part of the output chain. - -The actual values for A and B must be derived based on input that is not available at compile time. - -### State Machine - -This part of the code needs to exercise switch and if statements. As such, we will use a small Moore state machine. In particular, this will be a state machine that identifies string input as numbers and divides them according to format. - -The state machine will parse the input string until either a “,†separator or end of input is encountered. An invalid number will cause the state machine to return invalid state and a valid number will cause the state machine to return with type of number format (int/float/scientific). - -This code will perform a realistic task, be small enough to easily understand, and exercise the required functionality. The other option used in embedded systems is a mealy based state machine, which is driven by a table. The table then determines the number of states and complexity of transitions. This approach, however, tests mainly the load/store and function call mechanisms and less the handling of branches. If analysis of the final results shows that the load/store functionality of the processor is not exercised thoroughly, it may be a good addition to the benchmark (codesize allowing). - -For input, the memory block will be initialized with comma separated values of mixed formats, as well as invalid inputs. - -For the benchmark itself: -- Invoke the state machine on all of the input and count final states and state transitions. CRC of all final states and transitions will become part of the output chain. -- Modify the input at intervals (inject errors) and repeat the state machine operation. -- Modify the input back to original form. - -The actual input must be initialized based on data that cannot be determined at compile time. In addition the intervals for modification of the input and the actual modification must be based on input that cannot be determined at compile time. - -# Validation - -This release was tested on the following platforms: -* x86 cygwin and gcc 3.4 (Quad, dual and single core systems) -* x86 linux (Ubuntu/Fedora) and gcc (4.2/4.1) (Quad and single core systems) -* MIPS64 BE linux and gcc 3.4 16 cores system -* MIPS32 BE linux with CodeSourcery compiler 4.2-177 on Malta/Linux with a 1004K 3-core system -* PPC simulator with gcc 4.2.2 (No OS) -* PPC 64b BE linux (yellowdog) with gcc 3.4 and 4.1 (Dual core system) -* BF533 with VDSP50 -* Renesas R8C/H8 MCU with HEW 4.05 -* NXP LPC1700 armcc v4.0.0.524 -* NEC 78K with IAR v4.61 -* ARM simulator with armcc v4 - -# Memory Analysis - -Valgrind 3.4.0 used and no errors reported. - -# Balance Analysis - -Number of instructions executed for each function tested with cachegrind and found balanced with gcc and -O0. - -# Statistics - -Lines: -~~~ -Lines Blank Cmnts Source AESL -===== ===== ===== ===== ========== ======================================= - 469 66 170 251 627.5 core_list_join.c (C) - 330 18 54 268 670.0 core_main.c (C) - 256 32 80 146 365.0 core_matrix.c (C) - 240 16 51 186 465.0 core_state.c (C) - 165 11 20 134 335.0 core_util.c (C) - 150 23 36 98 245.0 coremark.h (C) - 1610 166 411 1083 2707.5 ----- Benchmark ----- (6 files) - 293 15 74 212 530.0 linux/core_portme.c (C) - 235 30 104 104 260.0 linux/core_portme.h (C) - 528 45 178 316 790.0 ----- Porting ----- (2 files) - -* For comparison, here are the stats for Dhrystone -Lines Blank Cmnts Source AESL -===== ===== ===== ===== ========== ======================================= - 311 15 242 54 135.0 dhry.h (C) - 789 132 119 553 1382.5 dhry_1.c (C) - 186 26 68 107 267.5 dhry_2.c (C) - 1286 173 429 714 1785.0 ----- C ----- (3 files) -~~~ - -# Credits -Many thanks to all of the individuals who helped with the development or testing of CoreMark including (Sorted by company name; note that company names may no longer be accurate as this was written in 2009). -* Alan Anderson, ADI -* Adhikary Rajiv, ADI -* Elena Stohr, ARM -* Ian Rickards, ARM -* Andrew Pickard, ARM -* Trent Parker, CAVIUM -* Shay Gal-On, EEMBC -* Markus Levy, EEMBC -* Peter Torelli, EEMBC -* Ron Olson, IBM -* Eyal Barzilay, MIPS -* Jens Eltze, NEC -* Hirohiko Ono, NEC -* Ulrich Drees, NEC -* Frank Roscheda, NEC -* Rob Cosaro, NXP -* Shumpei Kawasaki, RENESAS - -# Legal -Please refer to LICENSE.md in this reposity for a description of your rights to use this code. - -# Copyright -Copyright © 2009 EEMBC All rights reserved. -CoreMark is a trademark of EEMBC and EEMBC is a registered trademark of the Embedded Microprocessor Benchmark Consortium. - diff --git a/tests/riscv-coremark/coremark/barebones/core_portme.c b/tests/riscv-coremark/coremark/barebones/core_portme.c deleted file mode 100644 index 18967676b..000000000 --- a/tests/riscv-coremark/coremark/barebones/core_portme.c +++ /dev/null @@ -1,153 +0,0 @@ -/* -Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Original Author: Shay Gal-on -*/ -#include "coremark.h" -#include "core_portme.h" - -#if VALIDATION_RUN -volatile ee_s32 seed1_volatile = 0x3415; -volatile ee_s32 seed2_volatile = 0x3415; -volatile ee_s32 seed3_volatile = 0x66; -#endif -#if PERFORMANCE_RUN -volatile ee_s32 seed1_volatile = 0x0; -volatile ee_s32 seed2_volatile = 0x0; -volatile ee_s32 seed3_volatile = 0x66; -#endif -#if PROFILE_RUN -volatile ee_s32 seed1_volatile = 0x8; -volatile ee_s32 seed2_volatile = 0x8; -volatile ee_s32 seed3_volatile = 0x8; -#endif -volatile ee_s32 seed4_volatile = ITERATIONS; -volatile ee_s32 seed5_volatile = 0; -/* Porting : Timing functions - How to capture time and convert to seconds must be ported to whatever is - supported by the platform. e.g. Read value from on board RTC, read value from - cpu clock cycles performance counter etc. Sample implementation for standard - time.h and windows.h definitions included. -*/ -CORETIMETYPE -barebones_clock() -{ -#error \ - "You must implement a method to measure time in barebones_clock()! This function should return current time.\n" -} -/* Define : TIMER_RES_DIVIDER - Divider to trade off timer resolution and total time that can be - measured. - - Use lower values to increase resolution, but make sure that overflow - does not occur. If there are issues with the return value overflowing, - increase this value. - */ -#define GETMYTIME(_t) (*_t = barebones_clock()) -#define MYTIMEDIFF(fin, ini) ((fin) - (ini)) -#define TIMER_RES_DIVIDER 1 -#define SAMPLE_TIME_IMPLEMENTATION 1 -#define EE_TICKS_PER_SEC (CLOCKS_PER_SEC / TIMER_RES_DIVIDER) - -/** Define Host specific (POSIX), or target specific global time variables. */ -static CORETIMETYPE start_time_val, stop_time_val; - -/* Function : start_time - This function will be called right before starting the timed portion of - the benchmark. - - Implementation may be capturing a system timer (as implemented in the - example code) or zeroing some system parameters - e.g. setting the cpu clocks - cycles to 0. -*/ -void -start_time(void) -{ - GETMYTIME(&start_time_val); -} -/* Function : stop_time - This function will be called right after ending the timed portion of the - benchmark. - - Implementation may be capturing a system timer (as implemented in the - example code) or other system parameters - e.g. reading the current value of - cpu cycles counter. -*/ -void -stop_time(void) -{ - GETMYTIME(&stop_time_val); -} -/* Function : get_time - Return an abstract "ticks" number that signifies time on the system. - - Actual value returned may be cpu cycles, milliseconds or any other - value, as long as it can be converted to seconds by . This - methodology is taken to accomodate any hardware or simulated platform. The - sample implementation returns millisecs by default, and the resolution is - controlled by -*/ -CORE_TICKS -get_time(void) -{ - CORE_TICKS elapsed - = (CORE_TICKS)(MYTIMEDIFF(stop_time_val, start_time_val)); - return elapsed; -} -/* Function : time_in_secs - Convert the value returned by get_time to seconds. - - The type is used to accomodate systems with no support for - floating point. Default implementation implemented by the EE_TICKS_PER_SEC - macro above. -*/ -secs_ret -time_in_secs(CORE_TICKS ticks) -{ - secs_ret retval = ((secs_ret)ticks) / (secs_ret)EE_TICKS_PER_SEC; - return retval; -} - -ee_u32 default_num_contexts = 1; - -/* Function : portable_init - Target specific initialization code - Test for some common mistakes. -*/ -void -portable_init(core_portable *p, int *argc, char *argv[]) -{ -#error \ - "Call board initialization routines in portable init (if needed), in particular initialize UART!\n" - if (sizeof(ee_ptr_int) != sizeof(ee_u8 *)) - { - ee_printf( - "ERROR! Please define ee_ptr_int to a type that holds a " - "pointer!\n"); - } - if (sizeof(ee_u32) != 4) - { - ee_printf("ERROR! Please define ee_u32 to a 32b unsigned type!\n"); - } - p->portable_id = 1; -} -/* Function : portable_fini - Target specific final code -*/ -void -portable_fini(core_portable *p) -{ - p->portable_id = 0; -} diff --git a/tests/riscv-coremark/coremark/barebones/core_portme.h b/tests/riscv-coremark/coremark/barebones/core_portme.h deleted file mode 100644 index 55f643bf3..000000000 --- a/tests/riscv-coremark/coremark/barebones/core_portme.h +++ /dev/null @@ -1,210 +0,0 @@ -/* -Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Original Author: Shay Gal-on -*/ -/* Topic : Description - This file contains configuration constants required to execute on - different platforms -*/ -#ifndef CORE_PORTME_H -#define CORE_PORTME_H -/************************/ -/* Data types and settings */ -/************************/ -/* Configuration : HAS_FLOAT - Define to 1 if the platform supports floating point. -*/ -#ifndef HAS_FLOAT -#define HAS_FLOAT 1 -#endif -/* Configuration : HAS_TIME_H - Define to 1 if platform has the time.h header file, - and implementation of functions thereof. -*/ -#ifndef HAS_TIME_H -#define HAS_TIME_H 1 -#endif -/* Configuration : USE_CLOCK - Define to 1 if platform has the time.h header file, - and implementation of functions thereof. -*/ -#ifndef USE_CLOCK -#define USE_CLOCK 1 -#endif -/* Configuration : HAS_STDIO - Define to 1 if the platform has stdio.h. -*/ -#ifndef HAS_STDIO -#define HAS_STDIO 0 -#endif -/* Configuration : HAS_PRINTF - Define to 1 if the platform has stdio.h and implements the printf - function. -*/ -#ifndef HAS_PRINTF -#define HAS_PRINTF 0 -#endif - -/* Definitions : COMPILER_VERSION, COMPILER_FLAGS, MEM_LOCATION - Initialize these strings per platform -*/ -#ifndef COMPILER_VERSION -#ifdef __GNUC__ -#define COMPILER_VERSION "GCC"__VERSION__ -#else -#define COMPILER_VERSION "Please put compiler version here (e.g. gcc 4.1)" -#endif -#endif -#ifndef COMPILER_FLAGS -#define COMPILER_FLAGS \ - FLAGS_STR /* "Please put compiler flags here (e.g. -o3)" */ -#endif -#ifndef MEM_LOCATION -#define MEM_LOCATION "STACK" -#endif - -/* Data Types : - To avoid compiler issues, define the data types that need ot be used for - 8b, 16b and 32b in . - - *Imprtant* : - ee_ptr_int needs to be the data type used to hold pointers, otherwise - coremark may fail!!! -*/ -typedef signed short ee_s16; -typedef unsigned short ee_u16; -typedef signed int ee_s32; -typedef double ee_f32; -typedef unsigned char ee_u8; -typedef unsigned int ee_u32; -typedef ee_u32 ee_ptr_int; -typedef size_t ee_size_t; -#define NULL ((void *)0) -/* align_mem : - This macro is used to align an offset to point to a 32b value. It is - used in the Matrix algorithm to initialize the input memory blocks. -*/ -#define align_mem(x) (void *)(4 + (((ee_ptr_int)(x)-1) & ~3)) - -/* Configuration : CORE_TICKS - Define type of return from the timing functions. - */ -#define CORETIMETYPE ee_u32 -typedef ee_u32 CORE_TICKS; - -/* Configuration : SEED_METHOD - Defines method to get seed values that cannot be computed at compile - time. - - Valid values : - SEED_ARG - from command line. - SEED_FUNC - from a system function. - SEED_VOLATILE - from volatile variables. -*/ -#ifndef SEED_METHOD -#define SEED_METHOD SEED_VOLATILE -#endif - -/* Configuration : MEM_METHOD - Defines method to get a block of memry. - - Valid values : - MEM_MALLOC - for platforms that implement malloc and have malloc.h. - MEM_STATIC - to use a static memory array. - MEM_STACK - to allocate the data block on the stack (NYI). -*/ -#ifndef MEM_METHOD -#define MEM_METHOD MEM_STACK -#endif - -/* Configuration : MULTITHREAD - Define for parallel execution - - Valid values : - 1 - only one context (default). - N>1 - will execute N copies in parallel. - - Note : - If this flag is defined to more then 1, an implementation for launching - parallel contexts must be defined. - - Two sample implementations are provided. Use or - to enable them. - - It is valid to have a different implementation of - and in , to fit a particular architecture. -*/ -#ifndef MULTITHREAD -#define MULTITHREAD 1 -#define USE_PTHREAD 0 -#define USE_FORK 0 -#define USE_SOCKET 0 -#endif - -/* Configuration : MAIN_HAS_NOARGC - Needed if platform does not support getting arguments to main. - - Valid values : - 0 - argc/argv to main is supported - 1 - argc/argv to main is not supported - - Note : - This flag only matters if MULTITHREAD has been defined to a value - greater then 1. -*/ -#ifndef MAIN_HAS_NOARGC -#define MAIN_HAS_NOARGC 0 -#endif - -/* Configuration : MAIN_HAS_NORETURN - Needed if platform does not support returning a value from main. - - Valid values : - 0 - main returns an int, and return value will be 0. - 1 - platform does not support returning a value from main -*/ -#ifndef MAIN_HAS_NORETURN -#define MAIN_HAS_NORETURN 0 -#endif - -/* Variable : default_num_contexts - Not used for this simple port, must cintain the value 1. -*/ -extern ee_u32 default_num_contexts; - -typedef struct CORE_PORTABLE_S -{ - ee_u8 portable_id; -} core_portable; - -/* target specific init/fini */ -void portable_init(core_portable *p, int *argc, char *argv[]); -void portable_fini(core_portable *p); - -#if !defined(PROFILE_RUN) && !defined(PERFORMANCE_RUN) \ - && !defined(VALIDATION_RUN) -#if (TOTAL_DATA_SIZE == 1200) -#define PROFILE_RUN 1 -#elif (TOTAL_DATA_SIZE == 2000) -#define PERFORMANCE_RUN 1 -#else -#define VALIDATION_RUN 1 -#endif -#endif - -int ee_printf(const char *fmt, ...); - -#endif /* CORE_PORTME_H */ diff --git a/tests/riscv-coremark/coremark/barebones/core_portme.mak b/tests/riscv-coremark/coremark/barebones/core_portme.mak deleted file mode 100755 index 81594697d..000000000 --- a/tests/riscv-coremark/coremark/barebones/core_portme.mak +++ /dev/null @@ -1,87 +0,0 @@ -# Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# Original Author: Shay Gal-on - -#File : core_portme.mak - -# Flag : OUTFLAG -# Use this flag to define how to to get an executable (e.g -o) -OUTFLAG= -o -# Flag : CC -# Use this flag to define compiler to use -CC = gcc -# Flag : LD -# Use this flag to define compiler to use -LD = gld -# Flag : AS -# Use this flag to define compiler to use -AS = gas -# Flag : CFLAGS -# Use this flag to define compiler options. Note, you can add compiler options from the command line using XCFLAGS="other flags" -PORT_CFLAGS = -O0 -g -FLAGS_STR = "$(PORT_CFLAGS) $(XCFLAGS) $(XLFLAGS) $(LFLAGS_END)" -CFLAGS = $(PORT_CFLAGS) -I$(PORT_DIR) -I. -DFLAGS_STR=\"$(FLAGS_STR)\" -#Flag : LFLAGS_END -# Define any libraries needed for linking or other flags that should come at the end of the link line (e.g. linker scripts). -# Note : On certain platforms, the default clock_gettime implementation is supported but requires linking of librt. -SEPARATE_COMPILE=1 -# Flag : SEPARATE_COMPILE -# You must also define below how to create an object file, and how to link. -OBJOUT = -o -LFLAGS = -ASFLAGS = -OFLAG = -o -COUT = -c - -LFLAGS_END = -# Flag : PORT_SRCS -# Port specific source files can be added here -# You may also need cvt.c if the fcvt functions are not provided as intrinsics by your compiler! -PORT_SRCS = $(PORT_DIR)/core_portme.c $(PORT_DIR)/ee_printf.c -vpath %.c $(PORT_DIR) -vpath %.s $(PORT_DIR) - -# Flag : LOAD -# For a simple port, we assume self hosted compile and run, no load needed. - -# Flag : RUN -# For a simple port, we assume self hosted compile and run, simple invocation of the executable - -LOAD = echo "Please set LOAD to the process of loading the executable to the flash" -RUN = echo "Please set LOAD to the process of running the executable (e.g. via jtag, or board reset)" - -OEXT = .o -EXE = .bin - -$(OPATH)$(PORT_DIR)/%$(OEXT) : %.c - $(CC) $(CFLAGS) $(XCFLAGS) $(COUT) $< $(OBJOUT) $@ - -$(OPATH)%$(OEXT) : %.c - $(CC) $(CFLAGS) $(XCFLAGS) $(COUT) $< $(OBJOUT) $@ - -$(OPATH)$(PORT_DIR)/%$(OEXT) : %.s - $(AS) $(ASFLAGS) $< $(OBJOUT) $@ - -# Target : port_pre% and port_post% -# For the purpose of this simple port, no pre or post steps needed. - -.PHONY : port_prebuild port_postbuild port_prerun port_postrun port_preload port_postload -port_pre% port_post% : - -# FLAG : OPATH -# Path to the output folder. Default - current folder. -OPATH = ./ -MKDIR = mkdir -p - diff --git a/tests/riscv-coremark/coremark/barebones/cvt.c b/tests/riscv-coremark/coremark/barebones/cvt.c deleted file mode 100644 index 333e8ead2..000000000 --- a/tests/riscv-coremark/coremark/barebones/cvt.c +++ /dev/null @@ -1,127 +0,0 @@ -/* -Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ -#include -#define CVTBUFSIZE 80 -static char CVTBUF[CVTBUFSIZE]; - -static char * -cvt(double arg, int ndigits, int *decpt, int *sign, char *buf, int eflag) -{ - int r2; - double fi, fj; - char * p, *p1; - - if (ndigits < 0) - ndigits = 0; - if (ndigits >= CVTBUFSIZE - 1) - ndigits = CVTBUFSIZE - 2; - r2 = 0; - *sign = 0; - p = &buf[0]; - if (arg < 0) - { - *sign = 1; - arg = -arg; - } - arg = modf(arg, &fi); - p1 = &buf[CVTBUFSIZE]; - - if (fi != 0) - { - p1 = &buf[CVTBUFSIZE]; - while (fi != 0) - { - fj = modf(fi / 10, &fi); - *--p1 = (int)((fj + .03) * 10) + '0'; - r2++; - } - while (p1 < &buf[CVTBUFSIZE]) - *p++ = *p1++; - } - else if (arg > 0) - { - while ((fj = arg * 10) < 1) - { - arg = fj; - r2--; - } - } - p1 = &buf[ndigits]; - if (eflag == 0) - p1 += r2; - *decpt = r2; - if (p1 < &buf[0]) - { - buf[0] = '\0'; - return buf; - } - while (p <= p1 && p < &buf[CVTBUFSIZE]) - { - arg *= 10; - arg = modf(arg, &fj); - *p++ = (int)fj + '0'; - } - if (p1 >= &buf[CVTBUFSIZE]) - { - buf[CVTBUFSIZE - 1] = '\0'; - return buf; - } - p = p1; - *p1 += 5; - while (*p1 > '9') - { - *p1 = '0'; - if (p1 > buf) - ++*--p1; - else - { - *p1 = '1'; - (*decpt)++; - if (eflag == 0) - { - if (p > buf) - *p = '0'; - p++; - } - } - } - *p = '\0'; - return buf; -} - -char * -ecvt(double arg, int ndigits, int *decpt, int *sign) -{ - return cvt(arg, ndigits, decpt, sign, CVTBUF, 1); -} - -char * -ecvtbuf(double arg, int ndigits, int *decpt, int *sign, char *buf) -{ - return cvt(arg, ndigits, decpt, sign, buf, 1); -} - -char * -fcvt(double arg, int ndigits, int *decpt, int *sign) -{ - return cvt(arg, ndigits, decpt, sign, CVTBUF, 0); -} - -char * -fcvtbuf(double arg, int ndigits, int *decpt, int *sign, char *buf) -{ - return cvt(arg, ndigits, decpt, sign, buf, 0); -} diff --git a/tests/riscv-coremark/coremark/barebones/ee_printf.c b/tests/riscv-coremark/coremark/barebones/ee_printf.c deleted file mode 100644 index f2d362dc0..000000000 --- a/tests/riscv-coremark/coremark/barebones/ee_printf.c +++ /dev/null @@ -1,700 +0,0 @@ -/* -Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -#include -#include - -#define ZEROPAD (1 << 0) /* Pad with zero */ -#define SIGN (1 << 1) /* Unsigned/signed long */ -#define PLUS (1 << 2) /* Show plus */ -#define SPACE (1 << 3) /* Spacer */ -#define LEFT (1 << 4) /* Left justified */ -#define HEX_PREP (1 << 5) /* 0x */ -#define UPPERCASE (1 << 6) /* 'ABCDEF' */ - -#define is_digit(c) ((c) >= '0' && (c) <= '9') - -static char * 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) -{ - const char *sc; - for (sc = s; *sc != '\0' && count--; ++sc) - ; - return sc - s; -} - -static int -skip_atoi(const char **s) -{ - int i = 0; - while (is_digit(**s)) - i = i * 10 + *((*s)++) - '0'; - return i; -} - -static char * -number(char *str, long num, int base, int size, int precision, int type) -{ - char c, sign, tmp[66]; - char *dig = digits; - int i; - - if (type & UPPERCASE) - dig = upper_digits; - if (type & LEFT) - type &= ~ZEROPAD; - if (base < 2 || base > 36) - return 0; - - c = (type & ZEROPAD) ? '0' : ' '; - sign = 0; - if (type & SIGN) - { - if (num < 0) - { - sign = '-'; - num = -num; - size--; - } - else if (type & PLUS) - { - sign = '+'; - size--; - } - else if (type & SPACE) - { - sign = ' '; - size--; - } - } - - if (type & HEX_PREP) - { - if (base == 16) - size -= 2; - else if (base == 8) - size--; - } - - i = 0; - - if (num == 0) - tmp[i++] = '0'; - else - { - while (num != 0) - { - tmp[i++] = dig[((unsigned long)num) % (unsigned)base]; - num = ((unsigned long)num) / (unsigned)base; - } - } - - if (i > precision) - precision = i; - size -= precision; - if (!(type & (ZEROPAD | LEFT))) - while (size-- > 0) - *str++ = ' '; - if (sign) - *str++ = sign; - - if (type & HEX_PREP) - { - if (base == 8) - *str++ = '0'; - else if (base == 16) - { - *str++ = '0'; - *str++ = digits[33]; - } - } - - if (!(type & LEFT)) - while (size-- > 0) - *str++ = c; - while (i < precision--) - *str++ = '0'; - while (i-- > 0) - *str++ = tmp[i]; - while (size-- > 0) - *str++ = ' '; - - return str; -} - -static char * -eaddr(char *str, unsigned char *addr, int size, int precision, int type) -{ - char tmp[24]; - char *dig = digits; - int i, len; - - if (type & UPPERCASE) - dig = upper_digits; - len = 0; - for (i = 0; i < 6; i++) - { - if (i != 0) - tmp[len++] = ':'; - tmp[len++] = dig[addr[i] >> 4]; - tmp[len++] = dig[addr[i] & 0x0F]; - } - - if (!(type & LEFT)) - while (len < size--) - *str++ = ' '; - for (i = 0; i < len; ++i) - *str++ = tmp[i]; - while (len < size--) - *str++ = ' '; - - return str; -} - -static char * -iaddr(char *str, unsigned char *addr, int size, int precision, int type) -{ - char tmp[24]; - int i, n, len; - - len = 0; - for (i = 0; i < 4; i++) - { - if (i != 0) - tmp[len++] = '.'; - n = addr[i]; - - if (n == 0) - tmp[len++] = digits[0]; - else - { - if (n >= 100) - { - tmp[len++] = digits[n / 100]; - n = n % 100; - tmp[len++] = digits[n / 10]; - n = n % 10; - } - else if (n >= 10) - { - tmp[len++] = digits[n / 10]; - n = n % 10; - } - - tmp[len++] = digits[n]; - } - } - - if (!(type & LEFT)) - while (len < size--) - *str++ = ' '; - for (i = 0; i < len; ++i) - *str++ = tmp[i]; - while (len < size--) - *str++ = ' '; - - return str; -} - -#if HAS_FLOAT - -char * ecvtbuf(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); - -void -ee_bufcpy(char *pd, char *ps, int count) -{ - char *pe = ps + count; - while (ps != pe) - *pd++ = *ps++; -} - -static void -parse_float(double value, char *buffer, char fmt, int precision) -{ - int decpt, sign, exp, pos; - char *digits = NULL; - char cvtbuf[80]; - int capexp = 0; - int magnitude; - - if (fmt == 'G' || fmt == 'E') - { - capexp = 1; - fmt += 'a' - 'A'; - } - - if (fmt == 'g') - { - digits = ecvtbuf(value, precision, &decpt, &sign, cvtbuf); - magnitude = decpt - 1; - if (magnitude < -4 || magnitude > precision - 1) - { - fmt = 'e'; - precision -= 1; - } - else - { - fmt = 'f'; - precision -= decpt; - } - } - - if (fmt == 'e') - { - digits = ecvtbuf(value, precision + 1, &decpt, &sign, cvtbuf); - - if (sign) - *buffer++ = '-'; - *buffer++ = *digits; - if (precision > 0) - *buffer++ = '.'; - ee_bufcpy(buffer, digits + 1, precision); - buffer += precision; - *buffer++ = capexp ? 'E' : 'e'; - - if (decpt == 0) - { - if (value == 0.0) - exp = 0; - else - exp = -1; - } - else - exp = decpt - 1; - - if (exp < 0) - { - *buffer++ = '-'; - exp = -exp; - } - else - *buffer++ = '+'; - - buffer[2] = (exp % 10) + '0'; - exp = exp / 10; - buffer[1] = (exp % 10) + '0'; - exp = exp / 10; - buffer[0] = (exp % 10) + '0'; - buffer += 3; - } - else if (fmt == 'f') - { - digits = fcvtbuf(value, precision, &decpt, &sign, cvtbuf); - if (sign) - *buffer++ = '-'; - if (*digits) - { - if (decpt <= 0) - { - *buffer++ = '0'; - *buffer++ = '.'; - for (pos = 0; pos < -decpt; pos++) - *buffer++ = '0'; - while (*digits) - *buffer++ = *digits++; - } - else - { - pos = 0; - while (*digits) - { - if (pos++ == decpt) - *buffer++ = '.'; - *buffer++ = *digits++; - } - } - } - else - { - *buffer++ = '0'; - if (precision > 0) - { - *buffer++ = '.'; - for (pos = 0; pos < precision; pos++) - *buffer++ = '0'; - } - } - } - - *buffer = '\0'; -} - -static void -decimal_point(char *buffer) -{ - while (*buffer) - { - if (*buffer == '.') - return; - if (*buffer == 'e' || *buffer == 'E') - break; - buffer++; - } - - if (*buffer) - { - int n = strnlen(buffer, 256); - while (n > 0) - { - buffer[n + 1] = buffer[n]; - n--; - } - - *buffer = '.'; - } - else - { - *buffer++ = '.'; - *buffer = '\0'; - } -} - -static void -cropzeros(char *buffer) -{ - char *stop; - - while (*buffer && *buffer != '.') - buffer++; - if (*buffer++) - { - while (*buffer && *buffer != 'e' && *buffer != 'E') - buffer++; - stop = buffer--; - while (*buffer == '0') - buffer--; - if (*buffer == '.') - buffer--; - while (buffer != stop) - *++buffer = 0; - } -} - -static char * -flt(char *str, double num, int size, int precision, char fmt, int flags) -{ - char tmp[80]; - char c, sign; - int n, i; - - // Left align means no zero padding - if (flags & LEFT) - flags &= ~ZEROPAD; - - // Determine padding and sign char - c = (flags & ZEROPAD) ? '0' : ' '; - sign = 0; - if (flags & SIGN) - { - if (num < 0.0) - { - sign = '-'; - num = -num; - size--; - } - else if (flags & PLUS) - { - sign = '+'; - size--; - } - else if (flags & SPACE) - { - sign = ' '; - size--; - } - } - - // Compute the precision value - if (precision < 0) - precision = 6; // Default precision: 6 - - // Convert floating point number to text - parse_float(num, tmp, fmt, precision); - - if ((flags & HEX_PREP) && precision == 0) - decimal_point(tmp); - if (fmt == 'g' && !(flags & HEX_PREP)) - cropzeros(tmp); - - n = strnlen(tmp, 256); - - // Output number with alignment and padding - size -= n; - if (!(flags & (ZEROPAD | LEFT))) - while (size-- > 0) - *str++ = ' '; - if (sign) - *str++ = sign; - if (!(flags & LEFT)) - while (size-- > 0) - *str++ = c; - for (i = 0; i < n; i++) - *str++ = tmp[i]; - while (size-- > 0) - *str++ = ' '; - - return str; -} - -#endif - -static int -ee_vsprintf(char *buf, const char *fmt, va_list args) -{ - int len; - unsigned long num; - int i, base; - char * str; - char * s; - - int flags; // Flags to number() - - int field_width; // Width of output field - int precision; // Min. # of digits for integers; max number of chars for - // from string - int qualifier; // 'h', 'l', or 'L' for integer fields - - for (str = buf; *fmt; fmt++) - { - if (*fmt != '%') - { - *str++ = *fmt; - continue; - } - - // Process flags - flags = 0; - repeat: - fmt++; // This also skips first '%' - switch (*fmt) - { - case '-': - flags |= LEFT; - goto repeat; - case '+': - flags |= PLUS; - goto repeat; - case ' ': - flags |= SPACE; - goto repeat; - case '#': - flags |= HEX_PREP; - goto repeat; - case '0': - flags |= ZEROPAD; - goto repeat; - } - - // Get field width - field_width = -1; - if (is_digit(*fmt)) - field_width = skip_atoi(&fmt); - else if (*fmt == '*') - { - fmt++; - field_width = va_arg(args, int); - if (field_width < 0) - { - field_width = -field_width; - flags |= LEFT; - } - } - - // Get the precision - precision = -1; - if (*fmt == '.') - { - ++fmt; - if (is_digit(*fmt)) - precision = skip_atoi(&fmt); - else if (*fmt == '*') - { - ++fmt; - precision = va_arg(args, int); - } - if (precision < 0) - precision = 0; - } - - // Get the conversion qualifier - qualifier = -1; - if (*fmt == 'l' || *fmt == 'L') - { - qualifier = *fmt; - fmt++; - } - - // Default base - base = 10; - - switch (*fmt) - { - case 'c': - if (!(flags & LEFT)) - while (--field_width > 0) - *str++ = ' '; - *str++ = (unsigned char)va_arg(args, int); - while (--field_width > 0) - *str++ = ' '; - continue; - - case 's': - s = va_arg(args, char *); - if (!s) - s = ""; - len = strnlen(s, precision); - if (!(flags & LEFT)) - while (len < field_width--) - *str++ = ' '; - for (i = 0; i < len; ++i) - *str++ = *s++; - while (len < field_width--) - *str++ = ' '; - continue; - - case 'p': - if (field_width == -1) - { - field_width = 2 * sizeof(void *); - flags |= ZEROPAD; - } - str = number(str, - (unsigned long)va_arg(args, void *), - 16, - field_width, - precision, - flags); - continue; - - case 'A': - flags |= UPPERCASE; - - case 'a': - if (qualifier == 'l') - str = eaddr(str, - va_arg(args, unsigned char *), - field_width, - precision, - flags); - else - str = iaddr(str, - va_arg(args, unsigned char *), - field_width, - precision, - flags); - continue; - - // Integer number formats - set up the flags and "break" - case 'o': - base = 8; - break; - - case 'X': - flags |= UPPERCASE; - - case 'x': - base = 16; - break; - - case 'd': - case 'i': - flags |= SIGN; - - case 'u': - break; - -#if HAS_FLOAT - - case 'f': - str = flt(str, - va_arg(args, double), - field_width, - precision, - *fmt, - flags | SIGN); - continue; - -#endif - - default: - if (*fmt != '%') - *str++ = '%'; - if (*fmt) - *str++ = *fmt; - else - --fmt; - continue; - } - - if (qualifier == 'l') - num = va_arg(args, unsigned long); - else if (flags & SIGN) - num = va_arg(args, int); - else - num = va_arg(args, unsigned int); - - str = number(str, num, base, field_width, precision, flags); - } - - *str = '\0'; - return str - buf; -} - -void -uart_send_char(char c) -{ -#error "You must implement the method uart_send_char to use this file!\n"; - /* Output of a char to a UART usually follows the following model: - Wait until UART is ready - Write char to UART - Wait until UART is done - - Or in code: - while (*UART_CONTROL_ADDRESS != UART_READY); - *UART_DATA_ADDRESS = c; - while (*UART_CONTROL_ADDRESS != UART_READY); - - Check the UART sample code on your platform or the board - documentation. - */ -} - -int -ee_printf(const char *fmt, ...) -{ - char buf[1024], *p; - va_list args; - int n = 0; - - va_start(args, fmt); - ee_vsprintf(buf, fmt, args); - va_end(args); - p = buf; - while (*p) - { - uart_send_char(*p); - n++; - p++; - } - - return n; -} diff --git a/tests/riscv-coremark/coremark/core_list_join.c b/tests/riscv-coremark/coremark/core_list_join.c deleted file mode 100644 index 4bffeeccf..000000000 --- a/tests/riscv-coremark/coremark/core_list_join.c +++ /dev/null @@ -1,580 +0,0 @@ -/* -Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Original Author: Shay Gal-on -*/ - -#include "coremark.h" -//#include -//#include -/* -Topic: Description - Benchmark using a linked list. - - Linked list is a common data structure used in many applications. - - For our purposes, this will excercise the memory units of the processor. - In particular, usage of the list pointers to find and alter data. - - We are not using Malloc since some platforms do not support this library. - - Instead, the memory block being passed in is used to create a list, - and the benchmark takes care not to add more items then can be - accomodated by the memory block. The porting layer will make sure - that we have a valid memory block. - - All operations are done in place, without using any extra memory. - - The list itself contains list pointers and pointers to data items. - Data items contain the following: - - idx - An index that captures the initial order of the list. - data - Variable data initialized based on the input parameters. The 16b are divided as follows: - o Upper 8b are backup of original data. - o Bit 7 indicates if the lower 7 bits are to be used as is or calculated. - o Bits 0-2 indicate type of operation to perform to get a 7b value. - o Bits 3-6 provide input for the operation. - -*/ - -/* local functions */ - -list_head *core_list_find(list_head *list,list_data *info); -list_head *core_list_reverse(list_head *list); -list_head *core_list_remove(list_head *item); -list_head *core_list_undo_remove(list_head *item_removed, list_head *item_modified); -list_head *core_list_insert_new(list_head *insert_point - , list_data *info, list_head **memblock, list_data **datablock - , list_head *memblock_end, list_data *datablock_end); -typedef ee_s32(*list_cmp)(list_data *a, list_data *b, core_results *res); -list_head *core_list_mergesort(list_head *list, list_cmp cmp, core_results *res); - -ee_s16 calc_func(ee_s16 *pdata, core_results *res) { - ee_s16 data=*pdata; - ee_s16 retval; - ee_u8 optype=(data>>7) & 1; /* bit 7 indicates if the function result has been cached */ - if (optype) /* if cached, use cache */ - return (data & 0x007f); - else { /* otherwise calculate and cache the result */ - ee_s16 flag=data & 0x7; /* bits 0-2 is type of function to perform */ - ee_s16 dtype=((data>>3) & 0xf); /* bits 3-6 is specific data for the operation */ - dtype |= dtype << 4; /* replicate the lower 4 bits to get an 8b value */ - switch (flag) { - case 0: - if (dtype<0x22) /* set min period for bit corruption */ - dtype=0x22; - retval=core_bench_state(res->size,res->memblock[3],res->seed1,res->seed2,dtype,res->crc); - if (res->crcstate==0) - res->crcstate=retval; - break; - case 1: - retval=core_bench_matrix(&(res->mat),dtype,res->crc); - if (res->crcmatrix==0) - res->crcmatrix=retval; - break; - default: - retval=data; - break; - } - res->crc=crcu16(retval,res->crc); - retval &= 0x007f; - *pdata = (data & 0xff00) | 0x0080 | retval; /* cache the result */ - return retval; - } -} -/* Function: cmp_complex - Compare the data item in a list cell. - - Can be used by mergesort. -*/ -ee_s32 cmp_complex(list_data *a, list_data *b, core_results *res) { - ee_s16 val1=calc_func(&(a->data16),res); - ee_s16 val2=calc_func(&(b->data16),res); - return val1 - val2; -} - -/* Function: cmp_idx - Compare the idx item in a list cell, and regen the data. - - Can be used by mergesort. -*/ -ee_s32 cmp_idx(list_data *a, list_data *b, core_results *res) { - if (res==NULL) { - a->data16 = (a->data16 & 0xff00) | (0x00ff & (a->data16>>8)); - b->data16 = (b->data16 & 0xff00) | (0x00ff & (b->data16>>8)); - } - return a->idx - b->idx; -} - -/*void ehitoa(int value, char *str, int base){ - if (value>100000) strcpy(str,"too big"); - else{ - int places[6] = {100000, 10000, 1000, 100, 10, 1}; - int col; - int pv; - for(col = 0; col<6; col++){ - pv = 0; - while (value >= places[col]){ - value=value -places[col]; - pv++; - - } - str[col]=pv+'0'; - } - str[6]=0; - } -}*/ - -void copy_info(list_data *to,list_data *from) { - to->data16=from->data16; - to->idx=from->idx; -} - -/* Benchmark for linked list: - - Try to find multiple data items. - - List sort - - Operate on data from list (crc) - - Single remove/reinsert - * At the end of this function, the list is back to original state -*/ -ee_u16 core_bench_list(core_results *res, ee_s16 finder_idx) { - ee_u16 retval=0; - ee_u16 found=0,missed=0; - list_head *list=res->list; - ee_s16 find_num=res->seed3; - list_head *this_find; - list_head *finder, *remover; - list_data info; - ee_s16 i; - //ee_printf("entered corebenchlist \n"); - info.idx=finder_idx; - /* find values in the list, and change the list each time (reverse and cache if value found) */ - for (i=0; inext->info->data16 >> 8) & 1; - //ee_printf("if statement \n"); - } - else { - found++; - //ee_printf("else statement \n"); - if (this_find->info->data16 & 0x1) /* use found value */ - retval+=(this_find->info->data16 >> 9) & 1; - /* and cache next item at the head of the list (if any) */ - if (this_find->next != NULL) { - finder = this_find->next; - this_find->next = finder->next; - finder->next=list->next; - list->next=finder; - } - } - if (info.idx>=0) - info.idx++; -#if CORE_DEBUG - //ee_printf("List find %d: [%d,%d,%d]\n",i,retval,missed,found); -#endif - } - retval+=found*4-missed; - /* sort the list by data content and remove one item*/ - if (finder_idx>0) - list=core_list_mergesort(list,cmp_complex,res); - remover=core_list_remove(list->next); - /* CRC data content of list from location of index N forward, and then undo remove */ - finder=core_list_find(list,&info); - if (!finder) - finder=list->next; - while (finder) { - retval=crc16(list->info->data16,retval); - finder=finder->next; - } -#if CORE_DEBUG - //ee_printf("List sort 1: %04x\n",retval); -#endif - remover=core_list_undo_remove(remover,list->next); - /* sort the list by index, in effect returning the list to original state */ - list=core_list_mergesort(list,cmp_idx,NULL); - /* CRC data content of list */ - finder=list->next; - while (finder) { - retval=crc16(list->info->data16,retval); - finder=finder->next; - } -#if CORE_DEBUG - //ee_printf("List sort 2: %04x\n",retval); -#endif - return retval; -} -/* Function: core_list_init - Initialize list with data. - - Parameters: - blksize - Size of memory to be initialized. - memblock - Pointer to memory block. - seed - Actual values chosen depend on the seed parameter. - The seed parameter MUST be supplied from a source that cannot be determined at compile time - - Returns: - Pointer to the head of the list. - -*/ -list_head *core_list_init(ee_u32 blksize, list_head *memblock, ee_s16 seed) { - /* calculated pointers for the list */ - //ee_printf("%d \n blksize", blksize); - ee_u32 per_item=16+sizeof(struct list_data_s); - //ee_printf("%d \n sizeof", sizeof(struct list_data_s)); - //ee_printf("%d \n per_item", per_item); - ee_u32 size=(blksize/per_item)-2; - //char bufftwo[200]; - //ehitoa(size, bufftwo, 10); - //ee_printf(" size = %s done \n", bufftwo); - //ee_printf("%d", size);/* to accomodate systems with 64b pointers, and make sure same code is executed, set max list elements */ - list_head *memblock_end=memblock+size; - - list_data *datablock=(list_data *)(memblock_end); - list_data *datablock_end=datablock+size; - //ee_printf("datablock_end"); - /* some useful variables */ - ee_u32 i; - list_head *finder,*list=memblock; - list_data info; - //ehitoa(size, bufftwo, 10); - //ee_printf(" size2 = %s done \n", bufftwo); - - /* create a fake items for the list head and tail */ - list->next=NULL; - list->info=datablock; - list->info->idx=0x0000; - list->info->data16=(ee_s16)0x8080; - memblock++; - datablock++; - info.idx=0x7fff; - info.data16=(ee_s16)0xffff; - //ehitoa(size, bufftwo, 10); - //ee_printf(" size3 = %s done \n", bufftwo); - core_list_insert_new(list,&info,&memblock,&datablock,memblock_end,datablock_end); - //ehitoa(size, bufftwo, 10); - //ee_printf(" size4 = %s done \n", bufftwo);; - /* then insert size items */ - for (i=0; inext; - i=1; - //ehitoa(i, bufftwo, 10); - //ee_printf(" i = %s done \n", bufftwo); - while (finder->next!=NULL) { - //ee_printf("enter while statement \n"); - if (iinfo->idx=i++; - //ehitoa(i, bufftwo, 10); - //ee_printf(" if i = %s done \n", bufftwo); - } - - else { - ee_u16 pat=(ee_u16)(i++ ^ seed); /* get a pseudo random number */ - finder->info->idx=0x3fff & (((i & 0x07) << 8) | pat); /* make sure the mixed items end up after the ones in sequence */ - //ehitoa(i, bufftwo, 10); - //ee_printf(" else i = %s done \n", bufftwo); - } - finder=finder->next; - } - //ehitoa(i, bufftwo, 10); - //ee_printf(" i2 = %s done \n", bufftwo); - list = core_list_mergesort(list,cmp_idx,NULL); -#if CORE_DEBUG - //ee_printf("Initialized list:\n"); - finder=list; - while (finder) { - //ee_printf("[%04x,%04x]",finder->info->idx,(ee_u16)finder->info->data16); - finder=finder->next; - } - //ee_printf("\n"); -#endif - return list; -} - -/* Function: core_list_insert - Insert an item to the list - - Parameters: - insert_point - where to insert the item. - info - data for the cell. - memblock - pointer for the list header - datablock - pointer for the list data - memblock_end - end of region for list headers - datablock_end - end of region for list data - - Returns: - Pointer to new item. -*/ -list_head *core_list_insert_new(list_head *insert_point, list_data *info, list_head **memblock, list_data **datablock - , list_head *memblock_end, list_data *datablock_end) { - list_head *newitem; - - if ((*memblock+1) >= memblock_end) - return NULL; - if ((*datablock+1) >= datablock_end) - return NULL; - - newitem=*memblock; - (*memblock)++; - newitem->next=insert_point->next; - insert_point->next=newitem; - - newitem->info=*datablock; - (*datablock)++; - copy_info(newitem->info,info); - - return newitem; -} - -/* Function: core_list_remove - Remove an item from the list. - - Operation: - For a singly linked list, remove by copying the data from the next item - over to the current cell, and unlinking the next item. - - Note: - since there is always a fake item at the end of the list, no need to check for NULL. - - Returns: - Removed item. -*/ -list_head *core_list_remove(list_head *item) { - list_data *tmp; - list_head *ret=item->next; - /* swap data pointers */ - tmp=item->info; - item->info=ret->info; - ret->info=tmp; - /* and eliminate item */ - item->next=item->next->next; - ret->next=NULL; - return ret; -} - -/* Function: core_list_undo_remove - Undo a remove operation. - - Operation: - Since we want each iteration of the benchmark to be exactly the same, - we need to be able to undo a remove. - Link the removed item back into the list, and switch the info items. - - Parameters: - item_removed - Return value from the - item_modified - List item that was modified during - - Returns: - The item that was linked back to the list. - -*/ -list_head *core_list_undo_remove(list_head *item_removed, list_head *item_modified) { - list_data *tmp; - /* swap data pointers */ - tmp=item_removed->info; - item_removed->info=item_modified->info; - item_modified->info=tmp; - /* and insert item */ - item_removed->next=item_modified->next; - item_modified->next=item_removed; - return item_removed; -} - -/* Function: core_list_find - Find an item in the list - - Operation: - Find an item by idx (if not 0) or specific data value - - Parameters: - list - list head - info - idx or data to find - - Returns: - Found item, or NULL if not found. -*/ -list_head *core_list_find(list_head *list,list_data *info) { - //ee_printf("entered core_list_find \n"); - if (info->idx>=0) { - //ee_printf("find if \n"); - while (list && (list->info->idx != info->idx)){ - list=list->next; - //ee_printf("find while if \n"); - } - //ee_printf("core_list_find end \n"); - return list; - } else { - //ee_printf("find else"); - while (list && ((list->info->data16 & 0xff) != info->data16)){ - list=list->next; - //ee_printf("find while else \n"); - } - //ee_printf("core list find end \n"); - return list; - } -} -/* Function: core_list_reverse - Reverse a list - - Operation: - Rearrange the pointers so the list is reversed. - - Parameters: - list - list head - info - idx or data to find - - Returns: - Found item, or NULL if not found. -*/ - -list_head *core_list_reverse(list_head *list) { -// ee_printf("entered core_list_reverse"); - list_head *next=NULL, *tmp; - while (list) { - tmp=list->next; - list->next=next; - next=list; - list=tmp; - } - //ee_printf("core_list_reverse done"); - return next; -} -/* Function: core_list_mergesort - Sort the list in place without recursion. - - Description: - Use mergesort, as for linked list this is a realistic solution. - Also, since this is aimed at embedded, care was taken to use iterative rather then recursive algorithm. - The sort can either return the list to original order (by idx) , - or use the data item to invoke other other algorithms and change the order of the list. - - Parameters: - list - list to be sorted. - cmp - cmp function to use - - Returns: - New head of the list. - - Note: - We have a special header for the list that will always be first, - but the algorithm could theoretically modify where the list starts. - - */ -list_head *core_list_mergesort(list_head *list, list_cmp cmp, core_results *res) { - list_head *p, *q, *e, *tail; - ee_s32 insize, nmerges, psize, qsize, i; - - insize = 1; - //char bufftwo[200]; - while (1) { - p = list; - list = NULL; - tail = NULL; - - nmerges = 0; /* count number of merges we do in this pass */ - //ehitoa(nmerges, bufftwo, 10); - //ee_printf(" nmerges default value = %s done \n", bufftwo); - while (p) { - nmerges++; /* there exists a merge to be done */ - //ehitoa(nmerges, bufftwo, 10); - //ee_printf(" current nmerges = %s done \n", bufftwo); - /* step `insize' places along from p */ - q = p; - psize = 0; - //ehitoa(insize, bufftwo, 10); - //ee_printf(" insize = %s done \n", bufftwo); - for (i = 0; i < insize; i++) { - //ehitoa(i, bufftwo, 10); - //ee_printf(" i = %s done \n", bufftwo); - psize++; - q = q->next; - if (!q) break; - } - - /* if q hasn't fallen off end, we have two lists to merge */ - qsize = insize; - //ehitoa(qsize, bufftwo, 10); - //ee_printf(" qsize = %s done \n", bufftwo); - - /* now we have two lists; merge them */ - while (psize > 0 || (qsize > 0 && q)) { - - /* decide whether next element of merge comes from p or q */ - if (psize == 0) { - //ee_printf("if \n"); - /* p is empty; e must come from q. */ - e = q; q = q->next; qsize--; - } else if (qsize == 0 || !q) { - //ee_printf("else if \n"); - /* q is empty; e must come from p. */ - e = p; p = p->next; psize--; - } else if (cmp(p->info,q->info,res) <= 0) { - //ee_printf("else if 2 \n"); - /* First element of p is lower (or same); e must come from p. */ - e = p; p = p->next; psize--; - } else { - //ee_printf("else \n"); - /* First element of q is lower; e must come from q. */ - e = q; q = q->next; qsize--; - } - - /* add the next element to the merged list */ - if (tail) { - //ee_printf("tail if \n"); - tail->next = e; - } else { - //ee_printf("tail else \n"); - list = e; - } - tail = e; - } - - /* now p has stepped `insize' places along, and q has too */ - p = q; - } - - tail->next = NULL; - - /* If we have done only one merge, we're finished. */ - if (nmerges <= 1) /* allow for nmerges==0, the empty list case */ - return list; - - /* Otherwise repeat, merging lists twice the size */ - insize *= 2; - //ehitoa(insize, bufftwo, 10); - //ee_printf(" insize2 = %s done \n", bufftwo); - } -#if COMPILER_REQUIRES_SORT_RETURN - return list; -#endif -} diff --git a/tests/riscv-coremark/coremark/core_main.c b/tests/riscv-coremark/coremark/core_main.c deleted file mode 100644 index b1ec758bf..000000000 --- a/tests/riscv-coremark/coremark/core_main.c +++ /dev/null @@ -1,447 +0,0 @@ -/* -Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Original Author: Shay Gal-on -*/ - -/* File: core_main.c - This file contains the framework to acquire a block of memory, seed - initial parameters, tun t he benchmark and report the results. -*/ -#include "coremark.h" - -/* Function: iterate - Run the benchmark for a specified number of iterations. - - Operation: - For each type of benchmarked algorithm: - a - Initialize the data block for the algorithm. - b - Execute the algorithm N times. - - Returns: - NULL. -*/ -static ee_u16 list_known_crc[] = { (ee_u16)0xd4b0, - (ee_u16)0x3340, - (ee_u16)0x6a79, - (ee_u16)0xe714, - (ee_u16)0xe3c1 }; -static ee_u16 matrix_known_crc[] = { (ee_u16)0xbe52, - (ee_u16)0x1199, - (ee_u16)0x5608, - (ee_u16)0x1fd7, - (ee_u16)0x0747 }; -static ee_u16 state_known_crc[] = { (ee_u16)0x5e47, - (ee_u16)0x39bf, - (ee_u16)0xe5a4, - (ee_u16)0x8e3a, - (ee_u16)0x8d84 }; -void * -iterate(void *pres) -{ - ee_u32 i; - ee_u16 crc; - core_results *res = (core_results *)pres; - ee_u32 iterations = res->iterations; - res->crc = 0; - res->crclist = 0; - res->crcmatrix = 0; - res->crcstate = 0; - - for (i = 0; i < iterations; i++) - { - crc = core_bench_list(res, 1); - res->crc = crcu16(crc, res->crc); - crc = core_bench_list(res, -1); - res->crc = crcu16(crc, res->crc); - if (i == 0) - res->crclist = res->crc; - } - return NULL; -} - -#if (SEED_METHOD == SEED_ARG) -ee_s32 get_seed_args(int i, int argc, char *argv[]); -#define get_seed(x) (ee_s16) get_seed_args(x, argc, argv) -#define get_seed_32(x) get_seed_args(x, argc, argv) -#else /* via function or volatile */ -ee_s32 get_seed_32(int i); -#define get_seed(x) (ee_s16) get_seed_32(x) -#endif - -#if (MEM_METHOD == MEM_STATIC) -ee_u8 static_memblk[TOTAL_DATA_SIZE]; -#endif -char *mem_name[3] = { "Static", "Heap", "Stack" }; -/* Function: main - Main entry routine for the benchmark. - This function is responsible for the following steps: - - 1 - Initialize input seeds from a source that cannot be determined at - compile time. 2 - Initialize memory block for use. 3 - Run and time the - benchmark. 4 - Report results, testing the validity of the output if the - seeds are known. - - Arguments: - 1 - first seed : Any value - 2 - second seed : Must be identical to first for iterations to be - identical 3 - third seed : Any value, should be at least an order of - magnitude less then the input size, but bigger then 32. 4 - Iterations : - Special, if set to 0, iterations will be automatically determined such that - the benchmark will run between 10 to 100 secs - -*/ - -#if MAIN_HAS_NOARGC -MAIN_RETURN_TYPE -main(void) -{ - int argc = 0; - char *argv[1]; -#else -MAIN_RETURN_TYPE -main(int argc, char *argv[]) -{ -#endif - ee_printf("SHOWTIME\n"); - ee_u16 i, j = 0, num_algorithms = 0; - ee_s16 known_id = -1, total_errors = 0; - ee_u16 seedcrc = 0; - CORE_TICKS total_time; - core_results results[MULTITHREAD]; -#if (MEM_METHOD == MEM_STACK) - ee_u8 stack_memblock[TOTAL_DATA_SIZE * MULTITHREAD]; -#endif - /* first call any initializations needed */ - portable_init(&(results[0].port), &argc, argv); - /* First some checks to make sure benchmark will run ok */ - if (sizeof(struct list_head_s) > 128) - { - ee_printf("list_head structure too big for comparable data!\n"); - return MAIN_RETURN_VAL; - } - results[0].seed1 = get_seed(1); - results[0].seed2 = get_seed(2); - results[0].seed3 = get_seed(3); - results[0].iterations = get_seed_32(4); -#if CORE_DEBUG - results[0].iterations = 1; -#endif - results[0].execs = get_seed_32(5); - if (results[0].execs == 0) - { /* if not supplied, execute all algorithms */ - results[0].execs = ALL_ALGORITHMS_MASK; - } - /* put in some default values based on one seed only for easy testing */ - if ((results[0].seed1 == 0) && (results[0].seed2 == 0) - && (results[0].seed3 == 0)) - { /* perfromance run */ - results[0].seed1 = 0; - results[0].seed2 = 0; - results[0].seed3 = 0x66; - } - if ((results[0].seed1 == 1) && (results[0].seed2 == 0) - && (results[0].seed3 == 0)) - { /* validation run */ - results[0].seed1 = 0x3415; - results[0].seed2 = 0x3415; - results[0].seed3 = 0x66; - } -#if (MEM_METHOD == MEM_STATIC) - results[0].memblock[0] = (void *)static_memblk; - results[0].size = TOTAL_DATA_SIZE; - results[0].err = 0; -#if (MULTITHREAD > 1) -#error "Cannot use a static data area with multiple contexts!" -#endif -#elif (MEM_METHOD == MEM_MALLOC) - for (i = 0; i < MULTITHREAD; i++) - { - ee_s32 malloc_override = get_seed(7); - if (malloc_override != 0) - results[i].size = malloc_override; - else - results[i].size = TOTAL_DATA_SIZE; - results[i].memblock[0] = portable_malloc(results[i].size); - results[i].seed1 = results[0].seed1; - results[i].seed2 = results[0].seed2; - results[i].seed3 = results[0].seed3; - results[i].err = 0; - results[i].execs = results[0].execs; - } -#elif (MEM_METHOD == MEM_STACK) -for (i = 0; i < MULTITHREAD; i++) -{ - results[i].memblock[0] = stack_memblock + i * TOTAL_DATA_SIZE; - results[i].size = TOTAL_DATA_SIZE; - results[i].seed1 = results[0].seed1; - results[i].seed2 = results[0].seed2; - results[i].seed3 = results[0].seed3; - results[i].err = 0; - results[i].execs = results[0].execs; -} -#else -#error "Please define a way to initialize a memory block." -#endif - /* Data init */ - /* Find out how space much we have based on number of algorithms */ - for (i = 0; i < NUM_ALGORITHMS; i++) - { - if ((1 << (ee_u32)i) & results[0].execs) - num_algorithms++; - } - for (i = 0; i < MULTITHREAD; i++) - results[i].size = results[i].size / num_algorithms; - /* Assign pointers */ - for (i = 0; i < NUM_ALGORITHMS; i++) - { - ee_u32 ctx; - if ((1 << (ee_u32)i) & results[0].execs) - { - for (ctx = 0; ctx < MULTITHREAD; ctx++) - results[ctx].memblock[i + 1] - = (char *)(results[ctx].memblock[0]) + results[0].size * j; - j++; - } - } - /* call inits */ - for (i = 0; i < MULTITHREAD; i++) - { - if (results[i].execs & ID_LIST) - { - results[i].list = core_list_init( - results[0].size, results[i].memblock[1], results[i].seed1); - } - if (results[i].execs & ID_MATRIX) - { - core_init_matrix(results[0].size, - results[i].memblock[2], - (ee_s32)results[i].seed1 - | (((ee_s32)results[i].seed2) << 16), - &(results[i].mat)); - } - if (results[i].execs & ID_STATE) - { - core_init_state( - results[0].size, results[i].seed1, results[i].memblock[3]); - } - } - - /* automatically determine number of iterations if not set */ - if (results[0].iterations == 0) - { - secs_ret secs_passed = 0; - ee_u32 divisor; - results[0].iterations = 1; - while (secs_passed < (secs_ret)1) - { - results[0].iterations *= 10; - start_time(); - iterate(&results[0]); - stop_time(); - secs_passed = time_in_secs(get_time()); - } - /* now we know it executes for at least 1 sec, set actual run time at - * about 10 secs */ - divisor = (ee_u32)secs_passed; - if (divisor == 0) /* some machines cast float to int as 0 since this - conversion is not defined by ANSI, but we know at - least one second passed */ - divisor = 1; - results[0].iterations *= 1 + 10 / divisor; - } - /* perform actual benchmark */ - start_time(); -#if (MULTITHREAD > 1) - if (default_num_contexts > MULTITHREAD) - { - default_num_contexts = MULTITHREAD; - } - for (i = 0; i < default_num_contexts; i++) - { - results[i].iterations = results[0].iterations; - results[i].execs = results[0].execs; - core_start_parallel(&results[i]); - } - for (i = 0; i < default_num_contexts; i++) - { - core_stop_parallel(&results[i]); - } -#else - iterate(&results[0]); -#endif - stop_time(); - total_time = get_time(); - /* get a function of the input to report */ - seedcrc = crc16(results[0].seed1, seedcrc); - seedcrc = crc16(results[0].seed2, seedcrc); - seedcrc = crc16(results[0].seed3, seedcrc); - seedcrc = crc16(results[0].size, seedcrc); - - switch (seedcrc) - { /* test known output for common seeds */ - case 0x8a02: /* seed1=0, seed2=0, seed3=0x66, size 2000 per algorithm */ - known_id = 0; - ee_printf("6k performance run parameters for coremark.\n"); - break; - case 0x7b05: /* seed1=0x3415, seed2=0x3415, seed3=0x66, size 2000 per - algorithm */ - known_id = 1; - ee_printf("6k validation run parameters for coremark.\n"); - break; - case 0x4eaf: /* seed1=0x8, seed2=0x8, seed3=0x8, size 400 per algorithm - */ - known_id = 2; - ee_printf("Profile generation run parameters for coremark.\n"); - break; - case 0xe9f5: /* seed1=0, seed2=0, seed3=0x66, size 666 per algorithm */ - known_id = 3; - ee_printf("2K performance run parameters for coremark.\n"); - break; - case 0x18f2: /* seed1=0x3415, seed2=0x3415, seed3=0x66, size 666 per - algorithm */ - known_id = 4; - ee_printf("2K validation run parameters for coremark.\n"); - break; - default: - total_errors = -1; - break; - } - if (known_id >= 0) - { - for (i = 0; i < default_num_contexts; i++) - { - results[i].err = 0; - if ((results[i].execs & ID_LIST) - && (results[i].crclist != list_known_crc[known_id])) - { - ee_printf("[%u]ERROR! list crc 0x%04x - should be 0x%04x\n", - i, - results[i].crclist, - list_known_crc[known_id]); - results[i].err++; - } - if ((results[i].execs & ID_MATRIX) - && (results[i].crcmatrix != matrix_known_crc[known_id])) - { - ee_printf("[%u]ERROR! matrix crc 0x%04x - should be 0x%04x\n", - i, - results[i].crcmatrix, - matrix_known_crc[known_id]); - results[i].err++; - } - if ((results[i].execs & ID_STATE) - && (results[i].crcstate != state_known_crc[known_id])) - { - ee_printf("[%u]ERROR! state crc 0x%04x - should be 0x%04x\n", - i, - results[i].crcstate, - state_known_crc[known_id]); - results[i].err++; - } - total_errors += results[i].err; - } - } - total_errors += check_data_types(); - /* and report results */ - ee_printf("CoreMark Size : %lu\n", (long unsigned)results[0].size); - ee_printf("Total ticks : %lu\n", (long unsigned)total_time); -#if HAS_FLOAT - ee_printf("Total time (secs): %f\n", time_in_secs(total_time)); - if (time_in_secs(total_time) > 0) - ee_printf("Iterations/Sec : %f\n", - default_num_contexts * results[0].iterations - / time_in_secs(total_time)); -#else - ee_printf("Total time (secs): %d\n", time_in_secs(total_time)); - if (time_in_secs(total_time) > 0) - ee_printf("Iterations/Sec : %d\n", - default_num_contexts * results[0].iterations - / time_in_secs(total_time)); -#endif - if (time_in_secs(total_time) < 10) - { - ee_printf( - "ERROR! Must execute for at least 10 secs for a valid result!\n"); - total_errors++; - } - - ee_printf("Iterations : %lu\n", - (long unsigned)default_num_contexts * results[0].iterations); - ee_printf("Compiler version : %s\n", COMPILER_VERSION); - ee_printf("Compiler flags : %s\n", COMPILER_FLAGS); -#if (MULTITHREAD > 1) - ee_printf("Parallel %s : %d\n", PARALLEL_METHOD, default_num_contexts); -#endif - ee_printf("Memory location : %s\n", MEM_LOCATION); - /* output for verification */ - ee_printf("seedcrc : 0x%04x\n", seedcrc); - if (results[0].execs & ID_LIST) - for (i = 0; i < default_num_contexts; i++) - ee_printf("[%d]crclist : 0x%04x\n", i, results[i].crclist); - if (results[0].execs & ID_MATRIX) - for (i = 0; i < default_num_contexts; i++) - ee_printf("[%d]crcmatrix : 0x%04x\n", i, results[i].crcmatrix); - if (results[0].execs & ID_STATE) - for (i = 0; i < default_num_contexts; i++) - ee_printf("[%d]crcstate : 0x%04x\n", i, results[i].crcstate); - for (i = 0; i < default_num_contexts; i++) - ee_printf("[%d]crcfinal : 0x%04x\n", i, results[i].crc); - if (total_errors == 0) - { - ee_printf( - "Correct operation validated. See README.md for run and reporting " - "rules.\n"); -#if HAS_FLOAT - if (known_id == 3) - { - unsigned long long tmp = (unsigned long long) 1000.0*default_num_contexts*results[0].iterations/time_in_secs(total_time); - secs_ret totalmsecs = time_in_secs(total_time); - int totalmint = (int) totalmsecs; - ee_printf("ELAPSED TIME: %d\n", totalmint); - - ee_printf("CoreMark 1.0 : %d / %s %s", - tmp, - COMPILER_VERSION, - COMPILER_FLAGS); -#if defined(MEM_LOCATION) && !defined(MEM_LOCATION_UNSPEC) - ee_printf(" / %s", MEM_LOCATION); -#else - ee_printf(" / %s", mem_name[MEM_METHOD]); -#endif - -#if (MULTITHREAD > 1) - ee_printf(" / %d:%s", default_num_contexts, PARALLEL_METHOD); -#endif - ee_printf("\n"); - } -#endif - } - if (total_errors > 0) - ee_printf("Errors detected\n"); - if (total_errors < 0) - ee_printf( - "Cannot validate operation for these seed values, please compare " - "with results on a known platform.\n"); - -#if (MEM_METHOD == MEM_MALLOC) - for (i = 0; i < MULTITHREAD; i++) - portable_free(results[i].memblock[0]); -#endif - /* And last call any target specific code for finalizing */ - portable_fini(&(results[0].port)); - - return MAIN_RETURN_VAL; -} diff --git a/tests/riscv-coremark/coremark/core_matrix.c b/tests/riscv-coremark/coremark/core_matrix.c deleted file mode 100644 index 29fd8ab45..000000000 --- a/tests/riscv-coremark/coremark/core_matrix.c +++ /dev/null @@ -1,359 +0,0 @@ -/* -Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Original Author: Shay Gal-on -*/ - -#include "coremark.h" -/* -Topic: Description - Matrix manipulation benchmark - - This very simple algorithm forms the basis of many more complex -algorithms. - - The tight inner loop is the focus of many optimizations (compiler as -well as hardware based) and is thus relevant for embedded processing. - - The total available data space will be divided to 3 parts: - NxN Matrix A - initialized with small values (upper 3/4 of the bits all -zero). NxN Matrix B - initialized with medium values (upper half of the bits all -zero). NxN Matrix C - used for the result. - - The actual values for A and B must be derived based on input that is not -available at compile time. -*/ -ee_s16 matrix_test(ee_u32 N, MATRES *C, MATDAT *A, MATDAT *B, MATDAT val); -ee_s16 matrix_sum(ee_u32 N, MATRES *C, MATDAT clipval); -void matrix_mul_const(ee_u32 N, MATRES *C, MATDAT *A, MATDAT val); -void matrix_mul_vect(ee_u32 N, MATRES *C, MATDAT *A, MATDAT *B); -void matrix_mul_matrix(ee_u32 N, MATRES *C, MATDAT *A, MATDAT *B); -void matrix_mul_matrix_bitextract(ee_u32 N, MATRES *C, MATDAT *A, MATDAT *B); -void matrix_add_const(ee_u32 N, MATDAT *A, MATDAT val); - -#define matrix_test_next(x) (x + 1) -#define matrix_clip(x, y) ((y) ? (x)&0x0ff : (x)&0x0ffff) -#define matrix_big(x) (0xf000 | (x)) -#define bit_extract(x, from, to) (((x) >> (from)) & (~(0xffffffff << (to)))) - -#if CORE_DEBUG -void -printmat(MATDAT *A, ee_u32 N, char *name) -{ - ee_u32 i, j; - ee_printf("Matrix %s [%dx%d]:\n", name, N, N); - for (i = 0; i < N; i++) - { - for (j = 0; j < N; j++) - { - if (j != 0) - ee_printf(","); - ee_printf("%d", A[i * N + j]); - } - ee_printf("\n"); - } -} -void -printmatC(MATRES *C, ee_u32 N, char *name) -{ - ee_u32 i, j; - ee_printf("Matrix %s [%dx%d]:\n", name, N, N); - for (i = 0; i < N; i++) - { - for (j = 0; j < N; j++) - { - if (j != 0) - ee_printf(","); - ee_printf("%d", C[i * N + j]); - } - ee_printf("\n"); - } -} -#endif -/* Function: core_bench_matrix - Benchmark function - - Iterate N times, - changing the matrix values slightly by a constant amount each time. -*/ -ee_u16 -core_bench_matrix(mat_params *p, ee_s16 seed, ee_u16 crc) -{ - ee_u32 N = p->N; - MATRES *C = p->C; - MATDAT *A = p->A; - MATDAT *B = p->B; - MATDAT val = (MATDAT)seed; - - crc = crc16(matrix_test(N, C, A, B, val), crc); - - return crc; -} - -/* Function: matrix_test - Perform matrix manipulation. - - Parameters: - N - Dimensions of the matrix. - C - memory for result matrix. - A - input matrix - B - operator matrix (not changed during operations) - - Returns: - A CRC value that captures all results calculated in the function. - In particular, crc of the value calculated on the result matrix - after each step by . - - Operation: - - 1 - Add a constant value to all elements of a matrix. - 2 - Multiply a matrix by a constant. - 3 - Multiply a matrix by a vector. - 4 - Multiply a matrix by a matrix. - 5 - Add a constant value to all elements of a matrix. - - After the last step, matrix A is back to original contents. -*/ -ee_s16 -matrix_test(ee_u32 N, MATRES *C, MATDAT *A, MATDAT *B, MATDAT val) -{ - ee_u16 crc = 0; - MATDAT clipval = matrix_big(val); - - matrix_add_const(N, A, val); /* make sure data changes */ -#if CORE_DEBUG - printmat(A, N, "matrix_add_const"); -#endif - matrix_mul_const(N, C, A, val); - crc = crc16(matrix_sum(N, C, clipval), crc); -#if CORE_DEBUG - printmatC(C, N, "matrix_mul_const"); -#endif - matrix_mul_vect(N, C, A, B); - crc = crc16(matrix_sum(N, C, clipval), crc); -#if CORE_DEBUG - printmatC(C, N, "matrix_mul_vect"); -#endif - matrix_mul_matrix(N, C, A, B); - crc = crc16(matrix_sum(N, C, clipval), crc); -#if CORE_DEBUG - printmatC(C, N, "matrix_mul_matrix"); -#endif - matrix_mul_matrix_bitextract(N, C, A, B); - crc = crc16(matrix_sum(N, C, clipval), crc); -#if CORE_DEBUG - printmatC(C, N, "matrix_mul_matrix_bitextract"); -#endif - - matrix_add_const(N, A, -val); /* return matrix to initial value */ - return crc; -} - -/* Function : matrix_init - Initialize the memory block for matrix benchmarking. - - Parameters: - blksize - Size of memory to be initialized. - memblk - Pointer to memory block. - seed - Actual values chosen depend on the seed parameter. - p - pointers to containing initialized matrixes. - - Returns: - Matrix dimensions. - - Note: - The seed parameter MUST be supplied from a source that cannot be - determined at compile time -*/ -ee_u32 -core_init_matrix(ee_u32 blksize, void *memblk, ee_s32 seed, mat_params *p) -{ - ee_u32 N = 0; - MATDAT *A; - MATDAT *B; - ee_s32 order = 1; - MATDAT val; - ee_u32 i = 0, j = 0; - if (seed == 0) - seed = 1; - while (j < blksize) - { - i++; - j = i * i * 2 * 4; - } - N = i - 1; - A = (MATDAT *)align_mem(memblk); - B = A + N * N; - - for (i = 0; i < N; i++) - { - for (j = 0; j < N; j++) - { - seed = ((order * seed) % 65536); - val = (seed + order); - val = matrix_clip(val, 0); - B[i * N + j] = val; - val = (val + order); - val = matrix_clip(val, 1); - A[i * N + j] = val; - order++; - } - } - - p->A = A; - p->B = B; - p->C = (MATRES *)align_mem(B + N * N); - p->N = N; -#if CORE_DEBUG - printmat(A, N, "A"); - printmat(B, N, "B"); -#endif - return N; -} - -/* Function: matrix_sum - Calculate a function that depends on the values of elements in the - matrix. - - For each element, accumulate into a temporary variable. - - As long as this value is under the parameter clipval, - add 1 to the result if the element is bigger then the previous. - - Otherwise, reset the accumulator and add 10 to the result. -*/ -ee_s16 -matrix_sum(ee_u32 N, MATRES *C, MATDAT clipval) -{ - MATRES tmp = 0, prev = 0, cur = 0; - ee_s16 ret = 0; - ee_u32 i, j; - for (i = 0; i < N; i++) - { - for (j = 0; j < N; j++) - { - cur = C[i * N + j]; - tmp += cur; - if (tmp > clipval) - { - ret += 10; - tmp = 0; - } - else - { - ret += (cur > prev) ? 1 : 0; - } - prev = cur; - } - } - return ret; -} - -/* Function: matrix_mul_const - Multiply a matrix by a constant. - This could be used as a scaler for instance. -*/ -void -matrix_mul_const(ee_u32 N, MATRES *C, MATDAT *A, MATDAT val) -{ - ee_u32 i, j; - for (i = 0; i < N; i++) - { - for (j = 0; j < N; j++) - { - C[i * N + j] = (MATRES)A[i * N + j] * (MATRES)val; - } - } -} - -/* Function: matrix_add_const - Add a constant value to all elements of a matrix. -*/ -void -matrix_add_const(ee_u32 N, MATDAT *A, MATDAT val) -{ - ee_u32 i, j; - for (i = 0; i < N; i++) - { - for (j = 0; j < N; j++) - { - A[i * N + j] += val; - } - } -} - -/* Function: matrix_mul_vect - Multiply a matrix by a vector. - This is common in many simple filters (e.g. fir where a vector of - coefficients is applied to the matrix.) -*/ -void -matrix_mul_vect(ee_u32 N, MATRES *C, MATDAT *A, MATDAT *B) -{ - ee_u32 i, j; - for (i = 0; i < N; i++) - { - C[i] = 0; - for (j = 0; j < N; j++) - { - C[i] += (MATRES)A[i * N + j] * (MATRES)B[j]; - } - } -} - -/* Function: matrix_mul_matrix - Multiply a matrix by a matrix. - Basic code is used in many algorithms, mostly with minor changes such as - scaling. -*/ -void -matrix_mul_matrix(ee_u32 N, MATRES *C, MATDAT *A, MATDAT *B) -{ - ee_u32 i, j, k; - for (i = 0; i < N; i++) - { - for (j = 0; j < N; j++) - { - C[i * N + j] = 0; - for (k = 0; k < N; k++) - { - C[i * N + j] += (MATRES)A[i * N + k] * (MATRES)B[k * N + j]; - } - } - } -} - -/* Function: matrix_mul_matrix_bitextract - Multiply a matrix by a matrix, and extract some bits from the result. - Basic code is used in many algorithms, mostly with minor changes such as - scaling. -*/ -void -matrix_mul_matrix_bitextract(ee_u32 N, MATRES *C, MATDAT *A, MATDAT *B) -{ - ee_u32 i, j, k; - for (i = 0; i < N; i++) - { - for (j = 0; j < N; j++) - { - C[i * N + j] = 0; - for (k = 0; k < N; k++) - { - MATRES tmp = (MATRES)A[i * N + k] * (MATRES)B[k * N + j]; - C[i * N + j] += bit_extract(tmp, 2, 4) * bit_extract(tmp, 5, 7); - } - } - } -} diff --git a/tests/riscv-coremark/coremark/core_state.c b/tests/riscv-coremark/coremark/core_state.c deleted file mode 100644 index 6dbab9dd9..000000000 --- a/tests/riscv-coremark/coremark/core_state.c +++ /dev/null @@ -1,330 +0,0 @@ -/* -Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Original Author: Shay Gal-on -*/ - -#include "coremark.h" -/* local functions */ -enum CORE_STATE core_state_transition(ee_u8 **instr, ee_u32 *transition_count); - -/* -Topic: Description - Simple state machines like this one are used in many embedded products. - - For more complex state machines, sometimes a state transition table -implementation is used instead, trading speed of direct coding for ease of -maintenance. - - Since the main goal of using a state machine in CoreMark is to excercise -the switch/if behaviour, we are using a small moore machine. - - In particular, this machine tests type of string input, - trying to determine whether the input is a number or something else. - (see core_state.png). -*/ - -/* Function: core_bench_state - Benchmark function - - Go over the input twice, once direct, and once after introducing some - corruption. -*/ -ee_u16 -core_bench_state(ee_u32 blksize, - ee_u8 *memblock, - ee_s16 seed1, - ee_s16 seed2, - ee_s16 step, - ee_u16 crc) -{ - ee_u32 final_counts[NUM_CORE_STATES]; - ee_u32 track_counts[NUM_CORE_STATES]; - ee_u8 *p = memblock; - ee_u32 i; - -#if CORE_DEBUG - ee_printf("State Bench: %d,%d,%d,%04x\n", seed1, seed2, step, crc); -#endif - for (i = 0; i < NUM_CORE_STATES; i++) - { - final_counts[i] = track_counts[i] = 0; - } - /* run the state machine over the input */ - while (*p != 0) - { - enum CORE_STATE fstate = core_state_transition(&p, track_counts); - final_counts[fstate]++; -#if CORE_DEBUG - ee_printf("%d,", fstate); - } - ee_printf("\n"); -#else - } -#endif - p = memblock; - while (p < (memblock + blksize)) - { /* insert some corruption */ - if (*p != ',') - *p ^= (ee_u8)seed1; - p += step; - } - p = memblock; - /* run the state machine over the input again */ - while (*p != 0) - { - enum CORE_STATE fstate = core_state_transition(&p, track_counts); - final_counts[fstate]++; -#if CORE_DEBUG - ee_printf("%d,", fstate); - } - ee_printf("\n"); -#else - } -#endif - p = memblock; - while (p < (memblock + blksize)) - { /* undo corruption is seed1 and seed2 are equal */ - if (*p != ',') - *p ^= (ee_u8)seed2; - p += step; - } - /* end timing */ - for (i = 0; i < NUM_CORE_STATES; i++) - { - crc = crcu32(final_counts[i], crc); - crc = crcu32(track_counts[i], crc); - } - return crc; -} - -/* Default initialization patterns */ -static ee_u8 *intpat[4] - = { (ee_u8 *)"5012", (ee_u8 *)"1234", (ee_u8 *)"-874", (ee_u8 *)"+122" }; -static ee_u8 *floatpat[4] = { (ee_u8 *)"35.54400", - (ee_u8 *)".1234500", - (ee_u8 *)"-110.700", - (ee_u8 *)"+0.64400" }; -static ee_u8 *scipat[4] = { (ee_u8 *)"5.500e+3", - (ee_u8 *)"-.123e-2", - (ee_u8 *)"-87e+832", - (ee_u8 *)"+0.6e-12" }; -static ee_u8 *errpat[4] = { (ee_u8 *)"T0.3e-1F", - (ee_u8 *)"-T.T++Tq", - (ee_u8 *)"1T3.4e4z", - (ee_u8 *)"34.0e-T^" }; - -/* Function: core_init_state - Initialize the input data for the state machine. - - Populate the input with several predetermined strings, interspersed. - Actual patterns chosen depend on the seed parameter. - - Note: - The seed parameter MUST be supplied from a source that cannot be - determined at compile time -*/ -void -core_init_state(ee_u32 size, ee_s16 seed, ee_u8 *p) -{ - ee_u32 total = 0, next = 0, i; - ee_u8 *buf = 0; -#if CORE_DEBUG - ee_u8 *start = p; - ee_printf("State: %d,%d\n", size, seed); -#endif - size--; - next = 0; - while ((total + next + 1) < size) - { - if (next > 0) - { - for (i = 0; i < next; i++) - *(p + total + i) = buf[i]; - *(p + total + i) = ','; - total += next + 1; - } - seed++; - switch (seed & 0x7) - { - case 0: /* int */ - case 1: /* int */ - case 2: /* int */ - buf = intpat[(seed >> 3) & 0x3]; - next = 4; - break; - case 3: /* float */ - case 4: /* float */ - buf = floatpat[(seed >> 3) & 0x3]; - next = 8; - break; - case 5: /* scientific */ - case 6: /* scientific */ - buf = scipat[(seed >> 3) & 0x3]; - next = 8; - break; - case 7: /* invalid */ - buf = errpat[(seed >> 3) & 0x3]; - next = 8; - break; - default: /* Never happen, just to make some compilers happy */ - break; - } - } - size++; - while (total < size) - { /* fill the rest with 0 */ - *(p + total) = 0; - total++; - } -#if CORE_DEBUG - ee_printf("State Input: %s\n", start); -#endif -} - -static ee_u8 -ee_isdigit(ee_u8 c) -{ - ee_u8 retval; - retval = ((c >= '0') & (c <= '9')) ? 1 : 0; - return retval; -} - -/* Function: core_state_transition - Actual state machine. - - The state machine will continue scanning until either: - 1 - an invalid input is detcted. - 2 - a valid number has been detected. - - The input pointer is updated to point to the end of the token, and the - end state is returned (either specific format determined or invalid). -*/ - -enum CORE_STATE -core_state_transition(ee_u8 **instr, ee_u32 *transition_count) -{ - ee_u8 * str = *instr; - ee_u8 NEXT_SYMBOL; - enum CORE_STATE state = CORE_START; - for (; *str && state != CORE_INVALID; str++) - { - NEXT_SYMBOL = *str; - if (NEXT_SYMBOL == ',') /* end of this input */ - { - str++; - break; - } - switch (state) - { - case CORE_START: - if (ee_isdigit(NEXT_SYMBOL)) - { - state = CORE_INT; - } - else if (NEXT_SYMBOL == '+' || NEXT_SYMBOL == '-') - { - state = CORE_S1; - } - else if (NEXT_SYMBOL == '.') - { - state = CORE_FLOAT; - } - else - { - state = CORE_INVALID; - transition_count[CORE_INVALID]++; - } - transition_count[CORE_START]++; - break; - case CORE_S1: - if (ee_isdigit(NEXT_SYMBOL)) - { - state = CORE_INT; - transition_count[CORE_S1]++; - } - else if (NEXT_SYMBOL == '.') - { - state = CORE_FLOAT; - transition_count[CORE_S1]++; - } - else - { - state = CORE_INVALID; - transition_count[CORE_S1]++; - } - break; - case CORE_INT: - if (NEXT_SYMBOL == '.') - { - state = CORE_FLOAT; - transition_count[CORE_INT]++; - } - else if (!ee_isdigit(NEXT_SYMBOL)) - { - state = CORE_INVALID; - transition_count[CORE_INT]++; - } - break; - case CORE_FLOAT: - if (NEXT_SYMBOL == 'E' || NEXT_SYMBOL == 'e') - { - state = CORE_S2; - transition_count[CORE_FLOAT]++; - } - else if (!ee_isdigit(NEXT_SYMBOL)) - { - state = CORE_INVALID; - transition_count[CORE_FLOAT]++; - } - break; - case CORE_S2: - if (NEXT_SYMBOL == '+' || NEXT_SYMBOL == '-') - { - state = CORE_EXPONENT; - transition_count[CORE_S2]++; - } - else - { - state = CORE_INVALID; - transition_count[CORE_S2]++; - } - break; - case CORE_EXPONENT: - if (ee_isdigit(NEXT_SYMBOL)) - { - state = CORE_SCIENTIFIC; - transition_count[CORE_EXPONENT]++; - } - else - { - state = CORE_INVALID; - transition_count[CORE_EXPONENT]++; - } - break; - case CORE_SCIENTIFIC: - if (!ee_isdigit(NEXT_SYMBOL)) - { - state = CORE_INVALID; - transition_count[CORE_INVALID]++; - } - break; - default: - break; - } - } - *instr = str; - return state; -} diff --git a/tests/riscv-coremark/coremark/core_util.c b/tests/riscv-coremark/coremark/core_util.c deleted file mode 100644 index 67c5d7757..000000000 --- a/tests/riscv-coremark/coremark/core_util.c +++ /dev/null @@ -1,249 +0,0 @@ -/* -Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Original Author: Shay Gal-on -*/ - -#include "coremark.h" -/* Function: get_seed - Get a values that cannot be determined at compile time. - - Since different embedded systems and compilers are used, 3 different - methods are provided: 1 - Using a volatile variable. This method is only - valid if the compiler is forced to generate code that reads the value of a - volatile variable from memory at run time. Please note, if using this method, - you would need to modify core_portme.c to generate training profile. 2 - - Command line arguments. This is the preferred method if command line - arguments are supported. 3 - System function. If none of the first 2 methods - is available on the platform, a system function which is not a stub can be - used. - - e.g. read the value on GPIO pins connected to switches, or invoke - special simulator functions. -*/ -#if (SEED_METHOD == SEED_VOLATILE) -extern volatile ee_s32 seed1_volatile; -extern volatile ee_s32 seed2_volatile; -extern volatile ee_s32 seed3_volatile; -extern volatile ee_s32 seed4_volatile; -extern volatile ee_s32 seed5_volatile; -ee_s32 -get_seed_32(int i) -{ - ee_s32 retval; - switch (i) - { - case 1: - retval = seed1_volatile; - break; - case 2: - retval = seed2_volatile; - break; - case 3: - retval = seed3_volatile; - break; - case 4: - retval = seed4_volatile; - break; - case 5: - retval = seed5_volatile; - break; - default: - retval = 0; - break; - } - return retval; -} -#elif (SEED_METHOD == SEED_ARG) -ee_s32 -parseval(char *valstring) -{ - ee_s32 retval = 0; - ee_s32 neg = 1; - int hexmode = 0; - if (*valstring == '-') - { - neg = -1; - valstring++; - } - if ((valstring[0] == '0') && (valstring[1] == 'x')) - { - hexmode = 1; - valstring += 2; - } - /* first look for digits */ - if (hexmode) - { - while (((*valstring >= '0') && (*valstring <= '9')) - || ((*valstring >= 'a') && (*valstring <= 'f'))) - { - ee_s32 digit = *valstring - '0'; - if (digit > 9) - digit = 10 + *valstring - 'a'; - retval *= 16; - retval += digit; - valstring++; - } - } - else - { - while ((*valstring >= '0') && (*valstring <= '9')) - { - ee_s32 digit = *valstring - '0'; - retval *= 10; - retval += digit; - valstring++; - } - } - /* now add qualifiers */ - if (*valstring == 'K') - retval *= 1024; - if (*valstring == 'M') - retval *= 1024 * 1024; - - retval *= neg; - return retval; -} - -ee_s32 -get_seed_args(int i, int argc, char *argv[]) -{ - if (argc > i) - return parseval(argv[i]); - return 0; -} - -#elif (SEED_METHOD == SEED_FUNC) -/* If using OS based function, you must define and implement the functions below - * in core_portme.h and core_portme.c ! */ -ee_s32 -get_seed_32(int i) -{ - ee_s32 retval; - switch (i) - { - case 1: - retval = portme_sys1(); - break; - case 2: - retval = portme_sys2(); - break; - case 3: - retval = portme_sys3(); - break; - case 4: - retval = portme_sys4(); - break; - case 5: - retval = portme_sys5(); - break; - default: - retval = 0; - break; - } - return retval; -} -#endif - -/* Function: crc* - Service functions to calculate 16b CRC code. - -*/ -ee_u16 -crcu8(ee_u8 data, ee_u16 crc) -{ - ee_u8 i = 0, x16 = 0, carry = 0; - - for (i = 0; i < 8; i++) - { - x16 = (ee_u8)((data & 1) ^ ((ee_u8)crc & 1)); - data >>= 1; - - if (x16 == 1) - { - crc ^= 0x4002; - carry = 1; - } - else - carry = 0; - crc >>= 1; - if (carry) - crc |= 0x8000; - else - crc &= 0x7fff; - } - return crc; -} -ee_u16 -crcu16(ee_u16 newval, ee_u16 crc) -{ - crc = crcu8((ee_u8)(newval), crc); - crc = crcu8((ee_u8)((newval) >> 8), crc); - return crc; -} -ee_u16 -crcu32(ee_u32 newval, ee_u16 crc) -{ - crc = crc16((ee_s16)newval, crc); - crc = crc16((ee_s16)(newval >> 16), crc); - return crc; -} -ee_u16 -crc16(ee_s16 newval, ee_u16 crc) -{ - return crcu16((ee_u16)newval, crc); -} - -ee_u8 -check_data_types() -{ - ee_u8 retval = 0; - if (sizeof(ee_u8) != 1) - { - ee_printf("ERROR: ee_u8 is not an 8b datatype!\n"); - retval++; - } - if (sizeof(ee_u16) != 2) - { - ee_printf("ERROR: ee_u16 is not a 16b datatype!\n"); - retval++; - } - if (sizeof(ee_s16) != 2) - { - ee_printf("ERROR: ee_s16 is not a 16b datatype!\n"); - retval++; - } - if (sizeof(ee_s32) != 4) - { - ee_printf("ERROR: ee_s32 is not a 32b datatype!\n"); - retval++; - } - if (sizeof(ee_u32) != 4) - { - ee_printf("ERROR: ee_u32 is not a 32b datatype!\n"); - retval++; - } - if (sizeof(ee_ptr_int) != sizeof(int *)) - { - ee_printf( - "ERROR: ee_ptr_int is not a datatype that holds an int pointer!\n"); - retval++; - } - if (retval > 0) - { - ee_printf("ERROR: Please modify the datatypes in core_portme.h!\n"); - } - return retval; -} diff --git a/tests/riscv-coremark/coremark/coremark.h b/tests/riscv-coremark/coremark/coremark.h deleted file mode 100644 index 9c5e4060a..000000000 --- a/tests/riscv-coremark/coremark/coremark.h +++ /dev/null @@ -1,183 +0,0 @@ -/* -Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Original Author: Shay Gal-on -*/ - -/* Topic: Description - This file contains declarations of the various benchmark functions. -*/ - -/* Configuration: TOTAL_DATA_SIZE - Define total size for data algorithms will operate on -*/ -#ifndef TOTAL_DATA_SIZE -#define TOTAL_DATA_SIZE 2 * 1000 -#endif - -#define SEED_ARG 0 -#define SEED_FUNC 1 -#define SEED_VOLATILE 2 - -#define MEM_STATIC 0 -#define MEM_MALLOC 1 -#define MEM_STACK 2 - -#include "core_portme.h" - -#if HAS_STDIO -#include -#endif -#if HAS_PRINTF -#define ee_printf printf -#endif - -/* Actual benchmark execution in iterate */ -void *iterate(void *pres); - -/* Typedef: secs_ret - For machines that have floating point support, get number of seconds as - a double. Otherwise an unsigned int. -*/ -#if HAS_FLOAT -typedef double secs_ret; -#else -typedef ee_u32 secs_ret; -#endif - -#if MAIN_HAS_NORETURN -#define MAIN_RETURN_VAL -#define MAIN_RETURN_TYPE void -#else -#define MAIN_RETURN_VAL 0 -#define MAIN_RETURN_TYPE int -#endif - -void start_time(void); -void stop_time(void); -CORE_TICKS get_time(void); -secs_ret time_in_secs(CORE_TICKS ticks); - -/* Misc useful functions */ -ee_u16 crcu8(ee_u8 data, ee_u16 crc); -ee_u16 crc16(ee_s16 newval, ee_u16 crc); -ee_u16 crcu16(ee_u16 newval, ee_u16 crc); -ee_u16 crcu32(ee_u32 newval, ee_u16 crc); -ee_u8 check_data_types(void); -void * portable_malloc(ee_size_t size); -void portable_free(void *p); -ee_s32 parseval(char *valstring); - -/* Algorithm IDS */ -#define ID_LIST (1 << 0) -#define ID_MATRIX (1 << 1) -#define ID_STATE (1 << 2) -#define ALL_ALGORITHMS_MASK (ID_LIST | ID_MATRIX | ID_STATE) -#define NUM_ALGORITHMS 3 - -/* list data structures */ -typedef struct list_data_s -{ - ee_s16 data16; - ee_s16 idx; -} list_data; - -typedef struct list_head_s -{ - struct list_head_s *next; - struct list_data_s *info; -} list_head; - -/*matrix benchmark related stuff */ -#define MATDAT_INT 1 -#if MATDAT_INT -typedef ee_s16 MATDAT; -typedef ee_s32 MATRES; -#else -typedef ee_f16 MATDAT; -typedef ee_f32 MATRES; -#endif - -typedef struct MAT_PARAMS_S -{ - int N; - MATDAT *A; - MATDAT *B; - MATRES *C; -} mat_params; - -/* state machine related stuff */ -/* List of all the possible states for the FSM */ -typedef enum CORE_STATE -{ - CORE_START = 0, - CORE_INVALID, - CORE_S1, - CORE_S2, - CORE_INT, - CORE_FLOAT, - CORE_EXPONENT, - CORE_SCIENTIFIC, - NUM_CORE_STATES -} core_state_e; - -/* Helper structure to hold results */ -typedef struct RESULTS_S -{ - /* inputs */ - ee_s16 seed1; /* Initializing seed */ - ee_s16 seed2; /* Initializing seed */ - ee_s16 seed3; /* Initializing seed */ - void * memblock[4]; /* Pointer to safe memory location */ - ee_u32 size; /* Size of the data */ - ee_u32 iterations; /* Number of iterations to execute */ - ee_u32 execs; /* Bitmask of operations to execute */ - struct list_head_s *list; - mat_params mat; - /* outputs */ - ee_u16 crc; - ee_u16 crclist; - ee_u16 crcmatrix; - ee_u16 crcstate; - ee_s16 err; - /* ultithread specific */ - core_portable port; -} core_results; - -/* Multicore execution handling */ -#if (MULTITHREAD > 1) -ee_u8 core_start_parallel(core_results *res); -ee_u8 core_stop_parallel(core_results *res); -#endif - -/* list benchmark functions */ -list_head *core_list_init(ee_u32 blksize, list_head *memblock, ee_s16 seed); -ee_u16 core_bench_list(core_results *res, ee_s16 finder_idx); - -/* state benchmark functions */ -void core_init_state(ee_u32 size, ee_s16 seed, ee_u8 *p); -ee_u16 core_bench_state(ee_u32 blksize, - ee_u8 *memblock, - ee_s16 seed1, - ee_s16 seed2, - ee_s16 step, - ee_u16 crc); - -/* matrix benchmark functions */ -ee_u32 core_init_matrix(ee_u32 blksize, - void * memblk, - ee_s32 seed, - mat_params *p); -ee_u16 core_bench_matrix(mat_params *p, ee_s16 seed, ee_u16 crc); diff --git a/tests/riscv-coremark/coremark/coremark.md5 b/tests/riscv-coremark/coremark/coremark.md5 deleted file mode 100644 index 94160db22..000000000 --- a/tests/riscv-coremark/coremark/coremark.md5 +++ /dev/null @@ -1,6 +0,0 @@ -8d082dc4a9676c02731a8cf209339072 core_list_join.c -c984863b84b59185d8b5fb81c1ca7535 core_main.c -5fa21a0f7c3964167c9691db531ca652 core_matrix.c -edcfc7a0b146a50028014f06e6826aa3 core_state.c -45540ba2145adea1ec7ea2c72a1fbbcb core_util.c -8ca974c013b380dc7f0d6d1afb76eb2d coremark.h diff --git a/tests/riscv-coremark/coremark/cygwin/core_portme.c b/tests/riscv-coremark/coremark/cygwin/core_portme.c deleted file mode 100755 index fe8d29983..000000000 --- a/tests/riscv-coremark/coremark/cygwin/core_portme.c +++ /dev/null @@ -1,336 +0,0 @@ -/* -Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Original Author: Shay Gal-on -*/ - -#include -#include -#include "coremark.h" -#if CALLGRIND_RUN -#include -#endif - -#if (MEM_METHOD==MEM_MALLOC) -#include -/* Function: portable_malloc - Provide malloc() functionality in a platform specific way. -*/ -void *portable_malloc(size_t size) { - return malloc(size); -} -/* Function: portable_free - Provide free() functionality in a platform specific way. -*/ -void portable_free(void *p) { - free(p); -} -#else -void *portable_malloc(size_t size) { - return NULL; -} -void portable_free(void *p) { - p=NULL; -} -#endif - -#if (SEED_METHOD==SEED_VOLATILE) -#if VALIDATION_RUN - volatile ee_s32 seed1_volatile=0x3415; - volatile ee_s32 seed2_volatile=0x3415; - volatile ee_s32 seed3_volatile=0x66; -#endif -#if PERFORMANCE_RUN - volatile ee_s32 seed1_volatile=0x0; - volatile ee_s32 seed2_volatile=0x0; - volatile ee_s32 seed3_volatile=0x66; -#endif -#if PROFILE_RUN - volatile ee_s32 seed1_volatile=0x8; - volatile ee_s32 seed2_volatile=0x8; - volatile ee_s32 seed3_volatile=0x8; -#endif - volatile ee_s32 seed4_volatile=ITERATIONS; - volatile ee_s32 seed5_volatile=0; -#endif -/* Porting: Timing functions - How to capture time and convert to seconds must be ported to whatever is supported by the platform. - e.g. Read value from on board RTC, read value from cpu clock cycles performance counter etc. - Sample implementation for standard time.h and windows.h definitions included. -*/ -/* Define: TIMER_RES_DIVIDER - Divider to trade off timer resolution and total time that can be measured. - - Use lower values to increase resolution, but make sure that overflow does not occur. - If there are issues with the return value overflowing, increase this value. - */ -#if USE_CLOCK - #define NSECS_PER_SEC CLOCKS_PER_SEC - #define EE_TIMER_TICKER_RATE 1000 - #define CORETIMETYPE clock_t - #define GETMYTIME(_t) (*_t=clock()) - #define MYTIMEDIFF(fin,ini) ((fin)-(ini)) - #define TIMER_RES_DIVIDER 1 - #define SAMPLE_TIME_IMPLEMENTATION 1 -#elif defined(_MSC_VER) - #define NSECS_PER_SEC 10000000 - #define EE_TIMER_TICKER_RATE 1000 - #define CORETIMETYPE FILETIME - #define GETMYTIME(_t) GetSystemTimeAsFileTime(_t) - #define MYTIMEDIFF(fin,ini) (((*(__int64*)&fin)-(*(__int64*)&ini))/TIMER_RES_DIVIDER) - /* setting to millisces resolution by default with MSDEV */ - #ifndef TIMER_RES_DIVIDER - #define TIMER_RES_DIVIDER 1000 - #endif - #define SAMPLE_TIME_IMPLEMENTATION 1 -#elif HAS_TIME_H - #define NSECS_PER_SEC 1000000000 - #define EE_TIMER_TICKER_RATE 1000 - #define CORETIMETYPE struct timespec - #define GETMYTIME(_t) clock_gettime(CLOCK_REALTIME,_t) - #define MYTIMEDIFF(fin,ini) ((fin.tv_sec-ini.tv_sec)*(NSECS_PER_SEC/TIMER_RES_DIVIDER)+(fin.tv_nsec-ini.tv_nsec)/TIMER_RES_DIVIDER) - /* setting to 1/1000 of a second resolution by default with linux */ - #ifndef TIMER_RES_DIVIDER - #define TIMER_RES_DIVIDER 1000000 - #endif - #define SAMPLE_TIME_IMPLEMENTATION 1 -#else - #define SAMPLE_TIME_IMPLEMENTATION 0 -#endif -#define EE_TICKS_PER_SEC (NSECS_PER_SEC / TIMER_RES_DIVIDER) - -#if SAMPLE_TIME_IMPLEMENTATION -/** Define Host specific (POSIX), or target specific global time variables. */ -static CORETIMETYPE start_time_val, stop_time_val; - -/* Function: start_time - This function will be called right before starting the timed portion of the benchmark. - - Implementation may be capturing a system timer (as implemented in the example code) - or zeroing some system parameters - e.g. setting the cpu clocks cycles to 0. -*/ -void start_time(void) { - GETMYTIME(&start_time_val ); -#if CALLGRIND_RUN - CALLGRIND_START_INSTRUMENTATION -#endif -#if MICA - asm volatile("int3");/*1 */ -#endif -} -/* Function: stop_time - This function will be called right after ending the timed portion of the benchmark. - - Implementation may be capturing a system timer (as implemented in the example code) - or other system parameters - e.g. reading the current value of cpu cycles counter. -*/ -void stop_time(void) { -#if CALLGRIND_RUN - CALLGRIND_STOP_INSTRUMENTATION -#endif -#if MICA - asm volatile("int3");/*1 */ -#endif - GETMYTIME(&stop_time_val ); -} -/* Function: get_time - Return an abstract "ticks" number that signifies time on the system. - - Actual value returned may be cpu cycles, milliseconds or any other value, - as long as it can be converted to seconds by . - This methodology is taken to accomodate any hardware or simulated platform. - The sample implementation returns millisecs by default, - and the resolution is controlled by -*/ -CORE_TICKS get_time(void) { - CORE_TICKS elapsed=(CORE_TICKS)(MYTIMEDIFF(stop_time_val, start_time_val)); - return elapsed; -} -/* Function: time_in_secs - Convert the value returned by get_time to seconds. - - The type is used to accomodate systems with no support for floating point. - Default implementation implemented by the EE_TICKS_PER_SEC macro above. -*/ -secs_ret time_in_secs(CORE_TICKS ticks) { - secs_ret retval=((secs_ret)ticks) / (secs_ret)EE_TICKS_PER_SEC; - return retval; -} -#else -#error "Please implement timing functionality in core_portme.c" -#endif /* SAMPLE_TIME_IMPLEMENTATION */ - -ee_u32 default_num_contexts=MULTITHREAD; - -/* Function: portable_init - Target specific initialization code - Test for some common mistakes. -*/ -void portable_init(core_portable *p, int *argc, char *argv[]) -{ -#if PRINT_ARGS - int i; - for (i=0; i<*argc; i++) { - ee_printf("Arg[%d]=%s\n",i,argv[i]); - } -#endif - if (sizeof(ee_ptr_int) != sizeof(ee_u8 *)) { - ee_printf("ERROR! Please define ee_ptr_int to a type that holds a pointer!\n"); - } - if (sizeof(ee_u32) != 4) { - ee_printf("ERROR! Please define ee_u32 to a 32b unsigned type!\n"); - } -#if (MAIN_HAS_NOARGC && (SEED_METHOD==SEED_ARG)) - ee_printf("ERROR! Main has no argc, but SEED_METHOD defined to SEED_ARG!\n"); -#endif - -#if (MULTITHREAD>1) && (SEED_METHOD==SEED_ARG) - int nargs=*argc,i; - if ((nargs>1) && (*argv[1]=='M')) { - default_num_contexts=parseval(argv[1]+1); - if (default_num_contexts>MULTITHREAD) - default_num_contexts=MULTITHREAD; - /* Shift args since first arg is directed to the portable part and not to coremark main */ - --nargs; - for (i=1; i*/ - p->portable_id=1; -} -/* Function: portable_fini - Target specific final code -*/ -void portable_fini(core_portable *p) -{ - p->portable_id=0; -} - -#if (MULTITHREAD>1) - -/* Function: core_start_parallel - Start benchmarking in a parallel context. - - Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets. - Other implementations using MCAPI or other standards can easily be devised. -*/ -/* Function: core_stop_parallel - Stop a parallel context execution of coremark, and gather the results. - - Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets. - Other implementations using MCAPI or other standards can easily be devised. -*/ -#if USE_PTHREAD -ee_u8 core_start_parallel(core_results *res) { - return (ee_u8)pthread_create(&(res->port.thread),NULL,iterate,(void *)res); -} -ee_u8 core_stop_parallel(core_results *res) { - void *retval; - return (ee_u8)pthread_join(res->port.thread,&retval); -} -#elif USE_FORK -static int key_id=0; -ee_u8 core_start_parallel(core_results *res) { - key_t key=4321+key_id; - key_id++; - res->port.pid=fork(); - res->port.shmid=shmget(key, 8, IPC_CREAT | 0666); - if (res->port.shmid<0) { - ee_printf("ERROR in shmget!\n"); - } - if (res->port.pid==0) { - iterate(res); - res->port.shm=shmat(res->port.shmid, NULL, 0); - /* copy the validation values to the shared memory area and quit*/ - if (res->port.shm == (char *) -1) { - ee_printf("ERROR in child shmat!\n"); - } else { - memcpy(res->port.shm,&(res->crc),8); - shmdt(res->port.shm); - } - exit(0); - } - return 1; -} -ee_u8 core_stop_parallel(core_results *res) { - int status; - pid_t wpid = waitpid(res->port.pid,&status,WUNTRACED); - if (wpid != res->port.pid) { - ee_printf("ERROR waiting for child.\n"); - if (errno == ECHILD) ee_printf("errno=No such child %d\n",res->port.pid); - if (errno == EINTR) ee_printf("errno=Interrupted\n"); - return 0; - } - /* after process is done, get the values from the shared memory area */ - res->port.shm=shmat(res->port.shmid, NULL, 0); - if (res->port.shm == (char *) -1) { - ee_printf("ERROR in parent shmat!\n"); - return 0; - } - memcpy(&(res->crc),res->port.shm,8); - shmdt(res->port.shm); - return 1; -} -#elif USE_SOCKET -static int key_id=0; -ee_u8 core_start_parallel(core_results *res) { - int bound, buffer_length=8; - res->port.sa.sin_family = AF_INET; - res->port.sa.sin_addr.s_addr = htonl(0x7F000001); - res->port.sa.sin_port = htons(7654+key_id); - key_id++; - res->port.pid=fork(); - if (res->port.pid==0) { /* benchmark child */ - iterate(res); - res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); - if (-1 == res->port.sock) /* if socket failed to initialize, exit */ { - ee_printf("Error Creating Socket"); - } else { - int bytes_sent = sendto(res->port.sock, &(res->crc), buffer_length, 0,(struct sockaddr*)&(res->port.sa), sizeof (struct sockaddr_in)); - if (bytes_sent < 0) - ee_printf("Error sending packet: %s\n", strerror(errno)); - close(res->port.sock); /* close the socket */ - } - exit(0); - } - /* parent process, open the socket */ - res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); - bound = bind(res->port.sock,(struct sockaddr*)&(res->port.sa), sizeof(struct sockaddr)); - if (bound < 0) - ee_printf("bind(): %s\n",strerror(errno)); - return 1; -} -ee_u8 core_stop_parallel(core_results *res) { - int status; - int fromlen=sizeof(struct sockaddr); - int recsize = recvfrom(res->port.sock, &(res->crc), 8, 0, (struct sockaddr*)&(res->port.sa), &fromlen); - if (recsize < 0) { - ee_printf("Error in receive: %s\n", strerror(errno)); - return 0; - } - pid_t wpid = waitpid(res->port.pid,&status,WUNTRACED); - if (wpid != res->port.pid) { - ee_printf("ERROR waiting for child.\n"); - if (errno == ECHILD) ee_printf("errno=No such child %d\n",res->port.pid); - if (errno == EINTR) ee_printf("errno=Interrupted\n"); - return 0; - } - return 1; -} -#else /* no standard multicore implementation */ -#error "Please implement multicore functionality in core_portme.c to use multiple contexts." -#endif /* multithread implementations */ -#endif diff --git a/tests/riscv-coremark/coremark/cygwin/core_portme.h b/tests/riscv-coremark/coremark/cygwin/core_portme.h deleted file mode 100755 index 9471b12ec..000000000 --- a/tests/riscv-coremark/coremark/cygwin/core_portme.h +++ /dev/null @@ -1,293 +0,0 @@ -/* -Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Original Author: Shay Gal-on -*/ - -/* Topic: Description - This file contains configuration constants required to execute on different platforms -*/ -#ifndef CORE_PORTME_H -#define CORE_PORTME_H -/************************/ -/* Data types and settings */ -/************************/ -/* Configuration: HAS_FLOAT - Define to 1 if the platform supports floating point. -*/ -#ifndef HAS_FLOAT -#define HAS_FLOAT 1 -#endif -/* Configuration: HAS_TIME_H - Define to 1 if platform has the time.h header file, - and implementation of functions thereof. -*/ -#ifndef HAS_TIME_H -#define HAS_TIME_H 1 -#endif -/* Configuration: USE_CLOCK - Define to 1 if platform has the time.h header file, - and implementation of functions thereof. -*/ -#ifndef USE_CLOCK -#define USE_CLOCK 0 -#endif -/* Configuration: HAS_STDIO - Define to 1 if the platform has stdio.h. -*/ -#ifndef HAS_STDIO -#define HAS_STDIO 1 -#endif -/* Configuration: HAS_PRINTF - Define to 1 if the platform has stdio.h and implements the printf function. -*/ -#ifndef HAS_PRINTF -#define HAS_PRINTF 1 -#endif - -/* Configuration: CORE_TICKS - Define type of return from the timing functions. - */ -#if defined(_MSC_VER) -#include -typedef size_t CORE_TICKS; -#elif HAS_TIME_H -#include -typedef clock_t CORE_TICKS; -#else -#error "Please define type of CORE_TICKS and implement start_time, end_time get_time and time_in_secs functions!" -#endif - -/* Definitions: COMPILER_VERSION, COMPILER_FLAGS, MEM_LOCATION - Initialize these strings per platform -*/ -#ifndef COMPILER_VERSION - #ifdef __GNUC__ - #define COMPILER_VERSION "GCC"__VERSION__ - #else - #define COMPILER_VERSION "Please put compiler version here (e.g. gcc 4.1)" - #endif -#endif -#ifndef COMPILER_FLAGS - #define COMPILER_FLAGS FLAGS_STR /* "Please put compiler flags here (e.g. -o3)" */ -#endif -#ifndef MEM_LOCATION - #define MEM_LOCATION "Please put data memory location here\n\t\t\t(e.g. code in flash, data on heap etc)" - #define MEM_LOCATION_UNSPEC 1 -#endif - -/* Data Types: - To avoid compiler issues, define the data types that need ot be used for 8b, 16b and 32b in . - - *Imprtant*: - ee_ptr_int needs to be the data type used to hold pointers, otherwise coremark may fail!!! -*/ -typedef signed short ee_s16; -typedef unsigned short ee_u16; -typedef signed int ee_s32; -typedef double ee_f32; -typedef unsigned char ee_u8; -typedef unsigned int ee_u32; -typedef ee_u32 ee_ptr_int; -typedef size_t ee_size_t; -/* align_mem: - This macro is used to align an offset to point to a 32b value. It is used in the Matrix algorithm to initialize the input memory blocks. -*/ -#define align_mem(x) (void *)(4 + (((ee_ptr_int)(x) - 1) & ~3)) - -/* Configuration: SEED_METHOD - Defines method to get seed values that cannot be computed at compile time. - - Valid values: - SEED_ARG - from command line. - SEED_FUNC - from a system function. - SEED_VOLATILE - from volatile variables. -*/ -#ifndef SEED_METHOD -#define SEED_METHOD SEED_ARG -#endif - -/* Configuration: MEM_METHOD - Defines method to get a block of memry. - - Valid values: - MEM_MALLOC - for platforms that implement malloc and have malloc.h. - MEM_STATIC - to use a static memory array. - MEM_STACK - to allocate the data block on the stack (NYI). -*/ -#ifndef MEM_METHOD -#define MEM_METHOD MEM_MALLOC -#endif - -/* Configuration: MULTITHREAD - Define for parallel execution - - Valid values: - 1 - only one context (default). - N>1 - will execute N copies in parallel. - - Note: - If this flag is defined to more then 1, an implementation for launching parallel contexts must be defined. - - Two sample implementations are provided. Use or to enable them. - - It is valid to have a different implementation of and in , - to fit a particular architecture. -*/ -#ifndef MULTITHREAD -#define MULTITHREAD 1 -#endif - -/* Configuration: USE_PTHREAD - Sample implementation for launching parallel contexts - This implementation uses pthread_thread_create and pthread_join. - - Valid values: - 0 - Do not use pthreads API. - 1 - Use pthreads API - - Note: - This flag only matters if MULTITHREAD has been defined to a value greater then 1. -*/ -#ifndef USE_PTHREAD -#define USE_PTHREAD 0 -#endif - -/* Configuration: USE_FORK - Sample implementation for launching parallel contexts - This implementation uses fork, waitpid, shmget,shmat and shmdt. - - Valid values: - 0 - Do not use fork API. - 1 - Use fork API - - Note: - This flag only matters if MULTITHREAD has been defined to a value greater then 1. -*/ -#ifndef USE_FORK -#define USE_FORK 0 -#endif - -/* Configuration: USE_SOCKET - Sample implementation for launching parallel contexts - This implementation uses fork, socket, sendto and recvfrom - - Valid values: - 0 - Do not use fork and sockets API. - 1 - Use fork and sockets API - - Note: - This flag only matters if MULTITHREAD has been defined to a value greater then 1. -*/ -#ifndef USE_SOCKET -#define USE_SOCKET 0 -#endif - -/* Configuration: MAIN_HAS_NOARGC - Needed if platform does not support getting arguments to main. - - Valid values: - 0 - argc/argv to main is supported - 1 - argc/argv to main is not supported -*/ -#ifndef MAIN_HAS_NOARGC -#define MAIN_HAS_NOARGC 0 -#endif - -/* Configuration: MAIN_HAS_NORETURN - Needed if platform does not support returning a value from main. - - Valid values: - 0 - main returns an int, and return value will be 0. - 1 - platform does not support returning a value from main -*/ -#ifndef MAIN_HAS_NORETURN -#define MAIN_HAS_NORETURN 0 -#endif - -/* Variable: default_num_contexts - Number of contexts to spawn in multicore context. - Override this global value to change number of contexts used. - - Note: - This value may not be set higher then the define. - - To experiment, you can set the define to the highest value expected, and use argc/argv in the to set this value from the command line. -*/ -extern ee_u32 default_num_contexts; - -#if (MULTITHREAD>1) -#if USE_PTHREAD - #include - #define PARALLEL_METHOD "PThreads" -#elif USE_FORK - #include - #include - #include - #include - #include /* for memcpy */ - #define PARALLEL_METHOD "Fork" -#elif USE_SOCKET - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #define PARALLEL_METHOD "Sockets" -#else - #define PARALLEL_METHOD "Proprietary" - #error "Please implement multicore functionality in core_portme.c to use multiple contexts." -#endif /* Method for multithreading */ -#endif /* MULTITHREAD > 1 */ - -typedef struct CORE_PORTABLE_S { -#if (MULTITHREAD>1) - #if USE_PTHREAD - pthread_t thread; - #elif USE_FORK - pid_t pid; - int shmid; - void *shm; - #elif USE_SOCKET - pid_t pid; - int sock; - struct sockaddr_in sa; - #endif /* Method for multithreading */ -#endif /* MULTITHREAD>1 */ - ee_u8 portable_id; -} core_portable; - -/* target specific init/fini */ -void portable_init(core_portable *p, int *argc, char *argv[]); -void portable_fini(core_portable *p); - -#if (SEED_METHOD==SEED_VOLATILE) - #if (VALIDATION_RUN || PERFORMANCE_RUN || PROFILE_RUN) - #define RUN_TYPE_FLAG 1 - #else - #if (TOTAL_DATA_SIZE==1200) - #define PROFILE_RUN 1 - #else - #define PERFORMANCE_RUN 1 - #endif - #endif -#endif /* SEED_METHOD==SEED_VOLATILE */ - -#endif /* CORE_PORTME_H */ diff --git a/tests/riscv-coremark/coremark/cygwin/core_portme.mak b/tests/riscv-coremark/coremark/cygwin/core_portme.mak deleted file mode 100644 index 97b6d6ace..000000000 --- a/tests/riscv-coremark/coremark/cygwin/core_portme.mak +++ /dev/null @@ -1,17 +0,0 @@ -# Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# Original Author: Shay Gal-on - -include posix/core_portme.mak diff --git a/tests/riscv-coremark/coremark/docs/READM.md b/tests/riscv-coremark/coremark/docs/READM.md deleted file mode 100644 index 6f71f426d..000000000 --- a/tests/riscv-coremark/coremark/docs/READM.md +++ /dev/null @@ -1 +0,0 @@ -This folder contains the original, unaltered documents from the CoreMark V1.0 release. diff --git a/tests/riscv-coremark/coremark/docs/balance_O0_joined.png b/tests/riscv-coremark/coremark/docs/balance_O0_joined.png deleted file mode 100644 index 46b41583a8b834d371c2bced376f956e0f54065b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48672 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 - -core_portme.mak - CoreMark - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/files/core_list_join-c.html b/tests/riscv-coremark/coremark/docs/html/files/core_list_join-c.html deleted file mode 100644 index 6ee2aeecd..000000000 --- a/tests/riscv-coremark/coremark/docs/html/files/core_list_join-c.html +++ /dev/null @@ -1,58 +0,0 @@ - - -/cygdrive/d/dev/code/coremark/core_list_join.c - CoreMark - - - - - - - -

core_list_join.c

Summary
core_list_join.c
DescriptionBenchmark using a linked list.
Functions
cmp_complexCompare the data item in a list cell.
cmp_idxCompare the idx item in a list cell, and regen the data.
core_list_initInitialize list with data.
core_list_insertInsert an item to the list
core_list_removeRemove an item from the list.
core_list_undo_removeUndo a remove operation.
core_list_findFind an item in the list
core_list_reverseReverse a list
core_list_mergesortSort the list in place without recursion.
- -

Description

Benchmark using a linked list.

Linked list is a common data structure used in many applications.

For our purposes, this will excercise the memory units of the processor.  In particular, usage of the list pointers to find and alter data.

We are not using Malloc since some platforms do not support this library.

Instead, the memory block being passed in is used to create a list, and the benchmark takes care not to add more items then can be accomodated by the memory block.  The porting layer will make sure that we have a valid memory block.

All operations are done in place, without using any extra memory.

The list itself contains list pointers and pointers to data items.  Data items contain the following:

idxAn index that captures the initial order of the list.
dataVariable data initialized based on the input parameters.  The 16b are divided as follows:
  • Upper 8b are backup of original data.
  • Bit 7 indicates if the lower 7 bits are to be used as is or calculated.
  • Bits 0-2 indicate type of operation to perform to get a 7b value.
  • Bits 3-6 provide input for the operation.
- -

Functions

- -

cmp_complex

ee_s32 cmp_complex(list_data *a,
list_data *b,
core_results *res)

Compare the data item in a list cell.

Can be used by mergesort.

- -

cmp_idx

ee_s32 cmp_idx(list_data *a,
list_data *b,
core_results *res)

Compare the idx item in a list cell, and regen the data.

Can be used by mergesort.

- -

core_list_init

list_head *core_list_init(ee_u32 blksize,
list_head *memblock,
ee_s16 seed)

Initialize list with data.

Parameters

blksizeSize of memory to be initialized.
memblockPointer to memory block.
seedActual values chosen depend on the seed parameter.  The seed parameter MUST be supplied from a source that cannot be determined at compile time

Returns

Pointer to the head of the list.

- -

core_list_insert

list_head *core_list_insert_new(list_head *insert_point,
list_data *info,
list_head **memblock,
list_data **datablock ,
list_head *memblock_end,
list_data *datablock_end)

Insert an item to the list

Parameters

insert_pointwhere to insert the item.
infodata for the cell.
memblockpointer for the list header
datablockpointer for the list data
memblock_endend of region for list headers
datablock_endend of region for list data

Returns

Pointer to new item.

- -

core_list_remove

list_head *core_list_remove(list_head *item)

Remove an item from the list.

Operation

For a singly linked list, remove by copying the data from the next item over to the current cell, and unlinking the next item.

Note

since there is always a fake item at the end of the list, no need to check for NULL.

Returns

Removed item.

- -

core_list_undo_remove

list_head *core_list_undo_remove(list_head *item_removed,
list_head *item_modified)

Undo a remove operation.

Operation

Since we want each iteration of the benchmark to be exactly the same, we need to be able to undo a remove.  Link the removed item back into the list, and switch the info items.

Parameters

item_removedReturn value from the core_list_remove
item_modifiedList item that was modified during core_list_remove

Returns

The item that was linked back to the list.

- -

core_list_find

list_head *core_list_find(list_head *list,
list_data *info)

Find an item in the list

Operation

Find an item by idx (if not 0) or specific data value

Parameters

listlist head
infoidx or data to find

Returns

Found item, or NULL if not found.

- -

core_list_reverse

list_head *core_list_reverse(list_head *list)

Reverse a list

Operation

Rearrange the pointers so the list is reversed.

Parameters

listlist head
infoidx or data to find

Returns

Found item, or NULL if not found.

- -

core_list_mergesort

list_head *core_list_mergesort(list_head *list,
list_cmp cmp,
core_results *res)

Sort the list in place without recursion.

Description

Use mergesort, as for linked list this is a realistic solution.  Also, since this is aimed at embedded, care was taken to use iterative rather then recursive algorithm.  The sort can either return the list to original order (by idx) , or use the data item to invoke other other algorithms and change the order of the list.

Parameters

listlist to be sorted.
cmpcmp function to use

Returns

New head of the list.

Note

We have a special header for the list that will always be first, but the algorithm could theoretically modify where the list starts.

- -
- - - - - - - - - - -
ee_s32 cmp_complex(list_data *a,
list_data *b,
core_results *res)
Compare the data item in a list cell.
ee_s32 cmp_idx(list_data *a,
list_data *b,
core_results *res)
Compare the idx item in a list cell, and regen the data.
list_head *core_list_init(ee_u32 blksize,
list_head *memblock,
ee_s16 seed)
Initialize list with data.
list_head *core_list_insert_new(list_head *insert_point,
list_data *info,
list_head **memblock,
list_data **datablock ,
list_head *memblock_end,
list_data *datablock_end)
Insert an item to the list
list_head *core_list_remove(list_head *item)
Remove an item from the list.
list_head *core_list_undo_remove(list_head *item_removed,
list_head *item_modified)
Undo a remove operation.
list_head *core_list_find(list_head *list,
list_data *info)
Find an item in the list
list_head *core_list_reverse(list_head *list)
Reverse a list
list_head *core_list_mergesort(list_head *list,
list_cmp cmp,
core_results *res)
Sort the list in place without recursion.
- - - - - - - - \ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/files/core_main-c.html b/tests/riscv-coremark/coremark/docs/html/files/core_main-c.html deleted file mode 100644 index 847744131..000000000 --- a/tests/riscv-coremark/coremark/docs/html/files/core_main-c.html +++ /dev/null @@ -1,42 +0,0 @@ - - -core_main.c - CoreMark - - - - - - - -

core_main.c

This file contains the framework to acquire a block of memory, seed initial parameters, tun t he benchmark and report the results.

Summary
core_main.cThis file contains the framework to acquire a block of memory, seed initial parameters, tun t he benchmark and report the results.
Functions
iterateRun the benchmark for a specified number of iterations.
mainMain entry routine for the benchmark.
- -

Functions

- -

iterate

Run the benchmark for a specified number of iterations.

Operation

For each type of benchmarked algorithm: a - Initialize the data block for the algorithm. b - Execute the algorithm N times.

Returns

NULL.

- -

main

#if MAIN_HAS_NOARGC MAIN_RETURN_TYPE main(void)

Main entry routine for the benchmark.  This function is responsible for the following steps:

1Initialize input seeds from a source that cannot be determined at compile time.
2Initialize memory block for use.
3Run and time the benchmark.
4Report results, testing the validity of the output if the seeds are known.

Arguments

1first seed : Any value
2second seed : Must be identical to first for iterations to be identical
3third seed : Any value, should be at least an order of magnitude less then the input size, but bigger then 32.
4Iterations : Special, if set to 0, iterations will be automatically determined such that the benchmark will run between 10 to 100 secs
- -
- - - - - - - - - - -
#if MAIN_HAS_NOARGC MAIN_RETURN_TYPE main(void)
Main entry routine for the benchmark.
- - - - - - - - \ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/files/core_matrix-c.html b/tests/riscv-coremark/coremark/docs/html/files/core_matrix-c.html deleted file mode 100644 index 2ad041b71..000000000 --- a/tests/riscv-coremark/coremark/docs/html/files/core_matrix-c.html +++ /dev/null @@ -1,56 +0,0 @@ - - -/cygdrive/d/dev/code/coremark/core_matrix.c - CoreMark - - - - - - - -

core_matrix.c

Summary
core_matrix.c
DescriptionMatrix manipulation benchmark
Functions
core_bench_matrixBenchmark function
matrix_testPerform matrix manipulation.
matrix_sumCalculate a function that depends on the values of elements in the matrix.
matrix_mul_constMultiply a matrix by a constant.
matrix_add_constAdd a constant value to all elements of a matrix.
matrix_mul_vectMultiply a matrix by a vector.
matrix_mul_matrixMultiply a matrix by a matrix.
matrix_mul_matrix_bitextractMultiply a matrix by a matrix, and extract some bits from the result.
- -

Description

Matrix manipulation benchmark

This very simple algorithm forms the basis of many more complex algorithms.

The tight inner loop is the focus of many optimizations (compiler as well as hardware based) and is thus relevant for embedded processing.

The total available data space will be divided to 3 parts

NxN Matrix Ainitialized with small values (upper 3/4 of the bits all zero).
NxN Matrix Binitialized with medium values (upper half of the bits all zero).
NxN Matrix Cused for the result.

The actual values for A and B must be derived based on input that is not available at compile time.

- -

Functions

- -

core_bench_matrix

ee_u16 core_bench_matrix(mat_params *p,
ee_s16 seed,
ee_u16 crc)

Benchmark function

Iterate matrix_test N times, changing the matrix values slightly by a constant amount each time.

- -

matrix_test

ee_s16 matrix_test(ee_u32 N,
MATRES *C,
MATDAT *A,
MATDAT *B,
MATDAT val)

Perform matrix manipulation.

Parameters

NDimensions of the matrix.
Cmemory for result matrix.
Ainput matrix
Boperator matrix (not changed during operations)

Returns

A CRC value that captures all results calculated in the function.  In particular, crc of the value calculated on the result matrix after each step by matrix_sum.

Operation

1Add a constant value to all elements of a matrix.
2Multiply a matrix by a constant.
3Multiply a matrix by a vector.
4Multiply a matrix by a matrix.
5Add a constant value to all elements of a matrix.

After the last step, matrix A is back to original contents.

- -

matrix_sum

ee_s16 matrix_sum(ee_u32 N,
MATRES *C,
MATDAT clipval)

Calculate a function that depends on the values of elements in the matrix.

For each element, accumulate into a temporary variable.

As long as this value is under the parameter clipval, add 1 to the result if the element is bigger then the previous.

Otherwise, reset the accumulator and add 10 to the result.

- -

matrix_mul_const

void matrix_mul_const(ee_u32 N,
MATRES *C,
MATDAT *A,
MATDAT val)

Multiply a matrix by a constant.  This could be used as a scaler for instance.

- -

matrix_add_const

void matrix_add_const(ee_u32 N,
MATDAT *A,
MATDAT val)

Add a constant value to all elements of a matrix.

- -

matrix_mul_vect

void matrix_mul_vect(ee_u32 N,
MATRES *C,
MATDAT *A,
MATDAT *B)

Multiply a matrix by a vector.  This is common in many simple filters (e.g. fir where a vector of coefficients is applied to the matrix.)

- -

matrix_mul_matrix

void matrix_mul_matrix(ee_u32 N,
MATRES *C,
MATDAT *A,
MATDAT *B)

Multiply a matrix by a matrix.  Basic code is used in many algorithms, mostly with minor changes such as scaling.

- -

matrix_mul_matrix_bitextract

void matrix_mul_matrix_bitextract(ee_u32 N,
MATRES *C,
MATDAT *A,
MATDAT *B)

Multiply a matrix by a matrix, and extract some bits from the result.  Basic code is used in many algorithms, mostly with minor changes such as scaling.

- -
- - - - - - - - - - -
ee_u16 core_bench_matrix(mat_params *p,
ee_s16 seed,
ee_u16 crc)
Benchmark function
ee_s16 matrix_test(ee_u32 N,
MATRES *C,
MATDAT *A,
MATDAT *B,
MATDAT val)
Perform matrix manipulation.
ee_s16 matrix_sum(ee_u32 N,
MATRES *C,
MATDAT clipval)
Calculate a function that depends on the values of elements in the matrix.
void matrix_mul_const(ee_u32 N,
MATRES *C,
MATDAT *A,
MATDAT val)
Multiply a matrix by a constant.
void matrix_add_const(ee_u32 N,
MATDAT *A,
MATDAT val)
Add a constant value to all elements of a matrix.
void matrix_mul_vect(ee_u32 N,
MATRES *C,
MATDAT *A,
MATDAT *B)
Multiply a matrix by a vector.
void matrix_mul_matrix(ee_u32 N,
MATRES *C,
MATDAT *A,
MATDAT *B)
Multiply a matrix by a matrix.
void matrix_mul_matrix_bitextract(ee_u32 N,
MATRES *C,
MATDAT *A,
MATDAT *B)
Multiply a matrix by a matrix, and extract some bits from the result.
- - - - - - - - \ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/files/core_state-c.html b/tests/riscv-coremark/coremark/docs/html/files/core_state-c.html deleted file mode 100644 index 9f8035990..000000000 --- a/tests/riscv-coremark/coremark/docs/html/files/core_state-c.html +++ /dev/null @@ -1,46 +0,0 @@ - - -/cygdrive/d/dev/code/coremark/core_state.c - CoreMark - - - - - - - -

core_state.c

Summary
core_state.c
DescriptionSimple state machines like this one are used in many embedded products.
Functions
core_bench_stateBenchmark function
core_init_stateInitialize the input data for the state machine.
core_state_transitionActual state machine.
- -

Description

Simple state machines like this one are used in many embedded products.

For more complex state machines, sometimes a state transition table implementation is used instead, trading speed of direct coding for ease of maintenance.

Since the main goal of using a state machine in CoreMark is to excercise the switch/if behaviour, we are using a small moore machine.

In particular, this machine tests type of string input, trying to determine whether the input is a number or something else.  (see core_state).

core_state
- -

Functions

- -

core_bench_state

ee_u16 core_bench_state(ee_u32 blksize,
ee_u8 *memblock,
ee_s16 seed1,
ee_s16 seed2,
ee_s16 step,
ee_u16 crc)

Benchmark function

Go over the input twice, once direct, and once after introducing some corruption.

- -

core_init_state

void core_init_state(ee_u32 size,
ee_s16 seed,
ee_u8 *p)

Initialize the input data for the state machine.

Populate the input with several predetermined strings, interspersed.  Actual patterns chosen depend on the seed parameter.

Note

The seed parameter MUST be supplied from a source that cannot be determined at compile time

- -

core_state_transition

enum CORE_STATE core_state_transition(ee_u8 **instr ,
ee_u32 *transition_count)

Actual state machine.

The state machine will continue scanning until either

1an invalid input is detcted.
2a valid number has been detected.

The input pointer is updated to point to the end of the token, and the end state is returned (either specific format determined or invalid).

- -
- - - - - - - - - - -
ee_u16 core_bench_state(ee_u32 blksize,
ee_u8 *memblock,
ee_s16 seed1,
ee_s16 seed2,
ee_s16 step,
ee_u16 crc)
Benchmark function
void core_init_state(ee_u32 size,
ee_s16 seed,
ee_u8 *p)
Initialize the input data for the state machine.
enum CORE_STATE core_state_transition(ee_u8 **instr ,
ee_u32 *transition_count)
Actual state machine.
- - - - - - - - \ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/files/core_util-c.html b/tests/riscv-coremark/coremark/docs/html/files/core_util-c.html deleted file mode 100644 index 3ebdb3879..000000000 --- a/tests/riscv-coremark/coremark/docs/html/files/core_util-c.html +++ /dev/null @@ -1,42 +0,0 @@ - - -/cygdrive/d/dev/code/coremark/core_util.c - CoreMark - - - - - - - -

core_util.c

Summary
core_util.c
Functions
get_seedGet a values that cannot be determined at compile time.
crc*Service functions to calculate 16b CRC code.
- -

Functions

- -

get_seed

Get a values that cannot be determined at compile time.

Since different embedded systems and compilers are used, 3 different methods are provided

1Using a volatile variable.  This method is only valid if the compiler is forced to generate code that reads the value of a volatile variable from memory at run time.  Please note, if using this method, you would need to modify core_portme.c to generate training profile.
2Command line arguments.  This is the preferred method if command line arguments are supported.
3System function.  If none of the first 2 methods is available on the platform, a system function which is not a stub can be used.

e.g. read the value on GPIO pins connected to switches, or invoke special simulator functions.

- -

crc*

Service functions to calculate 16b CRC code.

- -
- - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/files/coremark-h.html b/tests/riscv-coremark/coremark/docs/html/files/coremark-h.html deleted file mode 100644 index 337bc1a0c..000000000 --- a/tests/riscv-coremark/coremark/docs/html/files/coremark-h.html +++ /dev/null @@ -1,46 +0,0 @@ - - -/cygdrive/d/dev/code/coremark/coremark.h - CoreMark - - - - - - - -

coremark.h

Summary
coremark.h
DescriptionThis file contains declarations of the various benchmark functions.
Configuration
TOTAL_DATA_SIZEDefine total size for data algorithms will operate on
Types
secs_retFor machines that have floating point support, get number of seconds as a double.
- -

Description

This file contains declarations of the various benchmark functions.

- -

Configuration

- -

TOTAL_DATA_SIZE

Define total size for data algorithms will operate on

- -

Types

- -

secs_ret

For machines that have floating point support, get number of seconds as a double.  Otherwise an unsigned int.

- -
- - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/files/docs/core_state.png b/tests/riscv-coremark/coremark/docs/html/files/docs/core_state.png deleted file mode 100644 index 9b5a4ea6078f44f7ffab2d06574052d01ae0db55..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 72093 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

-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 - -core_portme.c - CoreMark - - - - - - - -

core_portme.c

Summary
core_portme.c
portable_mallocProvide malloc() functionality in a platform specific way.
portable_freeProvide free() functionality in a platform specific way.
TIMER_RES_DIVIDERDivider to trade off timer resolution and total time that can be measured.
start_timeThis function will be called right before starting the timed portion of the benchmark.
stop_timeThis function will be called right after ending the timed portion of the benchmark.
get_timeReturn an abstract “ticks” number that signifies time on the system.
time_in_secsConvert the value returned by get_time to seconds.
portable_initTarget specific initialization code Test for some common mistakes.
portable_finiTarget specific final code
core_start_parallelStart benchmarking in a parallel context.
core_stop_parallelStop a parallel context execution of coremark, and gather the results.
- -

portable_malloc

void *portable_malloc(size_t size)

Provide malloc() functionality in a platform specific way.

- -

portable_free

void portable_free(void *p)

Provide free() functionality in a platform specific way.

- -

TIMER_RES_DIVIDER

Divider to trade off timer resolution and total time that can be measured.

Use lower values to increase resolution, but make sure that overflow does not occur.  If there are issues with the return value overflowing, increase this value.

- -

start_time

void start_time(void)

This function will be called right before starting the timed portion of the benchmark.

Implementation may be capturing a system timer (as implemented in the example code) or zeroing some system parameters - e.g. setting the cpu clocks cycles to 0.

- -

stop_time

void stop_time(void)

This function will be called right after ending the timed portion of the benchmark.

Implementation may be capturing a system timer (as implemented in the example code) or other system parameters - e.g. reading the current value of cpu cycles counter.

- -

get_time

CORE_TICKS get_time(void)

Return an abstract “ticks” number that signifies time on the system.

Actual value returned may be cpu cycles, milliseconds or any other value, as long as it can be converted to seconds by time_in_secs.  This methodology is taken to accomodate any hardware or simulated platform.  The sample implementation returns millisecs by default, and the resolution is controlled by TIMER_RES_DIVIDER

- -

time_in_secs

secs_ret time_in_secs(CORE_TICKS ticks)

Convert the value returned by get_time to seconds.

The secs_ret type is used to accomodate systems with no support for floating point.  Default implementation implemented by the EE_TICKS_PER_SEC macro above.

- -

portable_init

void portable_init(core_portable *p,
int *argc,
char *argv[])

Target specific initialization code Test for some common mistakes.

- -

portable_fini

void portable_fini(core_portable *p)

Target specific final code

- -

core_start_parallel

Start benchmarking in a parallel context.

Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets.  Other implementations using MCAPI or other standards can easily be devised.

- -

core_stop_parallel

Stop a parallel context execution of coremark, and gather the results.

Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets.  Other implementations using MCAPI or other standards can easily be devised.

- -
- - - - - - - - - - -
void *portable_malloc(size_t size)
Provide malloc() functionality in a platform specific way.
void portable_free(void *p)
Provide free() functionality in a platform specific way.
void start_time(void)
This function will be called right before starting the timed portion of the benchmark.
void stop_time(void)
This function will be called right after ending the timed portion of the benchmark.
CORE_TICKS get_time(void)
Return an abstract “ticks” number that signifies time on the system.
secs_ret time_in_secs(CORE_TICKS ticks)
Convert the value returned by get_time to seconds.
void portable_init(core_portable *p,
int *argc,
char *argv[])
Target specific initialization code Test for some common mistakes.
void portable_fini(core_portable *p)
Target specific final code
Divider to trade off timer resolution and total time that can be measured.
For machines that have floating point support, get number of seconds as a double.
- - - - - - - - \ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/files/linux/core_portme-h.html b/tests/riscv-coremark/coremark/docs/html/files/linux/core_portme-h.html deleted file mode 100644 index 90810f13d..000000000 --- a/tests/riscv-coremark/coremark/docs/html/files/linux/core_portme-h.html +++ /dev/null @@ -1,72 +0,0 @@ - - -core_portme.h - CoreMark - - - - - - - -

core_portme.h

Summary
core_portme.h
DescriptionThis file contains configuration constants required to execute on different platforms
Configuration
HAS_FLOATDefine to 1 if the platform supports floating point.
HAS_TIME_HDefine to 1 if platform has the time.h header file, and implementation of functions thereof.
USE_CLOCKDefine to 1 if platform has the time.h header file, and implementation of functions thereof.
HAS_STDIODefine to 1 if the platform has stdio.h.
HAS_PRINTFDefine to 1 if the platform has stdio.h and implements the printf function.
CORE_TICKSDefine type of return from the timing functions.
SEED_METHODDefines method to get seed values that cannot be computed at compile time.
MEM_METHODDefines method to get a block of memry.
MULTITHREADDefine for parallel execution
USE_PTHREADSample implementation for launching parallel contexts This implementation uses pthread_thread_create and pthread_join.
USE_FORKSample implementation for launching parallel contexts This implementation uses fork, waitpid, shmget,shmat and shmdt.
USE_SOCKETSample implementation for launching parallel contexts This implementation uses fork, socket, sendto and recvfrom
MAIN_HAS_NOARGCNeeded if platform does not support getting arguments to main.
MAIN_HAS_NORETURNNeeded if platform does not support returning a value from main.
Variables
default_num_contextsNumber of contexts to spawn in multicore context.
- -

Description

This file contains configuration constants required to execute on different platforms

- -

Configuration

- -

HAS_FLOAT

Define to 1 if the platform supports floating point.

- -

HAS_TIME_H

Define to 1 if platform has the time.h header file, and implementation of functions thereof.

- -

USE_CLOCK

Define to 1 if platform has the time.h header file, and implementation of functions thereof.

- -

HAS_STDIO

Define to 1 if the platform has stdio.h.

- -

HAS_PRINTF

Define to 1 if the platform has stdio.h and implements the printf function.

- -

CORE_TICKS

Define type of return from the timing functions.

- -

SEED_METHOD

Defines method to get seed values that cannot be computed at compile time.

Valid values

SEED_ARGfrom command line.
SEED_FUNCfrom a system function.
SEED_VOLATILEfrom volatile variables.
- -

MEM_METHOD

Defines method to get a block of memry.

Valid values

MEM_MALLOCfor platforms that implement malloc and have malloc.h.
MEM_STATICto use a static memory array.
MEM_STACKto allocate the data block on the stack (NYI).
- -

MULTITHREAD

Define for parallel execution

Valid values

1only one context (default).
N>1will execute N copies in parallel.

Note

If this flag is defined to more then 1, an implementation for launching parallel contexts must be defined.

Two sample implementations are provided.  Use USE_PTHREAD or USE_FORK to enable them.

It is valid to have a different implementation of core_start_parallel and <core_end_parallel> in core_portme.c, to fit a particular architecture.

- -

USE_PTHREAD

Sample implementation for launching parallel contexts This implementation uses pthread_thread_create and pthread_join.

Valid values

0Do not use pthreads API.
1Use pthreads API

Note

This flag only matters if MULTITHREAD has been defined to a value greater then 1.

- -

USE_FORK

Sample implementation for launching parallel contexts This implementation uses fork, waitpid, shmget,shmat and shmdt.

Valid values

0Do not use fork API.
1Use fork API

Note

This flag only matters if MULTITHREAD has been defined to a value greater then 1.

- -

USE_SOCKET

Sample implementation for launching parallel contexts This implementation uses fork, socket, sendto and recvfrom

Valid values

0Do not use fork and sockets API.
1Use fork and sockets API

Note

This flag only matters if MULTITHREAD has been defined to a value greater then 1.

- -

MAIN_HAS_NOARGC

Needed if platform does not support getting arguments to main.

Valid values

0argc/argv to main is supported
1argc/argv to main is not supported
- -

MAIN_HAS_NORETURN

Needed if platform does not support returning a value from main.

Valid values

0main returns an int, and return value will be 0.
1platform does not support returning a value from main
- -

Variables

- -

default_num_contexts

extern ee_u32 default_num_contexts

Number of contexts to spawn in multicore context.  Override this global value to change number of contexts used.

Note

This value may not be set higher then the MULTITHREAD define.

To experiment, you can set the MULTITHREAD define to the highest value expected, and use argc/argv in the portable_init to set this value from the command line.

- -
- - - - - - - - - - -
extern ee_u32 default_num_contexts
Number of contexts to spawn in multicore context.
Sample implementation for launching parallel contexts This implementation uses pthread_thread_create and pthread_join.
Sample implementation for launching parallel contexts This implementation uses fork, waitpid, shmget,shmat and shmdt.
Start benchmarking in a parallel context.
Define for parallel execution
void portable_init(core_portable *p,
int *argc,
char *argv[])
Target specific initialization code Test for some common mistakes.
- - - - - - - - \ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/files/linux/core_portme-mak.html b/tests/riscv-coremark/coremark/docs/html/files/linux/core_portme-mak.html deleted file mode 100644 index ffd6cbe66..000000000 --- a/tests/riscv-coremark/coremark/docs/html/files/linux/core_portme-mak.html +++ /dev/null @@ -1,76 +0,0 @@ - - -core_portme.mak - CoreMark - - - - - - - -

core_portme.mak

Summary
core_portme.mak
Variables
OUTFLAGUse this flag to define how to to get an executable (e.g -o)
CCUse this flag to define compiler to use
CFLAGSUse this flag to define compiler options.
LFLAGS_ENDDefine any libraries needed for linking or other flags that should come at the end of the link line (e.g.
PORT_SRCSPort specific source files can be added here
LOADDefine this flag if you need to load to a target, as in a cross compile environment.
RUNDefine this flag if running does not consist of simple invocation of the binary.
SEPARATE_COMPILEDefine if you need to separate compilation from link stage.
PORT_OBJSPort specific object files can be added here
Build Targets
port_prebuildGenerate any files that are needed before actual build starts.
port_postbuildGenerate any files that are needed after actual build end.
port_postrunDo platform specific after run stuff.
port_prerunDo platform specific after run stuff.
port_postloadDo platform specific after load stuff.
port_preloadDo platform specific before load stuff.
Variables
OPATH
PERLDefine perl executable to calculate the geomean if running separate.
- -

Variables

- -

OUTFLAG

Use this flag to define how to to get an executable (e.g -o)

- -

CC

Use this flag to define compiler to use

- -

CFLAGS

Use this flag to define compiler options.  Note, you can add compiler options from the command line using XCFLAGS=”other flags”

- -

LFLAGS_END

Define any libraries needed for linking or other flags that should come at the end of the link line (e.g. linker scripts).  Note: On certain platforms, the default clock_gettime implementation is supported but requires linking of librt.

- -

PORT_SRCS

Port specific source files can be added here

- -

LOAD

Define this flag if you need to load to a target, as in a cross compile environment.

- -

RUN

Define this flag if running does not consist of simple invocation of the binary.  In a cross compile environment, you need to define this.

- -

SEPARATE_COMPILE

Define if you need to separate compilation from link stage.  In this case, you also need to define below how to create an object file, and how to link.

- -

PORT_OBJS

Port specific object files can be added here

- -

Build Targets

- -

port_prebuild

Generate any files that are needed before actual build starts.  E.g. generate profile guidance files.  Sample PGO generation for gcc enabled with PGO=1

  • First, check if PGO was defined on the command line, if so, need to add -fprofile-use to compile line.
  • Second, if PGO reference has not yet been generated, add a step to the prebuild that will build a profile-generate version and run it.
NoteUsing REBUILD=1

Use make PGO=1 to invoke this sample processing.

- -

port_postbuild

Generate any files that are needed after actual build end.  E.g. change format to srec, bin, zip in order to be able to load into flash

- -

port_postrun

Do platform specific after run stuff.  E.g. reset the board, backup the logfiles etc.

- -

port_prerun

Do platform specific after run stuff.  E.g. reset the board, backup the logfiles etc.

- -

port_postload

Do platform specific after load stuff.  E.g. reset the reset power to the flash eraser

- -

port_preload

Do platform specific before load stuff.  E.g. reset the reset power to the flash eraser

- -

Variables

- -

OPATH

Path to the output folder.  Defaultcurrent folder.
- -

PERL

Define perl executable to calculate the geomean if running separate.

- -
- - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/files/readme-txt.html b/tests/riscv-coremark/coremark/docs/html/files/readme-txt.html deleted file mode 100644 index 2b57f37f4..000000000 --- a/tests/riscv-coremark/coremark/docs/html/files/readme-txt.html +++ /dev/null @@ -1,71 +0,0 @@ - - -CoreMark - - - - - - - -

CoreMark

Summary
CoreMark
WelcomeCopyright © 2009 EEMBC All rights reserved.
Building and runningDownload the release files from the www.coremark.org.
DocumentationWhen you unpack the documentation (tar -vzxf coremark_<version>_docs.tgz) a docs folder will be created.
Submitting resultsCoreMark results can be submitted on the web.
Run rulesWhat is and is not allowed.
Reporting rulesHow to report results on a data sheet?
Log File FormatThe log files have the following format
LegalSee LICENSE.txt or the word document file under docs/LICENSE.doc.
CreditsMany thanks to all of the individuals who helped with the development or testing of CoreMark including (Sorted by company name)
- -

Welcome

Copyright © 2009 EEMBC All rights reserved.  CoreMark is a trademark of EEMBC and EEMBC is a registered trademark of the Embedded Microprocessor Benchmark Consortium.

CoreMark’s primary goals are simplicity and providing a method for testing only a processor’s core features.

For more information about EEMBC’s comprehensive embedded benchmark suites, please see www.eembc.org.

- -

Building and running

Download the release files from the www.coremark.org.  You can verify the download using the coremark_<version>.md5 file

md5sum -c coremark_<version>.md5

Unpack the distribution (tar -vzxf coremark_<version>.tgz && tar -vzxf coremark_<version>_docs.tgz) then change to the coremark_<version> folder.

To build and run the benchmark, type

make

Full results are available in the files run1.log and run2.log.  CoreMark result can be found in run1.log.

For self hosted Linux or Cygwin platforms, a simple make should work.

Cross Compile

For cross compile platforms please adjust core_portme.mak, core_portme.h (and possibly core_portme.c) according to the specific platform used.  When porting to a new platform, it is recommended to copy one of the default port folders (e.g. mkdir <platform> && cp linux/* <platform>), adjust the porting files, and run

make PORT_DIR=<platform>

Systems without make

The following files need to be compiled:

For example

gcc -O2 -o coremark.exe core_list_join.c core_main.c core_matrix.c core_state.c core_util.c simple/core_portme.c -DPERFORMANCE_RUN=1 -DITERATIONS=1000
-./coremark.exe > run1.log

The above will compile the benchmark for a performance run and 1000 iterations.  Output is redirected to run1.log.

Make targets

runDefault target, creates run1.log and run2.log.
run1.logRun the benchmark with performance parameters, and output to run1.log
run2.logRun the benchmark with validation parameters, and output to run2.log
run3.logRun the benchmark with profile generation parameters, and output to run3.log
compilecompile the benchmark executable
linklink the benchmark executable
checktest MD5 of sources that may not be modified
cleanclean temporary files

ITERATIONS

By default, the benchmark will run between 10-100 seconds.  To override, use ITERATIONS=N

make ITERATIONS=10

Will run the benchmark for 10 iterations.  It is recommended to set a specific number of iterations in certain situations e.g.:

  • Running with a simulator
  • Measuring power/energy
  • Timing cannot be restarted

Minimum required run time

Results are only valid for reporting if the benchmark ran for at least 10 secs!

XCFLAGS

To add compiler flags from the command line, use XCFLAGS e.g.

make XCFLAGS="-g -DMULTITHREAD=4 -DUSE_FORK=1"
  • CORE_DEBUG

Define to compile for a debug run if you get incorrect CRC.

make XCFLAGS="-DCORE_DEBUG=1"
  • Parallel Execution

Use XCFLAGS=-DMULTITHREAD=N where N is number of threads to run in parallel.  Several implementations are available to execute in multiple contexts, or you can implement your own in core_portme.c.

make XCFLAGS="-DMULTITHREAD=4 -DUSE_PTHREAD"

Above will compile the benchmark for execution on 4 cores, using POSIX Threads API.

REBUILD

To force rebuild, add the flag REBUILD to the command line

make REBUILD=1

Check core_portme.mak for more important options.

Run parameters for the benchmark executable

Coremark executable takes several parameters as follows (if main accepts arguments).  1st - A seed value used for initialization of data.  2nd - A seed value used for initialization of data.  3rd - A seed value used for initialization of data.  4th - Number of iterations (0 for auto : default value) 5th - Reserved for internal use.  6th - Reserved for internal use.  7th - For malloc users only, ovreride the size of the input data buffer.

The run target from make will run coremark with 2 different data initialization seeds.

Alternative parameters

If not using malloc or command line arguments are not supported, the buffer size for the algorithms must be defined via the compiler define TOTAL_DATA_SIZE.  TOTAL_DATA_SIZE must be set to 2000 bytes (default) for standard runs.  The default for such a target when testing different configurations could be ...

make XCFLAGS="-DTOTAL_DATA_SIZE=6000 -DMAIN_HAS_NOARGC=1"
- -

Documentation

When you unpack the documentation (tar -vzxf coremark_<version>_docs.tgz) a docs folder will be created.  Check the file docs/html/index.html and the website http://www.coremark.org for more info.

- -

Submitting results

CoreMark results can be submitted on the web.

Open a web browser and go to http://www.coremark.org- /benchmark- /index.php?pg=benchmark Select the link to add a new score and follow the instructions.

- -

Run rules

What is and is not allowed.

Required

1The benchmark needs to run for at least 10 seconds.
2All validation must succeed for seeds 0,0,0x66 and 0x3415,0x3415,0x66, buffer size of 2000 bytes total.
  • If not using command line arguments to main:
make XCFLAGS="-DPERFORMANCE_RUN=1" REBUILD=1 run1.log
-make XCFLAGS="-DVALIDATION_RUN=1" REBUILD=1 run2.log
3If using profile guided optimization, profile must be generated using seeds of 8,8,8, and buffer size of 1200 bytes total.
make XCFLAGS="-DTOTAL_DATA_SIZE=1200 -DPROFILE_RUN=1" REBUILD=1 run3.log
4All source files must be compiled with the same flags.
5All data type sizes must match size in bits such that:
  • ee_u8 is an 8 bits datatype.
  • ee_s16 is an 16 bits datatype.
  • ee_u16 is an 16 bits datatype.
  • ee_s32 is an 32 bits datatype.
  • ee_u32 is an 32 bits datatype.

Allowed

  • Changing number of iterations
  • Changing toolchain and build/load/run options
  • Changing method of acquiring a data memory block
  • Changing the method of acquiring seed values
  • Changing implementation in core_portme.c
  • Changing configuration values in core_portme.h
  • Changing core_portme.mak

Not allowed

  • Changing of source file other then core_portme* (use make check to validate)
- -

Reporting rules

How to report results on a data sheet?

CoreMark 1.0 : N / C [/ P] [/ M]

NNumber of iterations per second with seeds 0,0,0x66,size=2000)
CCompiler version and flags
PParameters such as data and code allocation specifics
  • This parameter may be omitted if all data was allocated on the heap in RAM.
  • This parameter may not be omitted when reporting CoreMark/MHz
MType of parallel execution (if used) and number of contexts This parameter may be omitted if parallel execution was not used.

e.g.

CoreMark 1.0 : 128 / GCC 4.1.2 -O2 -fprofile-use / Heap in TCRAM / FORK:2

or

CoreMark 1.0 : 1400 / GCC 3.4 -O4

If reporting scaling results, the results must be reported as follows

CoreMark/MHz 1.0 : N / C / P [/ M]

PWhen reporting scaling results, memory parameter must also indicate memory frequency:core frequency ratio.
  • If the core has cache and cache frequency to core frequency ratio is configurable, that must also be included.

e.g.

CoreMark/MHz 1.0 : 1.47 / GCC 4.1.2 -O2 / DDR3(Heap) 30:1 Memory 1:1 Cache
- -

Log File Format

The log files have the following format

2K performance run parameters for coremark. (Run type)
-CoreMark Size       : 666                   (Buffer size)
-Total ticks         : 25875                 (platform dependent value)
-Total time (secs)   : 25.875000             (actual time in seconds)
-Iterations/Sec      : 3864.734300           (Performance value to report)
-Iterations          : 100000                (number of iterations used)
-Compiler version    : GCC3.4.4              (Compiler and version)
-Compiler flags      : -O2                   (Compiler and linker flags)
-Memory location     : Code in flash, data in on chip RAM
-seedcrc             : 0xe9f5                (identifier for the input seeds)
-[0]crclist          : 0xe714                (validation for list part)
-[0]crcmatrix        : 0x1fd7                (validation for matrix part)
-[0]crcstate         : 0x8e3a                (validation for state part)
-[0]crcfinal         : 0x33ff                (iteration dependent output)
-Correct operation validated. See README.md for run and reporting rules.  (*Only when run is successful*)
-CoreMark 1.0 : 6508.490622 / GCC3.4.4 -O2 / Heap                          (*Only on a successful performance run*)
- -

Legal

See LICENSE.txt or the word document file under docs/LICENSE.doc.  For more information on your legal rights to use this benchmark, please see http://www.coremark.org- /download- /register.php?pg=register

- -

Credits

Many thanks to all of the individuals who helped with the development or testing of CoreMark including (Sorted by company name)

  • Alan Anderson, ADI
  • Adhikary Rajiv, ADI
  • Elena Stohr, ARM
  • Ian Rickards, ARM
  • Andrew Pickard, ARM
  • Trent Parker, CAVIUM
  • Shay Gal-On, EEMBC
  • Markus Levy, EEMBC
  • Ron Olson, IBM
  • Eyal Barzilay, MIPS
  • Jens Eltze, NEC
  • Hirohiko Ono, NEC
  • Ulrich Drees, NEC
  • Frank Roscheda, NEC
  • Rob Cosaro, NXP
  • Shumpei Kawasaki, RENESAS
- -
- - - - - - - - - - -
This file contains the framework to acquire a block of memory, seed initial parameters, tun t he benchmark and report the results.
- - - - - - - - diff --git a/tests/riscv-coremark/coremark/docs/html/files/release_notes-txt.html b/tests/riscv-coremark/coremark/docs/html/files/release_notes-txt.html deleted file mode 100644 index 6658c7141..000000000 --- a/tests/riscv-coremark/coremark/docs/html/files/release_notes-txt.html +++ /dev/null @@ -1,56 +0,0 @@ - - -Release Notes - CoreMark - - - - - - - -

Release Notes

Version: 1.01

History

Version 1.01

  • Added validation testing the sizes of datatypes.

Version 1.00

  • First public version.

Validation

This release was tested on the following platforms

  • x86 cygwin and gcc 3.4 (Quad, dual and single core systems)
  • x86 linux (Ubuntu/Fedora) and gcc (4.2/4.1) (Quad and single core systems)
  • MIPS64 BE linux and gcc 3.4 16 cores system
  • MIPS32 BE linux with CodeSourcery compiler 4.2-177 on Malta/Linux with a 1004K 3-core system
  • PPC simulator with gcc 4.2.2 (No OS)
  • PPC 64b BE linux (yellowdog) with gcc 3.4 and 4.1 (Dual core system)
  • BF533 with VDSP50
  • Renesas R8C/H8 MCU with HEW 4.05
  • NXP LPC1700 armcc v4.0.0.524
  • NEC 78K with IAR v4.61
  • ARM simulator with armcc v4

Coverage

GCOV results can be found on SVN under cover.

Memory analysis

Valgrind 3.4.0 used and no errors reported.

Balance analysis

Number of instructions executed for each function tested with cachegrind and found balanced with gcc and -O0.

Statistics

Lines

Lines  Blank  Cmnts  Source     AESL
-=====  =====  =====  =====  ==========  =======================================
-  469     66    170    251       627.5  core_list_join.c  (C)
-  330     18     54    268       670.0  core_main.c  (C)
-  256     32     80    146       365.0  core_matrix.c  (C)
-  240     16     51    186       465.0  core_state.c  (C)
-  165     11     20    134       335.0  core_util.c  (C)
-  150     23     36     98       245.0  coremark.h  (C)
- 1610    166    411   1083      2707.5  ----- Benchmark -----  (6 files)
-  293     15     74    212       530.0  linux/core_portme.c  (C)
-  235     30    104    104       260.0  linux/core_portme.h  (C)
-  528     45    178    316       790.0  ----- Porting -----  (2 files)
-
-
-* For comparison, here are the stats for Dhrystone
-Lines  Blank  Cmnts  Source     AESL
-=====  =====  =====  =====  ==========  =======================================
-  311     15    242     54       135.0  dhry.h  (C)
-  789    132    119    553      1382.5  dhry_1.c  (C)
-  186     26     68    107       267.5  dhry_2.c  (C)
- 1286    173    429    714      1785.0  ----- C -----  (3 files)
- -
- - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/index.html b/tests/riscv-coremark/coremark/docs/html/index.html deleted file mode 100644 index f7a88682a..000000000 --- a/tests/riscv-coremark/coremark/docs/html/index.html +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/index/BuildTargets.html b/tests/riscv-coremark/coremark/docs/html/index/BuildTargets.html deleted file mode 100644 index 635c0ff78..000000000 --- a/tests/riscv-coremark/coremark/docs/html/index/BuildTargets.html +++ /dev/null @@ -1,31 +0,0 @@ - - -Build Target Index - CoreMark - - - - - - - -
Build Target Index
$#! · 0-9 · A · B · C · D · E · F · G · H · I · J · K · L · M · N · O · P · Q · R · S · T · U · V · W · X · Y · Z
P
 port_postbuild
 port_postload
 port_postrun
 port_prebuild
 port_preload
 port_prerun
- -
Generate any files that are needed after actual build end.
Do platform specific after load stuff.
Do platform specific after run stuff.
Generate any files that are needed before actual build starts.
Do platform specific before load stuff.
Do platform specific after run stuff.
- -
- - - - - - - - - - - - \ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/index/Configuration.html b/tests/riscv-coremark/coremark/docs/html/index/Configuration.html deleted file mode 100644 index 8e5ef3aab..000000000 --- a/tests/riscv-coremark/coremark/docs/html/index/Configuration.html +++ /dev/null @@ -1,51 +0,0 @@ - - -Configuration Index - CoreMark - - - - - - - -
Configuration Index
$#! · 0-9 · A · B · C · D · E · F · G · H · I · J · K · L · M · N · O · P · Q · R · S · T · U · V · W · X · Y · Z
C
 CORE_TICKS
H
 HAS_FLOAT
 HAS_PRINTF
 HAS_STDIO
 HAS_TIME_H
M
 MAIN_HAS_NOARGC
 MAIN_HAS_NORETURN
 MEM_METHOD
 MULTITHREAD
S
 SEED_METHOD
T
 TOTAL_DATA_SIZE
U
 USE_CLOCK
 USE_FORK
 USE_PTHREAD
 USE_SOCKET
- -
Define type of return from the timing functions.
- - - -
Define to 1 if the platform supports floating point.
Define to 1 if the platform has stdio.h and implements the printf function.
Define to 1 if the platform has stdio.h.
Define to 1 if platform has the time.h header file, and implementation of functions thereof.
- - - -
Needed if platform does not support getting arguments to main.
Needed if platform does not support returning a value from main.
Defines method to get a block of memry.
Define for parallel execution
- - - -
Defines method to get seed values that cannot be computed at compile time.
- - - -
Define total size for data algorithms will operate on
- - - -
Define to 1 if platform has the time.h header file, and implementation of functions thereof.
Sample implementation for launching parallel contexts This implementation uses fork, waitpid, shmget,shmat and shmdt.
Sample implementation for launching parallel contexts This implementation uses pthread_thread_create and pthread_join.
Sample implementation for launching parallel contexts This implementation uses fork, socket, sendto and recvfrom
- -
- - - - - - - - - - - - \ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/index/Configurations.html b/tests/riscv-coremark/coremark/docs/html/index/Configurations.html deleted file mode 100644 index 0faee64a0..000000000 --- a/tests/riscv-coremark/coremark/docs/html/index/Configurations.html +++ /dev/null @@ -1,45 +0,0 @@ - - -Configuration Index - - - - - - - - - -
Configuration Index
$#! · 0-9 · A · B · C · D · E · F · G · H · I · J · K · L · M · N · O · P · Q · R · S · T · U · V · W · X · Y · Z
H
 HAS_FLOAT
 HAS_STDIO
 HAS_TIME_H
M
 MEM_METHOD
S
 SEED_METHOD
T
 TOTAL_DATA_SIZE
- -
Define to 1 if the platform supports floating point.
Define to 1 if the platform has stdio.h and implements the printf function.
Define to 1 if platform has the time.h header file, and implementation of functions thereof.
- - - -
Defines method to get a block of memry.
- - - -
Defines method to get seed values that cannot be computed at compile time.
- - - -
Define total size for data algorithms will operate on
- -
- - - - - - - - - - - - \ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/index/Files.html b/tests/riscv-coremark/coremark/docs/html/index/Files.html deleted file mode 100644 index 7e6d2fa04..000000000 --- a/tests/riscv-coremark/coremark/docs/html/index/Files.html +++ /dev/null @@ -1,35 +0,0 @@ - - -File Index - CoreMark - - - - - - - -
File Index
$#! · 0-9 · A · B · C · D · E · F · G · H · I · J · K · L · M · N · O · P · Q · R · S · T · U · V · W · X · Y · Z
C
 core_list_join.c
 core_main.c
 core_matrix.c
 core_portme.c
 core_portme.h
 core_portme.mak
 core_state.c
 core_util.c
 CoreMark
 coremark.h
R
 Release Notes
- -
This file contains the framework to acquire a block of memory, seed initial parameters, tun t he benchmark and report the results.
- - - -
Version: 1.01
- -
- - - - - - - - - - - - \ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/index/Functions.html b/tests/riscv-coremark/coremark/docs/html/index/Functions.html deleted file mode 100644 index a249d5186..000000000 --- a/tests/riscv-coremark/coremark/docs/html/index/Functions.html +++ /dev/null @@ -1,55 +0,0 @@ - - -Function Index - CoreMark - - - - - - - -
Function Index
$#! · 0-9 · A · B · C · D · E · F · G · H · I · J · K · L · M · N · O · P · Q · R · S · T · U · V · W · X · Y · Z
C
 cmp_complex
 cmp_idx
 core_bench_matrix
 core_bench_state
 core_init_state
 core_list_find
 core_list_init
 core_list_insert
 core_list_mergesort
 core_list_remove
 core_list_reverse
 core_list_undo_remove
 core_start_parallel
 core_state_transition
 core_stop_parallel
 crc*
G
 get_seed
 get_time
I
 iterate
M
 main
 matrix_add_const
 matrix_mul_const
 matrix_mul_matrix
 matrix_mul_matrix_bitextract
 matrix_mul_vect
 matrix_sum
 matrix_test
P
 portable_fini
 portable_free
 portable_init
 portable_malloc
S
 start_time
 stop_time
T
 time_in_secs
- -
ee_s32 cmp_complex(list_data *a,
list_data *b,
core_results *res)
Compare the data item in a list cell.
ee_s32 cmp_idx(list_data *a,
list_data *b,
core_results *res)
Compare the idx item in a list cell, and regen the data.
ee_u16 core_bench_matrix(mat_params *p,
ee_s16 seed,
ee_u16 crc)
Benchmark function
ee_u16 core_bench_state(ee_u32 blksize,
ee_u8 *memblock,
ee_s16 seed1,
ee_s16 seed2,
ee_s16 step,
ee_u16 crc)
Benchmark function
void core_init_state(ee_u32 size,
ee_s16 seed,
ee_u8 *p)
Initialize the input data for the state machine.
list_head *core_list_find(list_head *list,
list_data *info)
Find an item in the list
list_head *core_list_init(ee_u32 blksize,
list_head *memblock,
ee_s16 seed)
Initialize list with data.
list_head *core_list_insert_new(list_head *insert_point,
list_data *info,
list_head **memblock,
list_data **datablock ,
list_head *memblock_end,
list_data *datablock_end)
Insert an item to the list
list_head *core_list_mergesort(list_head *list,
list_cmp cmp,
core_results *res)
Sort the list in place without recursion.
list_head *core_list_remove(list_head *item)
Remove an item from the list.
list_head *core_list_reverse(list_head *list)
Reverse a list
list_head *core_list_undo_remove(list_head *item_removed,
list_head *item_modified)
Undo a remove operation.
Start benchmarking in a parallel context.
enum CORE_STATE core_state_transition(ee_u8 **instr ,
ee_u32 *transition_count)
Actual state machine.
Stop a parallel context execution of coremark, and gather the results.
Service functions to calculate 16b CRC code.
- - - -
Get a values that cannot be determined at compile time.
CORE_TICKS get_time(void)
Return an abstract “ticks” number that signifies time on the system.
- - - -
Run the benchmark for a specified number of iterations.
- - - -
#if MAIN_HAS_NOARGC MAIN_RETURN_TYPE main(void)
Main entry routine for the benchmark.
void matrix_add_const(ee_u32 N,
MATDAT *A,
MATDAT val)
Add a constant value to all elements of a matrix.
void matrix_mul_const(ee_u32 N,
MATRES *C,
MATDAT *A,
MATDAT val)
Multiply a matrix by a constant.
void matrix_mul_matrix(ee_u32 N,
MATRES *C,
MATDAT *A,
MATDAT *B)
Multiply a matrix by a matrix.
void matrix_mul_matrix_bitextract(ee_u32 N,
MATRES *C,
MATDAT *A,
MATDAT *B)
Multiply a matrix by a matrix, and extract some bits from the result.
void matrix_mul_vect(ee_u32 N,
MATRES *C,
MATDAT *A,
MATDAT *B)
Multiply a matrix by a vector.
ee_s16 matrix_sum(ee_u32 N,
MATRES *C,
MATDAT clipval)
Calculate a function that depends on the values of elements in the matrix.
ee_s16 matrix_test(ee_u32 N,
MATRES *C,
MATDAT *A,
MATDAT *B,
MATDAT val)
Perform matrix manipulation.
- - - -
void portable_fini(core_portable *p)
Target specific final code
void portable_free(void *p)
Provide free() functionality in a platform specific way.
void portable_init(core_portable *p,
int *argc,
char *argv[])
Target specific initialization code Test for some common mistakes.
void *portable_malloc(size_t size)
Provide malloc() functionality in a platform specific way.
- - - -
void start_time(void)
This function will be called right before starting the timed portion of the benchmark.
void stop_time(void)
This function will be called right after ending the timed portion of the benchmark.
- - - -
secs_ret time_in_secs(CORE_TICKS ticks)
Convert the value returned by get_time to seconds.
- -
- - - - - - - - - - - - \ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/index/General.html b/tests/riscv-coremark/coremark/docs/html/index/General.html deleted file mode 100644 index bd47b299f..000000000 --- a/tests/riscv-coremark/coremark/docs/html/index/General.html +++ /dev/null @@ -1,75 +0,0 @@ - - -Index - CoreMark - - - - - - - -
Index
$#! · 0-9 · A · B · C · D · E · F · G · H · I · J · K · L · M · N · O · P · Q · R · S · T · U · V · W · X · Y · Z
B
 Build Targets
 Building and running
C
 CC
 CFLAGS
 cmp_complex
 cmp_idx
 Configuration
 core_bench_matrix
 core_bench_state
 core_init_state
 core_list_find
 core_list_init
 core_list_insert
 core_list_join.c
 core_list_mergesort
 core_list_remove
 core_list_reverse
 core_list_undo_remove
 core_main.c
 core_matrix.c
 core_portme.c
 core_portme.h
 core_portme.mak
 core_start_parallel
 core_state.c
 core_state_transition
 core_stop_parallel
 CORE_TICKS
 core_util.c
 CoreMark
 coremark.h
 crc*
 Credits
D
 default_num_contexts
 Description
 Documentation
F
 Functions
G
 get_seed
 get_time
H
 HAS_FLOAT
 HAS_PRINTF
 HAS_STDIO
 HAS_TIME_H
I
 iterate
L
 Legal
 LFLAGS_END
 LOAD
 Log File Format
M
 main
 MAIN_HAS_NOARGC
 MAIN_HAS_NORETURN
 matrix_add_const
 matrix_mul_const
 matrix_mul_matrix
 matrix_mul_matrix_bitextract
 matrix_mul_vect
 matrix_sum
 matrix_test
 MEM_METHOD
 MULTITHREAD
O
 OPATH
 OUTFLAG
P
 PERL
 PORT_OBJS
 port_postbuild
 port_postload
 port_postrun
 port_prebuild
 port_preload
 port_prerun
 PORT_SRCS
 portable_fini
 portable_free
 portable_init
 portable_malloc
R
 Release Notes
 Reporting rules
 RUN
 Run rules
- -
Download the release files from the www.coremark.org.
- - - -
Use this flag to define compiler to use
Use this flag to define compiler options.
ee_s32 cmp_complex(list_data *a,
list_data *b,
core_results *res)
Compare the data item in a list cell.
ee_s32 cmp_idx(list_data *a,
list_data *b,
core_results *res)
Compare the idx item in a list cell, and regen the data.
ee_u16 core_bench_matrix(mat_params *p,
ee_s16 seed,
ee_u16 crc)
Benchmark function
ee_u16 core_bench_state(ee_u32 blksize,
ee_u8 *memblock,
ee_s16 seed1,
ee_s16 seed2,
ee_s16 step,
ee_u16 crc)
Benchmark function
void core_init_state(ee_u32 size,
ee_s16 seed,
ee_u8 *p)
Initialize the input data for the state machine.
list_head *core_list_find(list_head *list,
list_data *info)
Find an item in the list
list_head *core_list_init(ee_u32 blksize,
list_head *memblock,
ee_s16 seed)
Initialize list with data.
list_head *core_list_insert_new(list_head *insert_point,
list_data *info,
list_head **memblock,
list_data **datablock ,
list_head *memblock_end,
list_data *datablock_end)
Insert an item to the list
list_head *core_list_mergesort(list_head *list,
list_cmp cmp,
core_results *res)
Sort the list in place without recursion.
list_head *core_list_remove(list_head *item)
Remove an item from the list.
list_head *core_list_reverse(list_head *list)
Reverse a list
list_head *core_list_undo_remove(list_head *item_removed,
list_head *item_modified)
Undo a remove operation.
This file contains the framework to acquire a block of memory, seed initial parameters, tun t he benchmark and report the results.
Start benchmarking in a parallel context.
enum CORE_STATE core_state_transition(ee_u8 **instr ,
ee_u32 *transition_count)
Actual state machine.
Stop a parallel context execution of coremark, and gather the results.
Define type of return from the timing functions.
Service functions to calculate 16b CRC code.
Many thanks to all of the individuals who helped with the development or testing of CoreMark including (Sorted by company name)
- - - -
extern ee_u32 default_num_contexts
Number of contexts to spawn in multicore context.
Benchmark using a linked list.
When you unpack the documentation (tar -vzxf coremark_version_docs.tgz) a docs folder will be created.
- - - - - - - -
Get a values that cannot be determined at compile time.
CORE_TICKS get_time(void)
Return an abstract “ticks” number that signifies time on the system.
- - - -
Define to 1 if the platform supports floating point.
Define to 1 if the platform has stdio.h and implements the printf function.
Define to 1 if the platform has stdio.h.
Define to 1 if platform has the time.h header file, and implementation of functions thereof.
- - - -
Run the benchmark for a specified number of iterations.
- - - -
See LICENSE.txt or the word document file under docs/LICENSE.doc.
Define any libraries needed for linking or other flags that should come at the end of the link line (e.g.
Define this flag if you need to load to a target, as in a cross compile environment.
The log files have the following format
- - - -
#if MAIN_HAS_NOARGC MAIN_RETURN_TYPE main(void)
Main entry routine for the benchmark.
Needed if platform does not support getting arguments to main.
Needed if platform does not support returning a value from main.
void matrix_add_const(ee_u32 N,
MATDAT *A,
MATDAT val)
Add a constant value to all elements of a matrix.
void matrix_mul_const(ee_u32 N,
MATRES *C,
MATDAT *A,
MATDAT val)
Multiply a matrix by a constant.
void matrix_mul_matrix(ee_u32 N,
MATRES *C,
MATDAT *A,
MATDAT *B)
Multiply a matrix by a matrix.
void matrix_mul_matrix_bitextract(ee_u32 N,
MATRES *C,
MATDAT *A,
MATDAT *B)
Multiply a matrix by a matrix, and extract some bits from the result.
void matrix_mul_vect(ee_u32 N,
MATRES *C,
MATDAT *A,
MATDAT *B)
Multiply a matrix by a vector.
ee_s16 matrix_sum(ee_u32 N,
MATRES *C,
MATDAT clipval)
Calculate a function that depends on the values of elements in the matrix.
ee_s16 matrix_test(ee_u32 N,
MATRES *C,
MATDAT *A,
MATDAT *B,
MATDAT val)
Perform matrix manipulation.
Defines method to get a block of memry.
Define for parallel execution
- - - -
Use this flag to define how to to get an executable (e.g -o)
- - - -
Define perl executable to calculate the geomean if running separate.
Port specific object files can be added here
Generate any files that are needed after actual build end.
Do platform specific after load stuff.
Do platform specific after run stuff.
Generate any files that are needed before actual build starts.
Do platform specific before load stuff.
Do platform specific after run stuff.
Port specific source files can be added here
void portable_fini(core_portable *p)
Target specific final code
void portable_free(void *p)
Provide free() functionality in a platform specific way.
void portable_init(core_portable *p,
int *argc,
char *argv[])
Target specific initialization code Test for some common mistakes.
void *portable_malloc(size_t size)
Provide malloc() functionality in a platform specific way.
- - - -
Version: 1.01
How to report results on a data sheet?
Define this flag if running does not consist of simple invocation of the binary.
What is and is not allowed.
- -
- - - - - - - - - - - - \ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/index/General2.html b/tests/riscv-coremark/coremark/docs/html/index/General2.html deleted file mode 100644 index 3852ab5aa..000000000 --- a/tests/riscv-coremark/coremark/docs/html/index/General2.html +++ /dev/null @@ -1,47 +0,0 @@ - - -Index - CoreMark - - - - - - - -
Index
$#! · 0-9 · A · B · C · D · E · F · G · H · I · J · K · L · M · N · O · P · Q · R · S · T · U · V · W · X · Y · Z
S
 secs_ret
 SEED_METHOD
 SEPARATE_COMPILE
 start_time
 stop_time
 Submitting results
T
 time_in_secs
 TIMER_RES_DIVIDER
 TOTAL_DATA_SIZE
 Types
U
 USE_CLOCK
 USE_FORK
 USE_PTHREAD
 USE_SOCKET
V
 Variables
W
 Welcome
- -
For machines that have floating point support, get number of seconds as a double.
Defines method to get seed values that cannot be computed at compile time.
Define if you need to separate compilation from link stage.
void start_time(void)
This function will be called right before starting the timed portion of the benchmark.
void stop_time(void)
This function will be called right after ending the timed portion of the benchmark.
CoreMark results can be submitted on the web.
- - - -
secs_ret time_in_secs(CORE_TICKS ticks)
Convert the value returned by get_time to seconds.
Divider to trade off timer resolution and total time that can be measured.
Define total size for data algorithms will operate on
- - - -
Define to 1 if platform has the time.h header file, and implementation of functions thereof.
Sample implementation for launching parallel contexts This implementation uses fork, waitpid, shmget,shmat and shmdt.
Sample implementation for launching parallel contexts This implementation uses pthread_thread_create and pthread_join.
Sample implementation for launching parallel contexts This implementation uses fork, socket, sendto and recvfrom
- - - - - - - -
Copyright © 2009 EEMBC All rights reserved.
- -
- - - - - - - - - - - - \ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/index/Types.html b/tests/riscv-coremark/coremark/docs/html/index/Types.html deleted file mode 100644 index 1f4413653..000000000 --- a/tests/riscv-coremark/coremark/docs/html/index/Types.html +++ /dev/null @@ -1,31 +0,0 @@ - - -Type Index - CoreMark - - - - - - - -
Type Index
$#! · 0-9 · A · B · C · D · E · F · G · H · I · J · K · L · M · N · O · P · Q · R · S · T · U · V · W · X · Y · Z
S
 secs_ret
- -
For machines that have floating point support, get number of seconds as a double.
- -
- - - - - - - - - - - - \ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/index/Variables.html b/tests/riscv-coremark/coremark/docs/html/index/Variables.html deleted file mode 100644 index 8c050daef..000000000 --- a/tests/riscv-coremark/coremark/docs/html/index/Variables.html +++ /dev/null @@ -1,55 +0,0 @@ - - -Variable Index - CoreMark - - - - - - - -
Variable Index
$#! · 0-9 · A · B · C · D · E · F · G · H · I · J · K · L · M · N · O · P · Q · R · S · T · U · V · W · X · Y · Z
C
 CC
 CFLAGS
D
 default_num_contexts
L
 LFLAGS_END
 LOAD
O
 OPATH
 OUTFLAG
P
 PERL
 PORT_OBJS
 PORT_SRCS
R
 RUN
S
 SEPARATE_COMPILE
- -
Use this flag to define compiler to use
Use this flag to define compiler options.
- - - -
extern ee_u32 default_num_contexts
Number of contexts to spawn in multicore context.
- - - -
Define any libraries needed for linking or other flags that should come at the end of the link line (e.g.
Define this flag if you need to load to a target, as in a cross compile environment.
- - - -
Use this flag to define how to to get an executable (e.g -o)
- - - -
Define perl executable to calculate the geomean if running separate.
Port specific object files can be added here
Port specific source files can be added here
- - - -
Define this flag if running does not consist of simple invocation of the binary.
- - - -
Define if you need to separate compilation from link stage.
- -
- - - - - - - - - - - - \ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/javascript/main.js b/tests/riscv-coremark/coremark/docs/html/javascript/main.js deleted file mode 100644 index 91991f507..000000000 --- a/tests/riscv-coremark/coremark/docs/html/javascript/main.js +++ /dev/null @@ -1,836 +0,0 @@ -// This file is part of Natural Docs, which is Copyright (C) 2003-2008 Greg Valure -// Natural Docs is licensed under the GPL - - -// -// Browser Styles -// ____________________________________________________________________________ - -var agt=navigator.userAgent.toLowerCase(); -var browserType; -var browserVer; - -if (agt.indexOf("opera") != -1) - { - browserType = "Opera"; - - if (agt.indexOf("opera 7") != -1 || agt.indexOf("opera/7") != -1) - { browserVer = "Opera7"; } - else if (agt.indexOf("opera 8") != -1 || agt.indexOf("opera/8") != -1) - { browserVer = "Opera8"; } - else if (agt.indexOf("opera 9") != -1 || agt.indexOf("opera/9") != -1) - { browserVer = "Opera9"; } - } - -else if (agt.indexOf("applewebkit") != -1) - { - browserType = "Safari"; - - if (agt.indexOf("version/3") != -1) - { browserVer = "Safari3"; } - else if (agt.indexOf("safari/4") != -1) - { browserVer = "Safari2"; } - } - -else if (agt.indexOf("khtml") != -1) - { - browserType = "Konqueror"; - } - -else if (agt.indexOf("msie") != -1) - { - browserType = "IE"; - - if (agt.indexOf("msie 6") != -1) - { browserVer = "IE6"; } - else if (agt.indexOf("msie 7") != -1) - { browserVer = "IE7"; } - } - -else if (agt.indexOf("gecko") != -1) - { - browserType = "Firefox"; - - if (agt.indexOf("rv:1.7") != -1) - { browserVer = "Firefox1"; } - else if (agt.indexOf("rv:1.8)") != -1 || agt.indexOf("rv:1.8.0") != -1) - { browserVer = "Firefox15"; } - else if (agt.indexOf("rv:1.8.1") != -1) - { browserVer = "Firefox2"; } - } - - -// -// Support Functions -// ____________________________________________________________________________ - - -function GetXPosition(item) - { - var position = 0; - - if (item.offsetWidth != null) - { - while (item != document.body && item != null) - { - position += item.offsetLeft; - item = item.offsetParent; - }; - }; - - return position; - }; - - -function GetYPosition(item) - { - var position = 0; - - if (item.offsetWidth != null) - { - while (item != document.body && item != null) - { - position += item.offsetTop; - item = item.offsetParent; - }; - }; - - return position; - }; - - -function MoveToPosition(item, x, y) - { - // Opera 5 chokes on the px extension, so it can use the Microsoft one instead. - - if (item.style.left != null) - { - item.style.left = x + "px"; - item.style.top = y + "px"; - } - else if (item.style.pixelLeft != null) - { - item.style.pixelLeft = x; - item.style.pixelTop = y; - }; - }; - - -// -// Menu -// ____________________________________________________________________________ - - -function ToggleMenu(id) - { - if (!window.document.getElementById) - { return; }; - - var display = window.document.getElementById(id).style.display; - - if (display == "none") - { display = "block"; } - else - { display = "none"; } - - window.document.getElementById(id).style.display = display; - } - -function HideAllBut(ids, max) - { - if (document.getElementById) - { - ids.sort( function(a,b) { return a - b; } ); - var number = 1; - - while (number < max) - { - if (ids.length > 0 && number == ids[0]) - { ids.shift(); } - else - { - document.getElementById("MGroupContent" + number).style.display = "none"; - }; - - number++; - }; - }; - } - - -// -// Tooltips -// ____________________________________________________________________________ - - -var tooltipTimer = 0; - -function ShowTip(event, tooltipID, linkID) - { - if (tooltipTimer) - { clearTimeout(tooltipTimer); }; - - var docX = event.clientX + window.pageXOffset; - var docY = event.clientY + window.pageYOffset; - - var showCommand = "ReallyShowTip('" + tooltipID + "', '" + linkID + "', " + docX + ", " + docY + ")"; - - tooltipTimer = setTimeout(showCommand, 1000); - } - -function ReallyShowTip(tooltipID, linkID, docX, docY) - { - tooltipTimer = 0; - - var tooltip; - var link; - - if (document.getElementById) - { - tooltip = document.getElementById(tooltipID); - link = document.getElementById(linkID); - } -/* else if (document.all) - { - tooltip = eval("document.all['" + tooltipID + "']"); - link = eval("document.all['" + linkID + "']"); - } -*/ - if (tooltip) - { - var left = GetXPosition(link); - var top = GetYPosition(link); - top += link.offsetHeight; - - - // The fallback method is to use the mouse X and Y relative to the document. We use a separate if and test if its a number - // in case some browser snuck through the above if statement but didn't support everything. - - if (!isFinite(top) || top == 0) - { - left = docX; - top = docY; - } - - // Some spacing to get it out from under the cursor. - - top += 10; - - // Make sure the tooltip doesnt get smushed by being too close to the edge, or in some browsers, go off the edge of the - // page. We do it here because Konqueror does get offsetWidth right even if it doesnt get the positioning right. - - if (tooltip.offsetWidth != null) - { - var width = tooltip.offsetWidth; - var docWidth = document.body.clientWidth; - - if (left + width > docWidth) - { left = docWidth - width - 1; } - - // If there's a horizontal scroll bar we could go past zero because it's using the page width, not the window width. - if (left < 0) - { left = 0; }; - } - - MoveToPosition(tooltip, left, top); - tooltip.style.visibility = "visible"; - } - } - -function HideTip(tooltipID) - { - if (tooltipTimer) - { - clearTimeout(tooltipTimer); - tooltipTimer = 0; - } - - var tooltip; - - if (document.getElementById) - { tooltip = document.getElementById(tooltipID); } - else if (document.all) - { tooltip = eval("document.all['" + tooltipID + "']"); } - - if (tooltip) - { tooltip.style.visibility = "hidden"; } - } - - -// -// Blockquote fix for IE -// ____________________________________________________________________________ - - -function NDOnLoad() - { - if (browserVer == "IE6") - { - var scrollboxes = document.getElementsByTagName('blockquote'); - - if (scrollboxes.item(0)) - { - NDDoResize(); - window.onresize=NDOnResize; - }; - }; - }; - - -var resizeTimer = 0; - -function NDOnResize() - { - if (resizeTimer != 0) - { clearTimeout(resizeTimer); }; - - resizeTimer = setTimeout(NDDoResize, 250); - }; - - -function NDDoResize() - { - var scrollboxes = document.getElementsByTagName('blockquote'); - - var i; - var item; - - i = 0; - while (item = scrollboxes.item(i)) - { - item.style.width = 100; - i++; - }; - - i = 0; - while (item = scrollboxes.item(i)) - { - item.style.width = item.parentNode.offsetWidth; - i++; - }; - - clearTimeout(resizeTimer); - resizeTimer = 0; - } - - - -/* ________________________________________________________________________________________________________ - - Class: SearchPanel - ________________________________________________________________________________________________________ - - A class handling everything associated with the search panel. - - Parameters: - - name - The name of the global variable that will be storing this instance. Is needed to be able to set timeouts. - mode - The mode the search is going to work in. Pass CommandLineOption()>, so the - value will be something like "HTML" or "FramedHTML". - - ________________________________________________________________________________________________________ -*/ - - -function SearchPanel(name, mode, resultsPath) - { - if (!name || !mode || !resultsPath) - { alert("Incorrect parameters to SearchPanel."); }; - - - // Group: Variables - // ________________________________________________________________________ - - /* - var: name - The name of the global variable that will be storing this instance of the class. - */ - this.name = name; - - /* - var: mode - The mode the search is going to work in, such as "HTML" or "FramedHTML". - */ - this.mode = mode; - - /* - var: resultsPath - The relative path from the current HTML page to the results page directory. - */ - this.resultsPath = resultsPath; - - /* - var: keyTimeout - The timeout used between a keystroke and when a search is performed. - */ - this.keyTimeout = 0; - - /* - var: keyTimeoutLength - The length of in thousandths of a second. - */ - this.keyTimeoutLength = 500; - - /* - var: lastSearchValue - The last search string executed, or an empty string if none. - */ - this.lastSearchValue = ""; - - /* - var: lastResultsPage - The last results page. The value is only relevant if is set. - */ - this.lastResultsPage = ""; - - /* - var: deactivateTimeout - - The timeout used between when a control is deactivated and when the entire panel is deactivated. Is necessary - because a control may be deactivated in favor of another control in the same panel, in which case it should stay - active. - */ - this.deactivateTimout = 0; - - /* - var: deactivateTimeoutLength - The length of in thousandths of a second. - */ - this.deactivateTimeoutLength = 200; - - - - - // Group: DOM Elements - // ________________________________________________________________________ - - - // Function: DOMSearchField - this.DOMSearchField = function() - { return document.getElementById("MSearchField"); }; - - // Function: DOMSearchType - this.DOMSearchType = function() - { return document.getElementById("MSearchType"); }; - - // Function: DOMPopupSearchResults - this.DOMPopupSearchResults = function() - { return document.getElementById("MSearchResults"); }; - - // Function: DOMPopupSearchResultsWindow - this.DOMPopupSearchResultsWindow = function() - { return document.getElementById("MSearchResultsWindow"); }; - - // Function: DOMSearchPanel - this.DOMSearchPanel = function() - { return document.getElementById("MSearchPanel"); }; - - - - - // Group: Event Handlers - // ________________________________________________________________________ - - - /* - Function: OnSearchFieldFocus - Called when focus is added or removed from the search field. - */ - this.OnSearchFieldFocus = function(isActive) - { - this.Activate(isActive); - }; - - - /* - Function: OnSearchFieldChange - Called when the content of the search field is changed. - */ - this.OnSearchFieldChange = function() - { - if (this.keyTimeout) - { - clearTimeout(this.keyTimeout); - this.keyTimeout = 0; - }; - - var searchValue = this.DOMSearchField().value.replace(/ +/g, ""); - - if (searchValue != this.lastSearchValue) - { - if (searchValue != "") - { - this.keyTimeout = setTimeout(this.name + ".Search()", this.keyTimeoutLength); - } - else - { - if (this.mode == "HTML") - { this.DOMPopupSearchResultsWindow().style.display = "none"; }; - this.lastSearchValue = ""; - }; - }; - }; - - - /* - Function: OnSearchTypeFocus - Called when focus is added or removed from the search type. - */ - this.OnSearchTypeFocus = function(isActive) - { - this.Activate(isActive); - }; - - - /* - Function: OnSearchTypeChange - Called when the search type is changed. - */ - this.OnSearchTypeChange = function() - { - var searchValue = this.DOMSearchField().value.replace(/ +/g, ""); - - if (searchValue != "") - { - this.Search(); - }; - }; - - - - // Group: Action Functions - // ________________________________________________________________________ - - - /* - Function: CloseResultsWindow - Closes the results window. - */ - this.CloseResultsWindow = function() - { - this.DOMPopupSearchResultsWindow().style.display = "none"; - this.Activate(false, true); - }; - - - /* - Function: Search - Performs a search. - */ - this.Search = function() - { - this.keyTimeout = 0; - - var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); - var searchTopic = this.DOMSearchType().value; - - var pageExtension = searchValue.substr(0,1); - - if (pageExtension.match(/^[a-z]/i)) - { pageExtension = pageExtension.toUpperCase(); } - else if (pageExtension.match(/^[0-9]/)) - { pageExtension = 'Numbers'; } - else - { pageExtension = "Symbols"; }; - - var resultsPage; - var resultsPageWithSearch; - var hasResultsPage; - - // indexSectionsWithContent is defined in searchdata.js - if (indexSectionsWithContent[searchTopic][pageExtension] == true) - { - resultsPage = this.resultsPath + '/' + searchTopic + pageExtension + '.html'; - resultsPageWithSearch = resultsPage+'?'+escape(searchValue); - hasResultsPage = true; - } - else - { - resultsPage = this.resultsPath + '/NoResults.html'; - resultsPageWithSearch = resultsPage; - hasResultsPage = false; - }; - - var resultsFrame; - if (this.mode == "HTML") - { resultsFrame = window.frames.MSearchResults; } - else if (this.mode == "FramedHTML") - { resultsFrame = window.top.frames['Content']; }; - - - if (resultsPage != this.lastResultsPage || - - // Bug in IE. If everything becomes hidden in a run, none of them will be able to be reshown in the next for some - // reason. It counts the right number of results, and you can even read the display as "block" after setting it, but it - // just doesn't work in IE 6 or IE 7. So if we're on the right page but the previous search had no results, reload the - // page anyway to get around the bug. - (browserType == "IE" && hasResultsPage && - (!resultsFrame.searchResults || resultsFrame.searchResults.lastMatchCount == 0)) ) - - { - resultsFrame.location.href = resultsPageWithSearch; - } - - // So if the results page is right and there's no IE bug, reperform the search on the existing page. We have to check if there - // are results because NoResults.html doesn't have any JavaScript, and it would be useless to do anything on that page even - // if it did. - else if (hasResultsPage) - { - // We need to check if this exists in case the frame is present but didn't finish loading. - if (resultsFrame.searchResults) - { resultsFrame.searchResults.Search(searchValue); } - - // Otherwise just reload instead of waiting. - else - { resultsFrame.location.href = resultsPageWithSearch; }; - }; - - - var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); - - if (this.mode == "HTML" && domPopupSearchResultsWindow.style.display != "block") - { - var domSearchType = this.DOMSearchType(); - - var left = GetXPosition(domSearchType); - var top = GetYPosition(domSearchType) + domSearchType.offsetHeight; - - MoveToPosition(domPopupSearchResultsWindow, left, top); - domPopupSearchResultsWindow.style.display = 'block'; - }; - - - this.lastSearchValue = searchValue; - this.lastResultsPage = resultsPage; - }; - - - - // Group: Activation Functions - // Functions that handle whether the entire panel is active or not. - // ________________________________________________________________________ - - - /* - Function: Activate - - Activates or deactivates the search panel, resetting things to their default values if necessary. You can call this on every - control's OnBlur() and it will handle not deactivating the entire panel when focus is just switching between them transparently. - - Parameters: - - isActive - Whether you're activating or deactivating the panel. - ignoreDeactivateDelay - Set if you're positive the action will deactivate the panel and thus want to skip the delay. - */ - this.Activate = function(isActive, ignoreDeactivateDelay) - { - // We want to ignore isActive being false while the results window is open. - if (isActive || (this.mode == "HTML" && this.DOMPopupSearchResultsWindow().style.display == "block")) - { - if (this.inactivateTimeout) - { - clearTimeout(this.inactivateTimeout); - this.inactivateTimeout = 0; - }; - - this.DOMSearchPanel().className = 'MSearchPanelActive'; - - var searchField = this.DOMSearchField(); - - if (searchField.value == 'Search') - { searchField.value = ""; } - } - else if (!ignoreDeactivateDelay) - { - this.inactivateTimeout = setTimeout(this.name + ".InactivateAfterTimeout()", this.inactivateTimeoutLength); - } - else - { - this.InactivateAfterTimeout(); - }; - }; - - - /* - Function: InactivateAfterTimeout - - Called by , which is set by . Inactivation occurs on a timeout because a control may - receive OnBlur() when focus is really transferring to another control in the search panel. In this case we don't want to - actually deactivate the panel because not only would that cause a visible flicker but it could also reset the search value. - So by doing it on a timeout instead, there's a short period where the second control's OnFocus() can cancel the deactivation. - */ - this.InactivateAfterTimeout = function() - { - this.inactivateTimeout = 0; - - this.DOMSearchPanel().className = 'MSearchPanelInactive'; - this.DOMSearchField().value = "Search"; - - this.lastSearchValue = ""; - this.lastResultsPage = ""; - }; - }; - - - - -/* ________________________________________________________________________________________________________ - - Class: SearchResults - _________________________________________________________________________________________________________ - - The class that handles everything on the search results page. - _________________________________________________________________________________________________________ -*/ - - -function SearchResults(name, mode) - { - /* - var: mode - The mode the search is going to work in, such as "HTML" or "FramedHTML". - */ - this.mode = mode; - - /* - var: lastMatchCount - The number of matches from the last run of . - */ - this.lastMatchCount = 0; - - - /* - Function: Toggle - Toggles the visibility of the passed element ID. - */ - this.Toggle = function(id) - { - if (this.mode == "FramedHTML") - { return; }; - - var parentElement = document.getElementById(id); - - var element = parentElement.firstChild; - - while (element && element != parentElement) - { - if (element.nodeName == 'DIV' && element.className == 'ISubIndex') - { - if (element.style.display == 'block') - { element.style.display = "none"; } - else - { element.style.display = 'block'; } - }; - - if (element.nodeName == 'DIV' && element.hasChildNodes()) - { element = element.firstChild; } - else if (element.nextSibling) - { element = element.nextSibling; } - else - { - do - { - element = element.parentNode; - } - while (element && element != parentElement && !element.nextSibling); - - if (element && element != parentElement) - { element = element.nextSibling; }; - }; - }; - }; - - - /* - Function: Search - - Searches for the passed string. If there is no parameter, it takes it from the URL query. - - Always returns true, since other documents may try to call it and that may or may not be possible. - */ - this.Search = function(search) - { - if (!search) - { - search = window.location.search; - search = search.substring(1); // Remove the leading ? - search = unescape(search); - }; - - search = search.replace(/^ +/, ""); - search = search.replace(/ +$/, ""); - search = search.toLowerCase(); - - if (search.match(/[^a-z0-9]/)) // Just a little speedup so it doesn't have to go through the below unnecessarily. - { - search = search.replace(/\_/g, "_und"); - search = search.replace(/\ +/gi, "_spc"); - search = search.replace(/\~/g, "_til"); - search = search.replace(/\!/g, "_exc"); - search = search.replace(/\@/g, "_att"); - search = search.replace(/\#/g, "_num"); - search = search.replace(/\$/g, "_dol"); - search = search.replace(/\%/g, "_pct"); - search = search.replace(/\^/g, "_car"); - search = search.replace(/\&/g, "_amp"); - search = search.replace(/\*/g, "_ast"); - search = search.replace(/\(/g, "_lpa"); - search = search.replace(/\)/g, "_rpa"); - search = search.replace(/\-/g, "_min"); - search = search.replace(/\+/g, "_plu"); - search = search.replace(/\=/g, "_equ"); - search = search.replace(/\{/g, "_lbc"); - search = search.replace(/\}/g, "_rbc"); - search = search.replace(/\[/g, "_lbk"); - search = search.replace(/\]/g, "_rbk"); - search = search.replace(/\:/g, "_col"); - search = search.replace(/\;/g, "_sco"); - search = search.replace(/\"/g, "_quo"); - search = search.replace(/\'/g, "_apo"); - search = search.replace(/\/g, "_ran"); - search = search.replace(/\,/g, "_com"); - search = search.replace(/\./g, "_per"); - search = search.replace(/\?/g, "_que"); - search = search.replace(/\//g, "_sla"); - search = search.replace(/[^a-z0-9\_]i/gi, "_zzz"); - }; - - var resultRows = document.getElementsByTagName("div"); - var matches = 0; - - var i = 0; - while (i < resultRows.length) - { - var row = resultRows.item(i); - - if (row.className == "SRResult") - { - var rowMatchName = row.id.toLowerCase(); - rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); - - if (search.length <= rowMatchName.length && rowMatchName.substr(0, search.length) == search) - { - row.style.display = "block"; - matches++; - } - else - { row.style.display = "none"; }; - }; - - i++; - }; - - document.getElementById("Searching").style.display="none"; - - if (matches == 0) - { document.getElementById("NoMatches").style.display="block"; } - else - { document.getElementById("NoMatches").style.display="none"; } - - this.lastMatchCount = matches; - - return true; - }; - }; - diff --git a/tests/riscv-coremark/coremark/docs/html/javascript/searchdata.js b/tests/riscv-coremark/coremark/docs/html/javascript/searchdata.js deleted file mode 100644 index 901318e77..000000000 --- a/tests/riscv-coremark/coremark/docs/html/javascript/searchdata.js +++ /dev/null @@ -1,212 +0,0 @@ -var indexSectionsWithContent = { - "General": { - "Symbols": false, - "Numbers": false, - "A": false, - "B": false, - "C": true, - "D": true, - "E": false, - "F": true, - "G": true, - "H": false, - "I": true, - "J": false, - "K": false, - "L": false, - "M": true, - "N": false, - "O": false, - "P": false, - "Q": false, - "R": false, - "S": true, - "T": true, - "U": false, - "V": false, - "W": false, - "X": false, - "Y": false, - "Z": false - }, - "Variables": { - "Symbols": false, - "Numbers": false, - "A": false, - "B": false, - "C": true, - "D": true, - "E": false, - "F": false, - "G": false, - "H": false, - "I": false, - "J": false, - "K": false, - "L": true, - "M": false, - "N": false, - "O": true, - "P": true, - "Q": false, - "R": true, - "S": true, - "T": false, - "U": false, - "V": false, - "W": false, - "X": false, - "Y": false, - "Z": false - }, - "Functions": { - "Symbols": false, - "Numbers": false, - "A": false, - "B": false, - "C": true, - "D": false, - "E": false, - "F": false, - "G": true, - "H": false, - "I": true, - "J": false, - "K": false, - "L": false, - "M": true, - "N": false, - "O": false, - "P": true, - "Q": false, - "R": false, - "S": true, - "T": true, - "U": false, - "V": false, - "W": false, - "X": false, - "Y": false, - "Z": false - }, - "Files": { - "Symbols": false, - "Numbers": false, - "A": false, - "B": false, - "C": true, - "D": false, - "E": false, - "F": false, - "G": false, - "H": false, - "I": false, - "J": false, - "K": false, - "L": false, - "M": false, - "N": false, - "O": false, - "P": false, - "Q": false, - "R": true, - "S": false, - "T": false, - "U": false, - "V": false, - "W": false, - "X": false, - "Y": false, - "Z": false - }, - "Configuration": { - "Symbols": false, - "Numbers": false, - "A": false, - "B": false, - "C": true, - "D": false, - "E": false, - "F": false, - "G": false, - "H": true, - "I": false, - "J": false, - "K": false, - "L": false, - "M": true, - "N": false, - "O": false, - "P": false, - "Q": false, - "R": false, - "S": true, - "T": true, - "U": true, - "V": false, - "W": false, - "X": false, - "Y": false, - "Z": false - }, - "Types": { - "Symbols": false, - "Numbers": false, - "A": false, - "B": false, - "C": false, - "D": false, - "E": false, - "F": false, - "G": false, - "H": false, - "I": false, - "J": false, - "K": false, - "L": false, - "M": false, - "N": false, - "O": false, - "P": false, - "Q": false, - "R": false, - "S": true, - "T": false, - "U": false, - "V": false, - "W": false, - "X": false, - "Y": false, - "Z": false - }, - "BuildTargets": { - "Symbols": false, - "Numbers": false, - "A": false, - "B": false, - "C": false, - "D": false, - "E": false, - "F": false, - "G": false, - "H": false, - "I": false, - "J": false, - "K": false, - "L": false, - "M": false, - "N": false, - "O": false, - "P": true, - "Q": false, - "R": false, - "S": false, - "T": false, - "U": false, - "V": false, - "W": false, - "X": false, - "Y": false, - "Z": false - } - } \ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/BuildTargetsP.html b/tests/riscv-coremark/coremark/docs/html/search/BuildTargetsP.html deleted file mode 100644 index 65e741d65..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/BuildTargetsP.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/ConfigurationC.html b/tests/riscv-coremark/coremark/docs/html/search/ConfigurationC.html deleted file mode 100644 index 84b49ca3a..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/ConfigurationC.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/ConfigurationH.html b/tests/riscv-coremark/coremark/docs/html/search/ConfigurationH.html deleted file mode 100644 index 3b0c39213..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/ConfigurationH.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/ConfigurationM.html b/tests/riscv-coremark/coremark/docs/html/search/ConfigurationM.html deleted file mode 100644 index 022606fa2..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/ConfigurationM.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/ConfigurationS.html b/tests/riscv-coremark/coremark/docs/html/search/ConfigurationS.html deleted file mode 100644 index d26de19b9..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/ConfigurationS.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/ConfigurationT.html b/tests/riscv-coremark/coremark/docs/html/search/ConfigurationT.html deleted file mode 100644 index 183daf1ee..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/ConfigurationT.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/ConfigurationU.html b/tests/riscv-coremark/coremark/docs/html/search/ConfigurationU.html deleted file mode 100644 index d9b46a52d..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/ConfigurationU.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/ConfigurationsH.html b/tests/riscv-coremark/coremark/docs/html/search/ConfigurationsH.html deleted file mode 100644 index ade2ab757..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/ConfigurationsH.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/ConfigurationsM.html b/tests/riscv-coremark/coremark/docs/html/search/ConfigurationsM.html deleted file mode 100644 index baa189221..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/ConfigurationsM.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/ConfigurationsS.html b/tests/riscv-coremark/coremark/docs/html/search/ConfigurationsS.html deleted file mode 100644 index ceb8abf51..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/ConfigurationsS.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/ConfigurationsT.html b/tests/riscv-coremark/coremark/docs/html/search/ConfigurationsT.html deleted file mode 100644 index ef138108f..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/ConfigurationsT.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/FilesC.html b/tests/riscv-coremark/coremark/docs/html/search/FilesC.html deleted file mode 100644 index e2b01c4b1..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/FilesC.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/FilesR.html b/tests/riscv-coremark/coremark/docs/html/search/FilesR.html deleted file mode 100644 index 6202fb7c7..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/FilesR.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/FunctionsC.html b/tests/riscv-coremark/coremark/docs/html/search/FunctionsC.html deleted file mode 100644 index 43993db85..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/FunctionsC.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/FunctionsG.html b/tests/riscv-coremark/coremark/docs/html/search/FunctionsG.html deleted file mode 100644 index 217e8540b..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/FunctionsG.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/FunctionsI.html b/tests/riscv-coremark/coremark/docs/html/search/FunctionsI.html deleted file mode 100644 index f17354d65..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/FunctionsI.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/FunctionsM.html b/tests/riscv-coremark/coremark/docs/html/search/FunctionsM.html deleted file mode 100644 index 345e2ba83..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/FunctionsM.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/FunctionsP.html b/tests/riscv-coremark/coremark/docs/html/search/FunctionsP.html deleted file mode 100644 index c4b9d2dbe..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/FunctionsP.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/FunctionsS.html b/tests/riscv-coremark/coremark/docs/html/search/FunctionsS.html deleted file mode 100644 index 33dfa5fa4..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/FunctionsS.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/FunctionsT.html b/tests/riscv-coremark/coremark/docs/html/search/FunctionsT.html deleted file mode 100644 index 65ae37ccd..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/FunctionsT.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/GeneralB.html b/tests/riscv-coremark/coremark/docs/html/search/GeneralB.html deleted file mode 100644 index 66e27e49b..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/GeneralB.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/GeneralC.html b/tests/riscv-coremark/coremark/docs/html/search/GeneralC.html deleted file mode 100644 index f1ac9d2d3..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/GeneralC.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/GeneralD.html b/tests/riscv-coremark/coremark/docs/html/search/GeneralD.html deleted file mode 100644 index b3c21002d..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/GeneralD.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/GeneralF.html b/tests/riscv-coremark/coremark/docs/html/search/GeneralF.html deleted file mode 100644 index 126a24c57..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/GeneralF.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/GeneralG.html b/tests/riscv-coremark/coremark/docs/html/search/GeneralG.html deleted file mode 100644 index 217e8540b..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/GeneralG.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/GeneralH.html b/tests/riscv-coremark/coremark/docs/html/search/GeneralH.html deleted file mode 100644 index 3b0c39213..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/GeneralH.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/GeneralI.html b/tests/riscv-coremark/coremark/docs/html/search/GeneralI.html deleted file mode 100644 index f17354d65..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/GeneralI.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/GeneralL.html b/tests/riscv-coremark/coremark/docs/html/search/GeneralL.html deleted file mode 100644 index 22a700c93..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/GeneralL.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/GeneralM.html b/tests/riscv-coremark/coremark/docs/html/search/GeneralM.html deleted file mode 100644 index 57f55b249..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/GeneralM.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/GeneralO.html b/tests/riscv-coremark/coremark/docs/html/search/GeneralO.html deleted file mode 100644 index b14f18001..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/GeneralO.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/GeneralP.html b/tests/riscv-coremark/coremark/docs/html/search/GeneralP.html deleted file mode 100644 index 063a6c13e..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/GeneralP.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/GeneralR.html b/tests/riscv-coremark/coremark/docs/html/search/GeneralR.html deleted file mode 100644 index 24f33954e..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/GeneralR.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/GeneralS.html b/tests/riscv-coremark/coremark/docs/html/search/GeneralS.html deleted file mode 100644 index a18c40715..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/GeneralS.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/GeneralT.html b/tests/riscv-coremark/coremark/docs/html/search/GeneralT.html deleted file mode 100644 index a2fde7e28..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/GeneralT.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/GeneralU.html b/tests/riscv-coremark/coremark/docs/html/search/GeneralU.html deleted file mode 100644 index d9b46a52d..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/GeneralU.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/GeneralV.html b/tests/riscv-coremark/coremark/docs/html/search/GeneralV.html deleted file mode 100644 index 9c53066a5..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/GeneralV.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/GeneralW.html b/tests/riscv-coremark/coremark/docs/html/search/GeneralW.html deleted file mode 100644 index e22dcb062..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/GeneralW.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/NoResults.html b/tests/riscv-coremark/coremark/docs/html/search/NoResults.html deleted file mode 100644 index 49e385959..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/NoResults.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - -
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/TypesS.html b/tests/riscv-coremark/coremark/docs/html/search/TypesS.html deleted file mode 100644 index 3d87649f5..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/TypesS.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/VariablesC.html b/tests/riscv-coremark/coremark/docs/html/search/VariablesC.html deleted file mode 100644 index d3bdfef76..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/VariablesC.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/VariablesD.html b/tests/riscv-coremark/coremark/docs/html/search/VariablesD.html deleted file mode 100644 index d4b961d3c..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/VariablesD.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/VariablesL.html b/tests/riscv-coremark/coremark/docs/html/search/VariablesL.html deleted file mode 100644 index 09e4b9abc..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/VariablesL.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/VariablesO.html b/tests/riscv-coremark/coremark/docs/html/search/VariablesO.html deleted file mode 100644 index b14f18001..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/VariablesO.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/VariablesP.html b/tests/riscv-coremark/coremark/docs/html/search/VariablesP.html deleted file mode 100644 index c687999aa..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/VariablesP.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/VariablesR.html b/tests/riscv-coremark/coremark/docs/html/search/VariablesR.html deleted file mode 100644 index 9cd771d25..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/VariablesR.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/VariablesS.html b/tests/riscv-coremark/coremark/docs/html/search/VariablesS.html deleted file mode 100644 index a1280a7d0..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/VariablesS.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/styles/1.css b/tests/riscv-coremark/coremark/docs/html/styles/1.css deleted file mode 100644 index d5a8bd6a2..000000000 --- a/tests/riscv-coremark/coremark/docs/html/styles/1.css +++ /dev/null @@ -1,767 +0,0 @@ -/* - IMPORTANT: If you're editing this file in the output directory of one of - your projects, your changes will be overwritten the next time you run - Natural Docs. Instead, copy this file to your project directory, make your - changes, and you can use it with -s. Even better would be to make a CSS - file in your project directory with only your changes, which you can then - use with -s [original style] [your changes]. - - On the other hand, if you're editing this file in the Natural Docs styles - directory, the changes will automatically be applied to all your projects - that use this style the next time Natural Docs is run on them. - - This file is part of Natural Docs, which is Copyright (C) 2003-2008 Greg Valure - Natural Docs is licensed under the GPL -*/ - -body { - font: 10pt Verdana, Arial, sans-serif; - color: #000000; - margin: 0; padding: 0; - } - -.ContentPage, -.IndexPage, -.FramedMenuPage { - background-color: #E8E8E8; - } -.FramedContentPage, -.FramedIndexPage, -.FramedSearchResultsPage, -.PopupSearchResultsPage { - background-color: #FFFFFF; - } - - -a:link, -a:visited { color: #900000; text-decoration: none } -a:hover { color: #900000; text-decoration: underline } -a:active { color: #FF0000; text-decoration: underline } - -td { - vertical-align: top } - -img { border: 0; } - - -/* - Comment out this line to use web-style paragraphs (blank line between - paragraphs, no indent) instead of print-style paragraphs (no blank line, - indented.) -*/ -p { - text-indent: 5ex; margin: 0 } - - -/* Can't use something like display: none or it won't break. */ -.HB { - font-size: 1px; - visibility: hidden; - } - -/* Blockquotes are used as containers for things that may need to scroll. */ -blockquote { - padding: 0; - margin: 0; - overflow: auto; - } - - -.Firefox1 blockquote { - padding-bottom: .5em; - } - -/* Turn off scrolling when printing. */ -@media print { - blockquote { - overflow: visible; - } - .IE blockquote { - width: auto; - } - } - - - -#Menu { - font-size: 9pt; - padding: 10px 0 0 0; - } -.ContentPage #Menu, -.IndexPage #Menu { - position: absolute; - top: 0; - left: 0; - width: 31ex; - overflow: hidden; - } -.ContentPage .Firefox #Menu, -.IndexPage .Firefox #Menu { - width: 27ex; - } - - - .MTitle { - font-size: 16pt; font-weight: bold; font-variant: small-caps; - text-align: center; - padding: 5px 10px 15px 10px; - border-bottom: 1px dotted #000000; - margin-bottom: 15px } - - .MSubTitle { - font-size: 9pt; font-weight: normal; font-variant: normal; - margin-top: 1ex; margin-bottom: 5px } - - - .MEntry a:link, - .MEntry a:hover, - .MEntry a:visited { color: #606060; margin-right: 0 } - .MEntry a:active { color: #A00000; margin-right: 0 } - - - .MGroup { - font-variant: small-caps; font-weight: bold; - margin: 1em 0 1em 10px; - } - - .MGroupContent { - font-variant: normal; font-weight: normal } - - .MGroup a:link, - .MGroup a:hover, - .MGroup a:visited { color: #545454; margin-right: 10px } - .MGroup a:active { color: #A00000; margin-right: 10px } - - - .MFile, - .MText, - .MLink, - .MIndex { - padding: 1px 17px 2px 10px; - margin: .25em 0 .25em 0; - } - - .MText { - font-size: 8pt; font-style: italic } - - .MLink { - font-style: italic } - - #MSelected { - color: #000000; background-color: #FFFFFF; - /* Replace padding with border. */ - padding: 0 10px 0 10px; - border-width: 1px 2px 2px 0; border-style: solid; border-color: #000000; - margin-right: 5px; - } - - /* Close off the left side when its in a group. */ - .MGroup #MSelected { - padding-left: 9px; border-left-width: 1px } - - /* A treat for Mozilla users. Blatantly non-standard. Will be replaced with CSS 3 attributes when finalized/supported. */ - .Firefox #MSelected { - -moz-border-radius-topright: 10px; - -moz-border-radius-bottomright: 10px } - .Firefox .MGroup #MSelected { - -moz-border-radius-topleft: 10px; - -moz-border-radius-bottomleft: 10px } - - - #MSearchPanel { - padding: 0px 6px; - margin: .25em 0; - } - - - #MSearchField { - font: italic 9pt Verdana, sans-serif; - color: #606060; - background-color: #E8E8E8; - border: none; - padding: 2px 4px; - width: 100%; - } - /* Only Opera gets it right. */ - .Firefox #MSearchField, - .IE #MSearchField, - .Safari #MSearchField { - width: 94%; - } - .Opera9 #MSearchField, - .Konqueror #MSearchField { - width: 97%; - } - .FramedMenuPage .Firefox #MSearchField, - .FramedMenuPage .Safari #MSearchField, - .FramedMenuPage .Konqueror #MSearchField { - width: 98%; - } - - /* Firefox doesn't do this right in frames without #MSearchPanel added on. - It's presence doesn't hurt anything other browsers. */ - #MSearchPanel.MSearchPanelInactive:hover #MSearchField { - background-color: #FFFFFF; - border: 1px solid #C0C0C0; - padding: 1px 3px; - } - .MSearchPanelActive #MSearchField { - background-color: #FFFFFF; - border: 1px solid #C0C0C0; - font-style: normal; - padding: 1px 3px; - } - - #MSearchType { - visibility: hidden; - font: 8pt Verdana, sans-serif; - width: 98%; - padding: 0; - border: 1px solid #C0C0C0; - } - .MSearchPanelActive #MSearchType, - /* As mentioned above, Firefox doesn't do this right in frames without #MSearchPanel added on. */ - #MSearchPanel.MSearchPanelInactive:hover #MSearchType, - #MSearchType:focus { - visibility: visible; - color: #606060; - } - #MSearchType option#MSearchEverything { - font-weight: bold; - } - - .Opera8 .MSearchPanelInactive:hover, - .Opera8 .MSearchPanelActive { - margin-left: -1px; - } - - - iframe#MSearchResults { - width: 60ex; - height: 15em; - } - #MSearchResultsWindow { - display: none; - position: absolute; - left: 0; top: 0; - border: 1px solid #000000; - background-color: #E8E8E8; - } - #MSearchResultsWindowClose { - font-weight: bold; - font-size: 8pt; - display: block; - padding: 2px 5px; - } - #MSearchResultsWindowClose:link, - #MSearchResultsWindowClose:visited { - color: #000000; - text-decoration: none; - } - #MSearchResultsWindowClose:active, - #MSearchResultsWindowClose:hover { - color: #800000; - text-decoration: none; - background-color: #F4F4F4; - } - - - - -#Content { - padding-bottom: 15px; - } - -.ContentPage #Content { - border-width: 0 0 1px 1px; - border-style: solid; - border-color: #000000; - background-color: #FFFFFF; - font-size: 9pt; /* To make 31ex match the menu's 31ex. */ - margin-left: 31ex; - } -.ContentPage .Firefox #Content { - margin-left: 27ex; - } - - - - .CTopic { - font-size: 10pt; - margin-bottom: 3em; - } - - - .CTitle { - font-size: 12pt; font-weight: bold; - border-width: 0 0 1px 0; border-style: solid; border-color: #A0A0A0; - margin: 0 15px .5em 15px } - - .CGroup .CTitle { - font-size: 16pt; font-variant: small-caps; - padding-left: 15px; padding-right: 15px; - border-width: 0 0 2px 0; border-color: #000000; - margin-left: 0; margin-right: 0 } - - .CClass .CTitle, - .CInterface .CTitle, - .CDatabase .CTitle, - .CDatabaseTable .CTitle, - .CSection .CTitle { - font-size: 18pt; - color: #FFFFFF; background-color: #A0A0A0; - padding: 10px 15px 10px 15px; - border-width: 2px 0; border-color: #000000; - margin-left: 0; margin-right: 0 } - - #MainTopic .CTitle { - font-size: 20pt; - color: #FFFFFF; background-color: #7070C0; - padding: 10px 15px 10px 15px; - border-width: 0 0 3px 0; border-color: #000000; - margin-left: 0; margin-right: 0 } - - .CBody { - margin-left: 15px; margin-right: 15px } - - - .CToolTip { - position: absolute; visibility: hidden; - left: 0; top: 0; - background-color: #FFFFE0; - padding: 5px; - border-width: 1px 2px 2px 1px; border-style: solid; border-color: #000000; - font-size: 8pt; - } - - .Opera .CToolTip { - max-width: 98%; - } - - /* Scrollbars would be useless. */ - .CToolTip blockquote { - overflow: hidden; - } - .IE6 .CToolTip blockquote { - overflow: visible; - } - - .CHeading { - font-weight: bold; font-size: 10pt; - margin: 1.5em 0 .5em 0; - } - - .CBody pre { - font: 10pt "Courier New", Courier, monospace; - margin: 1em 0; - } - - .CBody ul { - /* I don't know why CBody's margin doesn't apply, but it's consistent across browsers so whatever. - Reapply it here as padding. */ - padding-left: 15px; padding-right: 15px; - margin: .5em 5ex .5em 5ex; - } - - .CDescriptionList { - margin: .5em 5ex 0 5ex } - - .CDLEntry { - font: 10pt "Courier New", Courier, monospace; color: #808080; - padding-bottom: .25em; - white-space: nowrap } - - .CDLDescription { - font-size: 10pt; /* For browsers that don't inherit correctly, like Opera 5. */ - padding-bottom: .5em; padding-left: 5ex } - - - .CTopic img { - text-align: center; - display: block; - margin: 1em auto; - } - .CImageCaption { - font-variant: small-caps; - font-size: 8pt; - color: #808080; - text-align: center; - position: relative; - top: 1em; - } - - .CImageLink { - color: #808080; - font-style: italic; - } - a.CImageLink:link, - a.CImageLink:visited, - a.CImageLink:hover { color: #808080 } - - - - - -.Prototype { - font: 10pt "Courier New", Courier, monospace; - padding: 5px 3ex; - border-width: 1px; border-style: solid; - margin: 0 5ex 1.5em 5ex; - } - - .Prototype td { - font-size: 10pt; - } - - .PDefaultValue, - .PDefaultValuePrefix, - .PTypePrefix { - color: #8F8F8F; - } - .PTypePrefix { - text-align: right; - } - .PAfterParameters { - vertical-align: bottom; - } - - .IE .Prototype table { - padding: 0; - } - - .CFunction .Prototype { - background-color: #F4F4F4; border-color: #D0D0D0 } - .CProperty .Prototype { - background-color: #F4F4FF; border-color: #C0C0E8 } - .CVariable .Prototype { - background-color: #FFFFF0; border-color: #E0E0A0 } - - .CClass .Prototype { - border-width: 1px 2px 2px 1px; border-style: solid; border-color: #A0A0A0; - background-color: #F4F4F4; - } - .CInterface .Prototype { - border-width: 1px 2px 2px 1px; border-style: solid; border-color: #A0A0D0; - background-color: #F4F4FF; - } - - .CDatabaseIndex .Prototype, - .CConstant .Prototype { - background-color: #D0D0D0; border-color: #000000 } - .CType .Prototype, - .CEnumeration .Prototype { - background-color: #FAF0F0; border-color: #E0B0B0; - } - .CDatabaseTrigger .Prototype, - .CEvent .Prototype, - .CDelegate .Prototype { - background-color: #F0FCF0; border-color: #B8E4B8 } - - .CToolTip .Prototype { - margin: 0 0 .5em 0; - white-space: nowrap; - } - - - - - -.Summary { - margin: 1.5em 5ex 0 5ex } - - .STitle { - font-size: 12pt; font-weight: bold; - margin-bottom: .5em } - - - .SBorder { - background-color: #FFFFF0; - padding: 15px; - border: 1px solid #C0C060 } - - /* In a frame IE 6 will make them too long unless you set the width to 100%. Without frames it will be correct without a width - or slightly too long (but not enough to scroll) with a width. This arbitrary weirdness simply astounds me. IE 7 has the same - problem with frames, haven't tested it without. */ - .FramedContentPage .IE .SBorder { - width: 100% } - - /* A treat for Mozilla users. Blatantly non-standard. Will be replaced with CSS 3 attributes when finalized/supported. */ - .Firefox .SBorder { - -moz-border-radius: 20px } - - - .STable { - font-size: 9pt; width: 100% } - - .SEntry { - width: 30% } - .SDescription { - width: 70% } - - - .SMarked { - background-color: #F8F8D8 } - - .SDescription { padding-left: 2ex } - .SIndent1 .SEntry { padding-left: 1.5ex } .SIndent1 .SDescription { padding-left: 3.5ex } - .SIndent2 .SEntry { padding-left: 3.0ex } .SIndent2 .SDescription { padding-left: 5.0ex } - .SIndent3 .SEntry { padding-left: 4.5ex } .SIndent3 .SDescription { padding-left: 6.5ex } - .SIndent4 .SEntry { padding-left: 6.0ex } .SIndent4 .SDescription { padding-left: 8.0ex } - .SIndent5 .SEntry { padding-left: 7.5ex } .SIndent5 .SDescription { padding-left: 9.5ex } - - .SDescription a { color: #800000} - .SDescription a:active { color: #A00000 } - - .SGroup td { - padding-top: .5em; padding-bottom: .25em } - - .SGroup .SEntry { - font-weight: bold; font-variant: small-caps } - - .SGroup .SEntry a { color: #800000 } - .SGroup .SEntry a:active { color: #F00000 } - - - .SMain td, - .SClass td, - .SDatabase td, - .SDatabaseTable td, - .SSection td { - font-size: 10pt; - padding-bottom: .25em } - - .SClass td, - .SDatabase td, - .SDatabaseTable td, - .SSection td { - padding-top: 1em } - - .SMain .SEntry, - .SClass .SEntry, - .SDatabase .SEntry, - .SDatabaseTable .SEntry, - .SSection .SEntry { - font-weight: bold; - } - - .SMain .SEntry a, - .SClass .SEntry a, - .SDatabase .SEntry a, - .SDatabaseTable .SEntry a, - .SSection .SEntry a { color: #000000 } - - .SMain .SEntry a:active, - .SClass .SEntry a:active, - .SDatabase .SEntry a:active, - .SDatabaseTable .SEntry a:active, - .SSection .SEntry a:active { color: #A00000 } - - - - - -.ClassHierarchy { - margin: 0 15px 1em 15px } - - .CHEntry { - border-width: 1px 2px 2px 1px; border-style: solid; border-color: #A0A0A0; - margin-bottom: 3px; - padding: 2px 2ex; - font-size: 10pt; - background-color: #F4F4F4; color: #606060; - } - - .Firefox .CHEntry { - -moz-border-radius: 4px; - } - - .CHCurrent .CHEntry { - font-weight: bold; - border-color: #000000; - color: #000000; - } - - .CHChildNote .CHEntry { - font-style: italic; - font-size: 8pt; - } - - .CHIndent { - margin-left: 3ex; - } - - .CHEntry a:link, - .CHEntry a:visited, - .CHEntry a:hover { - color: #606060; - } - .CHEntry a:active { - color: #800000; - } - - - - - -#Index { - background-color: #FFFFFF; - } - -/* As opposed to .PopupSearchResultsPage #Index */ -.IndexPage #Index, -.FramedIndexPage #Index, -.FramedSearchResultsPage #Index { - padding: 15px; - } - -.IndexPage #Index { - border-width: 0 0 1px 1px; - border-style: solid; - border-color: #000000; - font-size: 9pt; /* To make 27ex match the menu's 27ex. */ - margin-left: 27ex; - } - - - .IPageTitle { - font-size: 20pt; font-weight: bold; - color: #FFFFFF; background-color: #7070C0; - padding: 10px 15px 10px 15px; - border-width: 0 0 3px 0; border-color: #000000; border-style: solid; - margin: -15px -15px 0 -15px } - - .FramedSearchResultsPage .IPageTitle { - margin-bottom: 15px; - } - - .INavigationBar { - font-size: 10pt; - text-align: center; - background-color: #FFFFF0; - padding: 5px; - border-bottom: solid 1px black; - margin: 0 -15px 15px -15px; - } - - .INavigationBar a { - font-weight: bold } - - .IHeading { - font-size: 16pt; font-weight: bold; - padding: 2.5em 0 .5em 0; - text-align: center; - width: 3.5ex; - } - #IFirstHeading { - padding-top: 0; - } - - .IEntry { - font-size: 10pt; - padding-left: 1ex; - } - .PopupSearchResultsPage .IEntry { - font-size: 8pt; - padding: 1px 5px; - } - .PopupSearchResultsPage .Opera9 .IEntry, - .FramedSearchResultsPage .Opera9 .IEntry { - text-align: left; - } - .FramedSearchResultsPage .IEntry { - padding: 0; - } - - .ISubIndex { - padding-left: 3ex; padding-bottom: .5em } - .PopupSearchResultsPage .ISubIndex { - display: none; - } - - /* While it may cause some entries to look like links when they aren't, I found it's much easier to read the - index if everything's the same color. */ - .ISymbol { - font-weight: bold; color: #900000 } - - .IndexPage .ISymbolPrefix, - .FramedIndexPage .ISymbolPrefix { - font-size: 10pt; - text-align: right; - color: #C47C7C; - background-color: #F8F8F8; - border-right: 3px solid #E0E0E0; - border-left: 1px solid #E0E0E0; - padding: 0 1px 0 2px; - } - .PopupSearchResultsPage .ISymbolPrefix, - .FramedSearchResultsPage .ISymbolPrefix { - color: #900000; - } - .PopupSearchResultsPage .ISymbolPrefix { - font-size: 8pt; - } - - .IndexPage #IFirstSymbolPrefix, - .FramedIndexPage #IFirstSymbolPrefix { - border-top: 1px solid #E0E0E0; - } - .IndexPage #ILastSymbolPrefix, - .FramedIndexPage #ILastSymbolPrefix { - border-bottom: 1px solid #E0E0E0; - } - .IndexPage #IOnlySymbolPrefix, - .FramedIndexPage #IOnlySymbolPrefix { - border-top: 1px solid #E0E0E0; - border-bottom: 1px solid #E0E0E0; - } - - a.IParent, - a.IFile { - display: block; - } - - .PopupSearchResultsPage .SRStatus { - padding: 2px 5px; - font-size: 8pt; - font-style: italic; - } - .FramedSearchResultsPage .SRStatus { - font-size: 10pt; - font-style: italic; - } - - .SRResult { - display: none; - } - - - -#Footer { - font-size: 8pt; - color: #989898; - text-align: right; - } - -#Footer p { - text-indent: 0; - margin-bottom: .5em; - } - -.ContentPage #Footer, -.IndexPage #Footer { - text-align: right; - margin: 2px; - } - -.FramedMenuPage #Footer { - text-align: center; - margin: 5em 10px 10px 10px; - padding-top: 1em; - border-top: 1px solid #C8C8C8; - } - - #Footer a:link, - #Footer a:hover, - #Footer a:visited { color: #989898 } - #Footer a:active { color: #A00000 } - diff --git a/tests/riscv-coremark/coremark/docs/html/styles/2.css b/tests/riscv-coremark/coremark/docs/html/styles/2.css deleted file mode 100644 index 69a1d1a7a..000000000 --- a/tests/riscv-coremark/coremark/docs/html/styles/2.css +++ /dev/null @@ -1,6 +0,0 @@ -#Menu { - padding: 48px 0 0 0; - background: url(file:../../coremark_logo.jpg) no-repeat; - background-position: 30px 10px; - } - diff --git a/tests/riscv-coremark/coremark/docs/html/styles/main.css b/tests/riscv-coremark/coremark/docs/html/styles/main.css deleted file mode 100644 index a672a9492..000000000 --- a/tests/riscv-coremark/coremark/docs/html/styles/main.css +++ /dev/null @@ -1,2 +0,0 @@ -@import URL("1.css"); -@import URL("2.css"); diff --git a/tests/riscv-coremark/coremark/freebsd/core_portme.mak b/tests/riscv-coremark/coremark/freebsd/core_portme.mak deleted file mode 100644 index 97b6d6ace..000000000 --- a/tests/riscv-coremark/coremark/freebsd/core_portme.mak +++ /dev/null @@ -1,17 +0,0 @@ -# Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# Original Author: Shay Gal-on - -include posix/core_portme.mak diff --git a/tests/riscv-coremark/coremark/linux/core_portme.c b/tests/riscv-coremark/coremark/linux/core_portme.c deleted file mode 100755 index 6b63610d1..000000000 --- a/tests/riscv-coremark/coremark/linux/core_portme.c +++ /dev/null @@ -1,338 +0,0 @@ -/* -Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Original Author: Shay Gal-on -*/ - -#include -#include -#include "coremark.h" -#if CALLGRIND_RUN -#include -#endif - -#if (MEM_METHOD==MEM_MALLOC) -#include -/* Function: portable_malloc - Provide malloc() functionality in a platform specific way. -*/ -void *portable_malloc(size_t size) { - return malloc(size); -} -/* Function: portable_free - Provide free() functionality in a platform specific way. -*/ -void portable_free(void *p) { - free(p); -} -#else -void *portable_malloc(size_t size) { - return NULL; -} -void portable_free(void *p) { - p=NULL; -} -#endif - -#if (SEED_METHOD==SEED_VOLATILE) -#if VALIDATION_RUN - volatile ee_s32 seed1_volatile=0x3415; - volatile ee_s32 seed2_volatile=0x3415; - volatile ee_s32 seed3_volatile=0x66; -#endif -#if PERFORMANCE_RUN - volatile ee_s32 seed1_volatile=0x0; - volatile ee_s32 seed2_volatile=0x0; - volatile ee_s32 seed3_volatile=0x66; -#endif -#if PROFILE_RUN - volatile ee_s32 seed1_volatile=0x8; - volatile ee_s32 seed2_volatile=0x8; - volatile ee_s32 seed3_volatile=0x8; -#endif - volatile ee_s32 seed4_volatile=ITERATIONS; - volatile ee_s32 seed5_volatile=0; -#endif -/* Porting: Timing functions - How to capture time and convert to seconds must be ported to whatever is supported by the platform. - e.g. Read value from on board RTC, read value from cpu clock cycles performance counter etc. - Sample implementation for standard time.h and windows.h definitions included. -*/ -/* Define: TIMER_RES_DIVIDER - Divider to trade off timer resolution and total time that can be measured. - - Use lower values to increase resolution, but make sure that overflow does not occur. - If there are issues with the return value overflowing, increase this value. - */ -#if USE_CLOCK - #define NSECS_PER_SEC CLOCKS_PER_SEC - #define EE_TIMER_TICKER_RATE 1000 - #define CORETIMETYPE clock_t - #define GETMYTIME(_t) (*_t=clock()) - #define MYTIMEDIFF(fin,ini) ((fin)-(ini)) - #define TIMER_RES_DIVIDER 1 - #define SAMPLE_TIME_IMPLEMENTATION 1 -#elif defined(_MSC_VER) - #define NSECS_PER_SEC 10000000 - #define EE_TIMER_TICKER_RATE 1000 - #define CORETIMETYPE FILETIME - #define GETMYTIME(_t) GetSystemTimeAsFileTime(_t) - #define MYTIMEDIFF(fin,ini) (((*(__int64*)&fin)-(*(__int64*)&ini))/TIMER_RES_DIVIDER) - /* setting to millisces resolution by default with MSDEV */ - #ifndef TIMER_RES_DIVIDER - #define TIMER_RES_DIVIDER 1000 - #endif - #define SAMPLE_TIME_IMPLEMENTATION 1 -#elif HAS_TIME_H - #define NSECS_PER_SEC 1000000000 - #define EE_TIMER_TICKER_RATE 1000 - #define CORETIMETYPE struct timespec - #define GETMYTIME(_t) clock_gettime(CLOCK_REALTIME,_t) - #define MYTIMEDIFF(fin,ini) ((fin.tv_sec-ini.tv_sec)*(NSECS_PER_SEC/TIMER_RES_DIVIDER)+(fin.tv_nsec-ini.tv_nsec)/TIMER_RES_DIVIDER) - /* setting to 1/1000 of a second resolution by default with linux */ - #ifndef TIMER_RES_DIVIDER - #define TIMER_RES_DIVIDER 1000000 - #endif - #define SAMPLE_TIME_IMPLEMENTATION 1 -#else - #define SAMPLE_TIME_IMPLEMENTATION 0 -#endif -#define EE_TICKS_PER_SEC (NSECS_PER_SEC / TIMER_RES_DIVIDER) - -#if SAMPLE_TIME_IMPLEMENTATION -/** Define Host specific (POSIX), or target specific global time variables. */ -static CORETIMETYPE start_time_val, stop_time_val; - -/* Function: start_time - This function will be called right before starting the timed portion of the benchmark. - - Implementation may be capturing a system timer (as implemented in the example code) - or zeroing some system parameters - e.g. setting the cpu clocks cycles to 0. -*/ -void start_time(void) { - GETMYTIME(&start_time_val ); -#if CALLGRIND_RUN - CALLGRIND_START_INSTRUMENTATION -#endif -#if MICA - asm volatile("int3");/*1 */ -#endif -} -/* Function: stop_time - This function will be called right after ending the timed portion of the benchmark. - - Implementation may be capturing a system timer (as implemented in the example code) - or other system parameters - e.g. reading the current value of cpu cycles counter. -*/ -void stop_time(void) { -#if CALLGRIND_RUN - CALLGRIND_STOP_INSTRUMENTATION -#endif -#if MICA - asm volatile("int3");/*1 */ -#endif - GETMYTIME(&stop_time_val ); -} -/* Function: get_time - Return an abstract "ticks" number that signifies time on the system. - - Actual value returned may be cpu cycles, milliseconds or any other value, - as long as it can be converted to seconds by . - This methodology is taken to accomodate any hardware or simulated platform. - The sample implementation returns millisecs by default, - and the resolution is controlled by -*/ -CORE_TICKS get_time(void) { - CORE_TICKS elapsed=(CORE_TICKS)(MYTIMEDIFF(stop_time_val, start_time_val)); - return elapsed; -} -/* Function: time_in_secs - Convert the value returned by get_time to seconds. - - The type is used to accomodate systems with no support for floating point. - Default implementation implemented by the EE_TICKS_PER_SEC macro above. -*/ -secs_ret time_in_secs(CORE_TICKS ticks) { - secs_ret retval=((secs_ret)ticks) / (secs_ret)EE_TICKS_PER_SEC; - return retval; -} -#else -#error "Please implement timing functionality in core_portme.c" -#endif /* SAMPLE_TIME_IMPLEMENTATION */ - -ee_u32 default_num_contexts=MULTITHREAD; - -/* Function: portable_init - Target specific initialization code - Test for some common mistakes. -*/ -void portable_init(core_portable *p, int *argc, char *argv[]) -{ -#if PRINT_ARGS - int i; - for (i=0; i<*argc; i++) { - ee_printf("Arg[%d]=%s\n",i,argv[i]); - } -#endif - if (sizeof(ee_ptr_int) != sizeof(ee_u8 *)) { - ee_printf("ERROR! Please define ee_ptr_int to a type that holds a pointer!\n"); - } - if (sizeof(ee_u32) != 4) { - ee_printf("ERROR! Please define ee_u32 to a 32b unsigned type!\n"); - } -#if (MAIN_HAS_NOARGC && (SEED_METHOD==SEED_ARG)) - ee_printf("ERROR! Main has no argc, but SEED_METHOD defined to SEED_ARG!\n"); -#endif - -#if (MULTITHREAD>1) && (SEED_METHOD==SEED_ARG) - { - int nargs=*argc,i; - if ((nargs>1) && (*argv[1]=='M')) { - default_num_contexts=parseval(argv[1]+1); - if (default_num_contexts>MULTITHREAD) - default_num_contexts=MULTITHREAD; - /* Shift args since first arg is directed to the portable part and not to coremark main */ - --nargs; - for (i=1; i*/ - p->portable_id=1; -} -/* Function: portable_fini - Target specific final code -*/ -void portable_fini(core_portable *p) -{ - p->portable_id=0; -} - -#if (MULTITHREAD>1) - -/* Function: core_start_parallel - Start benchmarking in a parallel context. - - Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets. - Other implementations using MCAPI or other standards can easily be devised. -*/ -/* Function: core_stop_parallel - Stop a parallel context execution of coremark, and gather the results. - - Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets. - Other implementations using MCAPI or other standards can easily be devised. -*/ -#if USE_PTHREAD -ee_u8 core_start_parallel(core_results *res) { - return (ee_u8)pthread_create(&(res->port.thread),NULL,iterate,(void *)res); -} -ee_u8 core_stop_parallel(core_results *res) { - void *retval; - return (ee_u8)pthread_join(res->port.thread,&retval); -} -#elif USE_FORK -static int key_id=0; -ee_u8 core_start_parallel(core_results *res) { - key_t key=4321+key_id; - key_id++; - res->port.pid=fork(); - res->port.shmid=shmget(key, 8, IPC_CREAT | 0666); - if (res->port.shmid<0) { - ee_printf("ERROR in shmget!\n"); - } - if (res->port.pid==0) { - iterate(res); - res->port.shm=shmat(res->port.shmid, NULL, 0); - /* copy the validation values to the shared memory area and quit*/ - if (res->port.shm == (char *) -1) { - ee_printf("ERROR in child shmat!\n"); - } else { - memcpy(res->port.shm,&(res->crc),8); - shmdt(res->port.shm); - } - exit(0); - } - return 1; -} -ee_u8 core_stop_parallel(core_results *res) { - int status; - pid_t wpid = waitpid(res->port.pid,&status,WUNTRACED); - if (wpid != res->port.pid) { - ee_printf("ERROR waiting for child.\n"); - if (errno == ECHILD) ee_printf("errno=No such child %d\n",res->port.pid); - if (errno == EINTR) ee_printf("errno=Interrupted\n"); - return 0; - } - /* after process is done, get the values from the shared memory area */ - res->port.shm=shmat(res->port.shmid, NULL, 0); - if (res->port.shm == (char *) -1) { - ee_printf("ERROR in parent shmat!\n"); - return 0; - } - memcpy(&(res->crc),res->port.shm,8); - shmdt(res->port.shm); - return 1; -} -#elif USE_SOCKET -static int key_id=0; -ee_u8 core_start_parallel(core_results *res) { - int bound, buffer_length=8; - res->port.sa.sin_family = AF_INET; - res->port.sa.sin_addr.s_addr = htonl(0x7F000001); - res->port.sa.sin_port = htons(7654+key_id); - key_id++; - res->port.pid=fork(); - if (res->port.pid==0) { /* benchmark child */ - iterate(res); - res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); - if (-1 == res->port.sock) /* if socket failed to initialize, exit */ { - ee_printf("Error Creating Socket"); - } else { - int bytes_sent = sendto(res->port.sock, &(res->crc), buffer_length, 0,(struct sockaddr*)&(res->port.sa), sizeof (struct sockaddr_in)); - if (bytes_sent < 0) - ee_printf("Error sending packet: %s\n", strerror(errno)); - close(res->port.sock); /* close the socket */ - } - exit(0); - } - /* parent process, open the socket */ - res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); - bound = bind(res->port.sock,(struct sockaddr*)&(res->port.sa), sizeof(struct sockaddr)); - if (bound < 0) - ee_printf("bind(): %s\n",strerror(errno)); - return 1; -} -ee_u8 core_stop_parallel(core_results *res) { - int status; - int fromlen=sizeof(struct sockaddr); - int recsize = recvfrom(res->port.sock, &(res->crc), 8, 0, (struct sockaddr*)&(res->port.sa), &fromlen); - if (recsize < 0) { - ee_printf("Error in receive: %s\n", strerror(errno)); - return 0; - } - pid_t wpid = waitpid(res->port.pid,&status,WUNTRACED); - if (wpid != res->port.pid) { - ee_printf("ERROR waiting for child.\n"); - if (errno == ECHILD) ee_printf("errno=No such child %d\n",res->port.pid); - if (errno == EINTR) ee_printf("errno=Interrupted\n"); - return 0; - } - return 1; -} -#else /* no standard multicore implementation */ -#error "Please implement multicore functionality in core_portme.c to use multiple contexts." -#endif /* multithread implementations */ -#endif diff --git a/tests/riscv-coremark/coremark/linux/core_portme.h b/tests/riscv-coremark/coremark/linux/core_portme.h deleted file mode 100755 index 2cf4659a4..000000000 --- a/tests/riscv-coremark/coremark/linux/core_portme.h +++ /dev/null @@ -1,290 +0,0 @@ -/* -Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Original Author: Shay Gal-on -*/ - -#ifndef CORE_PORTME_H -#define CORE_PORTME_H -/************************/ -/* Data types and settings */ -/************************/ -/* Configuration: HAS_FLOAT - Define to 1 if the platform supports floating point. -*/ -#ifndef HAS_FLOAT -#define HAS_FLOAT 1 -#endif -/* Configuration: HAS_TIME_H - Define to 1 if platform has the time.h header file, - and implementation of functions thereof. -*/ -#ifndef HAS_TIME_H -#define HAS_TIME_H 1 -#endif -/* Configuration: USE_CLOCK - Define to 1 if platform has the time.h header file, - and implementation of functions thereof. -*/ -#ifndef USE_CLOCK -#define USE_CLOCK 0 -#endif -/* Configuration: HAS_STDIO - Define to 1 if the platform has stdio.h. -*/ -#ifndef HAS_STDIO -#define HAS_STDIO 1 -#endif -/* Configuration: HAS_PRINTF - Define to 1 if the platform has stdio.h and implements the printf function. -*/ -#ifndef HAS_PRINTF -#define HAS_PRINTF 1 -#endif - -/* Configuration: CORE_TICKS - Define type of return from the timing functions. - */ -#if defined(_MSC_VER) -#include -typedef size_t CORE_TICKS; -#elif HAS_TIME_H -#include -typedef clock_t CORE_TICKS; -#else -#error "Please define type of CORE_TICKS and implement start_time, end_time get_time and time_in_secs functions!" -#endif - -/* Definitions: COMPILER_VERSION, COMPILER_FLAGS, MEM_LOCATION - Initialize these strings per platform -*/ -#ifndef COMPILER_VERSION - #ifdef __GNUC__ - #define COMPILER_VERSION "GCC"__VERSION__ - #else - #define COMPILER_VERSION "Please put compiler version here (e.g. gcc 4.1)" - #endif -#endif -#ifndef COMPILER_FLAGS - #define COMPILER_FLAGS FLAGS_STR /* "Please put compiler flags here (e.g. -o3)" */ -#endif -#ifndef MEM_LOCATION - #define MEM_LOCATION "Please put data memory location here\n\t\t\t(e.g. code in flash, data on heap etc)" - #define MEM_LOCATION_UNSPEC 1 -#endif - -/* Data Types: - To avoid compiler issues, define the data types that need ot be used for 8b, 16b and 32b in . - - *Imprtant*: - ee_ptr_int needs to be the data type used to hold pointers, otherwise coremark may fail!!! -*/ -typedef signed short ee_s16; -typedef unsigned short ee_u16; -typedef signed int ee_s32; -typedef double ee_f32; -typedef unsigned char ee_u8; -typedef unsigned int ee_u32; -typedef ee_u32 ee_ptr_int; -typedef size_t ee_size_t; -/* align_mem: - This macro is used to align an offset to point to a 32b value. It is used in the Matrix algorithm to initialize the input memory blocks. -*/ -#define align_mem(x) (void *)(4 + (((ee_ptr_int)(x) - 1) & ~3)) - -/* Configuration: SEED_METHOD - Defines method to get seed values that cannot be computed at compile time. - - Valid values: - SEED_ARG - from command line. - SEED_FUNC - from a system function. - SEED_VOLATILE - from volatile variables. -*/ -#ifndef SEED_METHOD -#define SEED_METHOD SEED_ARG -#endif - -/* Configuration: MEM_METHOD - Defines method to get a block of memry. - - Valid values: - MEM_MALLOC - for platforms that implement malloc and have malloc.h. - MEM_STATIC - to use a static memory array. - MEM_STACK - to allocate the data block on the stack (NYI). -*/ -#ifndef MEM_METHOD -#define MEM_METHOD MEM_MALLOC -#endif - -/* Configuration: MULTITHREAD - Define for parallel execution - - Valid values: - 1 - only one context (default). - N>1 - will execute N copies in parallel. - - Note: - If this flag is defined to more then 1, an implementation for launching parallel contexts must be defined. - - Two sample implementations are provided. Use or to enable them. - - It is valid to have a different implementation of and in , - to fit a particular architecture. -*/ -#ifndef MULTITHREAD -#define MULTITHREAD 1 -#endif - -/* Configuration: USE_PTHREAD - Sample implementation for launching parallel contexts - This implementation uses pthread_thread_create and pthread_join. - - Valid values: - 0 - Do not use pthreads API. - 1 - Use pthreads API - - Note: - This flag only matters if MULTITHREAD has been defined to a value greater then 1. -*/ -#ifndef USE_PTHREAD -#define USE_PTHREAD 0 -#endif - -/* Configuration: USE_FORK - Sample implementation for launching parallel contexts - This implementation uses fork, waitpid, shmget,shmat and shmdt. - - Valid values: - 0 - Do not use fork API. - 1 - Use fork API - - Note: - This flag only matters if MULTITHREAD has been defined to a value greater then 1. -*/ -#ifndef USE_FORK -#define USE_FORK 0 -#endif - -/* Configuration: USE_SOCKET - Sample implementation for launching parallel contexts - This implementation uses fork, socket, sendto and recvfrom - - Valid values: - 0 - Do not use fork and sockets API. - 1 - Use fork and sockets API - - Note: - This flag only matters if MULTITHREAD has been defined to a value greater then 1. -*/ -#ifndef USE_SOCKET -#define USE_SOCKET 0 -#endif - -/* Configuration: MAIN_HAS_NOARGC - Needed if platform does not support getting arguments to main. - - Valid values: - 0 - argc/argv to main is supported - 1 - argc/argv to main is not supported -*/ -#ifndef MAIN_HAS_NOARGC -#define MAIN_HAS_NOARGC 0 -#endif - -/* Configuration: MAIN_HAS_NORETURN - Needed if platform does not support returning a value from main. - - Valid values: - 0 - main returns an int, and return value will be 0. - 1 - platform does not support returning a value from main -*/ -#ifndef MAIN_HAS_NORETURN -#define MAIN_HAS_NORETURN 0 -#endif - -/* Variable: default_num_contexts - Number of contexts to spawn in multicore context. - Override this global value to change number of contexts used. - - Note: - This value may not be set higher then the define. - - To experiment, you can set the define to the highest value expected, and use argc/argv in the to set this value from the command line. -*/ -extern ee_u32 default_num_contexts; - -#if (MULTITHREAD>1) -#if USE_PTHREAD - #include - #define PARALLEL_METHOD "PThreads" -#elif USE_FORK - #include - #include - #include - #include - #include /* for memcpy */ - #define PARALLEL_METHOD "Fork" -#elif USE_SOCKET - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #define PARALLEL_METHOD "Sockets" -#else - #define PARALLEL_METHOD "Proprietary" - #error "Please implement multicore functionality in core_portme.c to use multiple contexts." -#endif /* Method for multithreading */ -#endif /* MULTITHREAD > 1 */ - -typedef struct CORE_PORTABLE_S { -#if (MULTITHREAD>1) - #if USE_PTHREAD - pthread_t thread; - #elif USE_FORK - pid_t pid; - int shmid; - void *shm; - #elif USE_SOCKET - pid_t pid; - int sock; - struct sockaddr_in sa; - #endif /* Method for multithreading */ -#endif /* MULTITHREAD>1 */ - ee_u8 portable_id; -} core_portable; - -/* target specific init/fini */ -void portable_init(core_portable *p, int *argc, char *argv[]); -void portable_fini(core_portable *p); - -#if (SEED_METHOD==SEED_VOLATILE) - #if (VALIDATION_RUN || PERFORMANCE_RUN || PROFILE_RUN) - #define RUN_TYPE_FLAG 1 - #else - #if (TOTAL_DATA_SIZE==1200) - #define PROFILE_RUN 1 - #else - #define PERFORMANCE_RUN 1 - #endif - #endif -#endif /* SEED_METHOD==SEED_VOLATILE */ - -#endif /* CORE_PORTME_H */ diff --git a/tests/riscv-coremark/coremark/linux/core_portme.mak b/tests/riscv-coremark/coremark/linux/core_portme.mak deleted file mode 100644 index 97b6d6ace..000000000 --- a/tests/riscv-coremark/coremark/linux/core_portme.mak +++ /dev/null @@ -1,17 +0,0 @@ -# Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# Original Author: Shay Gal-on - -include posix/core_portme.mak diff --git a/tests/riscv-coremark/coremark/linux64/core_portme.c b/tests/riscv-coremark/coremark/linux64/core_portme.c deleted file mode 100755 index fe8d29983..000000000 --- a/tests/riscv-coremark/coremark/linux64/core_portme.c +++ /dev/null @@ -1,336 +0,0 @@ -/* -Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Original Author: Shay Gal-on -*/ - -#include -#include -#include "coremark.h" -#if CALLGRIND_RUN -#include -#endif - -#if (MEM_METHOD==MEM_MALLOC) -#include -/* Function: portable_malloc - Provide malloc() functionality in a platform specific way. -*/ -void *portable_malloc(size_t size) { - return malloc(size); -} -/* Function: portable_free - Provide free() functionality in a platform specific way. -*/ -void portable_free(void *p) { - free(p); -} -#else -void *portable_malloc(size_t size) { - return NULL; -} -void portable_free(void *p) { - p=NULL; -} -#endif - -#if (SEED_METHOD==SEED_VOLATILE) -#if VALIDATION_RUN - volatile ee_s32 seed1_volatile=0x3415; - volatile ee_s32 seed2_volatile=0x3415; - volatile ee_s32 seed3_volatile=0x66; -#endif -#if PERFORMANCE_RUN - volatile ee_s32 seed1_volatile=0x0; - volatile ee_s32 seed2_volatile=0x0; - volatile ee_s32 seed3_volatile=0x66; -#endif -#if PROFILE_RUN - volatile ee_s32 seed1_volatile=0x8; - volatile ee_s32 seed2_volatile=0x8; - volatile ee_s32 seed3_volatile=0x8; -#endif - volatile ee_s32 seed4_volatile=ITERATIONS; - volatile ee_s32 seed5_volatile=0; -#endif -/* Porting: Timing functions - How to capture time and convert to seconds must be ported to whatever is supported by the platform. - e.g. Read value from on board RTC, read value from cpu clock cycles performance counter etc. - Sample implementation for standard time.h and windows.h definitions included. -*/ -/* Define: TIMER_RES_DIVIDER - Divider to trade off timer resolution and total time that can be measured. - - Use lower values to increase resolution, but make sure that overflow does not occur. - If there are issues with the return value overflowing, increase this value. - */ -#if USE_CLOCK - #define NSECS_PER_SEC CLOCKS_PER_SEC - #define EE_TIMER_TICKER_RATE 1000 - #define CORETIMETYPE clock_t - #define GETMYTIME(_t) (*_t=clock()) - #define MYTIMEDIFF(fin,ini) ((fin)-(ini)) - #define TIMER_RES_DIVIDER 1 - #define SAMPLE_TIME_IMPLEMENTATION 1 -#elif defined(_MSC_VER) - #define NSECS_PER_SEC 10000000 - #define EE_TIMER_TICKER_RATE 1000 - #define CORETIMETYPE FILETIME - #define GETMYTIME(_t) GetSystemTimeAsFileTime(_t) - #define MYTIMEDIFF(fin,ini) (((*(__int64*)&fin)-(*(__int64*)&ini))/TIMER_RES_DIVIDER) - /* setting to millisces resolution by default with MSDEV */ - #ifndef TIMER_RES_DIVIDER - #define TIMER_RES_DIVIDER 1000 - #endif - #define SAMPLE_TIME_IMPLEMENTATION 1 -#elif HAS_TIME_H - #define NSECS_PER_SEC 1000000000 - #define EE_TIMER_TICKER_RATE 1000 - #define CORETIMETYPE struct timespec - #define GETMYTIME(_t) clock_gettime(CLOCK_REALTIME,_t) - #define MYTIMEDIFF(fin,ini) ((fin.tv_sec-ini.tv_sec)*(NSECS_PER_SEC/TIMER_RES_DIVIDER)+(fin.tv_nsec-ini.tv_nsec)/TIMER_RES_DIVIDER) - /* setting to 1/1000 of a second resolution by default with linux */ - #ifndef TIMER_RES_DIVIDER - #define TIMER_RES_DIVIDER 1000000 - #endif - #define SAMPLE_TIME_IMPLEMENTATION 1 -#else - #define SAMPLE_TIME_IMPLEMENTATION 0 -#endif -#define EE_TICKS_PER_SEC (NSECS_PER_SEC / TIMER_RES_DIVIDER) - -#if SAMPLE_TIME_IMPLEMENTATION -/** Define Host specific (POSIX), or target specific global time variables. */ -static CORETIMETYPE start_time_val, stop_time_val; - -/* Function: start_time - This function will be called right before starting the timed portion of the benchmark. - - Implementation may be capturing a system timer (as implemented in the example code) - or zeroing some system parameters - e.g. setting the cpu clocks cycles to 0. -*/ -void start_time(void) { - GETMYTIME(&start_time_val ); -#if CALLGRIND_RUN - CALLGRIND_START_INSTRUMENTATION -#endif -#if MICA - asm volatile("int3");/*1 */ -#endif -} -/* Function: stop_time - This function will be called right after ending the timed portion of the benchmark. - - Implementation may be capturing a system timer (as implemented in the example code) - or other system parameters - e.g. reading the current value of cpu cycles counter. -*/ -void stop_time(void) { -#if CALLGRIND_RUN - CALLGRIND_STOP_INSTRUMENTATION -#endif -#if MICA - asm volatile("int3");/*1 */ -#endif - GETMYTIME(&stop_time_val ); -} -/* Function: get_time - Return an abstract "ticks" number that signifies time on the system. - - Actual value returned may be cpu cycles, milliseconds or any other value, - as long as it can be converted to seconds by . - This methodology is taken to accomodate any hardware or simulated platform. - The sample implementation returns millisecs by default, - and the resolution is controlled by -*/ -CORE_TICKS get_time(void) { - CORE_TICKS elapsed=(CORE_TICKS)(MYTIMEDIFF(stop_time_val, start_time_val)); - return elapsed; -} -/* Function: time_in_secs - Convert the value returned by get_time to seconds. - - The type is used to accomodate systems with no support for floating point. - Default implementation implemented by the EE_TICKS_PER_SEC macro above. -*/ -secs_ret time_in_secs(CORE_TICKS ticks) { - secs_ret retval=((secs_ret)ticks) / (secs_ret)EE_TICKS_PER_SEC; - return retval; -} -#else -#error "Please implement timing functionality in core_portme.c" -#endif /* SAMPLE_TIME_IMPLEMENTATION */ - -ee_u32 default_num_contexts=MULTITHREAD; - -/* Function: portable_init - Target specific initialization code - Test for some common mistakes. -*/ -void portable_init(core_portable *p, int *argc, char *argv[]) -{ -#if PRINT_ARGS - int i; - for (i=0; i<*argc; i++) { - ee_printf("Arg[%d]=%s\n",i,argv[i]); - } -#endif - if (sizeof(ee_ptr_int) != sizeof(ee_u8 *)) { - ee_printf("ERROR! Please define ee_ptr_int to a type that holds a pointer!\n"); - } - if (sizeof(ee_u32) != 4) { - ee_printf("ERROR! Please define ee_u32 to a 32b unsigned type!\n"); - } -#if (MAIN_HAS_NOARGC && (SEED_METHOD==SEED_ARG)) - ee_printf("ERROR! Main has no argc, but SEED_METHOD defined to SEED_ARG!\n"); -#endif - -#if (MULTITHREAD>1) && (SEED_METHOD==SEED_ARG) - int nargs=*argc,i; - if ((nargs>1) && (*argv[1]=='M')) { - default_num_contexts=parseval(argv[1]+1); - if (default_num_contexts>MULTITHREAD) - default_num_contexts=MULTITHREAD; - /* Shift args since first arg is directed to the portable part and not to coremark main */ - --nargs; - for (i=1; i*/ - p->portable_id=1; -} -/* Function: portable_fini - Target specific final code -*/ -void portable_fini(core_portable *p) -{ - p->portable_id=0; -} - -#if (MULTITHREAD>1) - -/* Function: core_start_parallel - Start benchmarking in a parallel context. - - Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets. - Other implementations using MCAPI or other standards can easily be devised. -*/ -/* Function: core_stop_parallel - Stop a parallel context execution of coremark, and gather the results. - - Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets. - Other implementations using MCAPI or other standards can easily be devised. -*/ -#if USE_PTHREAD -ee_u8 core_start_parallel(core_results *res) { - return (ee_u8)pthread_create(&(res->port.thread),NULL,iterate,(void *)res); -} -ee_u8 core_stop_parallel(core_results *res) { - void *retval; - return (ee_u8)pthread_join(res->port.thread,&retval); -} -#elif USE_FORK -static int key_id=0; -ee_u8 core_start_parallel(core_results *res) { - key_t key=4321+key_id; - key_id++; - res->port.pid=fork(); - res->port.shmid=shmget(key, 8, IPC_CREAT | 0666); - if (res->port.shmid<0) { - ee_printf("ERROR in shmget!\n"); - } - if (res->port.pid==0) { - iterate(res); - res->port.shm=shmat(res->port.shmid, NULL, 0); - /* copy the validation values to the shared memory area and quit*/ - if (res->port.shm == (char *) -1) { - ee_printf("ERROR in child shmat!\n"); - } else { - memcpy(res->port.shm,&(res->crc),8); - shmdt(res->port.shm); - } - exit(0); - } - return 1; -} -ee_u8 core_stop_parallel(core_results *res) { - int status; - pid_t wpid = waitpid(res->port.pid,&status,WUNTRACED); - if (wpid != res->port.pid) { - ee_printf("ERROR waiting for child.\n"); - if (errno == ECHILD) ee_printf("errno=No such child %d\n",res->port.pid); - if (errno == EINTR) ee_printf("errno=Interrupted\n"); - return 0; - } - /* after process is done, get the values from the shared memory area */ - res->port.shm=shmat(res->port.shmid, NULL, 0); - if (res->port.shm == (char *) -1) { - ee_printf("ERROR in parent shmat!\n"); - return 0; - } - memcpy(&(res->crc),res->port.shm,8); - shmdt(res->port.shm); - return 1; -} -#elif USE_SOCKET -static int key_id=0; -ee_u8 core_start_parallel(core_results *res) { - int bound, buffer_length=8; - res->port.sa.sin_family = AF_INET; - res->port.sa.sin_addr.s_addr = htonl(0x7F000001); - res->port.sa.sin_port = htons(7654+key_id); - key_id++; - res->port.pid=fork(); - if (res->port.pid==0) { /* benchmark child */ - iterate(res); - res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); - if (-1 == res->port.sock) /* if socket failed to initialize, exit */ { - ee_printf("Error Creating Socket"); - } else { - int bytes_sent = sendto(res->port.sock, &(res->crc), buffer_length, 0,(struct sockaddr*)&(res->port.sa), sizeof (struct sockaddr_in)); - if (bytes_sent < 0) - ee_printf("Error sending packet: %s\n", strerror(errno)); - close(res->port.sock); /* close the socket */ - } - exit(0); - } - /* parent process, open the socket */ - res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); - bound = bind(res->port.sock,(struct sockaddr*)&(res->port.sa), sizeof(struct sockaddr)); - if (bound < 0) - ee_printf("bind(): %s\n",strerror(errno)); - return 1; -} -ee_u8 core_stop_parallel(core_results *res) { - int status; - int fromlen=sizeof(struct sockaddr); - int recsize = recvfrom(res->port.sock, &(res->crc), 8, 0, (struct sockaddr*)&(res->port.sa), &fromlen); - if (recsize < 0) { - ee_printf("Error in receive: %s\n", strerror(errno)); - return 0; - } - pid_t wpid = waitpid(res->port.pid,&status,WUNTRACED); - if (wpid != res->port.pid) { - ee_printf("ERROR waiting for child.\n"); - if (errno == ECHILD) ee_printf("errno=No such child %d\n",res->port.pid); - if (errno == EINTR) ee_printf("errno=Interrupted\n"); - return 0; - } - return 1; -} -#else /* no standard multicore implementation */ -#error "Please implement multicore functionality in core_portme.c to use multiple contexts." -#endif /* multithread implementations */ -#endif diff --git a/tests/riscv-coremark/coremark/linux64/core_portme.h b/tests/riscv-coremark/coremark/linux64/core_portme.h deleted file mode 100755 index 1228a679b..000000000 --- a/tests/riscv-coremark/coremark/linux64/core_portme.h +++ /dev/null @@ -1,291 +0,0 @@ -/* -Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Original Author: Shay Gal-on -*/ - -/* Topic: Description - This file contains configuration constants required to execute on different platforms -*/ -#ifndef CORE_PORTME_H -#define CORE_PORTME_H -/************************/ -/* Data types and settings */ -/************************/ -/* Configuration: HAS_FLOAT - Define to 1 if the platform supports floating point. -*/ -#ifndef HAS_FLOAT -#define HAS_FLOAT 1 -#endif -/* Configuration: HAS_TIME_H - Define to 1 if platform has the time.h header file, - and implementation of functions thereof. -*/ -#ifndef HAS_TIME_H -#define HAS_TIME_H 1 -#endif -/* Configuration: USE_CLOCK - Define to 1 if platform has the time.h header file, - and implementation of functions thereof. -*/ -#ifndef USE_CLOCK -#define USE_CLOCK 0 -#endif -/* Configuration: HAS_STDIO - Define to 1 if the platform has stdio.h. -*/ -#ifndef HAS_STDIO -#define HAS_STDIO 1 -#endif -/* Configuration: HAS_PRINTF - Define to 1 if the platform has stdio.h and implements the printf function. -*/ -#ifndef HAS_PRINTF -#define HAS_PRINTF 1 -#endif - -/* Configuration: CORE_TICKS - Define type of return from the timing functions. - */ -#if defined(_MSC_VER) -#include -typedef size_t CORE_TICKS; -#elif HAS_TIME_H -#include -typedef clock_t CORE_TICKS; -#else -#error "Please define type of CORE_TICKS and implement start_time, end_time get_time and time_in_secs functions!" -#endif - -/* Definitions: COMPILER_VERSION, COMPILER_FLAGS, MEM_LOCATION - Initialize these strings per platform -*/ -#ifndef COMPILER_VERSION - #ifdef __GNUC__ - #define COMPILER_VERSION "GCC"__VERSION__ - #else - #define COMPILER_VERSION "Please put compiler version here (e.g. gcc 4.1)" - #endif -#endif -#ifndef COMPILER_FLAGS - #define COMPILER_FLAGS FLAGS_STR /* "Please put compiler flags here (e.g. -o3)" */ -#endif -#ifndef MEM_LOCATION - #define MEM_LOCATION "Please put data memory location here\n\t\t\t(e.g. code in flash, data on heap etc)" - #define MEM_LOCATION_UNSPEC 1 -#endif - -/* Data Types: - To avoid compiler issues, define the data types that need ot be used for 8b, 16b and 32b in . - - *Imprtant*: - ee_ptr_int needs to be the data type used to hold pointers, otherwise coremark may fail!!! -*/ -typedef signed short ee_s16; -typedef unsigned short ee_u16; -typedef signed int ee_s32; -typedef double ee_f32; -typedef unsigned char ee_u8; -typedef unsigned int ee_u32; -typedef unsigned long long ee_ptr_int; -typedef size_t ee_size_t; -/* align an offset to point to a 32b value */ -#define align_mem(x) (void *)(4 + (((ee_ptr_int)(x) - 1) & ~3)) - -/* Configuration: SEED_METHOD - Defines method to get seed values that cannot be computed at compile time. - - Valid values: - SEED_ARG - from command line. - SEED_FUNC - from a system function. - SEED_VOLATILE - from volatile variables. -*/ -#ifndef SEED_METHOD -#define SEED_METHOD SEED_ARG -#endif - -/* Configuration: MEM_METHOD - Defines method to get a block of memry. - - Valid values: - MEM_MALLOC - for platforms that implement malloc and have malloc.h. - MEM_STATIC - to use a static memory array. - MEM_STACK - to allocate the data block on the stack (NYI). -*/ -#ifndef MEM_METHOD -#define MEM_METHOD MEM_MALLOC -#endif - -/* Configuration: MULTITHREAD - Define for parallel execution - - Valid values: - 1 - only one context (default). - N>1 - will execute N copies in parallel. - - Note: - If this flag is defined to more then 1, an implementation for launching parallel contexts must be defined. - - Two sample implementations are provided. Use or to enable them. - - It is valid to have a different implementation of and in , - to fit a particular architecture. -*/ -#ifndef MULTITHREAD -#define MULTITHREAD 1 -#endif - -/* Configuration: USE_PTHREAD - Sample implementation for launching parallel contexts - This implementation uses pthread_thread_create and pthread_join. - - Valid values: - 0 - Do not use pthreads API. - 1 - Use pthreads API - - Note: - This flag only matters if MULTITHREAD has been defined to a value greater then 1. -*/ -#ifndef USE_PTHREAD -#define USE_PTHREAD 0 -#endif - -/* Configuration: USE_FORK - Sample implementation for launching parallel contexts - This implementation uses fork, waitpid, shmget,shmat and shmdt. - - Valid values: - 0 - Do not use fork API. - 1 - Use fork API - - Note: - This flag only matters if MULTITHREAD has been defined to a value greater then 1. -*/ -#ifndef USE_FORK -#define USE_FORK 0 -#endif - -/* Configuration: USE_SOCKET - Sample implementation for launching parallel contexts - This implementation uses fork, socket, sendto and recvfrom - - Valid values: - 0 - Do not use fork and sockets API. - 1 - Use fork and sockets API - - Note: - This flag only matters if MULTITHREAD has been defined to a value greater then 1. -*/ -#ifndef USE_SOCKET -#define USE_SOCKET 0 -#endif - -/* Configuration: MAIN_HAS_NOARGC - Needed if platform does not support getting arguments to main. - - Valid values: - 0 - argc/argv to main is supported - 1 - argc/argv to main is not supported -*/ -#ifndef MAIN_HAS_NOARGC -#define MAIN_HAS_NOARGC 0 -#endif - -/* Configuration: MAIN_HAS_NORETURN - Needed if platform does not support returning a value from main. - - Valid values: - 0 - main returns an int, and return value will be 0. - 1 - platform does not support returning a value from main -*/ -#ifndef MAIN_HAS_NORETURN -#define MAIN_HAS_NORETURN 0 -#endif - -/* Variable: default_num_contexts - Number of contexts to spawn in multicore context. - Override this global value to change number of contexts used. - - Note: - This value may not be set higher then the define. - - To experiment, you can set the define to the highest value expected, and use argc/argv in the to set this value from the command line. -*/ -extern ee_u32 default_num_contexts; - -#if (MULTITHREAD>1) -#if USE_PTHREAD - #include - #define PARALLEL_METHOD "PThreads" -#elif USE_FORK - #include - #include - #include - #include - #include /* for memcpy */ - #define PARALLEL_METHOD "Fork" -#elif USE_SOCKET - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #define PARALLEL_METHOD "Sockets" -#else - #define PARALLEL_METHOD "Proprietary" - #error "Please implement multicore functionality in core_portme.c to use multiple contexts." -#endif /* Method for multithreading */ -#endif /* MULTITHREAD > 1 */ - -typedef struct CORE_PORTABLE_S { -#if (MULTITHREAD>1) - #if USE_PTHREAD - pthread_t thread; - #elif USE_FORK - pid_t pid; - int shmid; - void *shm; - #elif USE_SOCKET - pid_t pid; - int sock; - struct sockaddr_in sa; - #endif /* Method for multithreading */ -#endif /* MULTITHREAD>1 */ - ee_u8 portable_id; -} core_portable; - -/* target specific init/fini */ -void portable_init(core_portable *p, int *argc, char *argv[]); -void portable_fini(core_portable *p); - -#if (SEED_METHOD==SEED_VOLATILE) - #if (VALIDATION_RUN || PERFORMANCE_RUN || PROFILE_RUN) - #define RUN_TYPE_FLAG 1 - #else - #if (TOTAL_DATA_SIZE==1200) - #define PROFILE_RUN 1 - #else - #define PERFORMANCE_RUN 1 - #endif - #endif -#endif /* SEED_METHOD==SEED_VOLATILE */ - -#endif /* CORE_PORTME_H */ diff --git a/tests/riscv-coremark/coremark/linux64/core_portme.mak b/tests/riscv-coremark/coremark/linux64/core_portme.mak deleted file mode 100755 index 5cfabee32..000000000 --- a/tests/riscv-coremark/coremark/linux64/core_portme.mak +++ /dev/null @@ -1,140 +0,0 @@ -# Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# Original Author: Shay Gal-on - -#File: core_portme.mak - -# Flag: OUTFLAG -# Use this flag to define how to to get an executable (e.g -o) -OUTFLAG= -o -# Flag: CC -# Use this flag to define compiler to use -CC = gcc -# Flag: CFLAGS -# Use this flag to define compiler options. Note, you can add compiler options from the command line using XCFLAGS="other flags" -PORT_CFLAGS = -O2 -FLAGS_STR = "$(PORT_CFLAGS) $(XCFLAGS) $(XLFLAGS) $(LFLAGS_END)" -CFLAGS = $(PORT_CFLAGS) -I$(PORT_DIR) -I. -DFLAGS_STR=\"$(FLAGS_STR)\" -#Flag: LFLAGS_END -# Define any libraries needed for linking or other flags that should come at the end of the link line (e.g. linker scripts). -# Note: On certain platforms, the default clock_gettime implementation is supported but requires linking of librt. -LFLAGS_END += -lrt -# Flag: PORT_SRCS -# Port specific source files can be added here -PORT_SRCS = $(PORT_DIR)/core_portme.c -# Flag: LOAD -# Define this flag if you need to load to a target, as in a cross compile environment. - -# Flag: RUN -# Define this flag if running does not consist of simple invocation of the binary. -# In a cross compile environment, you need to define this. - -#For flashing and using a tera term macro, you could use -#LOAD = flash ADDR -#RUN = ttpmacro coremark.ttl - -#For copying to target and executing via SSH connection, you could use -#LOAD = scp $(OUTFILE) user@target:~ -#RUN = ssh user@target -c - -#For native compilation and execution -LOAD = echo Loading done -RUN = - -OEXT = .o -EXE = .exe - -# Flag: SEPARATE_COMPILE -# Define if you need to separate compilation from link stage. -# In this case, you also need to define below how to create an object file, and how to link. -ifdef SEPARATE_COMPILE - -LD = gcc -OBJOUT = -o -LFLAGS = -OFLAG = -o -COUT = -c -# Flag: PORT_OBJS -# Port specific object files can be added here -PORT_OBJS = $(PORT_DIR)/core_portme$(OEXT) -PORT_CLEAN = *$(OEXT) - -$(OPATH)%$(OEXT) : %.c - $(CC) $(CFLAGS) $(XCFLAGS) $(COUT) $< $(OBJOUT) $@ - -endif - -# Target: port_prebuild -# Generate any files that are needed before actual build starts. -# E.g. generate profile guidance files. Sample PGO generation for gcc enabled with PGO=1 -# - First, check if PGO was defined on the command line, if so, need to add -fprofile-use to compile line. -# - Second, if PGO reference has not yet been generated, add a step to the prebuild that will build a profile-generate version and run it. -# Note - Using REBUILD=1 -# -# Use make PGO=1 to invoke this sample processing. - -ifdef PGO - ifeq (,$(findstring $(PGO),gen)) - PGO_STAGE=build_pgo_gcc - CFLAGS+=-fprofile-use - endif - PORT_CLEAN+=*.gcda *.gcno gmon.out -endif - -.PHONY: port_prebuild -port_prebuild: $(PGO_STAGE) - -.PHONY: build_pgo_gcc -build_pgo_gcc: - $(MAKE) PGO=gen XCFLAGS="$(XCFLAGS) -fprofile-generate -DTOTAL_DATA_SIZE=1200" ITERATIONS=10 gen_pgo_data REBUILD=1 - -# Target: port_postbuild -# Generate any files that are needed after actual build end. -# E.g. change format to srec, bin, zip in order to be able to load into flash -.PHONY: port_postbuild -port_postbuild: - -# Target: port_postrun -# Do platform specific after run stuff. -# E.g. reset the board, backup the logfiles etc. -.PHONY: port_postrun -port_postrun: - -# Target: port_prerun -# Do platform specific after run stuff. -# E.g. reset the board, backup the logfiles etc. -.PHONY: port_prerun -port_prerun: - -# Target: port_postload -# Do platform specific after load stuff. -# E.g. reset the reset power to the flash eraser -.PHONY: port_postload -port_postload: - -# Target: port_preload -# Do platform specific before load stuff. -# E.g. reset the reset power to the flash eraser -.PHONY: port_preload -port_preload: - -# FLAG: OPATH -# Path to the output folder. Default - current folder. -OPATH = ./ -MKDIR = mkdir -p - -# FLAG: PERL -# Define perl executable to calculate the geomean if running separate. -PERL=/usr/bin/perl diff --git a/tests/riscv-coremark/coremark/macos/core_portme.mak b/tests/riscv-coremark/coremark/macos/core_portme.mak deleted file mode 100644 index 6b27c3c41..000000000 --- a/tests/riscv-coremark/coremark/macos/core_portme.mak +++ /dev/null @@ -1,18 +0,0 @@ -# Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# Original Author: Shay Gal-on - -NO_LIBRT = 1 -include posix/core_portme.mak diff --git a/tests/riscv-coremark/coremark/posix/core_portme.c b/tests/riscv-coremark/coremark/posix/core_portme.c deleted file mode 100644 index f5a7f5b3d..000000000 --- a/tests/riscv-coremark/coremark/posix/core_portme.c +++ /dev/null @@ -1,419 +0,0 @@ -/* -Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Original Author: Shay Gal-on -*/ - -#include -#include -#include "coremark.h" -#if CALLGRIND_RUN -#include -#endif - -#if (MEM_METHOD == MEM_MALLOC) -/* Function: portable_malloc - Provide malloc() functionality in a platform specific way. -*/ -void * -portable_malloc(size_t size) -{ - return malloc(size); -} -/* Function: portable_free - Provide free() functionality in a platform specific way. -*/ -void -portable_free(void *p) -{ - free(p); -} -#else -void * -portable_malloc(size_t size) -{ - return NULL; -} -void -portable_free(void *p) -{ - p = NULL; -} -#endif - -#if (SEED_METHOD == SEED_VOLATILE) -#if VALIDATION_RUN -volatile ee_s32 seed1_volatile = 0x3415; -volatile ee_s32 seed2_volatile = 0x3415; -volatile ee_s32 seed3_volatile = 0x66; -#endif -#if PERFORMANCE_RUN -volatile ee_s32 seed1_volatile = 0x0; -volatile ee_s32 seed2_volatile = 0x0; -volatile ee_s32 seed3_volatile = 0x66; -#endif -#if PROFILE_RUN -volatile ee_s32 seed1_volatile = 0x8; -volatile ee_s32 seed2_volatile = 0x8; -volatile ee_s32 seed3_volatile = 0x8; -#endif -volatile ee_s32 seed4_volatile = ITERATIONS; -volatile ee_s32 seed5_volatile = 0; -#endif -/* Porting: Timing functions - How to capture time and convert to seconds must be ported to whatever is - supported by the platform. e.g. Read value from on board RTC, read value from - cpu clock cycles performance counter etc. Sample implementation for standard - time.h and windows.h definitions included. -*/ -/* Define: TIMER_RES_DIVIDER - Divider to trade off timer resolution and total time that can be - measured. - - Use lower values to increase resolution, but make sure that overflow - does not occur. If there are issues with the return value overflowing, - increase this value. - */ -#if USE_CLOCK -#define NSECS_PER_SEC CLOCKS_PER_SEC -#define EE_TIMER_TICKER_RATE 1000 -#define CORETIMETYPE clock_t -#define GETMYTIME(_t) (*_t = clock()) -#define MYTIMEDIFF(fin, ini) ((fin) - (ini)) -#define TIMER_RES_DIVIDER 1 -#define SAMPLE_TIME_IMPLEMENTATION 1 -#elif defined(_MSC_VER) -#define NSECS_PER_SEC 10000000 -#define EE_TIMER_TICKER_RATE 1000 -#define CORETIMETYPE FILETIME -#define GETMYTIME(_t) GetSystemTimeAsFileTime(_t) -#define MYTIMEDIFF(fin, ini) \ - (((*(__int64 *)&fin) - (*(__int64 *)&ini)) / TIMER_RES_DIVIDER) -/* setting to millisces resolution by default with MSDEV */ -#ifndef TIMER_RES_DIVIDER -#define TIMER_RES_DIVIDER 1000 -#endif -#define SAMPLE_TIME_IMPLEMENTATION 1 -#elif HAS_TIME_H -#define NSECS_PER_SEC 1000000000 -#define EE_TIMER_TICKER_RATE 1000 -#define CORETIMETYPE struct timespec -#define GETMYTIME(_t) clock_gettime(CLOCK_REALTIME, _t) -#define MYTIMEDIFF(fin, ini) \ - ((fin.tv_sec - ini.tv_sec) * (NSECS_PER_SEC / TIMER_RES_DIVIDER) \ - + (fin.tv_nsec - ini.tv_nsec) / TIMER_RES_DIVIDER) -/* setting to 1/1000 of a second resolution by default with linux */ -#ifndef TIMER_RES_DIVIDER -#define TIMER_RES_DIVIDER 1000000 -#endif -#define SAMPLE_TIME_IMPLEMENTATION 1 -#else -#define SAMPLE_TIME_IMPLEMENTATION 0 -#endif -#define EE_TICKS_PER_SEC (NSECS_PER_SEC / TIMER_RES_DIVIDER) - -#if SAMPLE_TIME_IMPLEMENTATION -/** Define Host specific (POSIX), or target specific global time variables. */ -static CORETIMETYPE start_time_val, stop_time_val; - -/* Function: start_time - This function will be called right before starting the timed portion of - the benchmark. - - Implementation may be capturing a system timer (as implemented in the - example code) or zeroing some system parameters - e.g. setting the cpu clocks - cycles to 0. -*/ -void -start_time(void) -{ - GETMYTIME(&start_time_val); -#if CALLGRIND_RUN - CALLGRIND_START_INSTRUMENTATION -#endif -#if MICA - asm volatile("int3"); /*1 */ -#endif -} -/* Function: stop_time - This function will be called right after ending the timed portion of the - benchmark. - - Implementation may be capturing a system timer (as implemented in the - example code) or other system parameters - e.g. reading the current value of - cpu cycles counter. -*/ -void -stop_time(void) -{ -#if CALLGRIND_RUN - CALLGRIND_STOP_INSTRUMENTATION -#endif -#if MICA - asm volatile("int3"); /*1 */ -#endif - GETMYTIME(&stop_time_val); -} -/* Function: get_time - Return an abstract "ticks" number that signifies time on the system. - - Actual value returned may be cpu cycles, milliseconds or any other - value, as long as it can be converted to seconds by . This - methodology is taken to accomodate any hardware or simulated platform. The - sample implementation returns millisecs by default, and the resolution is - controlled by -*/ -CORE_TICKS -get_time(void) -{ - CORE_TICKS elapsed - = (CORE_TICKS)(MYTIMEDIFF(stop_time_val, start_time_val)); - return elapsed; -} -/* Function: time_in_secs - Convert the value returned by get_time to seconds. - - The type is used to accomodate systems with no support for - floating point. Default implementation implemented by the EE_TICKS_PER_SEC - macro above. -*/ -secs_ret -time_in_secs(CORE_TICKS ticks) -{ - secs_ret retval = ((secs_ret)ticks) / (secs_ret)EE_TICKS_PER_SEC; - return retval; -} -#else -#error "Please implement timing functionality in core_portme.c" -#endif /* SAMPLE_TIME_IMPLEMENTATION */ - -ee_u32 default_num_contexts = MULTITHREAD; - -/* Function: portable_init - Target specific initialization code - Test for some common mistakes. -*/ -void -portable_init(core_portable *p, int *argc, char *argv[]) -{ -#if PRINT_ARGS - int i; - for (i = 0; i < *argc; i++) - { - ee_printf("Arg[%d]=%s\n", i, argv[i]); - } -#endif - if (sizeof(ee_ptr_int) != sizeof(ee_u8 *)) - { - ee_printf( - "ERROR! Please define ee_ptr_int to a type that holds a " - "pointer!\n"); - } - if (sizeof(ee_u32) != 4) - { - ee_printf("ERROR! Please define ee_u32 to a 32b unsigned type!\n"); - } -#if (MAIN_HAS_NOARGC && (SEED_METHOD == SEED_ARG)) - ee_printf( - "ERROR! Main has no argc, but SEED_METHOD defined to SEED_ARG!\n"); -#endif - -#if (MULTITHREAD > 1) && (SEED_METHOD == SEED_ARG) - int nargs = *argc, i; - if ((nargs > 1) && (*argv[1] == 'M')) - { - default_num_contexts = parseval(argv[1] + 1); - if (default_num_contexts > MULTITHREAD) - default_num_contexts = MULTITHREAD; - /* Shift args since first arg is directed to the portable part and not - * to coremark main */ - --nargs; - for (i = 1; i < nargs; i++) - argv[i] = argv[i + 1]; - *argc = nargs; - } -#endif /* sample of potential platform specific init via command line, reset \ - the number of contexts being used if first argument is M*/ - p->portable_id = 1; -} -/* Function: portable_fini - Target specific final code -*/ -void -portable_fini(core_portable *p) -{ - p->portable_id = 0; -} - -#if (MULTITHREAD > 1) - -/* Function: core_start_parallel - Start benchmarking in a parallel context. - - Three implementations are provided, one using pthreads, one using fork - and shared mem, and one using fork and sockets. Other implementations using - MCAPI or other standards can easily be devised. -*/ -/* Function: core_stop_parallel - Stop a parallel context execution of coremark, and gather the results. - - Three implementations are provided, one using pthreads, one using fork - and shared mem, and one using fork and sockets. Other implementations using - MCAPI or other standards can easily be devised. -*/ -#if USE_PTHREAD -ee_u8 -core_start_parallel(core_results *res) -{ - return (ee_u8)pthread_create( - &(res->port.thread), NULL, iterate, (void *)res); -} -ee_u8 -core_stop_parallel(core_results *res) -{ - void *retval; - return (ee_u8)pthread_join(res->port.thread, &retval); -} -#elif USE_FORK -static int key_id = 0; -ee_u8 -core_start_parallel(core_results *res) -{ - key_t key = 4321 + key_id; - key_id++; - res->port.pid = fork(); - res->port.shmid = shmget(key, 8, IPC_CREAT | 0666); - if (res->port.shmid < 0) - { - ee_printf("ERROR in shmget!\n"); - } - if (res->port.pid == 0) - { - iterate(res); - res->port.shm = shmat(res->port.shmid, NULL, 0); - /* copy the validation values to the shared memory area and quit*/ - if (res->port.shm == (char *)-1) - { - ee_printf("ERROR in child shmat!\n"); - } - else - { - memcpy(res->port.shm, &(res->crc), 8); - shmdt(res->port.shm); - } - exit(0); - } - return 1; -} -ee_u8 -core_stop_parallel(core_results *res) -{ - int status; - pid_t wpid = waitpid(res->port.pid, &status, WUNTRACED); - if (wpid != res->port.pid) - { - ee_printf("ERROR waiting for child.\n"); - if (errno == ECHILD) - ee_printf("errno=No such child %d\n", res->port.pid); - if (errno == EINTR) - ee_printf("errno=Interrupted\n"); - return 0; - } - /* after process is done, get the values from the shared memory area */ - res->port.shm = shmat(res->port.shmid, NULL, 0); - if (res->port.shm == (char *)-1) - { - ee_printf("ERROR in parent shmat!\n"); - return 0; - } - memcpy(&(res->crc), res->port.shm, 8); - shmdt(res->port.shm); - return 1; -} -#elif USE_SOCKET -static int key_id = 0; -ee_u8 -core_start_parallel(core_results *res) -{ - int bound, buffer_length = 8; - res->port.sa.sin_family = AF_INET; - res->port.sa.sin_addr.s_addr = htonl(0x7F000001); - res->port.sa.sin_port = htons(7654 + key_id); - key_id++; - res->port.pid = fork(); - if (res->port.pid == 0) - { /* benchmark child */ - iterate(res); - res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); - if (-1 == res->port.sock) /* if socket failed to initialize, exit */ - { - ee_printf("Error Creating Socket"); - } - else - { - int bytes_sent = sendto(res->port.sock, - &(res->crc), - buffer_length, - 0, - (struct sockaddr *)&(res->port.sa), - sizeof(struct sockaddr_in)); - if (bytes_sent < 0) - ee_printf("Error sending packet: %s\n", strerror(errno)); - close(res->port.sock); /* close the socket */ - } - exit(0); - } - /* parent process, open the socket */ - res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); - bound = bind(res->port.sock, - (struct sockaddr *)&(res->port.sa), - sizeof(struct sockaddr)); - if (bound < 0) - ee_printf("bind(): %s\n", strerror(errno)); - return 1; -} -ee_u8 -core_stop_parallel(core_results *res) -{ - int status; - int fromlen = sizeof(struct sockaddr); - int recsize = recvfrom(res->port.sock, - &(res->crc), - 8, - 0, - (struct sockaddr *)&(res->port.sa), - &fromlen); - if (recsize < 0) - { - ee_printf("Error in receive: %s\n", strerror(errno)); - return 0; - } - pid_t wpid = waitpid(res->port.pid, &status, WUNTRACED); - if (wpid != res->port.pid) - { - ee_printf("ERROR waiting for child.\n"); - if (errno == ECHILD) - ee_printf("errno=No such child %d\n", res->port.pid); - if (errno == EINTR) - ee_printf("errno=Interrupted\n"); - return 0; - } - return 1; -} -#else /* no standard multicore implementation */ -#error \ - "Please implement multicore functionality in core_portme.c to use multiple contexts." -#endif /* multithread implementations */ -#endif diff --git a/tests/riscv-coremark/coremark/posix/core_portme.h b/tests/riscv-coremark/coremark/posix/core_portme.h deleted file mode 100644 index e49e474b1..000000000 --- a/tests/riscv-coremark/coremark/posix/core_portme.h +++ /dev/null @@ -1,314 +0,0 @@ -/* -Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Original Author: Shay Gal-on -*/ - -/* Topic: Description - This file contains configuration constants required to execute on - different platforms -*/ -#ifndef CORE_PORTME_H -#define CORE_PORTME_H - -#include "core_portme_posix_overrides.h" - -/************************/ -/* Data types and settings */ -/************************/ -/* Configuration: HAS_FLOAT - Define to 1 if the platform supports floating point. -*/ -#ifndef HAS_FLOAT -#define HAS_FLOAT 1 -#endif -/* Configuration: HAS_TIME_H - Define to 1 if platform has the time.h header file, - and implementation of functions thereof. -*/ -#ifndef HAS_TIME_H -#define HAS_TIME_H 1 -#endif -/* Configuration: USE_CLOCK - Define to 1 if platform has the time.h header file, - and implementation of functions thereof. -*/ -#ifndef USE_CLOCK -#define USE_CLOCK 0 -#endif -/* Configuration: HAS_STDIO - Define to 1 if the platform has stdio.h. -*/ -#ifndef HAS_STDIO -#define HAS_STDIO 1 -#endif -/* Configuration: HAS_PRINTF - Define to 1 if the platform has stdio.h and implements the printf - function. -*/ -#ifndef HAS_PRINTF -#define HAS_PRINTF 1 -#endif - -/* Configuration: CORE_TICKS - Define type of return from the timing functions. - */ -#if defined(_MSC_VER) -#include -typedef size_t CORE_TICKS; -#elif HAS_TIME_H -#include -typedef clock_t CORE_TICKS; -#else -#error \ - "Please define type of CORE_TICKS and implement start_time, end_time get_time and time_in_secs functions!" -#endif - -/* Definitions: COMPILER_VERSION, COMPILER_FLAGS, MEM_LOCATION - Initialize these strings per platform -*/ -#ifndef COMPILER_VERSION -#ifdef __GNUC__ -#define COMPILER_VERSION "GCC"__VERSION__ -#else -#define COMPILER_VERSION "Please put compiler version here (e.g. gcc 4.1)" -#endif -#endif -#ifndef COMPILER_FLAGS -#define COMPILER_FLAGS \ - FLAGS_STR /* "Please put compiler flags here (e.g. -o3)" */ -#endif -#ifndef MEM_LOCATION -#define MEM_LOCATION \ - "Please put data memory location here\n\t\t\t(e.g. code in flash, data " \ - "on heap etc)" -#define MEM_LOCATION_UNSPEC 1 -#endif - -#include - -/* Data Types: - To avoid compiler issues, define the data types that need ot be used for - 8b, 16b and 32b in . - - *Imprtant*: - ee_ptr_int needs to be the data type used to hold pointers, otherwise - coremark may fail!!! -*/ -typedef signed short ee_s16; -typedef unsigned short ee_u16; -typedef signed int ee_s32; -typedef double ee_f32; -typedef unsigned char ee_u8; -typedef unsigned int ee_u32; -typedef uintptr_t ee_ptr_int; -typedef size_t ee_size_t; -/* align an offset to point to a 32b value */ -#define align_mem(x) (void *)(4 + (((ee_ptr_int)(x)-1) & ~3)) - -/* Configuration: SEED_METHOD - Defines method to get seed values that cannot be computed at compile - time. - - Valid values: - SEED_ARG - from command line. - SEED_FUNC - from a system function. - SEED_VOLATILE - from volatile variables. -*/ -#ifndef SEED_METHOD -#define SEED_METHOD SEED_ARG -#endif - -/* Configuration: MEM_METHOD - Defines method to get a block of memry. - - Valid values: - MEM_MALLOC - for platforms that implement malloc and have malloc.h. - MEM_STATIC - to use a static memory array. - MEM_STACK - to allocate the data block on the stack (NYI). -*/ -#ifndef MEM_METHOD -#define MEM_METHOD MEM_MALLOC -#endif - -/* Configuration: MULTITHREAD - Define for parallel execution - - Valid values: - 1 - only one context (default). - N>1 - will execute N copies in parallel. - - Note: - If this flag is defined to more then 1, an implementation for launching - parallel contexts must be defined. - - Two sample implementations are provided. Use or - to enable them. - - It is valid to have a different implementation of - and in , to fit a particular architecture. -*/ -#ifndef MULTITHREAD -#define MULTITHREAD 1 -#endif - -/* Configuration: USE_PTHREAD - Sample implementation for launching parallel contexts - This implementation uses pthread_thread_create and pthread_join. - - Valid values: - 0 - Do not use pthreads API. - 1 - Use pthreads API - - Note: - This flag only matters if MULTITHREAD has been defined to a value - greater then 1. -*/ -#ifndef USE_PTHREAD -#define USE_PTHREAD 0 -#endif - -/* Configuration: USE_FORK - Sample implementation for launching parallel contexts - This implementation uses fork, waitpid, shmget,shmat and shmdt. - - Valid values: - 0 - Do not use fork API. - 1 - Use fork API - - Note: - This flag only matters if MULTITHREAD has been defined to a value - greater then 1. -*/ -#ifndef USE_FORK -#define USE_FORK 0 -#endif - -/* Configuration: USE_SOCKET - Sample implementation for launching parallel contexts - This implementation uses fork, socket, sendto and recvfrom - - Valid values: - 0 - Do not use fork and sockets API. - 1 - Use fork and sockets API - - Note: - This flag only matters if MULTITHREAD has been defined to a value - greater then 1. -*/ -#ifndef USE_SOCKET -#define USE_SOCKET 0 -#endif - -/* Configuration: MAIN_HAS_NOARGC - Needed if platform does not support getting arguments to main. - - Valid values: - 0 - argc/argv to main is supported - 1 - argc/argv to main is not supported -*/ -#ifndef MAIN_HAS_NOARGC -#define MAIN_HAS_NOARGC 0 -#endif - -/* Configuration: MAIN_HAS_NORETURN - Needed if platform does not support returning a value from main. - - Valid values: - 0 - main returns an int, and return value will be 0. - 1 - platform does not support returning a value from main -*/ -#ifndef MAIN_HAS_NORETURN -#define MAIN_HAS_NORETURN 0 -#endif - -/* Variable: default_num_contexts - Number of contexts to spawn in multicore context. - Override this global value to change number of contexts used. - - Note: - This value may not be set higher then the define. - - To experiment, you can set the define to the highest value - expected, and use argc/argv in the to set this value from the - command line. -*/ -extern ee_u32 default_num_contexts; - -#if (MULTITHREAD > 1) -#if USE_PTHREAD -#include -#define PARALLEL_METHOD "PThreads" -#elif USE_FORK -#include -#include -#include -#include -#include /* for memcpy */ -#define PARALLEL_METHOD "Fork" -#elif USE_SOCKET -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#define PARALLEL_METHOD "Sockets" -#else -#define PARALLEL_METHOD "Proprietary" -#error \ - "Please implement multicore functionality in core_portme.c to use multiple contexts." -#endif /* Method for multithreading */ -#endif /* MULTITHREAD > 1 */ - -typedef struct CORE_PORTABLE_S -{ -#if (MULTITHREAD > 1) -#if USE_PTHREAD - pthread_t thread; -#elif USE_FORK - pid_t pid; - int shmid; - void *shm; -#elif USE_SOCKET - pid_t pid; - int sock; - struct sockaddr_in sa; -#endif /* Method for multithreading */ -#endif /* MULTITHREAD>1 */ - ee_u8 portable_id; -} core_portable; - -/* target specific init/fini */ -void portable_init(core_portable *p, int *argc, char *argv[]); -void portable_fini(core_portable *p); - -#if (SEED_METHOD == SEED_VOLATILE) -#if (VALIDATION_RUN || PERFORMANCE_RUN || PROFILE_RUN) -#define RUN_TYPE_FLAG 1 -#else -#if (TOTAL_DATA_SIZE == 1200) -#define PROFILE_RUN 1 -#else -#define PERFORMANCE_RUN 1 -#endif -#endif -#endif /* SEED_METHOD==SEED_VOLATILE */ - -#endif /* CORE_PORTME_H */ diff --git a/tests/riscv-coremark/coremark/posix/core_portme.mak b/tests/riscv-coremark/coremark/posix/core_portme.mak deleted file mode 100755 index e6be71a7e..000000000 --- a/tests/riscv-coremark/coremark/posix/core_portme.mak +++ /dev/null @@ -1,151 +0,0 @@ -# Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# Original Author: Shay Gal-on - -#File: core_portme.mak - -# Flag: OUTFLAG -# Use this flag to define how to to get an executable (e.g -o) -OUTFLAG= -o -# Flag: CC -# Use this flag to define compiler to use -CC?= cc -# Flag: CFLAGS -# Use this flag to define compiler options. Note, you can add compiler options from the command line using XCFLAGS="other flags" -PORT_CFLAGS = -O2 -FLAGS_STR = "$(PORT_CFLAGS) $(XCFLAGS) $(XLFLAGS) $(LFLAGS_END)" -CFLAGS = $(PORT_CFLAGS) -I$(PORT_DIR) -Iposix -I. -DFLAGS_STR=\"$(FLAGS_STR)\" -# Flag: NO_LIBRT -# Define if the platform does not provide a librt -ifndef NO_LIBRT -#Flag: LFLAGS_END -# Define any libraries needed for linking or other flags that should come at the end of the link line (e.g. linker scripts). -# Note: On certain platforms, the default clock_gettime implementation is supported but requires linking of librt. -LFLAGS_END += -lrt -endif -# Flag: PORT_SRCS -# Port specific source files can be added here -PORT_SRCS = posix/core_portme.c -vpath %.c posix -vpath %.h posix -vpath %.mak posix -# Flag: EXTRA_DEPENDS -# Port specific extra build dependencies. -# Some ports inherit from us, so ensure this Makefile is always a dependency. -EXTRA_DEPENDS += posix/core_portme.mak -# Flag: LOAD -# Define this flag if you need to load to a target, as in a cross compile environment. - -# Flag: RUN -# Define this flag if running does not consist of simple invocation of the binary. -# In a cross compile environment, you need to define this. - -#For flashing and using a tera term macro, you could use -#LOAD = flash ADDR -#RUN = ttpmacro coremark.ttl - -#For copying to target and executing via SSH connection, you could use -#LOAD = scp $(OUTFILE) user@target:~ -#RUN = ssh user@target -c - -#For native compilation and execution -LOAD = echo Loading done -RUN = - -OEXT = .o -EXE = .exe - -# Flag: SEPARATE_COMPILE -# Define if you need to separate compilation from link stage. -# In this case, you also need to define below how to create an object file, and how to link. -ifdef SEPARATE_COMPILE - -LD = gcc -OBJOUT = -o -LFLAGS = -OFLAG = -o -COUT = -c -# Flag: PORT_OBJS -# Port specific object files can be added here -PORT_OBJS = $(PORT_DIR)/core_portme$(OEXT) -PORT_CLEAN = *$(OEXT) - -$(OPATH)%$(OEXT) : %.c - $(CC) $(CFLAGS) $(XCFLAGS) $(COUT) $< $(OBJOUT) $@ - -endif - -# Target: port_prebuild -# Generate any files that are needed before actual build starts. -# E.g. generate profile guidance files. Sample PGO generation for gcc enabled with PGO=1 -# - First, check if PGO was defined on the command line, if so, need to add -fprofile-use to compile line. -# - Second, if PGO reference has not yet been generated, add a step to the prebuild that will build a profile-generate version and run it. -# Note - Using REBUILD=1 -# -# Use make PGO=1 to invoke this sample processing. - -ifdef PGO - ifeq (,$(findstring $(PGO),gen)) - PGO_STAGE=build_pgo_gcc - CFLAGS+=-fprofile-use - endif - PORT_CLEAN+=*.gcda *.gcno gmon.out -endif - -.PHONY: port_prebuild -port_prebuild: $(PGO_STAGE) - -.PHONY: build_pgo_gcc -build_pgo_gcc: - $(MAKE) PGO=gen XCFLAGS="$(XCFLAGS) -fprofile-generate -DTOTAL_DATA_SIZE=1200" ITERATIONS=10 gen_pgo_data REBUILD=1 - -# Target: port_postbuild -# Generate any files that are needed after actual build end. -# E.g. change format to srec, bin, zip in order to be able to load into flash -.PHONY: port_postbuild -port_postbuild: - -# Target: port_postrun -# Do platform specific after run stuff. -# E.g. reset the board, backup the logfiles etc. -.PHONY: port_postrun -port_postrun: - -# Target: port_prerun -# Do platform specific after run stuff. -# E.g. reset the board, backup the logfiles etc. -.PHONY: port_prerun -port_prerun: - -# Target: port_postload -# Do platform specific after load stuff. -# E.g. reset the reset power to the flash eraser -.PHONY: port_postload -port_postload: - -# Target: port_preload -# Do platform specific before load stuff. -# E.g. reset the reset power to the flash eraser -.PHONY: port_preload -port_preload: - -# FLAG: OPATH -# Path to the output folder. Default - current folder. -OPATH = ./ -MKDIR = mkdir -p - -# FLAG: PERL -# Define perl executable to calculate the geomean if running separate. -PERL=/usr/bin/perl diff --git a/tests/riscv-coremark/coremark/posix/core_portme_posix_overrides.h b/tests/riscv-coremark/coremark/posix/core_portme_posix_overrides.h deleted file mode 100644 index c0e998adf..000000000 --- a/tests/riscv-coremark/coremark/posix/core_portme_posix_overrides.h +++ /dev/null @@ -1,28 +0,0 @@ -/* -Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Original Author: Shay Gal-on -*/ - -/* Topic: Description - This file contains additional configuration constants required to execute on - different platforms over and above the POSIX defaults -*/ -#ifndef CORE_PORTME_POSIX_OVERRIDES_H -#define CORE_PORTME_POSIX_OVERRIDES_H - -/* None by default */ - -#endif diff --git a/tests/riscv-coremark/coremark/rtems/core_portme.mak b/tests/riscv-coremark/coremark/rtems/core_portme.mak deleted file mode 100644 index 6b27c3c41..000000000 --- a/tests/riscv-coremark/coremark/rtems/core_portme.mak +++ /dev/null @@ -1,18 +0,0 @@ -# Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# Original Author: Shay Gal-on - -NO_LIBRT = 1 -include posix/core_portme.mak diff --git a/tests/riscv-coremark/coremark/rtems/init.c b/tests/riscv-coremark/coremark/rtems/init.c deleted file mode 100644 index 64d3e59ae..000000000 --- a/tests/riscv-coremark/coremark/rtems/init.c +++ /dev/null @@ -1,63 +0,0 @@ -/*- - * SPDX-License-Identifier: BSD-2-Clause - * - * Copyright (c) 2021 Hesham Almatary - * - * This software was developed by SRI International and the University of - * Cambridge Computer Laboratory (Department of Computer Science and - * Technology) under DARPA contract HR0011-18-C-0016 ("ECATS"), as part of the - * DARPA SSITH research programme. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include -#include - -int main( - int argc, - void **args -); - -rtems_task Init( - rtems_task_argument ignored -); - -rtems_task Init( - rtems_task_argument ignored -) -{ - int ret = main(0, NULL); - exit(ret); -} - -/* configuration information */ -#define CONFIGURE_APPLICATION_NEEDS_SIMPLE_CONSOLE_DRIVER -#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER - -#define CONFIGURE_MAXIMUM_TASKS 20 - -#define CONFIGURE_RTEMS_INIT_TASKS_TABLE - -#define CONFIGURE_INIT - -#include diff --git a/tests/riscv-coremark/coremark/simple/core_portme.c b/tests/riscv-coremark/coremark/simple/core_portme.c deleted file mode 100644 index b95e3b21e..000000000 --- a/tests/riscv-coremark/coremark/simple/core_portme.c +++ /dev/null @@ -1,149 +0,0 @@ -/* -Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Original Author: Shay Gal-on -*/ - -#include -#include -#include "coremark.h" - -#if VALIDATION_RUN -volatile ee_s32 seed1_volatile = 0x3415; -volatile ee_s32 seed2_volatile = 0x3415; -volatile ee_s32 seed3_volatile = 0x66; -#endif -#if PERFORMANCE_RUN -volatile ee_s32 seed1_volatile = 0x0; -volatile ee_s32 seed2_volatile = 0x0; -volatile ee_s32 seed3_volatile = 0x66; -#endif -#if PROFILE_RUN -volatile ee_s32 seed1_volatile = 0x8; -volatile ee_s32 seed2_volatile = 0x8; -volatile ee_s32 seed3_volatile = 0x8; -#endif -volatile ee_s32 seed4_volatile = ITERATIONS; -volatile ee_s32 seed5_volatile = 0; -/* Porting : Timing functions - How to capture time and convert to seconds must be ported to whatever is - supported by the platform. e.g. Read value from on board RTC, read value from - cpu clock cycles performance counter etc. Sample implementation for standard - time.h and windows.h definitions included. -*/ -/* Define : TIMER_RES_DIVIDER - Divider to trade off timer resolution and total time that can be - measured. - - Use lower values to increase resolution, but make sure that overflow - does not occur. If there are issues with the return value overflowing, - increase this value. - */ -#define NSECS_PER_SEC CLOCKS_PER_SEC -#define CORETIMETYPE clock_t -#define GETMYTIME(_t) (*_t = clock()) -#define MYTIMEDIFF(fin, ini) ((fin) - (ini)) -#define TIMER_RES_DIVIDER 1 -#define SAMPLE_TIME_IMPLEMENTATION 1 -#define EE_TICKS_PER_SEC (NSECS_PER_SEC / TIMER_RES_DIVIDER) - -/** Define Host specific (POSIX), or target specific global time variables. */ -static CORETIMETYPE start_time_val, stop_time_val; - -/* Function : start_time - This function will be called right before starting the timed portion of - the benchmark. - - Implementation may be capturing a system timer (as implemented in the - example code) or zeroing some system parameters - e.g. setting the cpu clocks - cycles to 0. -*/ -void -start_time(void) -{ - GETMYTIME(&start_time_val); -} -/* Function : stop_time - This function will be called right after ending the timed portion of the - benchmark. - - Implementation may be capturing a system timer (as implemented in the - example code) or other system parameters - e.g. reading the current value of - cpu cycles counter. -*/ -void -stop_time(void) -{ - GETMYTIME(&stop_time_val); -} -/* Function : get_time - Return an abstract "ticks" number that signifies time on the system. - - Actual value returned may be cpu cycles, milliseconds or any other - value, as long as it can be converted to seconds by . This - methodology is taken to accomodate any hardware or simulated platform. The - sample implementation returns millisecs by default, and the resolution is - controlled by -*/ -CORE_TICKS -get_time(void) -{ - CORE_TICKS elapsed - = (CORE_TICKS)(MYTIMEDIFF(stop_time_val, start_time_val)); - return elapsed; -} -/* Function : time_in_secs - Convert the value returned by get_time to seconds. - - The type is used to accomodate systems with no support for - floating point. Default implementation implemented by the EE_TICKS_PER_SEC - macro above. -*/ -secs_ret -time_in_secs(CORE_TICKS ticks) -{ - secs_ret retval = ((secs_ret)ticks) / (secs_ret)EE_TICKS_PER_SEC; - return retval; -} - -ee_u32 default_num_contexts = 1; - -/* Function : portable_init - Target specific initialization code - Test for some common mistakes. -*/ -void -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 " - "pointer!\n"); - } - if (sizeof(ee_u32) != 4) - { - ee_printf("ERROR! Please define ee_u32 to a 32b unsigned type!\n"); - } - p->portable_id = 1; -} -/* Function : portable_fini - Target specific final code -*/ -void -portable_fini(core_portable *p) -{ - p->portable_id = 0; -} diff --git a/tests/riscv-coremark/coremark/simple/core_portme.h b/tests/riscv-coremark/coremark/simple/core_portme.h deleted file mode 100644 index dfd94cbfc..000000000 --- a/tests/riscv-coremark/coremark/simple/core_portme.h +++ /dev/null @@ -1,208 +0,0 @@ -/* -Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Original Author: Shay Gal-on -*/ - -/* Topic : Description - This file contains configuration constants required to execute on - different platforms -*/ -#ifndef CORE_PORTME_H -#define CORE_PORTME_H -/************************/ -/* Data types and settings */ -/************************/ -/* Configuration : HAS_FLOAT - Define to 1 if the platform supports floating point. -*/ -#ifndef HAS_FLOAT -#define HAS_FLOAT 1 -#endif -/* Configuration : HAS_TIME_H - Define to 1 if platform has the time.h header file, - and implementation of functions thereof. -*/ -#ifndef HAS_TIME_H -#define HAS_TIME_H 1 -#endif -/* Configuration : USE_CLOCK - Define to 1 if platform has the time.h header file, - and implementation of functions thereof. -*/ -#ifndef USE_CLOCK -#define USE_CLOCK 1 -#endif -/* Configuration : HAS_STDIO - Define to 1 if the platform has stdio.h. -*/ -#ifndef HAS_STDIO -#define HAS_STDIO 1 -#endif -/* Configuration : HAS_PRINTF - Define to 1 if the platform has stdio.h and implements the printf - function. -*/ -#ifndef HAS_PRINTF -#define HAS_PRINTF 1 -#endif - -/* Configuration : CORE_TICKS - Define type of return from the timing functions. - */ -#include -typedef clock_t CORE_TICKS; - -/* Definitions : COMPILER_VERSION, COMPILER_FLAGS, MEM_LOCATION - Initialize these strings per platform -*/ -#ifndef COMPILER_VERSION -#ifdef __GNUC__ -#define COMPILER_VERSION "GCC"__VERSION__ -#else -#define COMPILER_VERSION "Please put compiler version here (e.g. gcc 4.1)" -#endif -#endif -#ifndef COMPILER_FLAGS -#define COMPILER_FLAGS \ - FLAGS_STR /* "Please put compiler flags here (e.g. -o3)" */ -#endif -#ifndef MEM_LOCATION -#define MEM_LOCATION "STACK" -#endif - -/* Data Types : - To avoid compiler issues, define the data types that need ot be used for - 8b, 16b and 32b in . - - *Imprtant* : - ee_ptr_int needs to be the data type used to hold pointers, otherwise - coremark may fail!!! -*/ -typedef signed short ee_s16; -typedef unsigned short ee_u16; -typedef signed int ee_s32; -typedef double ee_f32; -typedef unsigned char ee_u8; -typedef unsigned int ee_u32; -typedef ee_u32 ee_ptr_int; -typedef size_t ee_size_t; -/* align_mem : - This macro is used to align an offset to point to a 32b value. It is - used in the Matrix algorithm to initialize the input memory blocks. -*/ -#define align_mem(x) (void *)(4 + (((ee_ptr_int)(x)-1) & ~3)) - -/* Configuration : SEED_METHOD - Defines method to get seed values that cannot be computed at compile - time. - - Valid values : - SEED_ARG - from command line. - SEED_FUNC - from a system function. - SEED_VOLATILE - from volatile variables. -*/ -#ifndef SEED_METHOD -#define SEED_METHOD SEED_VOLATILE -#endif - -/* Configuration : MEM_METHOD - Defines method to get a block of memry. - - Valid values : - MEM_MALLOC - for platforms that implement malloc and have malloc.h. - MEM_STATIC - to use a static memory array. - MEM_STACK - to allocate the data block on the stack (NYI). -*/ -#ifndef MEM_METHOD -#define MEM_METHOD MEM_STACK -#endif - -/* Configuration : MULTITHREAD - Define for parallel execution - - Valid values : - 1 - only one context (default). - N>1 - will execute N copies in parallel. - - Note : - If this flag is defined to more then 1, an implementation for launching - parallel contexts must be defined. - - Two sample implementations are provided. Use or - to enable them. - - It is valid to have a different implementation of - and in , to fit a particular architecture. -*/ -#ifndef MULTITHREAD -#define MULTITHREAD 1 -#define USE_PTHREAD 0 -#define USE_FORK 0 -#define USE_SOCKET 0 -#endif - -/* Configuration : MAIN_HAS_NOARGC - Needed if platform does not support getting arguments to main. - - Valid values : - 0 - argc/argv to main is supported - 1 - argc/argv to main is not supported - - Note : - This flag only matters if MULTITHREAD has been defined to a value - greater then 1. -*/ -#ifndef MAIN_HAS_NOARGC -#define MAIN_HAS_NOARGC 0 -#endif - -/* Configuration : MAIN_HAS_NORETURN - Needed if platform does not support returning a value from main. - - Valid values : - 0 - main returns an int, and return value will be 0. - 1 - platform does not support returning a value from main -*/ -#ifndef MAIN_HAS_NORETURN -#define MAIN_HAS_NORETURN 0 -#endif - -/* Variable : default_num_contexts - Not used for this simple port, must cintain the value 1. -*/ -extern ee_u32 default_num_contexts; - -typedef struct CORE_PORTABLE_S -{ - ee_u8 portable_id; -} core_portable; - -/* target specific init/fini */ -void portable_init(core_portable *p, int *argc, char *argv[]); -void portable_fini(core_portable *p); - -#if !defined(PROFILE_RUN) && !defined(PERFORMANCE_RUN) \ - && !defined(VALIDATION_RUN) -#if (TOTAL_DATA_SIZE == 1200) -#define PROFILE_RUN 1 -#elif (TOTAL_DATA_SIZE == 2000) -#define PERFORMANCE_RUN 1 -#else -#define VALIDATION_RUN 1 -#endif -#endif - -#endif /* CORE_PORTME_H */ diff --git a/tests/riscv-coremark/coremark/simple/core_portme.mak b/tests/riscv-coremark/coremark/simple/core_portme.mak deleted file mode 100755 index 61c3db683..000000000 --- a/tests/riscv-coremark/coremark/simple/core_portme.mak +++ /dev/null @@ -1,60 +0,0 @@ -# Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# Original Author: Shay Gal-on - -#File : core_portme.mak - -# Flag : OUTFLAG -# Use this flag to define how to to get an executable (e.g -o) -OUTFLAG= -o -# Flag : CC -# Use this flag to define compiler to use -CC = gcc -# Flag : CFLAGS -# Use this flag to define compiler options. Note, you can add compiler options from the command line using XCFLAGS="other flags" -PORT_CFLAGS = -O2 -FLAGS_STR = "$(PORT_CFLAGS) $(XCFLAGS) $(XLFLAGS) $(LFLAGS_END)" -CFLAGS = $(PORT_CFLAGS) -I$(PORT_DIR) -I. -DFLAGS_STR=\"$(FLAGS_STR)\" -#Flag : LFLAGS_END -# Define any libraries needed for linking or other flags that should come at the end of the link line (e.g. linker scripts). -# Note : On certain platforms, the default clock_gettime implementation is supported but requires linking of librt. -LFLAGS_END = -# Flag : PORT_SRCS -# Port specific source files can be added here -PORT_SRCS = $(PORT_DIR)/core_portme.c -# Flag : LOAD -# For a simple port, we assume self hosted compile and run, no load needed. - -# Flag : RUN -# For a simple port, we assume self hosted compile and run, simple invocation of the executable - -#For native compilation and execution -LOAD = echo Loading done -RUN = - -OEXT = .o -EXE = .exe - -# Target : port_pre% and port_post% -# For the purpose of this simple port, no pre or post steps needed. - -.PHONY : port_prebuild port_postbuild port_prerun port_postrun port_preload port_postload -port_pre% port_post% : - -# FLAG : OPATH -# Path to the output folder. Default - current folder. -OPATH = ./ -MKDIR = mkdir -p - diff --git a/tests/riscv-coremark/extraPortmes/README.md b/tests/riscv-coremark/extraPortmes/README.md deleted file mode 100644 index 681fc4d8b..000000000 --- a/tests/riscv-coremark/extraPortmes/README.md +++ /dev/null @@ -1,7 +0,0 @@ -This directory is a backup for the portme files associated with cygwin, linux, and linux64 - -This backup is needed in the event that a user replaces the coremark directory with a clean version -from EEMBC's github page (the clean version does not have the cygwin, linux, -and linux64 files that our version does). - -Please do not delete this directory under any circumstance. \ No newline at end of file diff --git a/tests/riscv-coremark/extraPortmes/cygwin/core_portme.c b/tests/riscv-coremark/extraPortmes/cygwin/core_portme.c deleted file mode 100755 index fe8d29983..000000000 --- a/tests/riscv-coremark/extraPortmes/cygwin/core_portme.c +++ /dev/null @@ -1,336 +0,0 @@ -/* -Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Original Author: Shay Gal-on -*/ - -#include -#include -#include "coremark.h" -#if CALLGRIND_RUN -#include -#endif - -#if (MEM_METHOD==MEM_MALLOC) -#include -/* Function: portable_malloc - Provide malloc() functionality in a platform specific way. -*/ -void *portable_malloc(size_t size) { - return malloc(size); -} -/* Function: portable_free - Provide free() functionality in a platform specific way. -*/ -void portable_free(void *p) { - free(p); -} -#else -void *portable_malloc(size_t size) { - return NULL; -} -void portable_free(void *p) { - p=NULL; -} -#endif - -#if (SEED_METHOD==SEED_VOLATILE) -#if VALIDATION_RUN - volatile ee_s32 seed1_volatile=0x3415; - volatile ee_s32 seed2_volatile=0x3415; - volatile ee_s32 seed3_volatile=0x66; -#endif -#if PERFORMANCE_RUN - volatile ee_s32 seed1_volatile=0x0; - volatile ee_s32 seed2_volatile=0x0; - volatile ee_s32 seed3_volatile=0x66; -#endif -#if PROFILE_RUN - volatile ee_s32 seed1_volatile=0x8; - volatile ee_s32 seed2_volatile=0x8; - volatile ee_s32 seed3_volatile=0x8; -#endif - volatile ee_s32 seed4_volatile=ITERATIONS; - volatile ee_s32 seed5_volatile=0; -#endif -/* Porting: Timing functions - How to capture time and convert to seconds must be ported to whatever is supported by the platform. - e.g. Read value from on board RTC, read value from cpu clock cycles performance counter etc. - Sample implementation for standard time.h and windows.h definitions included. -*/ -/* Define: TIMER_RES_DIVIDER - Divider to trade off timer resolution and total time that can be measured. - - Use lower values to increase resolution, but make sure that overflow does not occur. - If there are issues with the return value overflowing, increase this value. - */ -#if USE_CLOCK - #define NSECS_PER_SEC CLOCKS_PER_SEC - #define EE_TIMER_TICKER_RATE 1000 - #define CORETIMETYPE clock_t - #define GETMYTIME(_t) (*_t=clock()) - #define MYTIMEDIFF(fin,ini) ((fin)-(ini)) - #define TIMER_RES_DIVIDER 1 - #define SAMPLE_TIME_IMPLEMENTATION 1 -#elif defined(_MSC_VER) - #define NSECS_PER_SEC 10000000 - #define EE_TIMER_TICKER_RATE 1000 - #define CORETIMETYPE FILETIME - #define GETMYTIME(_t) GetSystemTimeAsFileTime(_t) - #define MYTIMEDIFF(fin,ini) (((*(__int64*)&fin)-(*(__int64*)&ini))/TIMER_RES_DIVIDER) - /* setting to millisces resolution by default with MSDEV */ - #ifndef TIMER_RES_DIVIDER - #define TIMER_RES_DIVIDER 1000 - #endif - #define SAMPLE_TIME_IMPLEMENTATION 1 -#elif HAS_TIME_H - #define NSECS_PER_SEC 1000000000 - #define EE_TIMER_TICKER_RATE 1000 - #define CORETIMETYPE struct timespec - #define GETMYTIME(_t) clock_gettime(CLOCK_REALTIME,_t) - #define MYTIMEDIFF(fin,ini) ((fin.tv_sec-ini.tv_sec)*(NSECS_PER_SEC/TIMER_RES_DIVIDER)+(fin.tv_nsec-ini.tv_nsec)/TIMER_RES_DIVIDER) - /* setting to 1/1000 of a second resolution by default with linux */ - #ifndef TIMER_RES_DIVIDER - #define TIMER_RES_DIVIDER 1000000 - #endif - #define SAMPLE_TIME_IMPLEMENTATION 1 -#else - #define SAMPLE_TIME_IMPLEMENTATION 0 -#endif -#define EE_TICKS_PER_SEC (NSECS_PER_SEC / TIMER_RES_DIVIDER) - -#if SAMPLE_TIME_IMPLEMENTATION -/** Define Host specific (POSIX), or target specific global time variables. */ -static CORETIMETYPE start_time_val, stop_time_val; - -/* Function: start_time - This function will be called right before starting the timed portion of the benchmark. - - Implementation may be capturing a system timer (as implemented in the example code) - or zeroing some system parameters - e.g. setting the cpu clocks cycles to 0. -*/ -void start_time(void) { - GETMYTIME(&start_time_val ); -#if CALLGRIND_RUN - CALLGRIND_START_INSTRUMENTATION -#endif -#if MICA - asm volatile("int3");/*1 */ -#endif -} -/* Function: stop_time - This function will be called right after ending the timed portion of the benchmark. - - Implementation may be capturing a system timer (as implemented in the example code) - or other system parameters - e.g. reading the current value of cpu cycles counter. -*/ -void stop_time(void) { -#if CALLGRIND_RUN - CALLGRIND_STOP_INSTRUMENTATION -#endif -#if MICA - asm volatile("int3");/*1 */ -#endif - GETMYTIME(&stop_time_val ); -} -/* Function: get_time - Return an abstract "ticks" number that signifies time on the system. - - Actual value returned may be cpu cycles, milliseconds or any other value, - as long as it can be converted to seconds by . - This methodology is taken to accomodate any hardware or simulated platform. - The sample implementation returns millisecs by default, - and the resolution is controlled by -*/ -CORE_TICKS get_time(void) { - CORE_TICKS elapsed=(CORE_TICKS)(MYTIMEDIFF(stop_time_val, start_time_val)); - return elapsed; -} -/* Function: time_in_secs - Convert the value returned by get_time to seconds. - - The type is used to accomodate systems with no support for floating point. - Default implementation implemented by the EE_TICKS_PER_SEC macro above. -*/ -secs_ret time_in_secs(CORE_TICKS ticks) { - secs_ret retval=((secs_ret)ticks) / (secs_ret)EE_TICKS_PER_SEC; - return retval; -} -#else -#error "Please implement timing functionality in core_portme.c" -#endif /* SAMPLE_TIME_IMPLEMENTATION */ - -ee_u32 default_num_contexts=MULTITHREAD; - -/* Function: portable_init - Target specific initialization code - Test for some common mistakes. -*/ -void portable_init(core_portable *p, int *argc, char *argv[]) -{ -#if PRINT_ARGS - int i; - for (i=0; i<*argc; i++) { - ee_printf("Arg[%d]=%s\n",i,argv[i]); - } -#endif - if (sizeof(ee_ptr_int) != sizeof(ee_u8 *)) { - ee_printf("ERROR! Please define ee_ptr_int to a type that holds a pointer!\n"); - } - if (sizeof(ee_u32) != 4) { - ee_printf("ERROR! Please define ee_u32 to a 32b unsigned type!\n"); - } -#if (MAIN_HAS_NOARGC && (SEED_METHOD==SEED_ARG)) - ee_printf("ERROR! Main has no argc, but SEED_METHOD defined to SEED_ARG!\n"); -#endif - -#if (MULTITHREAD>1) && (SEED_METHOD==SEED_ARG) - int nargs=*argc,i; - if ((nargs>1) && (*argv[1]=='M')) { - default_num_contexts=parseval(argv[1]+1); - if (default_num_contexts>MULTITHREAD) - default_num_contexts=MULTITHREAD; - /* Shift args since first arg is directed to the portable part and not to coremark main */ - --nargs; - for (i=1; i*/ - p->portable_id=1; -} -/* Function: portable_fini - Target specific final code -*/ -void portable_fini(core_portable *p) -{ - p->portable_id=0; -} - -#if (MULTITHREAD>1) - -/* Function: core_start_parallel - Start benchmarking in a parallel context. - - Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets. - Other implementations using MCAPI or other standards can easily be devised. -*/ -/* Function: core_stop_parallel - Stop a parallel context execution of coremark, and gather the results. - - Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets. - Other implementations using MCAPI or other standards can easily be devised. -*/ -#if USE_PTHREAD -ee_u8 core_start_parallel(core_results *res) { - return (ee_u8)pthread_create(&(res->port.thread),NULL,iterate,(void *)res); -} -ee_u8 core_stop_parallel(core_results *res) { - void *retval; - return (ee_u8)pthread_join(res->port.thread,&retval); -} -#elif USE_FORK -static int key_id=0; -ee_u8 core_start_parallel(core_results *res) { - key_t key=4321+key_id; - key_id++; - res->port.pid=fork(); - res->port.shmid=shmget(key, 8, IPC_CREAT | 0666); - if (res->port.shmid<0) { - ee_printf("ERROR in shmget!\n"); - } - if (res->port.pid==0) { - iterate(res); - res->port.shm=shmat(res->port.shmid, NULL, 0); - /* copy the validation values to the shared memory area and quit*/ - if (res->port.shm == (char *) -1) { - ee_printf("ERROR in child shmat!\n"); - } else { - memcpy(res->port.shm,&(res->crc),8); - shmdt(res->port.shm); - } - exit(0); - } - return 1; -} -ee_u8 core_stop_parallel(core_results *res) { - int status; - pid_t wpid = waitpid(res->port.pid,&status,WUNTRACED); - if (wpid != res->port.pid) { - ee_printf("ERROR waiting for child.\n"); - if (errno == ECHILD) ee_printf("errno=No such child %d\n",res->port.pid); - if (errno == EINTR) ee_printf("errno=Interrupted\n"); - return 0; - } - /* after process is done, get the values from the shared memory area */ - res->port.shm=shmat(res->port.shmid, NULL, 0); - if (res->port.shm == (char *) -1) { - ee_printf("ERROR in parent shmat!\n"); - return 0; - } - memcpy(&(res->crc),res->port.shm,8); - shmdt(res->port.shm); - return 1; -} -#elif USE_SOCKET -static int key_id=0; -ee_u8 core_start_parallel(core_results *res) { - int bound, buffer_length=8; - res->port.sa.sin_family = AF_INET; - res->port.sa.sin_addr.s_addr = htonl(0x7F000001); - res->port.sa.sin_port = htons(7654+key_id); - key_id++; - res->port.pid=fork(); - if (res->port.pid==0) { /* benchmark child */ - iterate(res); - res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); - if (-1 == res->port.sock) /* if socket failed to initialize, exit */ { - ee_printf("Error Creating Socket"); - } else { - int bytes_sent = sendto(res->port.sock, &(res->crc), buffer_length, 0,(struct sockaddr*)&(res->port.sa), sizeof (struct sockaddr_in)); - if (bytes_sent < 0) - ee_printf("Error sending packet: %s\n", strerror(errno)); - close(res->port.sock); /* close the socket */ - } - exit(0); - } - /* parent process, open the socket */ - res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); - bound = bind(res->port.sock,(struct sockaddr*)&(res->port.sa), sizeof(struct sockaddr)); - if (bound < 0) - ee_printf("bind(): %s\n",strerror(errno)); - return 1; -} -ee_u8 core_stop_parallel(core_results *res) { - int status; - int fromlen=sizeof(struct sockaddr); - int recsize = recvfrom(res->port.sock, &(res->crc), 8, 0, (struct sockaddr*)&(res->port.sa), &fromlen); - if (recsize < 0) { - ee_printf("Error in receive: %s\n", strerror(errno)); - return 0; - } - pid_t wpid = waitpid(res->port.pid,&status,WUNTRACED); - if (wpid != res->port.pid) { - ee_printf("ERROR waiting for child.\n"); - if (errno == ECHILD) ee_printf("errno=No such child %d\n",res->port.pid); - if (errno == EINTR) ee_printf("errno=Interrupted\n"); - return 0; - } - return 1; -} -#else /* no standard multicore implementation */ -#error "Please implement multicore functionality in core_portme.c to use multiple contexts." -#endif /* multithread implementations */ -#endif diff --git a/tests/riscv-coremark/extraPortmes/cygwin/core_portme.h b/tests/riscv-coremark/extraPortmes/cygwin/core_portme.h deleted file mode 100755 index 9471b12ec..000000000 --- a/tests/riscv-coremark/extraPortmes/cygwin/core_portme.h +++ /dev/null @@ -1,293 +0,0 @@ -/* -Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Original Author: Shay Gal-on -*/ - -/* Topic: Description - This file contains configuration constants required to execute on different platforms -*/ -#ifndef CORE_PORTME_H -#define CORE_PORTME_H -/************************/ -/* Data types and settings */ -/************************/ -/* Configuration: HAS_FLOAT - Define to 1 if the platform supports floating point. -*/ -#ifndef HAS_FLOAT -#define HAS_FLOAT 1 -#endif -/* Configuration: HAS_TIME_H - Define to 1 if platform has the time.h header file, - and implementation of functions thereof. -*/ -#ifndef HAS_TIME_H -#define HAS_TIME_H 1 -#endif -/* Configuration: USE_CLOCK - Define to 1 if platform has the time.h header file, - and implementation of functions thereof. -*/ -#ifndef USE_CLOCK -#define USE_CLOCK 0 -#endif -/* Configuration: HAS_STDIO - Define to 1 if the platform has stdio.h. -*/ -#ifndef HAS_STDIO -#define HAS_STDIO 1 -#endif -/* Configuration: HAS_PRINTF - Define to 1 if the platform has stdio.h and implements the printf function. -*/ -#ifndef HAS_PRINTF -#define HAS_PRINTF 1 -#endif - -/* Configuration: CORE_TICKS - Define type of return from the timing functions. - */ -#if defined(_MSC_VER) -#include -typedef size_t CORE_TICKS; -#elif HAS_TIME_H -#include -typedef clock_t CORE_TICKS; -#else -#error "Please define type of CORE_TICKS and implement start_time, end_time get_time and time_in_secs functions!" -#endif - -/* Definitions: COMPILER_VERSION, COMPILER_FLAGS, MEM_LOCATION - Initialize these strings per platform -*/ -#ifndef COMPILER_VERSION - #ifdef __GNUC__ - #define COMPILER_VERSION "GCC"__VERSION__ - #else - #define COMPILER_VERSION "Please put compiler version here (e.g. gcc 4.1)" - #endif -#endif -#ifndef COMPILER_FLAGS - #define COMPILER_FLAGS FLAGS_STR /* "Please put compiler flags here (e.g. -o3)" */ -#endif -#ifndef MEM_LOCATION - #define MEM_LOCATION "Please put data memory location here\n\t\t\t(e.g. code in flash, data on heap etc)" - #define MEM_LOCATION_UNSPEC 1 -#endif - -/* Data Types: - To avoid compiler issues, define the data types that need ot be used for 8b, 16b and 32b in . - - *Imprtant*: - ee_ptr_int needs to be the data type used to hold pointers, otherwise coremark may fail!!! -*/ -typedef signed short ee_s16; -typedef unsigned short ee_u16; -typedef signed int ee_s32; -typedef double ee_f32; -typedef unsigned char ee_u8; -typedef unsigned int ee_u32; -typedef ee_u32 ee_ptr_int; -typedef size_t ee_size_t; -/* align_mem: - This macro is used to align an offset to point to a 32b value. It is used in the Matrix algorithm to initialize the input memory blocks. -*/ -#define align_mem(x) (void *)(4 + (((ee_ptr_int)(x) - 1) & ~3)) - -/* Configuration: SEED_METHOD - Defines method to get seed values that cannot be computed at compile time. - - Valid values: - SEED_ARG - from command line. - SEED_FUNC - from a system function. - SEED_VOLATILE - from volatile variables. -*/ -#ifndef SEED_METHOD -#define SEED_METHOD SEED_ARG -#endif - -/* Configuration: MEM_METHOD - Defines method to get a block of memry. - - Valid values: - MEM_MALLOC - for platforms that implement malloc and have malloc.h. - MEM_STATIC - to use a static memory array. - MEM_STACK - to allocate the data block on the stack (NYI). -*/ -#ifndef MEM_METHOD -#define MEM_METHOD MEM_MALLOC -#endif - -/* Configuration: MULTITHREAD - Define for parallel execution - - Valid values: - 1 - only one context (default). - N>1 - will execute N copies in parallel. - - Note: - If this flag is defined to more then 1, an implementation for launching parallel contexts must be defined. - - Two sample implementations are provided. Use or to enable them. - - It is valid to have a different implementation of and in , - to fit a particular architecture. -*/ -#ifndef MULTITHREAD -#define MULTITHREAD 1 -#endif - -/* Configuration: USE_PTHREAD - Sample implementation for launching parallel contexts - This implementation uses pthread_thread_create and pthread_join. - - Valid values: - 0 - Do not use pthreads API. - 1 - Use pthreads API - - Note: - This flag only matters if MULTITHREAD has been defined to a value greater then 1. -*/ -#ifndef USE_PTHREAD -#define USE_PTHREAD 0 -#endif - -/* Configuration: USE_FORK - Sample implementation for launching parallel contexts - This implementation uses fork, waitpid, shmget,shmat and shmdt. - - Valid values: - 0 - Do not use fork API. - 1 - Use fork API - - Note: - This flag only matters if MULTITHREAD has been defined to a value greater then 1. -*/ -#ifndef USE_FORK -#define USE_FORK 0 -#endif - -/* Configuration: USE_SOCKET - Sample implementation for launching parallel contexts - This implementation uses fork, socket, sendto and recvfrom - - Valid values: - 0 - Do not use fork and sockets API. - 1 - Use fork and sockets API - - Note: - This flag only matters if MULTITHREAD has been defined to a value greater then 1. -*/ -#ifndef USE_SOCKET -#define USE_SOCKET 0 -#endif - -/* Configuration: MAIN_HAS_NOARGC - Needed if platform does not support getting arguments to main. - - Valid values: - 0 - argc/argv to main is supported - 1 - argc/argv to main is not supported -*/ -#ifndef MAIN_HAS_NOARGC -#define MAIN_HAS_NOARGC 0 -#endif - -/* Configuration: MAIN_HAS_NORETURN - Needed if platform does not support returning a value from main. - - Valid values: - 0 - main returns an int, and return value will be 0. - 1 - platform does not support returning a value from main -*/ -#ifndef MAIN_HAS_NORETURN -#define MAIN_HAS_NORETURN 0 -#endif - -/* Variable: default_num_contexts - Number of contexts to spawn in multicore context. - Override this global value to change number of contexts used. - - Note: - This value may not be set higher then the define. - - To experiment, you can set the define to the highest value expected, and use argc/argv in the to set this value from the command line. -*/ -extern ee_u32 default_num_contexts; - -#if (MULTITHREAD>1) -#if USE_PTHREAD - #include - #define PARALLEL_METHOD "PThreads" -#elif USE_FORK - #include - #include - #include - #include - #include /* for memcpy */ - #define PARALLEL_METHOD "Fork" -#elif USE_SOCKET - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #define PARALLEL_METHOD "Sockets" -#else - #define PARALLEL_METHOD "Proprietary" - #error "Please implement multicore functionality in core_portme.c to use multiple contexts." -#endif /* Method for multithreading */ -#endif /* MULTITHREAD > 1 */ - -typedef struct CORE_PORTABLE_S { -#if (MULTITHREAD>1) - #if USE_PTHREAD - pthread_t thread; - #elif USE_FORK - pid_t pid; - int shmid; - void *shm; - #elif USE_SOCKET - pid_t pid; - int sock; - struct sockaddr_in sa; - #endif /* Method for multithreading */ -#endif /* MULTITHREAD>1 */ - ee_u8 portable_id; -} core_portable; - -/* target specific init/fini */ -void portable_init(core_portable *p, int *argc, char *argv[]); -void portable_fini(core_portable *p); - -#if (SEED_METHOD==SEED_VOLATILE) - #if (VALIDATION_RUN || PERFORMANCE_RUN || PROFILE_RUN) - #define RUN_TYPE_FLAG 1 - #else - #if (TOTAL_DATA_SIZE==1200) - #define PROFILE_RUN 1 - #else - #define PERFORMANCE_RUN 1 - #endif - #endif -#endif /* SEED_METHOD==SEED_VOLATILE */ - -#endif /* CORE_PORTME_H */ diff --git a/tests/riscv-coremark/extraPortmes/cygwin/core_portme.mak b/tests/riscv-coremark/extraPortmes/cygwin/core_portme.mak deleted file mode 100644 index 97b6d6ace..000000000 --- a/tests/riscv-coremark/extraPortmes/cygwin/core_portme.mak +++ /dev/null @@ -1,17 +0,0 @@ -# Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# Original Author: Shay Gal-on - -include posix/core_portme.mak diff --git a/tests/riscv-coremark/extraPortmes/linux/core_portme.c b/tests/riscv-coremark/extraPortmes/linux/core_portme.c deleted file mode 100755 index 6b63610d1..000000000 --- a/tests/riscv-coremark/extraPortmes/linux/core_portme.c +++ /dev/null @@ -1,338 +0,0 @@ -/* -Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Original Author: Shay Gal-on -*/ - -#include -#include -#include "coremark.h" -#if CALLGRIND_RUN -#include -#endif - -#if (MEM_METHOD==MEM_MALLOC) -#include -/* Function: portable_malloc - Provide malloc() functionality in a platform specific way. -*/ -void *portable_malloc(size_t size) { - return malloc(size); -} -/* Function: portable_free - Provide free() functionality in a platform specific way. -*/ -void portable_free(void *p) { - free(p); -} -#else -void *portable_malloc(size_t size) { - return NULL; -} -void portable_free(void *p) { - p=NULL; -} -#endif - -#if (SEED_METHOD==SEED_VOLATILE) -#if VALIDATION_RUN - volatile ee_s32 seed1_volatile=0x3415; - volatile ee_s32 seed2_volatile=0x3415; - volatile ee_s32 seed3_volatile=0x66; -#endif -#if PERFORMANCE_RUN - volatile ee_s32 seed1_volatile=0x0; - volatile ee_s32 seed2_volatile=0x0; - volatile ee_s32 seed3_volatile=0x66; -#endif -#if PROFILE_RUN - volatile ee_s32 seed1_volatile=0x8; - volatile ee_s32 seed2_volatile=0x8; - volatile ee_s32 seed3_volatile=0x8; -#endif - volatile ee_s32 seed4_volatile=ITERATIONS; - volatile ee_s32 seed5_volatile=0; -#endif -/* Porting: Timing functions - How to capture time and convert to seconds must be ported to whatever is supported by the platform. - e.g. Read value from on board RTC, read value from cpu clock cycles performance counter etc. - Sample implementation for standard time.h and windows.h definitions included. -*/ -/* Define: TIMER_RES_DIVIDER - Divider to trade off timer resolution and total time that can be measured. - - Use lower values to increase resolution, but make sure that overflow does not occur. - If there are issues with the return value overflowing, increase this value. - */ -#if USE_CLOCK - #define NSECS_PER_SEC CLOCKS_PER_SEC - #define EE_TIMER_TICKER_RATE 1000 - #define CORETIMETYPE clock_t - #define GETMYTIME(_t) (*_t=clock()) - #define MYTIMEDIFF(fin,ini) ((fin)-(ini)) - #define TIMER_RES_DIVIDER 1 - #define SAMPLE_TIME_IMPLEMENTATION 1 -#elif defined(_MSC_VER) - #define NSECS_PER_SEC 10000000 - #define EE_TIMER_TICKER_RATE 1000 - #define CORETIMETYPE FILETIME - #define GETMYTIME(_t) GetSystemTimeAsFileTime(_t) - #define MYTIMEDIFF(fin,ini) (((*(__int64*)&fin)-(*(__int64*)&ini))/TIMER_RES_DIVIDER) - /* setting to millisces resolution by default with MSDEV */ - #ifndef TIMER_RES_DIVIDER - #define TIMER_RES_DIVIDER 1000 - #endif - #define SAMPLE_TIME_IMPLEMENTATION 1 -#elif HAS_TIME_H - #define NSECS_PER_SEC 1000000000 - #define EE_TIMER_TICKER_RATE 1000 - #define CORETIMETYPE struct timespec - #define GETMYTIME(_t) clock_gettime(CLOCK_REALTIME,_t) - #define MYTIMEDIFF(fin,ini) ((fin.tv_sec-ini.tv_sec)*(NSECS_PER_SEC/TIMER_RES_DIVIDER)+(fin.tv_nsec-ini.tv_nsec)/TIMER_RES_DIVIDER) - /* setting to 1/1000 of a second resolution by default with linux */ - #ifndef TIMER_RES_DIVIDER - #define TIMER_RES_DIVIDER 1000000 - #endif - #define SAMPLE_TIME_IMPLEMENTATION 1 -#else - #define SAMPLE_TIME_IMPLEMENTATION 0 -#endif -#define EE_TICKS_PER_SEC (NSECS_PER_SEC / TIMER_RES_DIVIDER) - -#if SAMPLE_TIME_IMPLEMENTATION -/** Define Host specific (POSIX), or target specific global time variables. */ -static CORETIMETYPE start_time_val, stop_time_val; - -/* Function: start_time - This function will be called right before starting the timed portion of the benchmark. - - Implementation may be capturing a system timer (as implemented in the example code) - or zeroing some system parameters - e.g. setting the cpu clocks cycles to 0. -*/ -void start_time(void) { - GETMYTIME(&start_time_val ); -#if CALLGRIND_RUN - CALLGRIND_START_INSTRUMENTATION -#endif -#if MICA - asm volatile("int3");/*1 */ -#endif -} -/* Function: stop_time - This function will be called right after ending the timed portion of the benchmark. - - Implementation may be capturing a system timer (as implemented in the example code) - or other system parameters - e.g. reading the current value of cpu cycles counter. -*/ -void stop_time(void) { -#if CALLGRIND_RUN - CALLGRIND_STOP_INSTRUMENTATION -#endif -#if MICA - asm volatile("int3");/*1 */ -#endif - GETMYTIME(&stop_time_val ); -} -/* Function: get_time - Return an abstract "ticks" number that signifies time on the system. - - Actual value returned may be cpu cycles, milliseconds or any other value, - as long as it can be converted to seconds by . - This methodology is taken to accomodate any hardware or simulated platform. - The sample implementation returns millisecs by default, - and the resolution is controlled by -*/ -CORE_TICKS get_time(void) { - CORE_TICKS elapsed=(CORE_TICKS)(MYTIMEDIFF(stop_time_val, start_time_val)); - return elapsed; -} -/* Function: time_in_secs - Convert the value returned by get_time to seconds. - - The type is used to accomodate systems with no support for floating point. - Default implementation implemented by the EE_TICKS_PER_SEC macro above. -*/ -secs_ret time_in_secs(CORE_TICKS ticks) { - secs_ret retval=((secs_ret)ticks) / (secs_ret)EE_TICKS_PER_SEC; - return retval; -} -#else -#error "Please implement timing functionality in core_portme.c" -#endif /* SAMPLE_TIME_IMPLEMENTATION */ - -ee_u32 default_num_contexts=MULTITHREAD; - -/* Function: portable_init - Target specific initialization code - Test for some common mistakes. -*/ -void portable_init(core_portable *p, int *argc, char *argv[]) -{ -#if PRINT_ARGS - int i; - for (i=0; i<*argc; i++) { - ee_printf("Arg[%d]=%s\n",i,argv[i]); - } -#endif - if (sizeof(ee_ptr_int) != sizeof(ee_u8 *)) { - ee_printf("ERROR! Please define ee_ptr_int to a type that holds a pointer!\n"); - } - if (sizeof(ee_u32) != 4) { - ee_printf("ERROR! Please define ee_u32 to a 32b unsigned type!\n"); - } -#if (MAIN_HAS_NOARGC && (SEED_METHOD==SEED_ARG)) - ee_printf("ERROR! Main has no argc, but SEED_METHOD defined to SEED_ARG!\n"); -#endif - -#if (MULTITHREAD>1) && (SEED_METHOD==SEED_ARG) - { - int nargs=*argc,i; - if ((nargs>1) && (*argv[1]=='M')) { - default_num_contexts=parseval(argv[1]+1); - if (default_num_contexts>MULTITHREAD) - default_num_contexts=MULTITHREAD; - /* Shift args since first arg is directed to the portable part and not to coremark main */ - --nargs; - for (i=1; i*/ - p->portable_id=1; -} -/* Function: portable_fini - Target specific final code -*/ -void portable_fini(core_portable *p) -{ - p->portable_id=0; -} - -#if (MULTITHREAD>1) - -/* Function: core_start_parallel - Start benchmarking in a parallel context. - - Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets. - Other implementations using MCAPI or other standards can easily be devised. -*/ -/* Function: core_stop_parallel - Stop a parallel context execution of coremark, and gather the results. - - Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets. - Other implementations using MCAPI or other standards can easily be devised. -*/ -#if USE_PTHREAD -ee_u8 core_start_parallel(core_results *res) { - return (ee_u8)pthread_create(&(res->port.thread),NULL,iterate,(void *)res); -} -ee_u8 core_stop_parallel(core_results *res) { - void *retval; - return (ee_u8)pthread_join(res->port.thread,&retval); -} -#elif USE_FORK -static int key_id=0; -ee_u8 core_start_parallel(core_results *res) { - key_t key=4321+key_id; - key_id++; - res->port.pid=fork(); - res->port.shmid=shmget(key, 8, IPC_CREAT | 0666); - if (res->port.shmid<0) { - ee_printf("ERROR in shmget!\n"); - } - if (res->port.pid==0) { - iterate(res); - res->port.shm=shmat(res->port.shmid, NULL, 0); - /* copy the validation values to the shared memory area and quit*/ - if (res->port.shm == (char *) -1) { - ee_printf("ERROR in child shmat!\n"); - } else { - memcpy(res->port.shm,&(res->crc),8); - shmdt(res->port.shm); - } - exit(0); - } - return 1; -} -ee_u8 core_stop_parallel(core_results *res) { - int status; - pid_t wpid = waitpid(res->port.pid,&status,WUNTRACED); - if (wpid != res->port.pid) { - ee_printf("ERROR waiting for child.\n"); - if (errno == ECHILD) ee_printf("errno=No such child %d\n",res->port.pid); - if (errno == EINTR) ee_printf("errno=Interrupted\n"); - return 0; - } - /* after process is done, get the values from the shared memory area */ - res->port.shm=shmat(res->port.shmid, NULL, 0); - if (res->port.shm == (char *) -1) { - ee_printf("ERROR in parent shmat!\n"); - return 0; - } - memcpy(&(res->crc),res->port.shm,8); - shmdt(res->port.shm); - return 1; -} -#elif USE_SOCKET -static int key_id=0; -ee_u8 core_start_parallel(core_results *res) { - int bound, buffer_length=8; - res->port.sa.sin_family = AF_INET; - res->port.sa.sin_addr.s_addr = htonl(0x7F000001); - res->port.sa.sin_port = htons(7654+key_id); - key_id++; - res->port.pid=fork(); - if (res->port.pid==0) { /* benchmark child */ - iterate(res); - res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); - if (-1 == res->port.sock) /* if socket failed to initialize, exit */ { - ee_printf("Error Creating Socket"); - } else { - int bytes_sent = sendto(res->port.sock, &(res->crc), buffer_length, 0,(struct sockaddr*)&(res->port.sa), sizeof (struct sockaddr_in)); - if (bytes_sent < 0) - ee_printf("Error sending packet: %s\n", strerror(errno)); - close(res->port.sock); /* close the socket */ - } - exit(0); - } - /* parent process, open the socket */ - res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); - bound = bind(res->port.sock,(struct sockaddr*)&(res->port.sa), sizeof(struct sockaddr)); - if (bound < 0) - ee_printf("bind(): %s\n",strerror(errno)); - return 1; -} -ee_u8 core_stop_parallel(core_results *res) { - int status; - int fromlen=sizeof(struct sockaddr); - int recsize = recvfrom(res->port.sock, &(res->crc), 8, 0, (struct sockaddr*)&(res->port.sa), &fromlen); - if (recsize < 0) { - ee_printf("Error in receive: %s\n", strerror(errno)); - return 0; - } - pid_t wpid = waitpid(res->port.pid,&status,WUNTRACED); - if (wpid != res->port.pid) { - ee_printf("ERROR waiting for child.\n"); - if (errno == ECHILD) ee_printf("errno=No such child %d\n",res->port.pid); - if (errno == EINTR) ee_printf("errno=Interrupted\n"); - return 0; - } - return 1; -} -#else /* no standard multicore implementation */ -#error "Please implement multicore functionality in core_portme.c to use multiple contexts." -#endif /* multithread implementations */ -#endif diff --git a/tests/riscv-coremark/extraPortmes/linux/core_portme.h b/tests/riscv-coremark/extraPortmes/linux/core_portme.h deleted file mode 100755 index 2cf4659a4..000000000 --- a/tests/riscv-coremark/extraPortmes/linux/core_portme.h +++ /dev/null @@ -1,290 +0,0 @@ -/* -Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Original Author: Shay Gal-on -*/ - -#ifndef CORE_PORTME_H -#define CORE_PORTME_H -/************************/ -/* Data types and settings */ -/************************/ -/* Configuration: HAS_FLOAT - Define to 1 if the platform supports floating point. -*/ -#ifndef HAS_FLOAT -#define HAS_FLOAT 1 -#endif -/* Configuration: HAS_TIME_H - Define to 1 if platform has the time.h header file, - and implementation of functions thereof. -*/ -#ifndef HAS_TIME_H -#define HAS_TIME_H 1 -#endif -/* Configuration: USE_CLOCK - Define to 1 if platform has the time.h header file, - and implementation of functions thereof. -*/ -#ifndef USE_CLOCK -#define USE_CLOCK 0 -#endif -/* Configuration: HAS_STDIO - Define to 1 if the platform has stdio.h. -*/ -#ifndef HAS_STDIO -#define HAS_STDIO 1 -#endif -/* Configuration: HAS_PRINTF - Define to 1 if the platform has stdio.h and implements the printf function. -*/ -#ifndef HAS_PRINTF -#define HAS_PRINTF 1 -#endif - -/* Configuration: CORE_TICKS - Define type of return from the timing functions. - */ -#if defined(_MSC_VER) -#include -typedef size_t CORE_TICKS; -#elif HAS_TIME_H -#include -typedef clock_t CORE_TICKS; -#else -#error "Please define type of CORE_TICKS and implement start_time, end_time get_time and time_in_secs functions!" -#endif - -/* Definitions: COMPILER_VERSION, COMPILER_FLAGS, MEM_LOCATION - Initialize these strings per platform -*/ -#ifndef COMPILER_VERSION - #ifdef __GNUC__ - #define COMPILER_VERSION "GCC"__VERSION__ - #else - #define COMPILER_VERSION "Please put compiler version here (e.g. gcc 4.1)" - #endif -#endif -#ifndef COMPILER_FLAGS - #define COMPILER_FLAGS FLAGS_STR /* "Please put compiler flags here (e.g. -o3)" */ -#endif -#ifndef MEM_LOCATION - #define MEM_LOCATION "Please put data memory location here\n\t\t\t(e.g. code in flash, data on heap etc)" - #define MEM_LOCATION_UNSPEC 1 -#endif - -/* Data Types: - To avoid compiler issues, define the data types that need ot be used for 8b, 16b and 32b in . - - *Imprtant*: - ee_ptr_int needs to be the data type used to hold pointers, otherwise coremark may fail!!! -*/ -typedef signed short ee_s16; -typedef unsigned short ee_u16; -typedef signed int ee_s32; -typedef double ee_f32; -typedef unsigned char ee_u8; -typedef unsigned int ee_u32; -typedef ee_u32 ee_ptr_int; -typedef size_t ee_size_t; -/* align_mem: - This macro is used to align an offset to point to a 32b value. It is used in the Matrix algorithm to initialize the input memory blocks. -*/ -#define align_mem(x) (void *)(4 + (((ee_ptr_int)(x) - 1) & ~3)) - -/* Configuration: SEED_METHOD - Defines method to get seed values that cannot be computed at compile time. - - Valid values: - SEED_ARG - from command line. - SEED_FUNC - from a system function. - SEED_VOLATILE - from volatile variables. -*/ -#ifndef SEED_METHOD -#define SEED_METHOD SEED_ARG -#endif - -/* Configuration: MEM_METHOD - Defines method to get a block of memry. - - Valid values: - MEM_MALLOC - for platforms that implement malloc and have malloc.h. - MEM_STATIC - to use a static memory array. - MEM_STACK - to allocate the data block on the stack (NYI). -*/ -#ifndef MEM_METHOD -#define MEM_METHOD MEM_MALLOC -#endif - -/* Configuration: MULTITHREAD - Define for parallel execution - - Valid values: - 1 - only one context (default). - N>1 - will execute N copies in parallel. - - Note: - If this flag is defined to more then 1, an implementation for launching parallel contexts must be defined. - - Two sample implementations are provided. Use or to enable them. - - It is valid to have a different implementation of and in , - to fit a particular architecture. -*/ -#ifndef MULTITHREAD -#define MULTITHREAD 1 -#endif - -/* Configuration: USE_PTHREAD - Sample implementation for launching parallel contexts - This implementation uses pthread_thread_create and pthread_join. - - Valid values: - 0 - Do not use pthreads API. - 1 - Use pthreads API - - Note: - This flag only matters if MULTITHREAD has been defined to a value greater then 1. -*/ -#ifndef USE_PTHREAD -#define USE_PTHREAD 0 -#endif - -/* Configuration: USE_FORK - Sample implementation for launching parallel contexts - This implementation uses fork, waitpid, shmget,shmat and shmdt. - - Valid values: - 0 - Do not use fork API. - 1 - Use fork API - - Note: - This flag only matters if MULTITHREAD has been defined to a value greater then 1. -*/ -#ifndef USE_FORK -#define USE_FORK 0 -#endif - -/* Configuration: USE_SOCKET - Sample implementation for launching parallel contexts - This implementation uses fork, socket, sendto and recvfrom - - Valid values: - 0 - Do not use fork and sockets API. - 1 - Use fork and sockets API - - Note: - This flag only matters if MULTITHREAD has been defined to a value greater then 1. -*/ -#ifndef USE_SOCKET -#define USE_SOCKET 0 -#endif - -/* Configuration: MAIN_HAS_NOARGC - Needed if platform does not support getting arguments to main. - - Valid values: - 0 - argc/argv to main is supported - 1 - argc/argv to main is not supported -*/ -#ifndef MAIN_HAS_NOARGC -#define MAIN_HAS_NOARGC 0 -#endif - -/* Configuration: MAIN_HAS_NORETURN - Needed if platform does not support returning a value from main. - - Valid values: - 0 - main returns an int, and return value will be 0. - 1 - platform does not support returning a value from main -*/ -#ifndef MAIN_HAS_NORETURN -#define MAIN_HAS_NORETURN 0 -#endif - -/* Variable: default_num_contexts - Number of contexts to spawn in multicore context. - Override this global value to change number of contexts used. - - Note: - This value may not be set higher then the define. - - To experiment, you can set the define to the highest value expected, and use argc/argv in the to set this value from the command line. -*/ -extern ee_u32 default_num_contexts; - -#if (MULTITHREAD>1) -#if USE_PTHREAD - #include - #define PARALLEL_METHOD "PThreads" -#elif USE_FORK - #include - #include - #include - #include - #include /* for memcpy */ - #define PARALLEL_METHOD "Fork" -#elif USE_SOCKET - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #define PARALLEL_METHOD "Sockets" -#else - #define PARALLEL_METHOD "Proprietary" - #error "Please implement multicore functionality in core_portme.c to use multiple contexts." -#endif /* Method for multithreading */ -#endif /* MULTITHREAD > 1 */ - -typedef struct CORE_PORTABLE_S { -#if (MULTITHREAD>1) - #if USE_PTHREAD - pthread_t thread; - #elif USE_FORK - pid_t pid; - int shmid; - void *shm; - #elif USE_SOCKET - pid_t pid; - int sock; - struct sockaddr_in sa; - #endif /* Method for multithreading */ -#endif /* MULTITHREAD>1 */ - ee_u8 portable_id; -} core_portable; - -/* target specific init/fini */ -void portable_init(core_portable *p, int *argc, char *argv[]); -void portable_fini(core_portable *p); - -#if (SEED_METHOD==SEED_VOLATILE) - #if (VALIDATION_RUN || PERFORMANCE_RUN || PROFILE_RUN) - #define RUN_TYPE_FLAG 1 - #else - #if (TOTAL_DATA_SIZE==1200) - #define PROFILE_RUN 1 - #else - #define PERFORMANCE_RUN 1 - #endif - #endif -#endif /* SEED_METHOD==SEED_VOLATILE */ - -#endif /* CORE_PORTME_H */ diff --git a/tests/riscv-coremark/extraPortmes/linux/core_portme.mak b/tests/riscv-coremark/extraPortmes/linux/core_portme.mak deleted file mode 100644 index 97b6d6ace..000000000 --- a/tests/riscv-coremark/extraPortmes/linux/core_portme.mak +++ /dev/null @@ -1,17 +0,0 @@ -# Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# Original Author: Shay Gal-on - -include posix/core_portme.mak diff --git a/tests/riscv-coremark/extraPortmes/linux64/core_portme.c b/tests/riscv-coremark/extraPortmes/linux64/core_portme.c deleted file mode 100755 index fe8d29983..000000000 --- a/tests/riscv-coremark/extraPortmes/linux64/core_portme.c +++ /dev/null @@ -1,336 +0,0 @@ -/* -Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Original Author: Shay Gal-on -*/ - -#include -#include -#include "coremark.h" -#if CALLGRIND_RUN -#include -#endif - -#if (MEM_METHOD==MEM_MALLOC) -#include -/* Function: portable_malloc - Provide malloc() functionality in a platform specific way. -*/ -void *portable_malloc(size_t size) { - return malloc(size); -} -/* Function: portable_free - Provide free() functionality in a platform specific way. -*/ -void portable_free(void *p) { - free(p); -} -#else -void *portable_malloc(size_t size) { - return NULL; -} -void portable_free(void *p) { - p=NULL; -} -#endif - -#if (SEED_METHOD==SEED_VOLATILE) -#if VALIDATION_RUN - volatile ee_s32 seed1_volatile=0x3415; - volatile ee_s32 seed2_volatile=0x3415; - volatile ee_s32 seed3_volatile=0x66; -#endif -#if PERFORMANCE_RUN - volatile ee_s32 seed1_volatile=0x0; - volatile ee_s32 seed2_volatile=0x0; - volatile ee_s32 seed3_volatile=0x66; -#endif -#if PROFILE_RUN - volatile ee_s32 seed1_volatile=0x8; - volatile ee_s32 seed2_volatile=0x8; - volatile ee_s32 seed3_volatile=0x8; -#endif - volatile ee_s32 seed4_volatile=ITERATIONS; - volatile ee_s32 seed5_volatile=0; -#endif -/* Porting: Timing functions - How to capture time and convert to seconds must be ported to whatever is supported by the platform. - e.g. Read value from on board RTC, read value from cpu clock cycles performance counter etc. - Sample implementation for standard time.h and windows.h definitions included. -*/ -/* Define: TIMER_RES_DIVIDER - Divider to trade off timer resolution and total time that can be measured. - - Use lower values to increase resolution, but make sure that overflow does not occur. - If there are issues with the return value overflowing, increase this value. - */ -#if USE_CLOCK - #define NSECS_PER_SEC CLOCKS_PER_SEC - #define EE_TIMER_TICKER_RATE 1000 - #define CORETIMETYPE clock_t - #define GETMYTIME(_t) (*_t=clock()) - #define MYTIMEDIFF(fin,ini) ((fin)-(ini)) - #define TIMER_RES_DIVIDER 1 - #define SAMPLE_TIME_IMPLEMENTATION 1 -#elif defined(_MSC_VER) - #define NSECS_PER_SEC 10000000 - #define EE_TIMER_TICKER_RATE 1000 - #define CORETIMETYPE FILETIME - #define GETMYTIME(_t) GetSystemTimeAsFileTime(_t) - #define MYTIMEDIFF(fin,ini) (((*(__int64*)&fin)-(*(__int64*)&ini))/TIMER_RES_DIVIDER) - /* setting to millisces resolution by default with MSDEV */ - #ifndef TIMER_RES_DIVIDER - #define TIMER_RES_DIVIDER 1000 - #endif - #define SAMPLE_TIME_IMPLEMENTATION 1 -#elif HAS_TIME_H - #define NSECS_PER_SEC 1000000000 - #define EE_TIMER_TICKER_RATE 1000 - #define CORETIMETYPE struct timespec - #define GETMYTIME(_t) clock_gettime(CLOCK_REALTIME,_t) - #define MYTIMEDIFF(fin,ini) ((fin.tv_sec-ini.tv_sec)*(NSECS_PER_SEC/TIMER_RES_DIVIDER)+(fin.tv_nsec-ini.tv_nsec)/TIMER_RES_DIVIDER) - /* setting to 1/1000 of a second resolution by default with linux */ - #ifndef TIMER_RES_DIVIDER - #define TIMER_RES_DIVIDER 1000000 - #endif - #define SAMPLE_TIME_IMPLEMENTATION 1 -#else - #define SAMPLE_TIME_IMPLEMENTATION 0 -#endif -#define EE_TICKS_PER_SEC (NSECS_PER_SEC / TIMER_RES_DIVIDER) - -#if SAMPLE_TIME_IMPLEMENTATION -/** Define Host specific (POSIX), or target specific global time variables. */ -static CORETIMETYPE start_time_val, stop_time_val; - -/* Function: start_time - This function will be called right before starting the timed portion of the benchmark. - - Implementation may be capturing a system timer (as implemented in the example code) - or zeroing some system parameters - e.g. setting the cpu clocks cycles to 0. -*/ -void start_time(void) { - GETMYTIME(&start_time_val ); -#if CALLGRIND_RUN - CALLGRIND_START_INSTRUMENTATION -#endif -#if MICA - asm volatile("int3");/*1 */ -#endif -} -/* Function: stop_time - This function will be called right after ending the timed portion of the benchmark. - - Implementation may be capturing a system timer (as implemented in the example code) - or other system parameters - e.g. reading the current value of cpu cycles counter. -*/ -void stop_time(void) { -#if CALLGRIND_RUN - CALLGRIND_STOP_INSTRUMENTATION -#endif -#if MICA - asm volatile("int3");/*1 */ -#endif - GETMYTIME(&stop_time_val ); -} -/* Function: get_time - Return an abstract "ticks" number that signifies time on the system. - - Actual value returned may be cpu cycles, milliseconds or any other value, - as long as it can be converted to seconds by . - This methodology is taken to accomodate any hardware or simulated platform. - The sample implementation returns millisecs by default, - and the resolution is controlled by -*/ -CORE_TICKS get_time(void) { - CORE_TICKS elapsed=(CORE_TICKS)(MYTIMEDIFF(stop_time_val, start_time_val)); - return elapsed; -} -/* Function: time_in_secs - Convert the value returned by get_time to seconds. - - The type is used to accomodate systems with no support for floating point. - Default implementation implemented by the EE_TICKS_PER_SEC macro above. -*/ -secs_ret time_in_secs(CORE_TICKS ticks) { - secs_ret retval=((secs_ret)ticks) / (secs_ret)EE_TICKS_PER_SEC; - return retval; -} -#else -#error "Please implement timing functionality in core_portme.c" -#endif /* SAMPLE_TIME_IMPLEMENTATION */ - -ee_u32 default_num_contexts=MULTITHREAD; - -/* Function: portable_init - Target specific initialization code - Test for some common mistakes. -*/ -void portable_init(core_portable *p, int *argc, char *argv[]) -{ -#if PRINT_ARGS - int i; - for (i=0; i<*argc; i++) { - ee_printf("Arg[%d]=%s\n",i,argv[i]); - } -#endif - if (sizeof(ee_ptr_int) != sizeof(ee_u8 *)) { - ee_printf("ERROR! Please define ee_ptr_int to a type that holds a pointer!\n"); - } - if (sizeof(ee_u32) != 4) { - ee_printf("ERROR! Please define ee_u32 to a 32b unsigned type!\n"); - } -#if (MAIN_HAS_NOARGC && (SEED_METHOD==SEED_ARG)) - ee_printf("ERROR! Main has no argc, but SEED_METHOD defined to SEED_ARG!\n"); -#endif - -#if (MULTITHREAD>1) && (SEED_METHOD==SEED_ARG) - int nargs=*argc,i; - if ((nargs>1) && (*argv[1]=='M')) { - default_num_contexts=parseval(argv[1]+1); - if (default_num_contexts>MULTITHREAD) - default_num_contexts=MULTITHREAD; - /* Shift args since first arg is directed to the portable part and not to coremark main */ - --nargs; - for (i=1; i*/ - p->portable_id=1; -} -/* Function: portable_fini - Target specific final code -*/ -void portable_fini(core_portable *p) -{ - p->portable_id=0; -} - -#if (MULTITHREAD>1) - -/* Function: core_start_parallel - Start benchmarking in a parallel context. - - Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets. - Other implementations using MCAPI or other standards can easily be devised. -*/ -/* Function: core_stop_parallel - Stop a parallel context execution of coremark, and gather the results. - - Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets. - Other implementations using MCAPI or other standards can easily be devised. -*/ -#if USE_PTHREAD -ee_u8 core_start_parallel(core_results *res) { - return (ee_u8)pthread_create(&(res->port.thread),NULL,iterate,(void *)res); -} -ee_u8 core_stop_parallel(core_results *res) { - void *retval; - return (ee_u8)pthread_join(res->port.thread,&retval); -} -#elif USE_FORK -static int key_id=0; -ee_u8 core_start_parallel(core_results *res) { - key_t key=4321+key_id; - key_id++; - res->port.pid=fork(); - res->port.shmid=shmget(key, 8, IPC_CREAT | 0666); - if (res->port.shmid<0) { - ee_printf("ERROR in shmget!\n"); - } - if (res->port.pid==0) { - iterate(res); - res->port.shm=shmat(res->port.shmid, NULL, 0); - /* copy the validation values to the shared memory area and quit*/ - if (res->port.shm == (char *) -1) { - ee_printf("ERROR in child shmat!\n"); - } else { - memcpy(res->port.shm,&(res->crc),8); - shmdt(res->port.shm); - } - exit(0); - } - return 1; -} -ee_u8 core_stop_parallel(core_results *res) { - int status; - pid_t wpid = waitpid(res->port.pid,&status,WUNTRACED); - if (wpid != res->port.pid) { - ee_printf("ERROR waiting for child.\n"); - if (errno == ECHILD) ee_printf("errno=No such child %d\n",res->port.pid); - if (errno == EINTR) ee_printf("errno=Interrupted\n"); - return 0; - } - /* after process is done, get the values from the shared memory area */ - res->port.shm=shmat(res->port.shmid, NULL, 0); - if (res->port.shm == (char *) -1) { - ee_printf("ERROR in parent shmat!\n"); - return 0; - } - memcpy(&(res->crc),res->port.shm,8); - shmdt(res->port.shm); - return 1; -} -#elif USE_SOCKET -static int key_id=0; -ee_u8 core_start_parallel(core_results *res) { - int bound, buffer_length=8; - res->port.sa.sin_family = AF_INET; - res->port.sa.sin_addr.s_addr = htonl(0x7F000001); - res->port.sa.sin_port = htons(7654+key_id); - key_id++; - res->port.pid=fork(); - if (res->port.pid==0) { /* benchmark child */ - iterate(res); - res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); - if (-1 == res->port.sock) /* if socket failed to initialize, exit */ { - ee_printf("Error Creating Socket"); - } else { - int bytes_sent = sendto(res->port.sock, &(res->crc), buffer_length, 0,(struct sockaddr*)&(res->port.sa), sizeof (struct sockaddr_in)); - if (bytes_sent < 0) - ee_printf("Error sending packet: %s\n", strerror(errno)); - close(res->port.sock); /* close the socket */ - } - exit(0); - } - /* parent process, open the socket */ - res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); - bound = bind(res->port.sock,(struct sockaddr*)&(res->port.sa), sizeof(struct sockaddr)); - if (bound < 0) - ee_printf("bind(): %s\n",strerror(errno)); - return 1; -} -ee_u8 core_stop_parallel(core_results *res) { - int status; - int fromlen=sizeof(struct sockaddr); - int recsize = recvfrom(res->port.sock, &(res->crc), 8, 0, (struct sockaddr*)&(res->port.sa), &fromlen); - if (recsize < 0) { - ee_printf("Error in receive: %s\n", strerror(errno)); - return 0; - } - pid_t wpid = waitpid(res->port.pid,&status,WUNTRACED); - if (wpid != res->port.pid) { - ee_printf("ERROR waiting for child.\n"); - if (errno == ECHILD) ee_printf("errno=No such child %d\n",res->port.pid); - if (errno == EINTR) ee_printf("errno=Interrupted\n"); - return 0; - } - return 1; -} -#else /* no standard multicore implementation */ -#error "Please implement multicore functionality in core_portme.c to use multiple contexts." -#endif /* multithread implementations */ -#endif diff --git a/tests/riscv-coremark/extraPortmes/linux64/core_portme.h b/tests/riscv-coremark/extraPortmes/linux64/core_portme.h deleted file mode 100755 index 1228a679b..000000000 --- a/tests/riscv-coremark/extraPortmes/linux64/core_portme.h +++ /dev/null @@ -1,291 +0,0 @@ -/* -Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Original Author: Shay Gal-on -*/ - -/* Topic: Description - This file contains configuration constants required to execute on different platforms -*/ -#ifndef CORE_PORTME_H -#define CORE_PORTME_H -/************************/ -/* Data types and settings */ -/************************/ -/* Configuration: HAS_FLOAT - Define to 1 if the platform supports floating point. -*/ -#ifndef HAS_FLOAT -#define HAS_FLOAT 1 -#endif -/* Configuration: HAS_TIME_H - Define to 1 if platform has the time.h header file, - and implementation of functions thereof. -*/ -#ifndef HAS_TIME_H -#define HAS_TIME_H 1 -#endif -/* Configuration: USE_CLOCK - Define to 1 if platform has the time.h header file, - and implementation of functions thereof. -*/ -#ifndef USE_CLOCK -#define USE_CLOCK 0 -#endif -/* Configuration: HAS_STDIO - Define to 1 if the platform has stdio.h. -*/ -#ifndef HAS_STDIO -#define HAS_STDIO 1 -#endif -/* Configuration: HAS_PRINTF - Define to 1 if the platform has stdio.h and implements the printf function. -*/ -#ifndef HAS_PRINTF -#define HAS_PRINTF 1 -#endif - -/* Configuration: CORE_TICKS - Define type of return from the timing functions. - */ -#if defined(_MSC_VER) -#include -typedef size_t CORE_TICKS; -#elif HAS_TIME_H -#include -typedef clock_t CORE_TICKS; -#else -#error "Please define type of CORE_TICKS and implement start_time, end_time get_time and time_in_secs functions!" -#endif - -/* Definitions: COMPILER_VERSION, COMPILER_FLAGS, MEM_LOCATION - Initialize these strings per platform -*/ -#ifndef COMPILER_VERSION - #ifdef __GNUC__ - #define COMPILER_VERSION "GCC"__VERSION__ - #else - #define COMPILER_VERSION "Please put compiler version here (e.g. gcc 4.1)" - #endif -#endif -#ifndef COMPILER_FLAGS - #define COMPILER_FLAGS FLAGS_STR /* "Please put compiler flags here (e.g. -o3)" */ -#endif -#ifndef MEM_LOCATION - #define MEM_LOCATION "Please put data memory location here\n\t\t\t(e.g. code in flash, data on heap etc)" - #define MEM_LOCATION_UNSPEC 1 -#endif - -/* Data Types: - To avoid compiler issues, define the data types that need ot be used for 8b, 16b and 32b in . - - *Imprtant*: - ee_ptr_int needs to be the data type used to hold pointers, otherwise coremark may fail!!! -*/ -typedef signed short ee_s16; -typedef unsigned short ee_u16; -typedef signed int ee_s32; -typedef double ee_f32; -typedef unsigned char ee_u8; -typedef unsigned int ee_u32; -typedef unsigned long long ee_ptr_int; -typedef size_t ee_size_t; -/* align an offset to point to a 32b value */ -#define align_mem(x) (void *)(4 + (((ee_ptr_int)(x) - 1) & ~3)) - -/* Configuration: SEED_METHOD - Defines method to get seed values that cannot be computed at compile time. - - Valid values: - SEED_ARG - from command line. - SEED_FUNC - from a system function. - SEED_VOLATILE - from volatile variables. -*/ -#ifndef SEED_METHOD -#define SEED_METHOD SEED_ARG -#endif - -/* Configuration: MEM_METHOD - Defines method to get a block of memry. - - Valid values: - MEM_MALLOC - for platforms that implement malloc and have malloc.h. - MEM_STATIC - to use a static memory array. - MEM_STACK - to allocate the data block on the stack (NYI). -*/ -#ifndef MEM_METHOD -#define MEM_METHOD MEM_MALLOC -#endif - -/* Configuration: MULTITHREAD - Define for parallel execution - - Valid values: - 1 - only one context (default). - N>1 - will execute N copies in parallel. - - Note: - If this flag is defined to more then 1, an implementation for launching parallel contexts must be defined. - - Two sample implementations are provided. Use or to enable them. - - It is valid to have a different implementation of and in , - to fit a particular architecture. -*/ -#ifndef MULTITHREAD -#define MULTITHREAD 1 -#endif - -/* Configuration: USE_PTHREAD - Sample implementation for launching parallel contexts - This implementation uses pthread_thread_create and pthread_join. - - Valid values: - 0 - Do not use pthreads API. - 1 - Use pthreads API - - Note: - This flag only matters if MULTITHREAD has been defined to a value greater then 1. -*/ -#ifndef USE_PTHREAD -#define USE_PTHREAD 0 -#endif - -/* Configuration: USE_FORK - Sample implementation for launching parallel contexts - This implementation uses fork, waitpid, shmget,shmat and shmdt. - - Valid values: - 0 - Do not use fork API. - 1 - Use fork API - - Note: - This flag only matters if MULTITHREAD has been defined to a value greater then 1. -*/ -#ifndef USE_FORK -#define USE_FORK 0 -#endif - -/* Configuration: USE_SOCKET - Sample implementation for launching parallel contexts - This implementation uses fork, socket, sendto and recvfrom - - Valid values: - 0 - Do not use fork and sockets API. - 1 - Use fork and sockets API - - Note: - This flag only matters if MULTITHREAD has been defined to a value greater then 1. -*/ -#ifndef USE_SOCKET -#define USE_SOCKET 0 -#endif - -/* Configuration: MAIN_HAS_NOARGC - Needed if platform does not support getting arguments to main. - - Valid values: - 0 - argc/argv to main is supported - 1 - argc/argv to main is not supported -*/ -#ifndef MAIN_HAS_NOARGC -#define MAIN_HAS_NOARGC 0 -#endif - -/* Configuration: MAIN_HAS_NORETURN - Needed if platform does not support returning a value from main. - - Valid values: - 0 - main returns an int, and return value will be 0. - 1 - platform does not support returning a value from main -*/ -#ifndef MAIN_HAS_NORETURN -#define MAIN_HAS_NORETURN 0 -#endif - -/* Variable: default_num_contexts - Number of contexts to spawn in multicore context. - Override this global value to change number of contexts used. - - Note: - This value may not be set higher then the define. - - To experiment, you can set the define to the highest value expected, and use argc/argv in the to set this value from the command line. -*/ -extern ee_u32 default_num_contexts; - -#if (MULTITHREAD>1) -#if USE_PTHREAD - #include - #define PARALLEL_METHOD "PThreads" -#elif USE_FORK - #include - #include - #include - #include - #include /* for memcpy */ - #define PARALLEL_METHOD "Fork" -#elif USE_SOCKET - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #define PARALLEL_METHOD "Sockets" -#else - #define PARALLEL_METHOD "Proprietary" - #error "Please implement multicore functionality in core_portme.c to use multiple contexts." -#endif /* Method for multithreading */ -#endif /* MULTITHREAD > 1 */ - -typedef struct CORE_PORTABLE_S { -#if (MULTITHREAD>1) - #if USE_PTHREAD - pthread_t thread; - #elif USE_FORK - pid_t pid; - int shmid; - void *shm; - #elif USE_SOCKET - pid_t pid; - int sock; - struct sockaddr_in sa; - #endif /* Method for multithreading */ -#endif /* MULTITHREAD>1 */ - ee_u8 portable_id; -} core_portable; - -/* target specific init/fini */ -void portable_init(core_portable *p, int *argc, char *argv[]); -void portable_fini(core_portable *p); - -#if (SEED_METHOD==SEED_VOLATILE) - #if (VALIDATION_RUN || PERFORMANCE_RUN || PROFILE_RUN) - #define RUN_TYPE_FLAG 1 - #else - #if (TOTAL_DATA_SIZE==1200) - #define PROFILE_RUN 1 - #else - #define PERFORMANCE_RUN 1 - #endif - #endif -#endif /* SEED_METHOD==SEED_VOLATILE */ - -#endif /* CORE_PORTME_H */ diff --git a/tests/riscv-coremark/extraPortmes/linux64/core_portme.mak b/tests/riscv-coremark/extraPortmes/linux64/core_portme.mak deleted file mode 100755 index 5cfabee32..000000000 --- a/tests/riscv-coremark/extraPortmes/linux64/core_portme.mak +++ /dev/null @@ -1,140 +0,0 @@ -# Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# Original Author: Shay Gal-on - -#File: core_portme.mak - -# Flag: OUTFLAG -# Use this flag to define how to to get an executable (e.g -o) -OUTFLAG= -o -# Flag: CC -# Use this flag to define compiler to use -CC = gcc -# Flag: CFLAGS -# Use this flag to define compiler options. Note, you can add compiler options from the command line using XCFLAGS="other flags" -PORT_CFLAGS = -O2 -FLAGS_STR = "$(PORT_CFLAGS) $(XCFLAGS) $(XLFLAGS) $(LFLAGS_END)" -CFLAGS = $(PORT_CFLAGS) -I$(PORT_DIR) -I. -DFLAGS_STR=\"$(FLAGS_STR)\" -#Flag: LFLAGS_END -# Define any libraries needed for linking or other flags that should come at the end of the link line (e.g. linker scripts). -# Note: On certain platforms, the default clock_gettime implementation is supported but requires linking of librt. -LFLAGS_END += -lrt -# Flag: PORT_SRCS -# Port specific source files can be added here -PORT_SRCS = $(PORT_DIR)/core_portme.c -# Flag: LOAD -# Define this flag if you need to load to a target, as in a cross compile environment. - -# Flag: RUN -# Define this flag if running does not consist of simple invocation of the binary. -# In a cross compile environment, you need to define this. - -#For flashing and using a tera term macro, you could use -#LOAD = flash ADDR -#RUN = ttpmacro coremark.ttl - -#For copying to target and executing via SSH connection, you could use -#LOAD = scp $(OUTFILE) user@target:~ -#RUN = ssh user@target -c - -#For native compilation and execution -LOAD = echo Loading done -RUN = - -OEXT = .o -EXE = .exe - -# Flag: SEPARATE_COMPILE -# Define if you need to separate compilation from link stage. -# In this case, you also need to define below how to create an object file, and how to link. -ifdef SEPARATE_COMPILE - -LD = gcc -OBJOUT = -o -LFLAGS = -OFLAG = -o -COUT = -c -# Flag: PORT_OBJS -# Port specific object files can be added here -PORT_OBJS = $(PORT_DIR)/core_portme$(OEXT) -PORT_CLEAN = *$(OEXT) - -$(OPATH)%$(OEXT) : %.c - $(CC) $(CFLAGS) $(XCFLAGS) $(COUT) $< $(OBJOUT) $@ - -endif - -# Target: port_prebuild -# Generate any files that are needed before actual build starts. -# E.g. generate profile guidance files. Sample PGO generation for gcc enabled with PGO=1 -# - First, check if PGO was defined on the command line, if so, need to add -fprofile-use to compile line. -# - Second, if PGO reference has not yet been generated, add a step to the prebuild that will build a profile-generate version and run it. -# Note - Using REBUILD=1 -# -# Use make PGO=1 to invoke this sample processing. - -ifdef PGO - ifeq (,$(findstring $(PGO),gen)) - PGO_STAGE=build_pgo_gcc - CFLAGS+=-fprofile-use - endif - PORT_CLEAN+=*.gcda *.gcno gmon.out -endif - -.PHONY: port_prebuild -port_prebuild: $(PGO_STAGE) - -.PHONY: build_pgo_gcc -build_pgo_gcc: - $(MAKE) PGO=gen XCFLAGS="$(XCFLAGS) -fprofile-generate -DTOTAL_DATA_SIZE=1200" ITERATIONS=10 gen_pgo_data REBUILD=1 - -# Target: port_postbuild -# Generate any files that are needed after actual build end. -# E.g. change format to srec, bin, zip in order to be able to load into flash -.PHONY: port_postbuild -port_postbuild: - -# Target: port_postrun -# Do platform specific after run stuff. -# E.g. reset the board, backup the logfiles etc. -.PHONY: port_postrun -port_postrun: - -# Target: port_prerun -# Do platform specific after run stuff. -# E.g. reset the board, backup the logfiles etc. -.PHONY: port_prerun -port_prerun: - -# Target: port_postload -# Do platform specific after load stuff. -# E.g. reset the reset power to the flash eraser -.PHONY: port_postload -port_postload: - -# Target: port_preload -# Do platform specific before load stuff. -# E.g. reset the reset power to the flash eraser -.PHONY: port_preload -port_preload: - -# FLAG: OPATH -# Path to the output folder. Default - current folder. -OPATH = ./ -MKDIR = mkdir -p - -# FLAG: PERL -# Define perl executable to calculate the geomean if running separate. -PERL=/usr/bin/perl diff --git a/tests/riscv-coremark/riscv64-baremetal/core_portme.c b/tests/riscv-coremark/riscv64-baremetal/core_portme.c deleted file mode 100755 index c3b30c492..000000000 --- a/tests/riscv-coremark/riscv64-baremetal/core_portme.c +++ /dev/null @@ -1,382 +0,0 @@ -/* -Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Original Author: Shay Gal-on -*/ - -#include -#include -#include "coremark.h" -#if CALLGRIND_RUN -#include -#endif - -#if (MEM_METHOD==MEM_MALLOC) -#include -/* Function: portable_malloc - Provide malloc() functionality in a platform specific way. -*/ -void *portable_malloc(size_t size) { - return malloc(size); -} -/* Function: portable_free - Provide free() functionality in a platform specific way. -*/ -void portable_free(void *p) { - free(p); -} -#else -void *portable_malloc(size_t size) { - return NULL; -} -void portable_free(void *p) { - p=NULL; -} -#endif - -#if (SEED_METHOD==SEED_VOLATILE) -#if VALIDATION_RUN - volatile ee_s32 seed1_volatile=0x3415; - volatile ee_s32 seed2_volatile=0x3415; - volatile ee_s32 seed3_volatile=0x66; -#endif -#if PERFORMANCE_RUN - volatile ee_s32 seed1_volatile=0x0; - volatile ee_s32 seed2_volatile=0x0; - volatile ee_s32 seed3_volatile=0x66; -#endif -#if PROFILE_RUN - volatile ee_s32 seed1_volatile=0x8; - volatile ee_s32 seed2_volatile=0x8; - volatile ee_s32 seed3_volatile=0x8; -#endif - volatile ee_s32 seed4_volatile=ITERATIONS; - volatile ee_s32 seed5_volatile=0; -#endif -/* Porting: Timing functions - How to capture time and convert to seconds must be ported to whatever is supported by the platform. - e.g. Read value from on board RTC, read value from cpu clock cycles performance counter etc. - Sample implementation for standard time.h and windows.h definitions included. -*/ -/* Define: TIMER_RES_DIVIDER - Divider to trade off timer resolution and total time that can be measured. - - Use lower values to increase resolution, but make sure that overflow does not occur. - If there are issues with the return value overflowing, increase this value. - */ -#if USE_CLOCK - #define NSECS_PER_SEC CLOCKS_PER_SEC - #define EE_TIMER_TICKER_RATE 1000 - #define CORETIMETYPE clock_t - #define GETMYTIME(_t) (*_t=clock()) - #define MYTIMEDIFF(fin,ini) ((fin)-(ini)) - #define TIMER_RES_DIVIDER 1 - #define SAMPLE_TIME_IMPLEMENTATION 1 -#elif defined(_MSC_VER) - #define NSECS_PER_SEC 10000000 - #define EE_TIMER_TICKER_RATE 1000 - #define CORETIMETYPE FILETIME - #define GETMYTIME(_t) GetSystemTimeAsFileTime(_t) - #define MYTIMEDIFF(fin,ini) (((*(__int64*)&fin)-(*(__int64*)&ini))/TIMER_RES_DIVIDER) - /* setting to millisces resolution by default with MSDEV */ - #ifndef TIMER_RES_DIVIDER - #define TIMER_RES_DIVIDER 1000 - #endif - #define SAMPLE_TIME_IMPLEMENTATION 1 -#elif HAS_TIME_H - #define NSECS_PER_SEC 1000000000 - #define EE_TIMER_TICKER_RATE 1000 - #define CORETIMETYPE struct timespec - #define GETMYTIME(_t) clock_gettime(CLOCK_REALTIME,_t) - #define MYTIMEDIFF(fin,ini) ((fin.tv_sec-ini.tv_sec)*(NSECS_PER_SEC/TIMER_RES_DIVIDER)+(fin.tv_nsec-ini.tv_nsec)/TIMER_RES_DIVIDER) - /* setting to 1/1000 of a second resolution by default with linux */ - #ifndef TIMER_RES_DIVIDER - #define TIMER_RES_DIVIDER 1000000 - #endif - #define SAMPLE_TIME_IMPLEMENTATION 1 -#else - // Defined for RISCV - #define NSECS_PER_SEC 1000000000 // TODO: What freq are we assuming? - #define EE_TIMER_TICKER_RATE 1000 // TODO: What is this? - #define CORETIMETYPE clock_t - #define read_csr(reg) ({ unsigned long __tmp; \ - asm volatile ("csrr %0, " #reg : "=r"(__tmp)); \ - __tmp; }) - #define GETMYTIME(_t) (_t = *(volatile unsigned long long*)0x0200BFF8) - #define MYTIMEDIFF(fin,ini) ((fin)-(ini)) - // Changing TIMER_RES_DIVIDER to 1000000 sets EE_TICKS_PER_SEC to 1000 (now counting ticks per ms) - #define TIMER_RES_DIVIDER 10000 - #define SAMPLE_TIME_IMPLEMENTATION 1 -#endif -#define EE_TICKS_PER_SEC (NSECS_PER_SEC / TIMER_RES_DIVIDER) - -#if SAMPLE_TIME_IMPLEMENTATION -/** Define Host specific (POSIX), or target specific global time variables. */ -static CORETIMETYPE start_time_val, stop_time_val; -static unsigned long start_instr_val, stop_instr_val; - -/* Function: minstretFunc - This function will count the number of instructions. -*/ -unsigned long minstretFunc(void) -{ - unsigned long minstretRead = read_csr(minstret); - //ee_printf("Minstret is %lu\n", minstretRead); - return minstretRead; -} - -/* Function: minstretDiff - This function will take the difference between the first and second reads from the - MINSTRET csr to determine the number of machine instructions retired between two points - of time -*/ -unsigned long minstretDiff(void) -{ - unsigned long minstretDifference = MYTIMEDIFF(stop_instr_val, start_instr_val); - return minstretDifference; -} - -/* Function: start_time - This function will be called right before starting the timed portion of the benchmark. - - Implementation may be capturing a system timer (as implemented in the example code) - or zeroing some system parameters - e.g. setting the cpu clocks cycles to 0. -*/ -void start_time(void) { - start_instr_val = minstretFunc(); - GETMYTIME(start_time_val); - //ee_printf("Timer started\n"); - //ee_printf(" MTIME: %u\n", start_time_val); -#if CALLGRIND_RUN - CALLGRIND_START_INSTRUMENTATION -#endif -#if MICA - asm volatile("int3");/*1 */ -#endif -} -/* Function: stop_time - This function will be called right after ending the timed portion of the benchmark. - - Implementation may be capturing a system timer (as implemented in the example code) - or other system parameters - e.g. reading the current value of cpu cycles counter. -*/ -void stop_time(void) { -#if CALLGRIND_RUN - CALLGRIND_STOP_INSTRUMENTATION -#endif -#if MICA - asm volatile("int3");/*1 */ -#endif - GETMYTIME(stop_time_val); - stop_instr_val = minstretFunc(); - //ee_printf("Timer stopped\n"); - //ee_printf(" MTIME: %u\n", stop_time_val); -} -/* Function: get_time - Return an abstract "ticks" number that signifies time on the system. - - Actual value returned may be cpu cycles, milliseconds or any other value, - as long as it can be converted to seconds by . - This methodology is taken to accomodate any hardware or simulated platform. - The sample implementation returns millisecs by default, - and the resolution is controlled by -*/ -CORE_TICKS get_time(void) { - CORE_TICKS elapsed=(CORE_TICKS)(MYTIMEDIFF(stop_time_val, start_time_val)); - unsigned long instructions = minstretDiff(); - double CPI = elapsed / instructions; - ee_printf(" Elapsed MTIME: %u\n", elapsed); - ee_printf(" Elapsed MINSTRET: %lu\n", instructions); - ee_printf(" CPI: %lf", CPI); - return elapsed; -} -/* Function: time_in_secs - Convert the value returned by get_time to seconds. - - The type is used to accomodate systems with no support for floating point. - Default implementation implemented by the EE_TICKS_PER_SEC macro above. -*/ -secs_ret time_in_secs(CORE_TICKS ticks) { - secs_ret retval=((secs_ret)ticks) / (secs_ret)EE_TICKS_PER_SEC; - int retvalint = (int)retval; - //ee_printf("RETURN VALUE FROM TIME IN SECS FUNCTION: %d\n", retvalint); - return retval; -} -#else -#error "Please implement timing functionality in core_portme.c" -#endif /* SAMPLE_TIME_IMPLEMENTATION */ - -ee_u32 default_num_contexts = MULTITHREAD; - -/* Function: portable_init - Target specific initialization code - Test for some common mistakes. -*/ -void portable_init(core_portable *p, int *argc, char *argv[]) -{ -#if PRINT_ARGS - int i; - for (i=0; i<*argc; i++) { - ee_printf("Arg[%d]=%s\n",i,argv[i]); - } -#endif - if (sizeof(ee_ptr_int) != sizeof(ee_u8 *)) { - ee_printf("ERROR! Please define ee_ptr_int to a type that holds a pointer!\n"); - } - if (sizeof(ee_u32) != 4) { - ee_printf("ERROR! Please define ee_u32 to a 32b unsigned type!\n"); - } -#if (MAIN_HAS_NOARGC && (SEED_METHOD==SEED_ARG)) - ee_printf("ERROR! Main has no argc, but SEED_METHOD defined to SEED_ARG!\n"); -#endif - -#if (MULTITHREAD>1) && (SEED_METHOD==SEED_ARG) - int nargs=*argc,i; - if ((nargs>1) && (*argv[1]=='M')) { - default_num_contexts=parseval(argv[1]+1); - if (default_num_contexts>MULTITHREAD) - default_num_contexts=MULTITHREAD; - /* Shift args since first arg is directed to the portable part and not to coremark main */ - --nargs; - for (i=1; i*/ - p->portable_id=1; -} -/* Function: portable_fini - Target specific final code -*/ -void portable_fini(core_portable *p) -{ - p->portable_id=0; -} - -#if (MULTITHREAD>1) - -/* Function: core_start_parallel - Start benchmarking in a parallel context. - - Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets. - Other implementations using MCAPI or other standards can easily be devised. -*/ -/* Function: core_stop_parallel - Stop a parallel context execution of coremark, and gather the results. - - Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets. - Other implementations using MCAPI or other standards can easily be devised. -*/ -#if USE_PTHREAD -ee_u8 core_start_parallel(core_results *res) { - return (ee_u8)pthread_create(&(res->port.thread),NULL,iterate,(void *)res); -} -ee_u8 core_stop_parallel(core_results *res) { - void *retval; - return (ee_u8)pthread_join(res->port.thread,&retval); -} -#elif USE_FORK -static int key_id=0; -ee_u8 core_start_parallel(core_results *res) { - key_t key=4321+key_id; - key_id++; - res->port.pid=fork(); - res->port.shmid=shmget(key, 8, IPC_CREAT | 0666); - if (res->port.shmid<0) { - ee_printf("ERROR in shmget!\n"); - } - if (res->port.pid==0) { - iterate(res); - res->port.shm=shmat(res->port.shmid, NULL, 0); - /* copy the validation values to the shared memory area and quit*/ - if (res->port.shm == (char *) -1) { - ee_printf("ERROR in child shmat!\n"); - } else { - memcpy(res->port.shm,&(res->crc),8); - shmdt(res->port.shm); - } - exit(0); - } - return 1; -} -ee_u8 core_stop_parallel(core_results *res) { - int status; - pid_t wpid = waitpid(res->port.pid,&status,WUNTRACED); - if (wpid != res->port.pid) { - ee_printf("ERROR waiting for child.\n"); - if (errno == ECHILD) ee_printf("errno=No such child %d\n",res->port.pid); - if (errno == EINTR) ee_printf("errno=Interrupted\n"); - return 0; - } - /* after process is done, get the values from the shared memory area */ - res->port.shm=shmat(res->port.shmid, NULL, 0); - if (res->port.shm == (char *) -1) { - ee_printf("ERROR in parent shmat!\n"); - return 0; - } - memcpy(&(res->crc),res->port.shm,8); - shmdt(res->port.shm); - return 1; -} -#elif USE_SOCKET -static int key_id=0; -ee_u8 core_start_parallel(core_results *res) { - int bound, buffer_length=8; - res->port.sa.sin_family = AF_INET; - res->port.sa.sin_addr.s_addr = htonl(0x7F000001); - res->port.sa.sin_port = htons(7654+key_id); - key_id++; - res->port.pid=fork(); - if (res->port.pid==0) { /* benchmark child */ - iterate(res); - res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); - if (-1 == res->port.sock) /* if socket failed to initialize, exit */ { - ee_printf("Error Creating Socket"); - } else { - int bytes_sent = sendto(res->port.sock, &(res->crc), buffer_length, 0,(struct sockaddr*)&(res->port.sa), sizeof (struct sockaddr_in)); - if (bytes_sent < 0) - ee_printf("Error sending packet: %s\n", strerror(errno)); - close(res->port.sock); /* close the socket */ - } - exit(0); - } - /* parent process, open the socket */ - res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); - bound = bind(res->port.sock,(struct sockaddr*)&(res->port.sa), sizeof(struct sockaddr)); - if (bound < 0) - ee_printf("bind(): %s\n",strerror(errno)); - return 1; -} -ee_u8 core_stop_parallel(core_results *res) { - int status; - int fromlen=sizeof(struct sockaddr); - int recsize = recvfrom(res->port.sock, &(res->crc), 8, 0, (struct sockaddr*)&(res->port.sa), &fromlen); - if (recsize < 0) { - ee_printf("Error in receive: %s\n", strerror(errno)); - return 0; - } - pid_t wpid = waitpid(res->port.pid,&status,WUNTRACED); - if (wpid != res->port.pid) { - ee_printf("ERROR waiting for child.\n"); - if (errno == ECHILD) ee_printf("errno=No such child %d\n",res->port.pid); - if (errno == EINTR) ee_printf("errno=Interrupted\n"); - return 0; - } - return 1; -} -#else /* no standard multicore implementation */ -#error "Please implement multicore functionality in core_portme.c to use multiple contexts." -#endif /* multithread implementations */ -#endif diff --git a/tests/riscv-coremark/riscv64-baremetal/core_portme.h b/tests/riscv-coremark/riscv64-baremetal/core_portme.h deleted file mode 100755 index ef26e88ad..000000000 --- a/tests/riscv-coremark/riscv64-baremetal/core_portme.h +++ /dev/null @@ -1,296 +0,0 @@ -/* -Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Original Author: Shay Gal-on -*/ - -/* Topic: Description - This file contains configuration constants required to execute on different platforms -*/ -#ifndef CORE_PORTME_H -#define CORE_PORTME_H -/************************/ -/* Data types and settings */ -/************************/ -/* Configuration: HAS_FLOAT - Define to 1 if the platform supports floating point. -*/ -#ifndef HAS_FLOAT -#define HAS_FLOAT 1 -#endif -/* Configuration: HAS_TIME_H - Define to 1 if platform has the time.h header file, - and implementation of functions thereof. -*/ -#ifndef HAS_TIME_H -#define HAS_TIME_H 0 -#endif -/* Configuration: USE_CLOCK - Define to 1 if platform has the time.h header file, - and implementation of functions thereof. -*/ -#ifndef USE_CLOCK -#define USE_CLOCK 0 -#endif -/* Configuration: HAS_STDIO - Define to 1 if the platform has stdio.h. -*/ -#ifndef HAS_STDIO -#define HAS_STDIO 1 -#endif -/* Configuration: HAS_PRINTF - Define to 1 if the platform has stdio.h and implements the printf function. -*/ -#ifndef HAS_PRINTF -#define HAS_PRINTF 1 -#endif - -/* Configuration: CORE_TICKS - Define type of return from the timing functions. - */ -#if defined(_MSC_VER) -#include -typedef size_t CORE_TICKS; -#elif HAS_TIME_H -#include -typedef clock_t CORE_TICKS; -#else -/* Configuration: size_t and clock_t - Note these need to match the size of the clock output and the xLen the processor supports - */ -typedef unsigned long int size_t; -typedef unsigned long int clock_t; -typedef clock_t CORE_TICKS; -#endif - -/* Definitions: COMPILER_VERSION, COMPILER_FLAGS, MEM_LOCATION - Initialize these strings per platform -*/ -#ifndef COMPILER_VERSION - #ifdef __GNUC__ - #define COMPILER_VERSION "GCC"__VERSION__ - #else - #define COMPILER_VERSION "Please put compiler version here (e.g. gcc 4.1)" - #endif -#endif -#ifndef COMPILER_FLAGS - #define COMPILER_FLAGS FLAGS_STR /* "Please put compiler flags here (e.g. -o3)" */ -#endif -#ifndef MEM_LOCATION - #define MEM_LOCATION "Please put data memory location here\n\t\t\t(e.g. code in flash, data on heap etc)" - #define MEM_LOCATION_UNSPEC 1 -#endif - -/* Data Types: - To avoid compiler issues, define the data types that need ot be used for 8b, 16b and 32b in . - - *Imprtant*: - ee_ptr_int needs to be the data type used to hold pointers, otherwise coremark may fail!!! -*/ -typedef signed short ee_s16; -typedef unsigned short ee_u16; -typedef signed int ee_s32; -typedef double ee_f32; -typedef unsigned char ee_u8; -typedef unsigned int ee_u32; -typedef unsigned long long ee_ptr_int; -typedef size_t ee_size_t; -/* align an offset to point to a 32b value */ -#define align_mem(x) (void *)(4 + (((ee_ptr_int)(x) - 1) & ~3)) - -/* Configuration: SEED_METHOD - Defines method to get seed values that cannot be computed at compile time. - - Valid values: - SEED_ARG - from command line. - SEED_FUNC - from a system function. - SEED_VOLATILE - from volatile variables. -*/ -#ifndef SEED_METHOD -#define SEED_METHOD SEED_VOLATILE -#endif - -/* Configuration: MEM_METHOD - Defines method to get a block of memry. - - Valid values: - MEM_MALLOC - for platforms that implement malloc and have malloc.h. - MEM_STATIC - to use a static memory array. - MEM_STACK - to allocate the data block on the stack (NYI). -*/ -#ifndef MEM_METHOD -#define MEM_METHOD MEM_STATIC -#endif - -/* Configuration: MULTITHREAD - Define for parallel execution - - Valid values: - 1 - only one context (default). - N>1 - will execute N copies in parallel. - - Note: - If this flag is defined to more then 1, an implementation for launching parallel contexts must be defined. - - Two sample implementations are provided. Use or to enable them. - - It is valid to have a different implementation of and in , - to fit a particular architecture. -*/ -#ifndef MULTITHREAD -#define MULTITHREAD 1 -#endif - -/* Configuration: USE_PTHREAD - Sample implementation for launching parallel contexts - This implementation uses pthread_thread_create and pthread_join. - - Valid values: - 0 - Do not use pthreads API. - 1 - Use pthreads API - - Note: - This flag only matters if MULTITHREAD has been defined to a value greater then 1. -*/ -#ifndef USE_PTHREAD -#define USE_PTHREAD 0 -#endif - -/* Configuration: USE_FORK - Sample implementation for launching parallel contexts - This implementation uses fork, waitpid, shmget,shmat and shmdt. - - Valid values: - 0 - Do not use fork API. - 1 - Use fork API - - Note: - This flag only matters if MULTITHREAD has been defined to a value greater then 1. -*/ -#ifndef USE_FORK -#define USE_FORK 0 -#endif - -/* Configuration: USE_SOCKET - Sample implementation for launching parallel contexts - This implementation uses fork, socket, sendto and recvfrom - - Valid values: - 0 - Do not use fork and sockets API. - 1 - Use fork and sockets API - - Note: - This flag only matters if MULTITHREAD has been defined to a value greater then 1. -*/ -#ifndef USE_SOCKET -#define USE_SOCKET 0 -#endif - -/* Configuration: MAIN_HAS_NOARGC - Needed if platform does not support getting arguments to main. - - Valid values: - 0 - argc/argv to main is supported - 1 - argc/argv to main is not supported -*/ -#ifndef MAIN_HAS_NOARGC -#define MAIN_HAS_NOARGC 1 -#endif - -/* Configuration: MAIN_HAS_NORETURN - Needed if platform does not support returning a value from main. - - Valid values: - 0 - main returns an int, and return value will be 0. - 1 - platform does not support returning a value from main -*/ -#ifndef MAIN_HAS_NORETURN -#define MAIN_HAS_NORETURN 0 -#endif - -/* Variable: default_num_contexts - Number of contexts to spawn in multicore context. - Override this global value to change number of contexts used. - - Note: - This value may not be set higher then the define. - - To experiment, you can set the define to the highest value expected, and use argc/argv in the to set this value from the command line. -*/ -extern ee_u32 default_num_contexts; - -#if (MULTITHREAD>1) -#if USE_PTHREAD - #include - #define PARALLEL_METHOD "PThreads" -#elif USE_FORK - #include - #include - #include - #include - #include /* for memcpy */ - #define PARALLEL_METHOD "Fork" -#elif USE_SOCKET - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #define PARALLEL_METHOD "Sockets" -#else - #define PARALLEL_METHOD "Proprietary" - #error "Please implement multicore functionality in core_portme.c to use multiple contexts." -#endif /* Method for multithreading */ -#endif /* MULTITHREAD > 1 */ - -typedef struct CORE_PORTABLE_S { -#if (MULTITHREAD>1) - #if USE_PTHREAD - pthread_t thread; - #elif USE_FORK - pid_t pid; - int shmid; - void *shm; - #elif USE_SOCKET - pid_t pid; - int sock; - struct sockaddr_in sa; - #endif /* Method for multithreading */ -#endif /* MULTITHREAD>1 */ - ee_u8 portable_id; -} core_portable; - -/* target specific init/fini */ -void portable_init(core_portable *p, int *argc, char *argv[]); -void portable_fini(core_portable *p); - -#if (SEED_METHOD==SEED_VOLATILE) - #if (VALIDATION_RUN || PERFORMANCE_RUN || PROFILE_RUN) - #define RUN_TYPE_FLAG 1 - #else - #if (TOTAL_DATA_SIZE==1200) - #define PROFILE_RUN 1 - #else - #define PERFORMANCE_RUN 1 - #endif - #endif -#endif /* SEED_METHOD==SEED_VOLATILE */ - -#endif /* CORE_PORTME_H */ diff --git a/tests/riscv-coremark/riscv64-baremetal/core_portme.mak b/tests/riscv-coremark/riscv64-baremetal/core_portme.mak deleted file mode 100755 index 8600ce0a0..000000000 --- a/tests/riscv-coremark/riscv64-baremetal/core_portme.mak +++ /dev/null @@ -1,147 +0,0 @@ -# Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# Original Author: Shay Gal-on - -#File: core_portme.mak - -# Flag: RISCVTOOLS -# Use this flag to point to your RISCV tools -RISCVTOOLS=$(RISCV) -# Flag: RISCVTYPE -# Type of toolchain to use -RISCVTYPE=riscv64-unknown-elf -# Flag: OUTFLAG -# Use this flag to define how to to get an executable (e.g -o) -OUTFLAG= -o -# Flag: CC -# Use this flag to define compiler to use -CC = $(RISCVTOOLS)/bin/$(RISCVTYPE)-gcc -# Flag: CFLAGS -# Use this flag to define compiler options. Note, you can add compiler options from the command line using XCFLAGS="other flags" -#PORT_CFLAGS = -O2 -static -std=gnu99 -PORT_CFLAGS = -O2 -mcmodel=medany -static -fno-tree-loop-distribute-patterns -std=gnu99 -fno-common -nostartfiles -lm -lgcc -T $(PORT_DIR)/link.ld -FLAGS_STR = "$(PORT_CFLAGS) $(XCFLAGS) $(XLFLAGS) $(LFLAGS_END)" -CFLAGS = $(PORT_CFLAGS) -I$(PORT_DIR) -I. -DFLAGS_STR=\"$(FLAGS_STR)\" -#Flag: LFLAGS_END -# Define any libraries needed for linking or other flags that should come at the end of the link line (e.g. linker scripts). -# Note: On certain platforms, the default clock_gettime implementation is supported but requires linking of librt. -LFLAGS_END += -# Flag: PORT_SRCS -# Port specific source files can be added here -PORT_SRCS = $(PORT_DIR)/core_portme.c $(PORT_DIR)/syscalls.c $(PORT_DIR)/crt.S -# Flag: LOAD -# Define this flag if you need to load to a target, as in a cross compile environment. - -# Flag: RUN -# Define this flag if running does not consist of simple invocation of the binary. -# In a cross compile environment, you need to define this. - -#For flashing and using a tera term macro, you could use -#LOAD = flash ADDR -#RUN = ttpmacro coremark.ttl - -#For copying to target and executing via SSH connection, you could use -#LOAD = scp $(OUTFILE) user@target:~ -#RUN = ssh user@target -c - -#For native compilation and execution -LOAD = echo Loading done -RUN = spike pk - -OEXT = .o -EXE = .bare.riscv - -# Flag: SEPARATE_COMPILE -# Define if you need to separate compilation from link stage. -# In this case, you also need to define below how to create an object file, and how to link. -ifdef SEPARATE_COMPILE - -LD = $(RISCVTOOLS)/bin/$(RISCVTYPE)-gcc -OBJOUT = -o -LFLAGS = -OFLAG = -o -COUT = -c -# Flag: PORT_OBJS -# Port specific object files can be added here -PORT_OBJS = $(PORT_DIR)/core_portme$(OEXT) -PORT_CLEAN = *$(OEXT) - -$(OPATH)%$(OEXT) : %.c - $(CC) $(CFLAGS) $(XCFLAGS) $(COUT) $< $(OBJOUT) $@ - -endif - -# Target: port_prebuild -# Generate any files that are needed before actual build starts. -# E.g. generate profile guidance files. Sample PGO generation for gcc enabled with PGO=1 -# - First, check if PGO was defined on the command line, if so, need to add -fprofile-use to compile line. -# - Second, if PGO reference has not yet been generated, add a step to the prebuild that will build a profile-generate version and run it. -# Note - Using REBUILD=1 -# -# Use make PGO=1 to invoke this sample processing. - -ifdef PGO - ifeq (,$(findstring $(PGO),gen)) - PGO_STAGE=build_pgo_gcc - CFLAGS+=-fprofile-use - endif - PORT_CLEAN+=*.gcda *.gcno gmon.out -endif - -.PHONY: port_prebuild -port_prebuild: $(PGO_STAGE) - -.PHONY: build_pgo_gcc -build_pgo_gcc: - $(MAKE) PGO=gen XCFLAGS="$(XCFLAGS) -fprofile-generate -DTOTAL_DATA_SIZE=1200" ITERATIONS=10 gen_pgo_data REBUILD=1 - -# Target: port_postbuild -# Generate any files that are needed after actual build end. -# E.g. change format to srec, bin, zip in order to be able to load into flash -.PHONY: port_postbuild -port_postbuild: - -# Target: port_postrun -# Do platform specific after run stuff. -# E.g. reset the board, backup the logfiles etc. -.PHONY: port_postrun -port_postrun: - -# Target: port_prerun -# Do platform specific after run stuff. -# E.g. reset the board, backup the logfiles etc. -.PHONY: port_prerun -port_prerun: - -# Target: port_postload -# Do platform specific after load stuff. -# E.g. reset the reset power to the flash eraser -.PHONY: port_postload -port_postload: - -# Target: port_preload -# Do platform specific before load stuff. -# E.g. reset the reset power to the flash eraser -.PHONY: port_preload -port_preload: - -# FLAG: OPATH -# Path to the output folder. Default - current folder. -OPATH = ./ -MKDIR = mkdir -p - -# FLAG: PERL -# Define perl executable to calculate the geomean if running separate. -PERL=/usr/bin/perl diff --git a/tests/riscv-coremark/riscv64-baremetal/crt.S b/tests/riscv-coremark/riscv64-baremetal/crt.S deleted file mode 100644 index d75e81e06..000000000 --- a/tests/riscv-coremark/riscv64-baremetal/crt.S +++ /dev/null @@ -1,237 +0,0 @@ -# See LICENSE for license details. - -#include "encoding.h" - -#if __riscv_xlen == 64 -# define LREG ld -# define SREG sd -# define REGBYTES 8 -#else -# define LREG lw -# define SREG sw -# define REGBYTES 4 -#endif - - .section ".text.init" - .globl _start -_start: - li x1, 0 - li x2, 0 - li x3, 0 - li x4, 0 - li x5, 0 - li x6, 0 - li x7, 0 - li x8, 0 - li x9, 0 - li x10,0 - li x11,0 - li x12,0 - li x13,0 - li x14,0 - li x15,0 - li x16,0 - li x17,0 - li x18,0 - li x19,0 - li x20,0 - li x21,0 - li x22,0 - li x23,0 - li x24,0 - li x25,0 - li x26,0 - li x27,0 - li x28,0 - li x29,0 - li x30,0 - li x31,0 - - # enable FPU and accelerator if present - li t0, MSTATUS_FS | MSTATUS_XS - csrs mstatus, t0 - - # make sure XLEN agrees with compilation choice - li t0, 1 - slli t0, t0, 31 -#if __riscv_xlen == 64 - bgez t0, 1f -#else - bltz t0, 1f -#endif -2: - li a0, 1 - sw a0, tohost, t0 - j 2b -1: - -#ifdef __riscv_flen - # initialize FPU if we have one - la t0, 1f - csrw mtvec, t0 - - fssr x0 - fmv.s.x f0, x0 - fmv.s.x f1, x0 - fmv.s.x f2, x0 - fmv.s.x f3, x0 - fmv.s.x f4, x0 - fmv.s.x f5, x0 - fmv.s.x f6, x0 - fmv.s.x f7, x0 - fmv.s.x f8, x0 - fmv.s.x f9, x0 - fmv.s.x f10,x0 - fmv.s.x f11,x0 - fmv.s.x f12,x0 - fmv.s.x f13,x0 - fmv.s.x f14,x0 - fmv.s.x f15,x0 - fmv.s.x f16,x0 - fmv.s.x f17,x0 - fmv.s.x f18,x0 - fmv.s.x f19,x0 - fmv.s.x f20,x0 - fmv.s.x f21,x0 - fmv.s.x f22,x0 - fmv.s.x f23,x0 - fmv.s.x f24,x0 - fmv.s.x f25,x0 - fmv.s.x f26,x0 - fmv.s.x f27,x0 - fmv.s.x f28,x0 - fmv.s.x f29,x0 - fmv.s.x f30,x0 - fmv.s.x f31,x0 -1: -#endif - - # initialize trap vector - la t0, trap_entry - csrw mtvec, t0 - - # initialize global pointer -.option push -.option norelax - la gp, __global_pointer$ -.option pop - - la tp, _end + 63 - and tp, tp, -64 - - # get core id - csrr a0, mhartid - # for now, assume only 1 core - li a1, 1 -1:bgeu a0, a1, 1b - - # give each core 128KB of stack + TLS -#define STKSHIFT 17 - sll a2, a0, STKSHIFT - add tp, tp, a2 - add sp, a0, 1 - sll sp, sp, STKSHIFT - add sp, sp, tp - - j _init - - .align 2 -trap_entry: - addi sp, sp, -272 - - SREG x1, 1*REGBYTES(sp) - SREG x2, 2*REGBYTES(sp) - SREG x3, 3*REGBYTES(sp) - SREG x4, 4*REGBYTES(sp) - SREG x5, 5*REGBYTES(sp) - SREG x6, 6*REGBYTES(sp) - SREG x7, 7*REGBYTES(sp) - SREG x8, 8*REGBYTES(sp) - SREG x9, 9*REGBYTES(sp) - SREG x10, 10*REGBYTES(sp) - SREG x11, 11*REGBYTES(sp) - SREG x12, 12*REGBYTES(sp) - SREG x13, 13*REGBYTES(sp) - SREG x14, 14*REGBYTES(sp) - SREG x15, 15*REGBYTES(sp) - SREG x16, 16*REGBYTES(sp) - SREG x17, 17*REGBYTES(sp) - SREG x18, 18*REGBYTES(sp) - SREG x19, 19*REGBYTES(sp) - SREG x20, 20*REGBYTES(sp) - SREG x21, 21*REGBYTES(sp) - SREG x22, 22*REGBYTES(sp) - SREG x23, 23*REGBYTES(sp) - SREG x24, 24*REGBYTES(sp) - SREG x25, 25*REGBYTES(sp) - SREG x26, 26*REGBYTES(sp) - SREG x27, 27*REGBYTES(sp) - SREG x28, 28*REGBYTES(sp) - SREG x29, 29*REGBYTES(sp) - SREG x30, 30*REGBYTES(sp) - SREG x31, 31*REGBYTES(sp) - - csrr a0, mcause - csrr a1, mepc - mv a2, sp - jal handle_trap - csrw mepc, a0 - - # Remain in M-mode after eret - li t0, MSTATUS_MPP - csrs mstatus, t0 - - LREG x1, 1*REGBYTES(sp) - LREG x2, 2*REGBYTES(sp) - LREG x3, 3*REGBYTES(sp) - LREG x4, 4*REGBYTES(sp) - LREG x5, 5*REGBYTES(sp) - LREG x6, 6*REGBYTES(sp) - LREG x7, 7*REGBYTES(sp) - LREG x8, 8*REGBYTES(sp) - LREG x9, 9*REGBYTES(sp) - LREG x10, 10*REGBYTES(sp) - LREG x11, 11*REGBYTES(sp) - LREG x12, 12*REGBYTES(sp) - LREG x13, 13*REGBYTES(sp) - LREG x14, 14*REGBYTES(sp) - LREG x15, 15*REGBYTES(sp) - LREG x16, 16*REGBYTES(sp) - LREG x17, 17*REGBYTES(sp) - LREG x18, 18*REGBYTES(sp) - LREG x19, 19*REGBYTES(sp) - LREG x20, 20*REGBYTES(sp) - LREG x21, 21*REGBYTES(sp) - LREG x22, 22*REGBYTES(sp) - LREG x23, 23*REGBYTES(sp) - LREG x24, 24*REGBYTES(sp) - LREG x25, 25*REGBYTES(sp) - LREG x26, 26*REGBYTES(sp) - LREG x27, 27*REGBYTES(sp) - LREG x28, 28*REGBYTES(sp) - LREG x29, 29*REGBYTES(sp) - LREG x30, 30*REGBYTES(sp) - LREG x31, 31*REGBYTES(sp) - - addi sp, sp, 272 - mret - -.section ".tdata.begin" -.globl _tdata_begin -_tdata_begin: - -.section ".tdata.end" -.globl _tdata_end -_tdata_end: - -.section ".tbss.end" -.globl _tbss_end -_tbss_end: - -.section ".tohost","aw",@progbits -.align 6 -.globl tohost -tohost: .dword 0 -.align 6 -.globl fromhost -fromhost: .dword 0 diff --git a/tests/riscv-coremark/riscv64-baremetal/encoding.h b/tests/riscv-coremark/riscv64-baremetal/encoding.h deleted file mode 100644 index c109ce189..000000000 --- a/tests/riscv-coremark/riscv64-baremetal/encoding.h +++ /dev/null @@ -1,1471 +0,0 @@ -// See LICENSE for license details. - -#ifndef RISCV_CSR_ENCODING_H -#define RISCV_CSR_ENCODING_H - -#define MSTATUS_UIE 0x00000001 -#define MSTATUS_SIE 0x00000002 -#define MSTATUS_HIE 0x00000004 -#define MSTATUS_MIE 0x00000008 -#define MSTATUS_UPIE 0x00000010 -#define MSTATUS_SPIE 0x00000020 -#define MSTATUS_HPIE 0x00000040 -#define MSTATUS_MPIE 0x00000080 -#define MSTATUS_SPP 0x00000100 -#define MSTATUS_HPP 0x00000600 -#define MSTATUS_MPP 0x00001800 -#define MSTATUS_FS 0x00006000 -#define MSTATUS_XS 0x00018000 -#define MSTATUS_MPRV 0x00020000 -#define MSTATUS_SUM 0x00040000 -#define MSTATUS_MXR 0x00080000 -#define MSTATUS_TVM 0x00100000 -#define MSTATUS_TW 0x00200000 -#define MSTATUS_TSR 0x00400000 -#define MSTATUS32_SD 0x80000000 -#define MSTATUS_UXL 0x0000000300000000 -#define MSTATUS_SXL 0x0000000C00000000 -#define MSTATUS64_SD 0x8000000000000000 - -#define SSTATUS_UIE 0x00000001 -#define SSTATUS_SIE 0x00000002 -#define SSTATUS_UPIE 0x00000010 -#define SSTATUS_SPIE 0x00000020 -#define SSTATUS_SPP 0x00000100 -#define SSTATUS_FS 0x00006000 -#define SSTATUS_XS 0x00018000 -#define SSTATUS_SUM 0x00040000 -#define SSTATUS_MXR 0x00080000 -#define SSTATUS32_SD 0x80000000 -#define SSTATUS_UXL 0x0000000300000000 -#define SSTATUS64_SD 0x8000000000000000 - -#define DCSR_XDEBUGVER (3U<<30) -#define DCSR_NDRESET (1<<29) -#define DCSR_FULLRESET (1<<28) -#define DCSR_EBREAKM (1<<15) -#define DCSR_EBREAKH (1<<14) -#define DCSR_EBREAKS (1<<13) -#define DCSR_EBREAKU (1<<12) -#define DCSR_STOPCYCLE (1<<10) -#define DCSR_STOPTIME (1<<9) -#define DCSR_CAUSE (7<<6) -#define DCSR_DEBUGINT (1<<5) -#define DCSR_HALT (1<<3) -#define DCSR_STEP (1<<2) -#define DCSR_PRV (3<<0) - -#define DCSR_CAUSE_NONE 0 -#define DCSR_CAUSE_SWBP 1 -#define DCSR_CAUSE_HWBP 2 -#define DCSR_CAUSE_DEBUGINT 3 -#define DCSR_CAUSE_STEP 4 -#define DCSR_CAUSE_HALT 5 - -#define MCONTROL_TYPE(xlen) (0xfULL<<((xlen)-4)) -#define MCONTROL_DMODE(xlen) (1ULL<<((xlen)-5)) -#define MCONTROL_MASKMAX(xlen) (0x3fULL<<((xlen)-11)) - -#define MCONTROL_SELECT (1<<19) -#define MCONTROL_TIMING (1<<18) -#define MCONTROL_ACTION (0x3f<<12) -#define MCONTROL_CHAIN (1<<11) -#define MCONTROL_MATCH (0xf<<7) -#define MCONTROL_M (1<<6) -#define MCONTROL_H (1<<5) -#define MCONTROL_S (1<<4) -#define MCONTROL_U (1<<3) -#define MCONTROL_EXECUTE (1<<2) -#define MCONTROL_STORE (1<<1) -#define MCONTROL_LOAD (1<<0) - -#define MCONTROL_TYPE_NONE 0 -#define MCONTROL_TYPE_MATCH 2 - -#define MCONTROL_ACTION_DEBUG_EXCEPTION 0 -#define MCONTROL_ACTION_DEBUG_MODE 1 -#define MCONTROL_ACTION_TRACE_START 2 -#define MCONTROL_ACTION_TRACE_STOP 3 -#define MCONTROL_ACTION_TRACE_EMIT 4 - -#define MCONTROL_MATCH_EQUAL 0 -#define MCONTROL_MATCH_NAPOT 1 -#define MCONTROL_MATCH_GE 2 -#define MCONTROL_MATCH_LT 3 -#define MCONTROL_MATCH_MASK_LOW 4 -#define MCONTROL_MATCH_MASK_HIGH 5 - -#define MIP_SSIP (1 << IRQ_S_SOFT) -#define MIP_HSIP (1 << IRQ_H_SOFT) -#define MIP_MSIP (1 << IRQ_M_SOFT) -#define MIP_STIP (1 << IRQ_S_TIMER) -#define MIP_HTIP (1 << IRQ_H_TIMER) -#define MIP_MTIP (1 << IRQ_M_TIMER) -#define MIP_SEIP (1 << IRQ_S_EXT) -#define MIP_HEIP (1 << IRQ_H_EXT) -#define MIP_MEIP (1 << IRQ_M_EXT) - -#define SIP_SSIP MIP_SSIP -#define SIP_STIP MIP_STIP - -#define PRV_U 0 -#define PRV_S 1 -#define PRV_H 2 -#define PRV_M 3 - -#define SATP32_MODE 0x80000000 -#define SATP32_ASID 0x7FC00000 -#define SATP32_PPN 0x003FFFFF -#define SATP64_MODE 0xF000000000000000 -#define SATP64_ASID 0x0FFFF00000000000 -#define SATP64_PPN 0x00000FFFFFFFFFFF - -#define SATP_MODE_OFF 0 -#define SATP_MODE_SV32 1 -#define SATP_MODE_SV39 8 -#define SATP_MODE_SV48 9 -#define SATP_MODE_SV57 10 -#define SATP_MODE_SV64 11 - -#define PMP_R 0x01 -#define PMP_W 0x02 -#define PMP_X 0x04 -#define PMP_A 0x18 -#define PMP_L 0x80 -#define PMP_SHIFT 2 - -#define PMP_TOR 0x08 -#define PMP_NA4 0x10 -#define PMP_NAPOT 0x18 - -#define IRQ_S_SOFT 1 -#define IRQ_H_SOFT 2 -#define IRQ_M_SOFT 3 -#define IRQ_S_TIMER 5 -#define IRQ_H_TIMER 6 -#define IRQ_M_TIMER 7 -#define IRQ_S_EXT 9 -#define IRQ_H_EXT 10 -#define IRQ_M_EXT 11 -#define IRQ_COP 12 -#define IRQ_HOST 13 - -#define DEFAULT_RSTVEC 0x00001000 -#define CLINT_BASE 0x02000000 -#define CLINT_SIZE 0x000c0000 -#define EXT_IO_BASE 0x40000000 -#define DRAM_BASE 0x80000000 - -// page table entry (PTE) fields -#define PTE_V 0x001 // Valid -#define PTE_R 0x002 // Read -#define PTE_W 0x004 // Write -#define PTE_X 0x008 // Execute -#define PTE_U 0x010 // User -#define PTE_G 0x020 // Global -#define PTE_A 0x040 // Accessed -#define PTE_D 0x080 // Dirty -#define PTE_SOFT 0x300 // Reserved for Software - -#define PTE_PPN_SHIFT 10 - -#define PTE_TABLE(PTE) (((PTE) & (PTE_V | PTE_R | PTE_W | PTE_X)) == PTE_V) - -#ifdef __riscv - -#if __riscv_xlen == 64 -# define MSTATUS_SD MSTATUS64_SD -# define SSTATUS_SD SSTATUS64_SD -# define RISCV_PGLEVEL_BITS 9 -# define SATP_MODE SATP64_MODE -#else -# define MSTATUS_SD MSTATUS32_SD -# define SSTATUS_SD SSTATUS32_SD -# define RISCV_PGLEVEL_BITS 10 -# define SATP_MODE SATP32_MODE -#endif -#define RISCV_PGSHIFT 12 -#define RISCV_PGSIZE (1 << RISCV_PGSHIFT) - -#ifndef __ASSEMBLER__ - -#ifdef __GNUC__ - -#define read_csr(reg) ({ unsigned long __tmp; \ - asm volatile ("csrr %0, " #reg : "=r"(__tmp)); \ - __tmp; }) - -#define write_csr(reg, val) ({ \ - asm volatile ("csrw " #reg ", %0" :: "rK"(val)); }) - -#define swap_csr(reg, val) ({ unsigned long __tmp; \ - asm volatile ("csrrw %0, " #reg ", %1" : "=r"(__tmp) : "rK"(val)); \ - __tmp; }) - -#define set_csr(reg, bit) ({ unsigned long __tmp; \ - asm volatile ("csrrs %0, " #reg ", %1" : "=r"(__tmp) : "rK"(bit)); \ - __tmp; }) - -#define clear_csr(reg, bit) ({ unsigned long __tmp; \ - asm volatile ("csrrc %0, " #reg ", %1" : "=r"(__tmp) : "rK"(bit)); \ - __tmp; }) - -#define rdtime() read_csr(time) -#define rdcycle() read_csr(cycle) -#define rdinstret() read_csr(instret) - -#endif - -#endif - -#endif - -#endif -/* Automatically generated by parse-opcodes. */ -#ifndef RISCV_ENCODING_H -#define RISCV_ENCODING_H -#define MATCH_BEQ 0x63 -#define MASK_BEQ 0x707f -#define MATCH_BNE 0x1063 -#define MASK_BNE 0x707f -#define MATCH_BLT 0x4063 -#define MASK_BLT 0x707f -#define MATCH_BGE 0x5063 -#define MASK_BGE 0x707f -#define MATCH_BLTU 0x6063 -#define MASK_BLTU 0x707f -#define MATCH_BGEU 0x7063 -#define MASK_BGEU 0x707f -#define MATCH_JALR 0x67 -#define MASK_JALR 0x707f -#define MATCH_JAL 0x6f -#define MASK_JAL 0x7f -#define MATCH_LUI 0x37 -#define MASK_LUI 0x7f -#define MATCH_AUIPC 0x17 -#define MASK_AUIPC 0x7f -#define MATCH_ADDI 0x13 -#define MASK_ADDI 0x707f -#define MATCH_SLLI 0x1013 -#define MASK_SLLI 0xfc00707f -#define MATCH_SLTI 0x2013 -#define MASK_SLTI 0x707f -#define MATCH_SLTIU 0x3013 -#define MASK_SLTIU 0x707f -#define MATCH_XORI 0x4013 -#define MASK_XORI 0x707f -#define MATCH_SRLI 0x5013 -#define MASK_SRLI 0xfc00707f -#define MATCH_SRAI 0x40005013 -#define MASK_SRAI 0xfc00707f -#define MATCH_ORI 0x6013 -#define MASK_ORI 0x707f -#define MATCH_ANDI 0x7013 -#define MASK_ANDI 0x707f -#define MATCH_ADD 0x33 -#define MASK_ADD 0xfe00707f -#define MATCH_SUB 0x40000033 -#define MASK_SUB 0xfe00707f -#define MATCH_SLL 0x1033 -#define MASK_SLL 0xfe00707f -#define MATCH_SLT 0x2033 -#define MASK_SLT 0xfe00707f -#define MATCH_SLTU 0x3033 -#define MASK_SLTU 0xfe00707f -#define MATCH_XOR 0x4033 -#define MASK_XOR 0xfe00707f -#define MATCH_SRL 0x5033 -#define MASK_SRL 0xfe00707f -#define MATCH_SRA 0x40005033 -#define MASK_SRA 0xfe00707f -#define MATCH_OR 0x6033 -#define MASK_OR 0xfe00707f -#define MATCH_AND 0x7033 -#define MASK_AND 0xfe00707f -#define MATCH_ADDIW 0x1b -#define MASK_ADDIW 0x707f -#define MATCH_SLLIW 0x101b -#define MASK_SLLIW 0xfe00707f -#define MATCH_SRLIW 0x501b -#define MASK_SRLIW 0xfe00707f -#define MATCH_SRAIW 0x4000501b -#define MASK_SRAIW 0xfe00707f -#define MATCH_ADDW 0x3b -#define MASK_ADDW 0xfe00707f -#define MATCH_SUBW 0x4000003b -#define MASK_SUBW 0xfe00707f -#define MATCH_SLLW 0x103b -#define MASK_SLLW 0xfe00707f -#define MATCH_SRLW 0x503b -#define MASK_SRLW 0xfe00707f -#define MATCH_SRAW 0x4000503b -#define MASK_SRAW 0xfe00707f -#define MATCH_LB 0x3 -#define MASK_LB 0x707f -#define MATCH_LH 0x1003 -#define MASK_LH 0x707f -#define MATCH_LW 0x2003 -#define MASK_LW 0x707f -#define MATCH_LD 0x3003 -#define MASK_LD 0x707f -#define MATCH_LBU 0x4003 -#define MASK_LBU 0x707f -#define MATCH_LHU 0x5003 -#define MASK_LHU 0x707f -#define MATCH_LWU 0x6003 -#define MASK_LWU 0x707f -#define MATCH_SB 0x23 -#define MASK_SB 0x707f -#define MATCH_SH 0x1023 -#define MASK_SH 0x707f -#define MATCH_SW 0x2023 -#define MASK_SW 0x707f -#define MATCH_SD 0x3023 -#define MASK_SD 0x707f -#define MATCH_FENCE 0xf -#define MASK_FENCE 0x707f -#define MATCH_FENCE_I 0x100f -#define MASK_FENCE_I 0x707f -#define MATCH_MUL 0x2000033 -#define MASK_MUL 0xfe00707f -#define MATCH_MULH 0x2001033 -#define MASK_MULH 0xfe00707f -#define MATCH_MULHSU 0x2002033 -#define MASK_MULHSU 0xfe00707f -#define MATCH_MULHU 0x2003033 -#define MASK_MULHU 0xfe00707f -#define MATCH_DIV 0x2004033 -#define MASK_DIV 0xfe00707f -#define MATCH_DIVU 0x2005033 -#define MASK_DIVU 0xfe00707f -#define MATCH_REM 0x2006033 -#define MASK_REM 0xfe00707f -#define MATCH_REMU 0x2007033 -#define MASK_REMU 0xfe00707f -#define MATCH_MULW 0x200003b -#define MASK_MULW 0xfe00707f -#define MATCH_DIVW 0x200403b -#define MASK_DIVW 0xfe00707f -#define MATCH_DIVUW 0x200503b -#define MASK_DIVUW 0xfe00707f -#define MATCH_REMW 0x200603b -#define MASK_REMW 0xfe00707f -#define MATCH_REMUW 0x200703b -#define MASK_REMUW 0xfe00707f -#define MATCH_AMOADD_W 0x202f -#define MASK_AMOADD_W 0xf800707f -#define MATCH_AMOXOR_W 0x2000202f -#define MASK_AMOXOR_W 0xf800707f -#define MATCH_AMOOR_W 0x4000202f -#define MASK_AMOOR_W 0xf800707f -#define MATCH_AMOAND_W 0x6000202f -#define MASK_AMOAND_W 0xf800707f -#define MATCH_AMOMIN_W 0x8000202f -#define MASK_AMOMIN_W 0xf800707f -#define MATCH_AMOMAX_W 0xa000202f -#define MASK_AMOMAX_W 0xf800707f -#define MATCH_AMOMINU_W 0xc000202f -#define MASK_AMOMINU_W 0xf800707f -#define MATCH_AMOMAXU_W 0xe000202f -#define MASK_AMOMAXU_W 0xf800707f -#define MATCH_AMOSWAP_W 0x800202f -#define MASK_AMOSWAP_W 0xf800707f -#define MATCH_LR_W 0x1000202f -#define MASK_LR_W 0xf9f0707f -#define MATCH_SC_W 0x1800202f -#define MASK_SC_W 0xf800707f -#define MATCH_AMOADD_D 0x302f -#define MASK_AMOADD_D 0xf800707f -#define MATCH_AMOXOR_D 0x2000302f -#define MASK_AMOXOR_D 0xf800707f -#define MATCH_AMOOR_D 0x4000302f -#define MASK_AMOOR_D 0xf800707f -#define MATCH_AMOAND_D 0x6000302f -#define MASK_AMOAND_D 0xf800707f -#define MATCH_AMOMIN_D 0x8000302f -#define MASK_AMOMIN_D 0xf800707f -#define MATCH_AMOMAX_D 0xa000302f -#define MASK_AMOMAX_D 0xf800707f -#define MATCH_AMOMINU_D 0xc000302f -#define MASK_AMOMINU_D 0xf800707f -#define MATCH_AMOMAXU_D 0xe000302f -#define MASK_AMOMAXU_D 0xf800707f -#define MATCH_AMOSWAP_D 0x800302f -#define MASK_AMOSWAP_D 0xf800707f -#define MATCH_LR_D 0x1000302f -#define MASK_LR_D 0xf9f0707f -#define MATCH_SC_D 0x1800302f -#define MASK_SC_D 0xf800707f -#define MATCH_ECALL 0x73 -#define MASK_ECALL 0xffffffff -#define MATCH_EBREAK 0x100073 -#define MASK_EBREAK 0xffffffff -#define MATCH_URET 0x200073 -#define MASK_URET 0xffffffff -#define MATCH_SRET 0x10200073 -#define MASK_SRET 0xffffffff -#define MATCH_MRET 0x30200073 -#define MASK_MRET 0xffffffff -#define MATCH_DRET 0x7b200073 -#define MASK_DRET 0xffffffff -#define MATCH_SFENCE_VMA 0x12000073 -#define MASK_SFENCE_VMA 0xfe007fff -#define MATCH_WFI 0x10500073 -#define MASK_WFI 0xffffffff -#define MATCH_CSRRW 0x1073 -#define MASK_CSRRW 0x707f -#define MATCH_CSRRS 0x2073 -#define MASK_CSRRS 0x707f -#define MATCH_CSRRC 0x3073 -#define MASK_CSRRC 0x707f -#define MATCH_CSRRWI 0x5073 -#define MASK_CSRRWI 0x707f -#define MATCH_CSRRSI 0x6073 -#define MASK_CSRRSI 0x707f -#define MATCH_CSRRCI 0x7073 -#define MASK_CSRRCI 0x707f -#define MATCH_FADD_S 0x53 -#define MASK_FADD_S 0xfe00007f -#define MATCH_FSUB_S 0x8000053 -#define MASK_FSUB_S 0xfe00007f -#define MATCH_FMUL_S 0x10000053 -#define MASK_FMUL_S 0xfe00007f -#define MATCH_FDIV_S 0x18000053 -#define MASK_FDIV_S 0xfe00007f -#define MATCH_FSGNJ_S 0x20000053 -#define MASK_FSGNJ_S 0xfe00707f -#define MATCH_FSGNJN_S 0x20001053 -#define MASK_FSGNJN_S 0xfe00707f -#define MATCH_FSGNJX_S 0x20002053 -#define MASK_FSGNJX_S 0xfe00707f -#define MATCH_FMIN_S 0x28000053 -#define MASK_FMIN_S 0xfe00707f -#define MATCH_FMAX_S 0x28001053 -#define MASK_FMAX_S 0xfe00707f -#define MATCH_FSQRT_S 0x58000053 -#define MASK_FSQRT_S 0xfff0007f -#define MATCH_FADD_D 0x2000053 -#define MASK_FADD_D 0xfe00007f -#define MATCH_FSUB_D 0xa000053 -#define MASK_FSUB_D 0xfe00007f -#define MATCH_FMUL_D 0x12000053 -#define MASK_FMUL_D 0xfe00007f -#define MATCH_FDIV_D 0x1a000053 -#define MASK_FDIV_D 0xfe00007f -#define MATCH_FSGNJ_D 0x22000053 -#define MASK_FSGNJ_D 0xfe00707f -#define MATCH_FSGNJN_D 0x22001053 -#define MASK_FSGNJN_D 0xfe00707f -#define MATCH_FSGNJX_D 0x22002053 -#define MASK_FSGNJX_D 0xfe00707f -#define MATCH_FMIN_D 0x2a000053 -#define MASK_FMIN_D 0xfe00707f -#define MATCH_FMAX_D 0x2a001053 -#define MASK_FMAX_D 0xfe00707f -#define MATCH_FCVT_S_D 0x40100053 -#define MASK_FCVT_S_D 0xfff0007f -#define MATCH_FCVT_D_S 0x42000053 -#define MASK_FCVT_D_S 0xfff0007f -#define MATCH_FSQRT_D 0x5a000053 -#define MASK_FSQRT_D 0xfff0007f -#define MATCH_FADD_Q 0x6000053 -#define MASK_FADD_Q 0xfe00007f -#define MATCH_FSUB_Q 0xe000053 -#define MASK_FSUB_Q 0xfe00007f -#define MATCH_FMUL_Q 0x16000053 -#define MASK_FMUL_Q 0xfe00007f -#define MATCH_FDIV_Q 0x1e000053 -#define MASK_FDIV_Q 0xfe00007f -#define MATCH_FSGNJ_Q 0x26000053 -#define MASK_FSGNJ_Q 0xfe00707f -#define MATCH_FSGNJN_Q 0x26001053 -#define MASK_FSGNJN_Q 0xfe00707f -#define MATCH_FSGNJX_Q 0x26002053 -#define MASK_FSGNJX_Q 0xfe00707f -#define MATCH_FMIN_Q 0x2e000053 -#define MASK_FMIN_Q 0xfe00707f -#define MATCH_FMAX_Q 0x2e001053 -#define MASK_FMAX_Q 0xfe00707f -#define MATCH_FCVT_S_Q 0x40300053 -#define MASK_FCVT_S_Q 0xfff0007f -#define MATCH_FCVT_Q_S 0x46000053 -#define MASK_FCVT_Q_S 0xfff0007f -#define MATCH_FCVT_D_Q 0x42300053 -#define MASK_FCVT_D_Q 0xfff0007f -#define MATCH_FCVT_Q_D 0x46100053 -#define MASK_FCVT_Q_D 0xfff0007f -#define MATCH_FSQRT_Q 0x5e000053 -#define MASK_FSQRT_Q 0xfff0007f -#define MATCH_FLE_S 0xa0000053 -#define MASK_FLE_S 0xfe00707f -#define MATCH_FLT_S 0xa0001053 -#define MASK_FLT_S 0xfe00707f -#define MATCH_FEQ_S 0xa0002053 -#define MASK_FEQ_S 0xfe00707f -#define MATCH_FLE_D 0xa2000053 -#define MASK_FLE_D 0xfe00707f -#define MATCH_FLT_D 0xa2001053 -#define MASK_FLT_D 0xfe00707f -#define MATCH_FEQ_D 0xa2002053 -#define MASK_FEQ_D 0xfe00707f -#define MATCH_FLE_Q 0xa6000053 -#define MASK_FLE_Q 0xfe00707f -#define MATCH_FLT_Q 0xa6001053 -#define MASK_FLT_Q 0xfe00707f -#define MATCH_FEQ_Q 0xa6002053 -#define MASK_FEQ_Q 0xfe00707f -#define MATCH_FCVT_W_S 0xc0000053 -#define MASK_FCVT_W_S 0xfff0007f -#define MATCH_FCVT_WU_S 0xc0100053 -#define MASK_FCVT_WU_S 0xfff0007f -#define MATCH_FCVT_L_S 0xc0200053 -#define MASK_FCVT_L_S 0xfff0007f -#define MATCH_FCVT_LU_S 0xc0300053 -#define MASK_FCVT_LU_S 0xfff0007f -#define MATCH_FMV_X_W 0xe0000053 -#define MASK_FMV_X_W 0xfff0707f -#define MATCH_FCLASS_S 0xe0001053 -#define MASK_FCLASS_S 0xfff0707f -#define MATCH_FCVT_W_D 0xc2000053 -#define MASK_FCVT_W_D 0xfff0007f -#define MATCH_FCVT_WU_D 0xc2100053 -#define MASK_FCVT_WU_D 0xfff0007f -#define MATCH_FCVT_L_D 0xc2200053 -#define MASK_FCVT_L_D 0xfff0007f -#define MATCH_FCVT_LU_D 0xc2300053 -#define MASK_FCVT_LU_D 0xfff0007f -#define MATCH_FMV_X_D 0xe2000053 -#define MASK_FMV_X_D 0xfff0707f -#define MATCH_FCLASS_D 0xe2001053 -#define MASK_FCLASS_D 0xfff0707f -#define MATCH_FCVT_W_Q 0xc6000053 -#define MASK_FCVT_W_Q 0xfff0007f -#define MATCH_FCVT_WU_Q 0xc6100053 -#define MASK_FCVT_WU_Q 0xfff0007f -#define MATCH_FCVT_L_Q 0xc6200053 -#define MASK_FCVT_L_Q 0xfff0007f -#define MATCH_FCVT_LU_Q 0xc6300053 -#define MASK_FCVT_LU_Q 0xfff0007f -#define MATCH_FMV_X_Q 0xe6000053 -#define MASK_FMV_X_Q 0xfff0707f -#define MATCH_FCLASS_Q 0xe6001053 -#define MASK_FCLASS_Q 0xfff0707f -#define MATCH_FCVT_S_W 0xd0000053 -#define MASK_FCVT_S_W 0xfff0007f -#define MATCH_FCVT_S_WU 0xd0100053 -#define MASK_FCVT_S_WU 0xfff0007f -#define MATCH_FCVT_S_L 0xd0200053 -#define MASK_FCVT_S_L 0xfff0007f -#define MATCH_FCVT_S_LU 0xd0300053 -#define MASK_FCVT_S_LU 0xfff0007f -#define MATCH_FMV_W_X 0xf0000053 -#define MASK_FMV_W_X 0xfff0707f -#define MATCH_FCVT_D_W 0xd2000053 -#define MASK_FCVT_D_W 0xfff0007f -#define MATCH_FCVT_D_WU 0xd2100053 -#define MASK_FCVT_D_WU 0xfff0007f -#define MATCH_FCVT_D_L 0xd2200053 -#define MASK_FCVT_D_L 0xfff0007f -#define MATCH_FCVT_D_LU 0xd2300053 -#define MASK_FCVT_D_LU 0xfff0007f -#define MATCH_FMV_D_X 0xf2000053 -#define MASK_FMV_D_X 0xfff0707f -#define MATCH_FCVT_Q_W 0xd6000053 -#define MASK_FCVT_Q_W 0xfff0007f -#define MATCH_FCVT_Q_WU 0xd6100053 -#define MASK_FCVT_Q_WU 0xfff0007f -#define MATCH_FCVT_Q_L 0xd6200053 -#define MASK_FCVT_Q_L 0xfff0007f -#define MATCH_FCVT_Q_LU 0xd6300053 -#define MASK_FCVT_Q_LU 0xfff0007f -#define MATCH_FMV_Q_X 0xf6000053 -#define MASK_FMV_Q_X 0xfff0707f -#define MATCH_FLW 0x2007 -#define MASK_FLW 0x707f -#define MATCH_FLD 0x3007 -#define MASK_FLD 0x707f -#define MATCH_FLQ 0x4007 -#define MASK_FLQ 0x707f -#define MATCH_FSW 0x2027 -#define MASK_FSW 0x707f -#define MATCH_FSD 0x3027 -#define MASK_FSD 0x707f -#define MATCH_FSQ 0x4027 -#define MASK_FSQ 0x707f -#define MATCH_FMADD_S 0x43 -#define MASK_FMADD_S 0x600007f -#define MATCH_FMSUB_S 0x47 -#define MASK_FMSUB_S 0x600007f -#define MATCH_FNMSUB_S 0x4b -#define MASK_FNMSUB_S 0x600007f -#define MATCH_FNMADD_S 0x4f -#define MASK_FNMADD_S 0x600007f -#define MATCH_FMADD_D 0x2000043 -#define MASK_FMADD_D 0x600007f -#define MATCH_FMSUB_D 0x2000047 -#define MASK_FMSUB_D 0x600007f -#define MATCH_FNMSUB_D 0x200004b -#define MASK_FNMSUB_D 0x600007f -#define MATCH_FNMADD_D 0x200004f -#define MASK_FNMADD_D 0x600007f -#define MATCH_FMADD_Q 0x6000043 -#define MASK_FMADD_Q 0x600007f -#define MATCH_FMSUB_Q 0x6000047 -#define MASK_FMSUB_Q 0x600007f -#define MATCH_FNMSUB_Q 0x600004b -#define MASK_FNMSUB_Q 0x600007f -#define MATCH_FNMADD_Q 0x600004f -#define MASK_FNMADD_Q 0x600007f -#define MATCH_C_NOP 0x1 -#define MASK_C_NOP 0xffff -#define MATCH_C_ADDI16SP 0x6101 -#define MASK_C_ADDI16SP 0xef83 -#define MATCH_C_JR 0x8002 -#define MASK_C_JR 0xf07f -#define MATCH_C_JALR 0x9002 -#define MASK_C_JALR 0xf07f -#define MATCH_C_EBREAK 0x9002 -#define MASK_C_EBREAK 0xffff -#define MATCH_C_LD 0x6000 -#define MASK_C_LD 0xe003 -#define MATCH_C_SD 0xe000 -#define MASK_C_SD 0xe003 -#define MATCH_C_ADDIW 0x2001 -#define MASK_C_ADDIW 0xe003 -#define MATCH_C_LDSP 0x6002 -#define MASK_C_LDSP 0xe003 -#define MATCH_C_SDSP 0xe002 -#define MASK_C_SDSP 0xe003 -#define MATCH_C_ADDI4SPN 0x0 -#define MASK_C_ADDI4SPN 0xe003 -#define MATCH_C_FLD 0x2000 -#define MASK_C_FLD 0xe003 -#define MATCH_C_LW 0x4000 -#define MASK_C_LW 0xe003 -#define MATCH_C_FLW 0x6000 -#define MASK_C_FLW 0xe003 -#define MATCH_C_FSD 0xa000 -#define MASK_C_FSD 0xe003 -#define MATCH_C_SW 0xc000 -#define MASK_C_SW 0xe003 -#define MATCH_C_FSW 0xe000 -#define MASK_C_FSW 0xe003 -#define MATCH_C_ADDI 0x1 -#define MASK_C_ADDI 0xe003 -#define MATCH_C_JAL 0x2001 -#define MASK_C_JAL 0xe003 -#define MATCH_C_LI 0x4001 -#define MASK_C_LI 0xe003 -#define MATCH_C_LUI 0x6001 -#define MASK_C_LUI 0xe003 -#define MATCH_C_SRLI 0x8001 -#define MASK_C_SRLI 0xec03 -#define MATCH_C_SRAI 0x8401 -#define MASK_C_SRAI 0xec03 -#define MATCH_C_ANDI 0x8801 -#define MASK_C_ANDI 0xec03 -#define MATCH_C_SUB 0x8c01 -#define MASK_C_SUB 0xfc63 -#define MATCH_C_XOR 0x8c21 -#define MASK_C_XOR 0xfc63 -#define MATCH_C_OR 0x8c41 -#define MASK_C_OR 0xfc63 -#define MATCH_C_AND 0x8c61 -#define MASK_C_AND 0xfc63 -#define MATCH_C_SUBW 0x9c01 -#define MASK_C_SUBW 0xfc63 -#define MATCH_C_ADDW 0x9c21 -#define MASK_C_ADDW 0xfc63 -#define MATCH_C_J 0xa001 -#define MASK_C_J 0xe003 -#define MATCH_C_BEQZ 0xc001 -#define MASK_C_BEQZ 0xe003 -#define MATCH_C_BNEZ 0xe001 -#define MASK_C_BNEZ 0xe003 -#define MATCH_C_SLLI 0x2 -#define MASK_C_SLLI 0xe003 -#define MATCH_C_FLDSP 0x2002 -#define MASK_C_FLDSP 0xe003 -#define MATCH_C_LWSP 0x4002 -#define MASK_C_LWSP 0xe003 -#define MATCH_C_FLWSP 0x6002 -#define MASK_C_FLWSP 0xe003 -#define MATCH_C_MV 0x8002 -#define MASK_C_MV 0xf003 -#define MATCH_C_ADD 0x9002 -#define MASK_C_ADD 0xf003 -#define MATCH_C_FSDSP 0xa002 -#define MASK_C_FSDSP 0xe003 -#define MATCH_C_SWSP 0xc002 -#define MASK_C_SWSP 0xe003 -#define MATCH_C_FSWSP 0xe002 -#define MASK_C_FSWSP 0xe003 -#define MATCH_CUSTOM0 0xb -#define MASK_CUSTOM0 0x707f -#define MATCH_CUSTOM0_RS1 0x200b -#define MASK_CUSTOM0_RS1 0x707f -#define MATCH_CUSTOM0_RS1_RS2 0x300b -#define MASK_CUSTOM0_RS1_RS2 0x707f -#define MATCH_CUSTOM0_RD 0x400b -#define MASK_CUSTOM0_RD 0x707f -#define MATCH_CUSTOM0_RD_RS1 0x600b -#define MASK_CUSTOM0_RD_RS1 0x707f -#define MATCH_CUSTOM0_RD_RS1_RS2 0x700b -#define MASK_CUSTOM0_RD_RS1_RS2 0x707f -#define MATCH_CUSTOM1 0x2b -#define MASK_CUSTOM1 0x707f -#define MATCH_CUSTOM1_RS1 0x202b -#define MASK_CUSTOM1_RS1 0x707f -#define MATCH_CUSTOM1_RS1_RS2 0x302b -#define MASK_CUSTOM1_RS1_RS2 0x707f -#define MATCH_CUSTOM1_RD 0x402b -#define MASK_CUSTOM1_RD 0x707f -#define MATCH_CUSTOM1_RD_RS1 0x602b -#define MASK_CUSTOM1_RD_RS1 0x707f -#define MATCH_CUSTOM1_RD_RS1_RS2 0x702b -#define MASK_CUSTOM1_RD_RS1_RS2 0x707f -#define MATCH_CUSTOM2 0x5b -#define MASK_CUSTOM2 0x707f -#define MATCH_CUSTOM2_RS1 0x205b -#define MASK_CUSTOM2_RS1 0x707f -#define MATCH_CUSTOM2_RS1_RS2 0x305b -#define MASK_CUSTOM2_RS1_RS2 0x707f -#define MATCH_CUSTOM2_RD 0x405b -#define MASK_CUSTOM2_RD 0x707f -#define MATCH_CUSTOM2_RD_RS1 0x605b -#define MASK_CUSTOM2_RD_RS1 0x707f -#define MATCH_CUSTOM2_RD_RS1_RS2 0x705b -#define MASK_CUSTOM2_RD_RS1_RS2 0x707f -#define MATCH_CUSTOM3 0x7b -#define MASK_CUSTOM3 0x707f -#define MATCH_CUSTOM3_RS1 0x207b -#define MASK_CUSTOM3_RS1 0x707f -#define MATCH_CUSTOM3_RS1_RS2 0x307b -#define MASK_CUSTOM3_RS1_RS2 0x707f -#define MATCH_CUSTOM3_RD 0x407b -#define MASK_CUSTOM3_RD 0x707f -#define MATCH_CUSTOM3_RD_RS1 0x607b -#define MASK_CUSTOM3_RD_RS1 0x707f -#define MATCH_CUSTOM3_RD_RS1_RS2 0x707b -#define MASK_CUSTOM3_RD_RS1_RS2 0x707f -#define CSR_FFLAGS 0x1 -#define CSR_FRM 0x2 -#define CSR_FCSR 0x3 -#define CSR_CYCLE 0xc00 -#define CSR_TIME 0xc01 -#define CSR_INSTRET 0xc02 -#define CSR_HPMCOUNTER3 0xc03 -#define CSR_HPMCOUNTER4 0xc04 -#define CSR_HPMCOUNTER5 0xc05 -#define CSR_HPMCOUNTER6 0xc06 -#define CSR_HPMCOUNTER7 0xc07 -#define CSR_HPMCOUNTER8 0xc08 -#define CSR_HPMCOUNTER9 0xc09 -#define CSR_HPMCOUNTER10 0xc0a -#define CSR_HPMCOUNTER11 0xc0b -#define CSR_HPMCOUNTER12 0xc0c -#define CSR_HPMCOUNTER13 0xc0d -#define CSR_HPMCOUNTER14 0xc0e -#define CSR_HPMCOUNTER15 0xc0f -#define CSR_HPMCOUNTER16 0xc10 -#define CSR_HPMCOUNTER17 0xc11 -#define CSR_HPMCOUNTER18 0xc12 -#define CSR_HPMCOUNTER19 0xc13 -#define CSR_HPMCOUNTER20 0xc14 -#define CSR_HPMCOUNTER21 0xc15 -#define CSR_HPMCOUNTER22 0xc16 -#define CSR_HPMCOUNTER23 0xc17 -#define CSR_HPMCOUNTER24 0xc18 -#define CSR_HPMCOUNTER25 0xc19 -#define CSR_HPMCOUNTER26 0xc1a -#define CSR_HPMCOUNTER27 0xc1b -#define CSR_HPMCOUNTER28 0xc1c -#define CSR_HPMCOUNTER29 0xc1d -#define CSR_HPMCOUNTER30 0xc1e -#define CSR_HPMCOUNTER31 0xc1f -#define CSR_SSTATUS 0x100 -#define CSR_SIE 0x104 -#define CSR_STVEC 0x105 -#define CSR_SCOUNTEREN 0x106 -#define CSR_SSCRATCH 0x140 -#define CSR_SEPC 0x141 -#define CSR_SCAUSE 0x142 -#define CSR_STVAL 0x143 -#define CSR_SIP 0x144 -#define CSR_SATP 0x180 -#define CSR_MSTATUS 0x300 -#define CSR_MISA 0x301 -#define CSR_MEDELEG 0x302 -#define CSR_MIDELEG 0x303 -#define CSR_MIE 0x304 -#define CSR_MTVEC 0x305 -#define CSR_MCOUNTEREN 0x306 -#define CSR_MSCRATCH 0x340 -#define CSR_MEPC 0x341 -#define CSR_MCAUSE 0x342 -#define CSR_MTVAL 0x343 -#define CSR_MIP 0x344 -#define CSR_PMPCFG0 0x3a0 -#define CSR_PMPCFG1 0x3a1 -#define CSR_PMPCFG2 0x3a2 -#define CSR_PMPCFG3 0x3a3 -#define CSR_PMPADDR0 0x3b0 -#define CSR_PMPADDR1 0x3b1 -#define CSR_PMPADDR2 0x3b2 -#define CSR_PMPADDR3 0x3b3 -#define CSR_PMPADDR4 0x3b4 -#define CSR_PMPADDR5 0x3b5 -#define CSR_PMPADDR6 0x3b6 -#define CSR_PMPADDR7 0x3b7 -#define CSR_PMPADDR8 0x3b8 -#define CSR_PMPADDR9 0x3b9 -#define CSR_PMPADDR10 0x3ba -#define CSR_PMPADDR11 0x3bb -#define CSR_PMPADDR12 0x3bc -#define CSR_PMPADDR13 0x3bd -#define CSR_PMPADDR14 0x3be -#define CSR_PMPADDR15 0x3bf -#define CSR_TSELECT 0x7a0 -#define CSR_TDATA1 0x7a1 -#define CSR_TDATA2 0x7a2 -#define CSR_TDATA3 0x7a3 -#define CSR_DCSR 0x7b0 -#define CSR_DPC 0x7b1 -#define CSR_DSCRATCH 0x7b2 -#define CSR_MCYCLE 0xb00 -#define CSR_MINSTRET 0xb02 -#define CSR_MHPMCOUNTER3 0xb03 -#define CSR_MHPMCOUNTER4 0xb04 -#define CSR_MHPMCOUNTER5 0xb05 -#define CSR_MHPMCOUNTER6 0xb06 -#define CSR_MHPMCOUNTER7 0xb07 -#define CSR_MHPMCOUNTER8 0xb08 -#define CSR_MHPMCOUNTER9 0xb09 -#define CSR_MHPMCOUNTER10 0xb0a -#define CSR_MHPMCOUNTER11 0xb0b -#define CSR_MHPMCOUNTER12 0xb0c -#define CSR_MHPMCOUNTER13 0xb0d -#define CSR_MHPMCOUNTER14 0xb0e -#define CSR_MHPMCOUNTER15 0xb0f -#define CSR_MHPMCOUNTER16 0xb10 -#define CSR_MHPMCOUNTER17 0xb11 -#define CSR_MHPMCOUNTER18 0xb12 -#define CSR_MHPMCOUNTER19 0xb13 -#define CSR_MHPMCOUNTER20 0xb14 -#define CSR_MHPMCOUNTER21 0xb15 -#define CSR_MHPMCOUNTER22 0xb16 -#define CSR_MHPMCOUNTER23 0xb17 -#define CSR_MHPMCOUNTER24 0xb18 -#define CSR_MHPMCOUNTER25 0xb19 -#define CSR_MHPMCOUNTER26 0xb1a -#define CSR_MHPMCOUNTER27 0xb1b -#define CSR_MHPMCOUNTER28 0xb1c -#define CSR_MHPMCOUNTER29 0xb1d -#define CSR_MHPMCOUNTER30 0xb1e -#define CSR_MHPMCOUNTER31 0xb1f -#define CSR_MHPMEVENT3 0x323 -#define CSR_MHPMEVENT4 0x324 -#define CSR_MHPMEVENT5 0x325 -#define CSR_MHPMEVENT6 0x326 -#define CSR_MHPMEVENT7 0x327 -#define CSR_MHPMEVENT8 0x328 -#define CSR_MHPMEVENT9 0x329 -#define CSR_MHPMEVENT10 0x32a -#define CSR_MHPMEVENT11 0x32b -#define CSR_MHPMEVENT12 0x32c -#define CSR_MHPMEVENT13 0x32d -#define CSR_MHPMEVENT14 0x32e -#define CSR_MHPMEVENT15 0x32f -#define CSR_MHPMEVENT16 0x330 -#define CSR_MHPMEVENT17 0x331 -#define CSR_MHPMEVENT18 0x332 -#define CSR_MHPMEVENT19 0x333 -#define CSR_MHPMEVENT20 0x334 -#define CSR_MHPMEVENT21 0x335 -#define CSR_MHPMEVENT22 0x336 -#define CSR_MHPMEVENT23 0x337 -#define CSR_MHPMEVENT24 0x338 -#define CSR_MHPMEVENT25 0x339 -#define CSR_MHPMEVENT26 0x33a -#define CSR_MHPMEVENT27 0x33b -#define CSR_MHPMEVENT28 0x33c -#define CSR_MHPMEVENT29 0x33d -#define CSR_MHPMEVENT30 0x33e -#define CSR_MHPMEVENT31 0x33f -#define CSR_MVENDORID 0xf11 -#define CSR_MARCHID 0xf12 -#define CSR_MIMPID 0xf13 -#define CSR_MHARTID 0xf14 -#define CSR_CYCLEH 0xc80 -#define CSR_TIMEH 0xc81 -#define CSR_INSTRETH 0xc82 -#define CSR_HPMCOUNTER3H 0xc83 -#define CSR_HPMCOUNTER4H 0xc84 -#define CSR_HPMCOUNTER5H 0xc85 -#define CSR_HPMCOUNTER6H 0xc86 -#define CSR_HPMCOUNTER7H 0xc87 -#define CSR_HPMCOUNTER8H 0xc88 -#define CSR_HPMCOUNTER9H 0xc89 -#define CSR_HPMCOUNTER10H 0xc8a -#define CSR_HPMCOUNTER11H 0xc8b -#define CSR_HPMCOUNTER12H 0xc8c -#define CSR_HPMCOUNTER13H 0xc8d -#define CSR_HPMCOUNTER14H 0xc8e -#define CSR_HPMCOUNTER15H 0xc8f -#define CSR_HPMCOUNTER16H 0xc90 -#define CSR_HPMCOUNTER17H 0xc91 -#define CSR_HPMCOUNTER18H 0xc92 -#define CSR_HPMCOUNTER19H 0xc93 -#define CSR_HPMCOUNTER20H 0xc94 -#define CSR_HPMCOUNTER21H 0xc95 -#define CSR_HPMCOUNTER22H 0xc96 -#define CSR_HPMCOUNTER23H 0xc97 -#define CSR_HPMCOUNTER24H 0xc98 -#define CSR_HPMCOUNTER25H 0xc99 -#define CSR_HPMCOUNTER26H 0xc9a -#define CSR_HPMCOUNTER27H 0xc9b -#define CSR_HPMCOUNTER28H 0xc9c -#define CSR_HPMCOUNTER29H 0xc9d -#define CSR_HPMCOUNTER30H 0xc9e -#define CSR_HPMCOUNTER31H 0xc9f -#define CSR_MCYCLEH 0xb80 -#define CSR_MINSTRETH 0xb82 -#define CSR_MHPMCOUNTER3H 0xb83 -#define CSR_MHPMCOUNTER4H 0xb84 -#define CSR_MHPMCOUNTER5H 0xb85 -#define CSR_MHPMCOUNTER6H 0xb86 -#define CSR_MHPMCOUNTER7H 0xb87 -#define CSR_MHPMCOUNTER8H 0xb88 -#define CSR_MHPMCOUNTER9H 0xb89 -#define CSR_MHPMCOUNTER10H 0xb8a -#define CSR_MHPMCOUNTER11H 0xb8b -#define CSR_MHPMCOUNTER12H 0xb8c -#define CSR_MHPMCOUNTER13H 0xb8d -#define CSR_MHPMCOUNTER14H 0xb8e -#define CSR_MHPMCOUNTER15H 0xb8f -#define CSR_MHPMCOUNTER16H 0xb90 -#define CSR_MHPMCOUNTER17H 0xb91 -#define CSR_MHPMCOUNTER18H 0xb92 -#define CSR_MHPMCOUNTER19H 0xb93 -#define CSR_MHPMCOUNTER20H 0xb94 -#define CSR_MHPMCOUNTER21H 0xb95 -#define CSR_MHPMCOUNTER22H 0xb96 -#define CSR_MHPMCOUNTER23H 0xb97 -#define CSR_MHPMCOUNTER24H 0xb98 -#define CSR_MHPMCOUNTER25H 0xb99 -#define CSR_MHPMCOUNTER26H 0xb9a -#define CSR_MHPMCOUNTER27H 0xb9b -#define CSR_MHPMCOUNTER28H 0xb9c -#define CSR_MHPMCOUNTER29H 0xb9d -#define CSR_MHPMCOUNTER30H 0xb9e -#define CSR_MHPMCOUNTER31H 0xb9f -#define CAUSE_MISALIGNED_FETCH 0x0 -#define CAUSE_FETCH_ACCESS 0x1 -#define CAUSE_ILLEGAL_INSTRUCTION 0x2 -#define CAUSE_BREAKPOINT 0x3 -#define CAUSE_MISALIGNED_LOAD 0x4 -#define CAUSE_LOAD_ACCESS 0x5 -#define CAUSE_MISALIGNED_STORE 0x6 -#define CAUSE_STORE_ACCESS 0x7 -#define CAUSE_USER_ECALL 0x8 -#define CAUSE_SUPERVISOR_ECALL 0x9 -#define CAUSE_HYPERVISOR_ECALL 0xa -#define CAUSE_MACHINE_ECALL 0xb -#define CAUSE_FETCH_PAGE_FAULT 0xc -#define CAUSE_LOAD_PAGE_FAULT 0xd -#define CAUSE_STORE_PAGE_FAULT 0xf -#endif -#ifdef DECLARE_INSN -DECLARE_INSN(beq, MATCH_BEQ, MASK_BEQ) -DECLARE_INSN(bne, MATCH_BNE, MASK_BNE) -DECLARE_INSN(blt, MATCH_BLT, MASK_BLT) -DECLARE_INSN(bge, MATCH_BGE, MASK_BGE) -DECLARE_INSN(bltu, MATCH_BLTU, MASK_BLTU) -DECLARE_INSN(bgeu, MATCH_BGEU, MASK_BGEU) -DECLARE_INSN(jalr, MATCH_JALR, MASK_JALR) -DECLARE_INSN(jal, MATCH_JAL, MASK_JAL) -DECLARE_INSN(lui, MATCH_LUI, MASK_LUI) -DECLARE_INSN(auipc, MATCH_AUIPC, MASK_AUIPC) -DECLARE_INSN(addi, MATCH_ADDI, MASK_ADDI) -DECLARE_INSN(slli, MATCH_SLLI, MASK_SLLI) -DECLARE_INSN(slti, MATCH_SLTI, MASK_SLTI) -DECLARE_INSN(sltiu, MATCH_SLTIU, MASK_SLTIU) -DECLARE_INSN(xori, MATCH_XORI, MASK_XORI) -DECLARE_INSN(srli, MATCH_SRLI, MASK_SRLI) -DECLARE_INSN(srai, MATCH_SRAI, MASK_SRAI) -DECLARE_INSN(ori, MATCH_ORI, MASK_ORI) -DECLARE_INSN(andi, MATCH_ANDI, MASK_ANDI) -DECLARE_INSN(add, MATCH_ADD, MASK_ADD) -DECLARE_INSN(sub, MATCH_SUB, MASK_SUB) -DECLARE_INSN(sll, MATCH_SLL, MASK_SLL) -DECLARE_INSN(slt, MATCH_SLT, MASK_SLT) -DECLARE_INSN(sltu, MATCH_SLTU, MASK_SLTU) -DECLARE_INSN(xor, MATCH_XOR, MASK_XOR) -DECLARE_INSN(srl, MATCH_SRL, MASK_SRL) -DECLARE_INSN(sra, MATCH_SRA, MASK_SRA) -DECLARE_INSN(or, MATCH_OR, MASK_OR) -DECLARE_INSN(and, MATCH_AND, MASK_AND) -DECLARE_INSN(addiw, MATCH_ADDIW, MASK_ADDIW) -DECLARE_INSN(slliw, MATCH_SLLIW, MASK_SLLIW) -DECLARE_INSN(srliw, MATCH_SRLIW, MASK_SRLIW) -DECLARE_INSN(sraiw, MATCH_SRAIW, MASK_SRAIW) -DECLARE_INSN(addw, MATCH_ADDW, MASK_ADDW) -DECLARE_INSN(subw, MATCH_SUBW, MASK_SUBW) -DECLARE_INSN(sllw, MATCH_SLLW, MASK_SLLW) -DECLARE_INSN(srlw, MATCH_SRLW, MASK_SRLW) -DECLARE_INSN(sraw, MATCH_SRAW, MASK_SRAW) -DECLARE_INSN(lb, MATCH_LB, MASK_LB) -DECLARE_INSN(lh, MATCH_LH, MASK_LH) -DECLARE_INSN(lw, MATCH_LW, MASK_LW) -DECLARE_INSN(ld, MATCH_LD, MASK_LD) -DECLARE_INSN(lbu, MATCH_LBU, MASK_LBU) -DECLARE_INSN(lhu, MATCH_LHU, MASK_LHU) -DECLARE_INSN(lwu, MATCH_LWU, MASK_LWU) -DECLARE_INSN(sb, MATCH_SB, MASK_SB) -DECLARE_INSN(sh, MATCH_SH, MASK_SH) -DECLARE_INSN(sw, MATCH_SW, MASK_SW) -DECLARE_INSN(sd, MATCH_SD, MASK_SD) -DECLARE_INSN(fence, MATCH_FENCE, MASK_FENCE) -DECLARE_INSN(fence_i, MATCH_FENCE_I, MASK_FENCE_I) -DECLARE_INSN(mul, MATCH_MUL, MASK_MUL) -DECLARE_INSN(mulh, MATCH_MULH, MASK_MULH) -DECLARE_INSN(mulhsu, MATCH_MULHSU, MASK_MULHSU) -DECLARE_INSN(mulhu, MATCH_MULHU, MASK_MULHU) -DECLARE_INSN(div, MATCH_DIV, MASK_DIV) -DECLARE_INSN(divu, MATCH_DIVU, MASK_DIVU) -DECLARE_INSN(rem, MATCH_REM, MASK_REM) -DECLARE_INSN(remu, MATCH_REMU, MASK_REMU) -DECLARE_INSN(mulw, MATCH_MULW, MASK_MULW) -DECLARE_INSN(divw, MATCH_DIVW, MASK_DIVW) -DECLARE_INSN(divuw, MATCH_DIVUW, MASK_DIVUW) -DECLARE_INSN(remw, MATCH_REMW, MASK_REMW) -DECLARE_INSN(remuw, MATCH_REMUW, MASK_REMUW) -DECLARE_INSN(amoadd_w, MATCH_AMOADD_W, MASK_AMOADD_W) -DECLARE_INSN(amoxor_w, MATCH_AMOXOR_W, MASK_AMOXOR_W) -DECLARE_INSN(amoor_w, MATCH_AMOOR_W, MASK_AMOOR_W) -DECLARE_INSN(amoand_w, MATCH_AMOAND_W, MASK_AMOAND_W) -DECLARE_INSN(amomin_w, MATCH_AMOMIN_W, MASK_AMOMIN_W) -DECLARE_INSN(amomax_w, MATCH_AMOMAX_W, MASK_AMOMAX_W) -DECLARE_INSN(amominu_w, MATCH_AMOMINU_W, MASK_AMOMINU_W) -DECLARE_INSN(amomaxu_w, MATCH_AMOMAXU_W, MASK_AMOMAXU_W) -DECLARE_INSN(amoswap_w, MATCH_AMOSWAP_W, MASK_AMOSWAP_W) -DECLARE_INSN(lr_w, MATCH_LR_W, MASK_LR_W) -DECLARE_INSN(sc_w, MATCH_SC_W, MASK_SC_W) -DECLARE_INSN(amoadd_d, MATCH_AMOADD_D, MASK_AMOADD_D) -DECLARE_INSN(amoxor_d, MATCH_AMOXOR_D, MASK_AMOXOR_D) -DECLARE_INSN(amoor_d, MATCH_AMOOR_D, MASK_AMOOR_D) -DECLARE_INSN(amoand_d, MATCH_AMOAND_D, MASK_AMOAND_D) -DECLARE_INSN(amomin_d, MATCH_AMOMIN_D, MASK_AMOMIN_D) -DECLARE_INSN(amomax_d, MATCH_AMOMAX_D, MASK_AMOMAX_D) -DECLARE_INSN(amominu_d, MATCH_AMOMINU_D, MASK_AMOMINU_D) -DECLARE_INSN(amomaxu_d, MATCH_AMOMAXU_D, MASK_AMOMAXU_D) -DECLARE_INSN(amoswap_d, MATCH_AMOSWAP_D, MASK_AMOSWAP_D) -DECLARE_INSN(lr_d, MATCH_LR_D, MASK_LR_D) -DECLARE_INSN(sc_d, MATCH_SC_D, MASK_SC_D) -DECLARE_INSN(ecall, MATCH_ECALL, MASK_ECALL) -DECLARE_INSN(ebreak, MATCH_EBREAK, MASK_EBREAK) -DECLARE_INSN(uret, MATCH_URET, MASK_URET) -DECLARE_INSN(sret, MATCH_SRET, MASK_SRET) -DECLARE_INSN(mret, MATCH_MRET, MASK_MRET) -DECLARE_INSN(dret, MATCH_DRET, MASK_DRET) -DECLARE_INSN(sfence_vma, MATCH_SFENCE_VMA, MASK_SFENCE_VMA) -DECLARE_INSN(wfi, MATCH_WFI, MASK_WFI) -DECLARE_INSN(csrrw, MATCH_CSRRW, MASK_CSRRW) -DECLARE_INSN(csrrs, MATCH_CSRRS, MASK_CSRRS) -DECLARE_INSN(csrrc, MATCH_CSRRC, MASK_CSRRC) -DECLARE_INSN(csrrwi, MATCH_CSRRWI, MASK_CSRRWI) -DECLARE_INSN(csrrsi, MATCH_CSRRSI, MASK_CSRRSI) -DECLARE_INSN(csrrci, MATCH_CSRRCI, MASK_CSRRCI) -DECLARE_INSN(fadd_s, MATCH_FADD_S, MASK_FADD_S) -DECLARE_INSN(fsub_s, MATCH_FSUB_S, MASK_FSUB_S) -DECLARE_INSN(fmul_s, MATCH_FMUL_S, MASK_FMUL_S) -DECLARE_INSN(fdiv_s, MATCH_FDIV_S, MASK_FDIV_S) -DECLARE_INSN(fsgnj_s, MATCH_FSGNJ_S, MASK_FSGNJ_S) -DECLARE_INSN(fsgnjn_s, MATCH_FSGNJN_S, MASK_FSGNJN_S) -DECLARE_INSN(fsgnjx_s, MATCH_FSGNJX_S, MASK_FSGNJX_S) -DECLARE_INSN(fmin_s, MATCH_FMIN_S, MASK_FMIN_S) -DECLARE_INSN(fmax_s, MATCH_FMAX_S, MASK_FMAX_S) -DECLARE_INSN(fsqrt_s, MATCH_FSQRT_S, MASK_FSQRT_S) -DECLARE_INSN(fadd_d, MATCH_FADD_D, MASK_FADD_D) -DECLARE_INSN(fsub_d, MATCH_FSUB_D, MASK_FSUB_D) -DECLARE_INSN(fmul_d, MATCH_FMUL_D, MASK_FMUL_D) -DECLARE_INSN(fdiv_d, MATCH_FDIV_D, MASK_FDIV_D) -DECLARE_INSN(fsgnj_d, MATCH_FSGNJ_D, MASK_FSGNJ_D) -DECLARE_INSN(fsgnjn_d, MATCH_FSGNJN_D, MASK_FSGNJN_D) -DECLARE_INSN(fsgnjx_d, MATCH_FSGNJX_D, MASK_FSGNJX_D) -DECLARE_INSN(fmin_d, MATCH_FMIN_D, MASK_FMIN_D) -DECLARE_INSN(fmax_d, MATCH_FMAX_D, MASK_FMAX_D) -DECLARE_INSN(fcvt_s_d, MATCH_FCVT_S_D, MASK_FCVT_S_D) -DECLARE_INSN(fcvt_d_s, MATCH_FCVT_D_S, MASK_FCVT_D_S) -DECLARE_INSN(fsqrt_d, MATCH_FSQRT_D, MASK_FSQRT_D) -DECLARE_INSN(fadd_q, MATCH_FADD_Q, MASK_FADD_Q) -DECLARE_INSN(fsub_q, MATCH_FSUB_Q, MASK_FSUB_Q) -DECLARE_INSN(fmul_q, MATCH_FMUL_Q, MASK_FMUL_Q) -DECLARE_INSN(fdiv_q, MATCH_FDIV_Q, MASK_FDIV_Q) -DECLARE_INSN(fsgnj_q, MATCH_FSGNJ_Q, MASK_FSGNJ_Q) -DECLARE_INSN(fsgnjn_q, MATCH_FSGNJN_Q, MASK_FSGNJN_Q) -DECLARE_INSN(fsgnjx_q, MATCH_FSGNJX_Q, MASK_FSGNJX_Q) -DECLARE_INSN(fmin_q, MATCH_FMIN_Q, MASK_FMIN_Q) -DECLARE_INSN(fmax_q, MATCH_FMAX_Q, MASK_FMAX_Q) -DECLARE_INSN(fcvt_s_q, MATCH_FCVT_S_Q, MASK_FCVT_S_Q) -DECLARE_INSN(fcvt_q_s, MATCH_FCVT_Q_S, MASK_FCVT_Q_S) -DECLARE_INSN(fcvt_d_q, MATCH_FCVT_D_Q, MASK_FCVT_D_Q) -DECLARE_INSN(fcvt_q_d, MATCH_FCVT_Q_D, MASK_FCVT_Q_D) -DECLARE_INSN(fsqrt_q, MATCH_FSQRT_Q, MASK_FSQRT_Q) -DECLARE_INSN(fle_s, MATCH_FLE_S, MASK_FLE_S) -DECLARE_INSN(flt_s, MATCH_FLT_S, MASK_FLT_S) -DECLARE_INSN(feq_s, MATCH_FEQ_S, MASK_FEQ_S) -DECLARE_INSN(fle_d, MATCH_FLE_D, MASK_FLE_D) -DECLARE_INSN(flt_d, MATCH_FLT_D, MASK_FLT_D) -DECLARE_INSN(feq_d, MATCH_FEQ_D, MASK_FEQ_D) -DECLARE_INSN(fle_q, MATCH_FLE_Q, MASK_FLE_Q) -DECLARE_INSN(flt_q, MATCH_FLT_Q, MASK_FLT_Q) -DECLARE_INSN(feq_q, MATCH_FEQ_Q, MASK_FEQ_Q) -DECLARE_INSN(fcvt_w_s, MATCH_FCVT_W_S, MASK_FCVT_W_S) -DECLARE_INSN(fcvt_wu_s, MATCH_FCVT_WU_S, MASK_FCVT_WU_S) -DECLARE_INSN(fcvt_l_s, MATCH_FCVT_L_S, MASK_FCVT_L_S) -DECLARE_INSN(fcvt_lu_s, MATCH_FCVT_LU_S, MASK_FCVT_LU_S) -DECLARE_INSN(fmv_x_w, MATCH_FMV_X_W, MASK_FMV_X_W) -DECLARE_INSN(fclass_s, MATCH_FCLASS_S, MASK_FCLASS_S) -DECLARE_INSN(fcvt_w_d, MATCH_FCVT_W_D, MASK_FCVT_W_D) -DECLARE_INSN(fcvt_wu_d, MATCH_FCVT_WU_D, MASK_FCVT_WU_D) -DECLARE_INSN(fcvt_l_d, MATCH_FCVT_L_D, MASK_FCVT_L_D) -DECLARE_INSN(fcvt_lu_d, MATCH_FCVT_LU_D, MASK_FCVT_LU_D) -DECLARE_INSN(fmv_x_d, MATCH_FMV_X_D, MASK_FMV_X_D) -DECLARE_INSN(fclass_d, MATCH_FCLASS_D, MASK_FCLASS_D) -DECLARE_INSN(fcvt_w_q, MATCH_FCVT_W_Q, MASK_FCVT_W_Q) -DECLARE_INSN(fcvt_wu_q, MATCH_FCVT_WU_Q, MASK_FCVT_WU_Q) -DECLARE_INSN(fcvt_l_q, MATCH_FCVT_L_Q, MASK_FCVT_L_Q) -DECLARE_INSN(fcvt_lu_q, MATCH_FCVT_LU_Q, MASK_FCVT_LU_Q) -DECLARE_INSN(fmv_x_q, MATCH_FMV_X_Q, MASK_FMV_X_Q) -DECLARE_INSN(fclass_q, MATCH_FCLASS_Q, MASK_FCLASS_Q) -DECLARE_INSN(fcvt_s_w, MATCH_FCVT_S_W, MASK_FCVT_S_W) -DECLARE_INSN(fcvt_s_wu, MATCH_FCVT_S_WU, MASK_FCVT_S_WU) -DECLARE_INSN(fcvt_s_l, MATCH_FCVT_S_L, MASK_FCVT_S_L) -DECLARE_INSN(fcvt_s_lu, MATCH_FCVT_S_LU, MASK_FCVT_S_LU) -DECLARE_INSN(fmv_w_x, MATCH_FMV_W_X, MASK_FMV_W_X) -DECLARE_INSN(fcvt_d_w, MATCH_FCVT_D_W, MASK_FCVT_D_W) -DECLARE_INSN(fcvt_d_wu, MATCH_FCVT_D_WU, MASK_FCVT_D_WU) -DECLARE_INSN(fcvt_d_l, MATCH_FCVT_D_L, MASK_FCVT_D_L) -DECLARE_INSN(fcvt_d_lu, MATCH_FCVT_D_LU, MASK_FCVT_D_LU) -DECLARE_INSN(fmv_d_x, MATCH_FMV_D_X, MASK_FMV_D_X) -DECLARE_INSN(fcvt_q_w, MATCH_FCVT_Q_W, MASK_FCVT_Q_W) -DECLARE_INSN(fcvt_q_wu, MATCH_FCVT_Q_WU, MASK_FCVT_Q_WU) -DECLARE_INSN(fcvt_q_l, MATCH_FCVT_Q_L, MASK_FCVT_Q_L) -DECLARE_INSN(fcvt_q_lu, MATCH_FCVT_Q_LU, MASK_FCVT_Q_LU) -DECLARE_INSN(fmv_q_x, MATCH_FMV_Q_X, MASK_FMV_Q_X) -DECLARE_INSN(flw, MATCH_FLW, MASK_FLW) -DECLARE_INSN(fld, MATCH_FLD, MASK_FLD) -DECLARE_INSN(flq, MATCH_FLQ, MASK_FLQ) -DECLARE_INSN(fsw, MATCH_FSW, MASK_FSW) -DECLARE_INSN(fsd, MATCH_FSD, MASK_FSD) -DECLARE_INSN(fsq, MATCH_FSQ, MASK_FSQ) -DECLARE_INSN(fmadd_s, MATCH_FMADD_S, MASK_FMADD_S) -DECLARE_INSN(fmsub_s, MATCH_FMSUB_S, MASK_FMSUB_S) -DECLARE_INSN(fnmsub_s, MATCH_FNMSUB_S, MASK_FNMSUB_S) -DECLARE_INSN(fnmadd_s, MATCH_FNMADD_S, MASK_FNMADD_S) -DECLARE_INSN(fmadd_d, MATCH_FMADD_D, MASK_FMADD_D) -DECLARE_INSN(fmsub_d, MATCH_FMSUB_D, MASK_FMSUB_D) -DECLARE_INSN(fnmsub_d, MATCH_FNMSUB_D, MASK_FNMSUB_D) -DECLARE_INSN(fnmadd_d, MATCH_FNMADD_D, MASK_FNMADD_D) -DECLARE_INSN(fmadd_q, MATCH_FMADD_Q, MASK_FMADD_Q) -DECLARE_INSN(fmsub_q, MATCH_FMSUB_Q, MASK_FMSUB_Q) -DECLARE_INSN(fnmsub_q, MATCH_FNMSUB_Q, MASK_FNMSUB_Q) -DECLARE_INSN(fnmadd_q, MATCH_FNMADD_Q, MASK_FNMADD_Q) -DECLARE_INSN(c_nop, MATCH_C_NOP, MASK_C_NOP) -DECLARE_INSN(c_addi16sp, MATCH_C_ADDI16SP, MASK_C_ADDI16SP) -DECLARE_INSN(c_jr, MATCH_C_JR, MASK_C_JR) -DECLARE_INSN(c_jalr, MATCH_C_JALR, MASK_C_JALR) -DECLARE_INSN(c_ebreak, MATCH_C_EBREAK, MASK_C_EBREAK) -DECLARE_INSN(c_ld, MATCH_C_LD, MASK_C_LD) -DECLARE_INSN(c_sd, MATCH_C_SD, MASK_C_SD) -DECLARE_INSN(c_addiw, MATCH_C_ADDIW, MASK_C_ADDIW) -DECLARE_INSN(c_ldsp, MATCH_C_LDSP, MASK_C_LDSP) -DECLARE_INSN(c_sdsp, MATCH_C_SDSP, MASK_C_SDSP) -DECLARE_INSN(c_addi4spn, MATCH_C_ADDI4SPN, MASK_C_ADDI4SPN) -DECLARE_INSN(c_fld, MATCH_C_FLD, MASK_C_FLD) -DECLARE_INSN(c_lw, MATCH_C_LW, MASK_C_LW) -DECLARE_INSN(c_flw, MATCH_C_FLW, MASK_C_FLW) -DECLARE_INSN(c_fsd, MATCH_C_FSD, MASK_C_FSD) -DECLARE_INSN(c_sw, MATCH_C_SW, MASK_C_SW) -DECLARE_INSN(c_fsw, MATCH_C_FSW, MASK_C_FSW) -DECLARE_INSN(c_addi, MATCH_C_ADDI, MASK_C_ADDI) -DECLARE_INSN(c_jal, MATCH_C_JAL, MASK_C_JAL) -DECLARE_INSN(c_li, MATCH_C_LI, MASK_C_LI) -DECLARE_INSN(c_lui, MATCH_C_LUI, MASK_C_LUI) -DECLARE_INSN(c_srli, MATCH_C_SRLI, MASK_C_SRLI) -DECLARE_INSN(c_srai, MATCH_C_SRAI, MASK_C_SRAI) -DECLARE_INSN(c_andi, MATCH_C_ANDI, MASK_C_ANDI) -DECLARE_INSN(c_sub, MATCH_C_SUB, MASK_C_SUB) -DECLARE_INSN(c_xor, MATCH_C_XOR, MASK_C_XOR) -DECLARE_INSN(c_or, MATCH_C_OR, MASK_C_OR) -DECLARE_INSN(c_and, MATCH_C_AND, MASK_C_AND) -DECLARE_INSN(c_subw, MATCH_C_SUBW, MASK_C_SUBW) -DECLARE_INSN(c_addw, MATCH_C_ADDW, MASK_C_ADDW) -DECLARE_INSN(c_j, MATCH_C_J, MASK_C_J) -DECLARE_INSN(c_beqz, MATCH_C_BEQZ, MASK_C_BEQZ) -DECLARE_INSN(c_bnez, MATCH_C_BNEZ, MASK_C_BNEZ) -DECLARE_INSN(c_slli, MATCH_C_SLLI, MASK_C_SLLI) -DECLARE_INSN(c_fldsp, MATCH_C_FLDSP, MASK_C_FLDSP) -DECLARE_INSN(c_lwsp, MATCH_C_LWSP, MASK_C_LWSP) -DECLARE_INSN(c_flwsp, MATCH_C_FLWSP, MASK_C_FLWSP) -DECLARE_INSN(c_mv, MATCH_C_MV, MASK_C_MV) -DECLARE_INSN(c_add, MATCH_C_ADD, MASK_C_ADD) -DECLARE_INSN(c_fsdsp, MATCH_C_FSDSP, MASK_C_FSDSP) -DECLARE_INSN(c_swsp, MATCH_C_SWSP, MASK_C_SWSP) -DECLARE_INSN(c_fswsp, MATCH_C_FSWSP, MASK_C_FSWSP) -DECLARE_INSN(custom0, MATCH_CUSTOM0, MASK_CUSTOM0) -DECLARE_INSN(custom0_rs1, MATCH_CUSTOM0_RS1, MASK_CUSTOM0_RS1) -DECLARE_INSN(custom0_rs1_rs2, MATCH_CUSTOM0_RS1_RS2, MASK_CUSTOM0_RS1_RS2) -DECLARE_INSN(custom0_rd, MATCH_CUSTOM0_RD, MASK_CUSTOM0_RD) -DECLARE_INSN(custom0_rd_rs1, MATCH_CUSTOM0_RD_RS1, MASK_CUSTOM0_RD_RS1) -DECLARE_INSN(custom0_rd_rs1_rs2, MATCH_CUSTOM0_RD_RS1_RS2, MASK_CUSTOM0_RD_RS1_RS2) -DECLARE_INSN(custom1, MATCH_CUSTOM1, MASK_CUSTOM1) -DECLARE_INSN(custom1_rs1, MATCH_CUSTOM1_RS1, MASK_CUSTOM1_RS1) -DECLARE_INSN(custom1_rs1_rs2, MATCH_CUSTOM1_RS1_RS2, MASK_CUSTOM1_RS1_RS2) -DECLARE_INSN(custom1_rd, MATCH_CUSTOM1_RD, MASK_CUSTOM1_RD) -DECLARE_INSN(custom1_rd_rs1, MATCH_CUSTOM1_RD_RS1, MASK_CUSTOM1_RD_RS1) -DECLARE_INSN(custom1_rd_rs1_rs2, MATCH_CUSTOM1_RD_RS1_RS2, MASK_CUSTOM1_RD_RS1_RS2) -DECLARE_INSN(custom2, MATCH_CUSTOM2, MASK_CUSTOM2) -DECLARE_INSN(custom2_rs1, MATCH_CUSTOM2_RS1, MASK_CUSTOM2_RS1) -DECLARE_INSN(custom2_rs1_rs2, MATCH_CUSTOM2_RS1_RS2, MASK_CUSTOM2_RS1_RS2) -DECLARE_INSN(custom2_rd, MATCH_CUSTOM2_RD, MASK_CUSTOM2_RD) -DECLARE_INSN(custom2_rd_rs1, MATCH_CUSTOM2_RD_RS1, MASK_CUSTOM2_RD_RS1) -DECLARE_INSN(custom2_rd_rs1_rs2, MATCH_CUSTOM2_RD_RS1_RS2, MASK_CUSTOM2_RD_RS1_RS2) -DECLARE_INSN(custom3, MATCH_CUSTOM3, MASK_CUSTOM3) -DECLARE_INSN(custom3_rs1, MATCH_CUSTOM3_RS1, MASK_CUSTOM3_RS1) -DECLARE_INSN(custom3_rs1_rs2, MATCH_CUSTOM3_RS1_RS2, MASK_CUSTOM3_RS1_RS2) -DECLARE_INSN(custom3_rd, MATCH_CUSTOM3_RD, MASK_CUSTOM3_RD) -DECLARE_INSN(custom3_rd_rs1, MATCH_CUSTOM3_RD_RS1, MASK_CUSTOM3_RD_RS1) -DECLARE_INSN(custom3_rd_rs1_rs2, MATCH_CUSTOM3_RD_RS1_RS2, MASK_CUSTOM3_RD_RS1_RS2) -#endif -#ifdef DECLARE_CSR -DECLARE_CSR(fflags, CSR_FFLAGS) -DECLARE_CSR(frm, CSR_FRM) -DECLARE_CSR(fcsr, CSR_FCSR) -DECLARE_CSR(cycle, CSR_CYCLE) -DECLARE_CSR(time, CSR_TIME) -DECLARE_CSR(instret, CSR_INSTRET) -DECLARE_CSR(hpmcounter3, CSR_HPMCOUNTER3) -DECLARE_CSR(hpmcounter4, CSR_HPMCOUNTER4) -DECLARE_CSR(hpmcounter5, CSR_HPMCOUNTER5) -DECLARE_CSR(hpmcounter6, CSR_HPMCOUNTER6) -DECLARE_CSR(hpmcounter7, CSR_HPMCOUNTER7) -DECLARE_CSR(hpmcounter8, CSR_HPMCOUNTER8) -DECLARE_CSR(hpmcounter9, CSR_HPMCOUNTER9) -DECLARE_CSR(hpmcounter10, CSR_HPMCOUNTER10) -DECLARE_CSR(hpmcounter11, CSR_HPMCOUNTER11) -DECLARE_CSR(hpmcounter12, CSR_HPMCOUNTER12) -DECLARE_CSR(hpmcounter13, CSR_HPMCOUNTER13) -DECLARE_CSR(hpmcounter14, CSR_HPMCOUNTER14) -DECLARE_CSR(hpmcounter15, CSR_HPMCOUNTER15) -DECLARE_CSR(hpmcounter16, CSR_HPMCOUNTER16) -DECLARE_CSR(hpmcounter17, CSR_HPMCOUNTER17) -DECLARE_CSR(hpmcounter18, CSR_HPMCOUNTER18) -DECLARE_CSR(hpmcounter19, CSR_HPMCOUNTER19) -DECLARE_CSR(hpmcounter20, CSR_HPMCOUNTER20) -DECLARE_CSR(hpmcounter21, CSR_HPMCOUNTER21) -DECLARE_CSR(hpmcounter22, CSR_HPMCOUNTER22) -DECLARE_CSR(hpmcounter23, CSR_HPMCOUNTER23) -DECLARE_CSR(hpmcounter24, CSR_HPMCOUNTER24) -DECLARE_CSR(hpmcounter25, CSR_HPMCOUNTER25) -DECLARE_CSR(hpmcounter26, CSR_HPMCOUNTER26) -DECLARE_CSR(hpmcounter27, CSR_HPMCOUNTER27) -DECLARE_CSR(hpmcounter28, CSR_HPMCOUNTER28) -DECLARE_CSR(hpmcounter29, CSR_HPMCOUNTER29) -DECLARE_CSR(hpmcounter30, CSR_HPMCOUNTER30) -DECLARE_CSR(hpmcounter31, CSR_HPMCOUNTER31) -DECLARE_CSR(sstatus, CSR_SSTATUS) -DECLARE_CSR(sie, CSR_SIE) -DECLARE_CSR(stvec, CSR_STVEC) -DECLARE_CSR(scounteren, CSR_SCOUNTEREN) -DECLARE_CSR(sscratch, CSR_SSCRATCH) -DECLARE_CSR(sepc, CSR_SEPC) -DECLARE_CSR(scause, CSR_SCAUSE) -DECLARE_CSR(stval, CSR_STVAL) -DECLARE_CSR(sip, CSR_SIP) -DECLARE_CSR(satp, CSR_SATP) -DECLARE_CSR(mstatus, CSR_MSTATUS) -DECLARE_CSR(misa, CSR_MISA) -DECLARE_CSR(medeleg, CSR_MEDELEG) -DECLARE_CSR(mideleg, CSR_MIDELEG) -DECLARE_CSR(mie, CSR_MIE) -DECLARE_CSR(mtvec, CSR_MTVEC) -DECLARE_CSR(mcounteren, CSR_MCOUNTEREN) -DECLARE_CSR(mscratch, CSR_MSCRATCH) -DECLARE_CSR(mepc, CSR_MEPC) -DECLARE_CSR(mcause, CSR_MCAUSE) -DECLARE_CSR(mtval, CSR_MTVAL) -DECLARE_CSR(mip, CSR_MIP) -DECLARE_CSR(pmpcfg0, CSR_PMPCFG0) -DECLARE_CSR(pmpcfg1, CSR_PMPCFG1) -DECLARE_CSR(pmpcfg2, CSR_PMPCFG2) -DECLARE_CSR(pmpcfg3, CSR_PMPCFG3) -DECLARE_CSR(pmpaddr0, CSR_PMPADDR0) -DECLARE_CSR(pmpaddr1, CSR_PMPADDR1) -DECLARE_CSR(pmpaddr2, CSR_PMPADDR2) -DECLARE_CSR(pmpaddr3, CSR_PMPADDR3) -DECLARE_CSR(pmpaddr4, CSR_PMPADDR4) -DECLARE_CSR(pmpaddr5, CSR_PMPADDR5) -DECLARE_CSR(pmpaddr6, CSR_PMPADDR6) -DECLARE_CSR(pmpaddr7, CSR_PMPADDR7) -DECLARE_CSR(pmpaddr8, CSR_PMPADDR8) -DECLARE_CSR(pmpaddr9, CSR_PMPADDR9) -DECLARE_CSR(pmpaddr10, CSR_PMPADDR10) -DECLARE_CSR(pmpaddr11, CSR_PMPADDR11) -DECLARE_CSR(pmpaddr12, CSR_PMPADDR12) -DECLARE_CSR(pmpaddr13, CSR_PMPADDR13) -DECLARE_CSR(pmpaddr14, CSR_PMPADDR14) -DECLARE_CSR(pmpaddr15, CSR_PMPADDR15) -DECLARE_CSR(tselect, CSR_TSELECT) -DECLARE_CSR(tdata1, CSR_TDATA1) -DECLARE_CSR(tdata2, CSR_TDATA2) -DECLARE_CSR(tdata3, CSR_TDATA3) -DECLARE_CSR(dcsr, CSR_DCSR) -DECLARE_CSR(dpc, CSR_DPC) -DECLARE_CSR(dscratch, CSR_DSCRATCH) -DECLARE_CSR(mcycle, CSR_MCYCLE) -DECLARE_CSR(minstret, CSR_MINSTRET) -DECLARE_CSR(mhpmcounter3, CSR_MHPMCOUNTER3) -DECLARE_CSR(mhpmcounter4, CSR_MHPMCOUNTER4) -DECLARE_CSR(mhpmcounter5, CSR_MHPMCOUNTER5) -DECLARE_CSR(mhpmcounter6, CSR_MHPMCOUNTER6) -DECLARE_CSR(mhpmcounter7, CSR_MHPMCOUNTER7) -DECLARE_CSR(mhpmcounter8, CSR_MHPMCOUNTER8) -DECLARE_CSR(mhpmcounter9, CSR_MHPMCOUNTER9) -DECLARE_CSR(mhpmcounter10, CSR_MHPMCOUNTER10) -DECLARE_CSR(mhpmcounter11, CSR_MHPMCOUNTER11) -DECLARE_CSR(mhpmcounter12, CSR_MHPMCOUNTER12) -DECLARE_CSR(mhpmcounter13, CSR_MHPMCOUNTER13) -DECLARE_CSR(mhpmcounter14, CSR_MHPMCOUNTER14) -DECLARE_CSR(mhpmcounter15, CSR_MHPMCOUNTER15) -DECLARE_CSR(mhpmcounter16, CSR_MHPMCOUNTER16) -DECLARE_CSR(mhpmcounter17, CSR_MHPMCOUNTER17) -DECLARE_CSR(mhpmcounter18, CSR_MHPMCOUNTER18) -DECLARE_CSR(mhpmcounter19, CSR_MHPMCOUNTER19) -DECLARE_CSR(mhpmcounter20, CSR_MHPMCOUNTER20) -DECLARE_CSR(mhpmcounter21, CSR_MHPMCOUNTER21) -DECLARE_CSR(mhpmcounter22, CSR_MHPMCOUNTER22) -DECLARE_CSR(mhpmcounter23, CSR_MHPMCOUNTER23) -DECLARE_CSR(mhpmcounter24, CSR_MHPMCOUNTER24) -DECLARE_CSR(mhpmcounter25, CSR_MHPMCOUNTER25) -DECLARE_CSR(mhpmcounter26, CSR_MHPMCOUNTER26) -DECLARE_CSR(mhpmcounter27, CSR_MHPMCOUNTER27) -DECLARE_CSR(mhpmcounter28, CSR_MHPMCOUNTER28) -DECLARE_CSR(mhpmcounter29, CSR_MHPMCOUNTER29) -DECLARE_CSR(mhpmcounter30, CSR_MHPMCOUNTER30) -DECLARE_CSR(mhpmcounter31, CSR_MHPMCOUNTER31) -DECLARE_CSR(mhpmevent3, CSR_MHPMEVENT3) -DECLARE_CSR(mhpmevent4, CSR_MHPMEVENT4) -DECLARE_CSR(mhpmevent5, CSR_MHPMEVENT5) -DECLARE_CSR(mhpmevent6, CSR_MHPMEVENT6) -DECLARE_CSR(mhpmevent7, CSR_MHPMEVENT7) -DECLARE_CSR(mhpmevent8, CSR_MHPMEVENT8) -DECLARE_CSR(mhpmevent9, CSR_MHPMEVENT9) -DECLARE_CSR(mhpmevent10, CSR_MHPMEVENT10) -DECLARE_CSR(mhpmevent11, CSR_MHPMEVENT11) -DECLARE_CSR(mhpmevent12, CSR_MHPMEVENT12) -DECLARE_CSR(mhpmevent13, CSR_MHPMEVENT13) -DECLARE_CSR(mhpmevent14, CSR_MHPMEVENT14) -DECLARE_CSR(mhpmevent15, CSR_MHPMEVENT15) -DECLARE_CSR(mhpmevent16, CSR_MHPMEVENT16) -DECLARE_CSR(mhpmevent17, CSR_MHPMEVENT17) -DECLARE_CSR(mhpmevent18, CSR_MHPMEVENT18) -DECLARE_CSR(mhpmevent19, CSR_MHPMEVENT19) -DECLARE_CSR(mhpmevent20, CSR_MHPMEVENT20) -DECLARE_CSR(mhpmevent21, CSR_MHPMEVENT21) -DECLARE_CSR(mhpmevent22, CSR_MHPMEVENT22) -DECLARE_CSR(mhpmevent23, CSR_MHPMEVENT23) -DECLARE_CSR(mhpmevent24, CSR_MHPMEVENT24) -DECLARE_CSR(mhpmevent25, CSR_MHPMEVENT25) -DECLARE_CSR(mhpmevent26, CSR_MHPMEVENT26) -DECLARE_CSR(mhpmevent27, CSR_MHPMEVENT27) -DECLARE_CSR(mhpmevent28, CSR_MHPMEVENT28) -DECLARE_CSR(mhpmevent29, CSR_MHPMEVENT29) -DECLARE_CSR(mhpmevent30, CSR_MHPMEVENT30) -DECLARE_CSR(mhpmevent31, CSR_MHPMEVENT31) -DECLARE_CSR(mvendorid, CSR_MVENDORID) -DECLARE_CSR(marchid, CSR_MARCHID) -DECLARE_CSR(mimpid, CSR_MIMPID) -DECLARE_CSR(mhartid, CSR_MHARTID) -DECLARE_CSR(cycleh, CSR_CYCLEH) -DECLARE_CSR(timeh, CSR_TIMEH) -DECLARE_CSR(instreth, CSR_INSTRETH) -DECLARE_CSR(hpmcounter3h, CSR_HPMCOUNTER3H) -DECLARE_CSR(hpmcounter4h, CSR_HPMCOUNTER4H) -DECLARE_CSR(hpmcounter5h, CSR_HPMCOUNTER5H) -DECLARE_CSR(hpmcounter6h, CSR_HPMCOUNTER6H) -DECLARE_CSR(hpmcounter7h, CSR_HPMCOUNTER7H) -DECLARE_CSR(hpmcounter8h, CSR_HPMCOUNTER8H) -DECLARE_CSR(hpmcounter9h, CSR_HPMCOUNTER9H) -DECLARE_CSR(hpmcounter10h, CSR_HPMCOUNTER10H) -DECLARE_CSR(hpmcounter11h, CSR_HPMCOUNTER11H) -DECLARE_CSR(hpmcounter12h, CSR_HPMCOUNTER12H) -DECLARE_CSR(hpmcounter13h, CSR_HPMCOUNTER13H) -DECLARE_CSR(hpmcounter14h, CSR_HPMCOUNTER14H) -DECLARE_CSR(hpmcounter15h, CSR_HPMCOUNTER15H) -DECLARE_CSR(hpmcounter16h, CSR_HPMCOUNTER16H) -DECLARE_CSR(hpmcounter17h, CSR_HPMCOUNTER17H) -DECLARE_CSR(hpmcounter18h, CSR_HPMCOUNTER18H) -DECLARE_CSR(hpmcounter19h, CSR_HPMCOUNTER19H) -DECLARE_CSR(hpmcounter20h, CSR_HPMCOUNTER20H) -DECLARE_CSR(hpmcounter21h, CSR_HPMCOUNTER21H) -DECLARE_CSR(hpmcounter22h, CSR_HPMCOUNTER22H) -DECLARE_CSR(hpmcounter23h, CSR_HPMCOUNTER23H) -DECLARE_CSR(hpmcounter24h, CSR_HPMCOUNTER24H) -DECLARE_CSR(hpmcounter25h, CSR_HPMCOUNTER25H) -DECLARE_CSR(hpmcounter26h, CSR_HPMCOUNTER26H) -DECLARE_CSR(hpmcounter27h, CSR_HPMCOUNTER27H) -DECLARE_CSR(hpmcounter28h, CSR_HPMCOUNTER28H) -DECLARE_CSR(hpmcounter29h, CSR_HPMCOUNTER29H) -DECLARE_CSR(hpmcounter30h, CSR_HPMCOUNTER30H) -DECLARE_CSR(hpmcounter31h, CSR_HPMCOUNTER31H) -DECLARE_CSR(mcycleh, CSR_MCYCLEH) -DECLARE_CSR(minstreth, CSR_MINSTRETH) -DECLARE_CSR(mhpmcounter3h, CSR_MHPMCOUNTER3H) -DECLARE_CSR(mhpmcounter4h, CSR_MHPMCOUNTER4H) -DECLARE_CSR(mhpmcounter5h, CSR_MHPMCOUNTER5H) -DECLARE_CSR(mhpmcounter6h, CSR_MHPMCOUNTER6H) -DECLARE_CSR(mhpmcounter7h, CSR_MHPMCOUNTER7H) -DECLARE_CSR(mhpmcounter8h, CSR_MHPMCOUNTER8H) -DECLARE_CSR(mhpmcounter9h, CSR_MHPMCOUNTER9H) -DECLARE_CSR(mhpmcounter10h, CSR_MHPMCOUNTER10H) -DECLARE_CSR(mhpmcounter11h, CSR_MHPMCOUNTER11H) -DECLARE_CSR(mhpmcounter12h, CSR_MHPMCOUNTER12H) -DECLARE_CSR(mhpmcounter13h, CSR_MHPMCOUNTER13H) -DECLARE_CSR(mhpmcounter14h, CSR_MHPMCOUNTER14H) -DECLARE_CSR(mhpmcounter15h, CSR_MHPMCOUNTER15H) -DECLARE_CSR(mhpmcounter16h, CSR_MHPMCOUNTER16H) -DECLARE_CSR(mhpmcounter17h, CSR_MHPMCOUNTER17H) -DECLARE_CSR(mhpmcounter18h, CSR_MHPMCOUNTER18H) -DECLARE_CSR(mhpmcounter19h, CSR_MHPMCOUNTER19H) -DECLARE_CSR(mhpmcounter20h, CSR_MHPMCOUNTER20H) -DECLARE_CSR(mhpmcounter21h, CSR_MHPMCOUNTER21H) -DECLARE_CSR(mhpmcounter22h, CSR_MHPMCOUNTER22H) -DECLARE_CSR(mhpmcounter23h, CSR_MHPMCOUNTER23H) -DECLARE_CSR(mhpmcounter24h, CSR_MHPMCOUNTER24H) -DECLARE_CSR(mhpmcounter25h, CSR_MHPMCOUNTER25H) -DECLARE_CSR(mhpmcounter26h, CSR_MHPMCOUNTER26H) -DECLARE_CSR(mhpmcounter27h, CSR_MHPMCOUNTER27H) -DECLARE_CSR(mhpmcounter28h, CSR_MHPMCOUNTER28H) -DECLARE_CSR(mhpmcounter29h, CSR_MHPMCOUNTER29H) -DECLARE_CSR(mhpmcounter30h, CSR_MHPMCOUNTER30H) -DECLARE_CSR(mhpmcounter31h, CSR_MHPMCOUNTER31H) -#endif -#ifdef DECLARE_CAUSE -DECLARE_CAUSE("misaligned fetch", CAUSE_MISALIGNED_FETCH) -DECLARE_CAUSE("fetch access", CAUSE_FETCH_ACCESS) -DECLARE_CAUSE("illegal instruction", CAUSE_ILLEGAL_INSTRUCTION) -DECLARE_CAUSE("breakpoint", CAUSE_BREAKPOINT) -DECLARE_CAUSE("misaligned load", CAUSE_MISALIGNED_LOAD) -DECLARE_CAUSE("load access", CAUSE_LOAD_ACCESS) -DECLARE_CAUSE("misaligned store", CAUSE_MISALIGNED_STORE) -DECLARE_CAUSE("store access", CAUSE_STORE_ACCESS) -DECLARE_CAUSE("user_ecall", CAUSE_USER_ECALL) -DECLARE_CAUSE("supervisor_ecall", CAUSE_SUPERVISOR_ECALL) -DECLARE_CAUSE("hypervisor_ecall", CAUSE_HYPERVISOR_ECALL) -DECLARE_CAUSE("machine_ecall", CAUSE_MACHINE_ECALL) -DECLARE_CAUSE("fetch page fault", CAUSE_FETCH_PAGE_FAULT) -DECLARE_CAUSE("load page fault", CAUSE_LOAD_PAGE_FAULT) -DECLARE_CAUSE("store page fault", CAUSE_STORE_PAGE_FAULT) -#endif diff --git a/tests/riscv-coremark/riscv64-baremetal/link.ld b/tests/riscv-coremark/riscv64-baremetal/link.ld deleted file mode 100644 index 4f8892ee2..000000000 --- a/tests/riscv-coremark/riscv64-baremetal/link.ld +++ /dev/null @@ -1,66 +0,0 @@ -/*======================================================================*/ -/* Proxy kernel linker script */ -/*======================================================================*/ -/* This is the linker script used when building the proxy kernel. */ - -/*----------------------------------------------------------------------*/ -/* Setup */ -/*----------------------------------------------------------------------*/ - -/* The OUTPUT_ARCH command specifies the machine architecture where the - argument is one of the names used in the BFD library. More - specifically one of the entires in bfd/cpu-mips.c */ - -OUTPUT_ARCH( "riscv" ) -ENTRY(_start) - -/*----------------------------------------------------------------------*/ -/* Sections */ -/*----------------------------------------------------------------------*/ - -SECTIONS -{ - - /* text: test code section */ - . = 0x80000000; - .text.init : { *(.text.init) } - - . = ALIGN(0x1000); - .tohost : { *(.tohost) } - - .text : { *(.text) } - - /* data segment */ - .data : { *(.data) } - - .sdata : { - __global_pointer$ = . + 0x800; - *(.srodata.cst16) *(.srodata.cst8) *(.srodata.cst4) *(.srodata.cst2) *(.srodata*) - *(.sdata .sdata.* .gnu.linkonce.s.*) - } - - /* bss segment */ - .sbss : { - *(.sbss .sbss.* .gnu.linkonce.sb.*) - *(.scommon) - } - .bss : { *(.bss) } - - /* thread-local data segment */ - .tdata : - { - _tls_data = .; - *(.tdata.begin) - *(.tdata) - *(.tdata.end) - } - .tbss : - { - *(.tbss) - *(.tbss.end) - } - - /* End of uninitalized data segement */ - _end = .; -} - diff --git a/tests/riscv-coremark/riscv64-baremetal/syscallbackup.c b/tests/riscv-coremark/riscv64-baremetal/syscallbackup.c deleted file mode 100644 index e4322563c..000000000 --- a/tests/riscv-coremark/riscv64-baremetal/syscallbackup.c +++ /dev/null @@ -1,1072 +0,0 @@ -// See LICENSE for license details. - -#include -#include -#include -#include -#include -#include -#include "util.h" -#undef printf -#define SYS_write 64 -#define ZEROPAD (1<<0) /* Pad with zero */ -#define SIGN (1<<1) /* Unsigned/signed long */ -#define PLUS (1<<2) /* Show plus */ -#define SPACE (1<<3) /* Spacer */ -#define LEFT (1<<4) /* Left justified */ -#define HEX_PREP (1<<5) /* 0x */ -#define UPPERCASE (1<<6) /* 'ABCDEF' */ -typedef size_t ee_size_t; -#define is_digit(c) ((c) >= '0' && (c) <= '9') -/*static ee_size_t strnlen(const char *s, ee_size_t count);*/ -#undef strcmp -static char *digits = "0123456789abcdefghijklmnopqrstuvwxyz"; -static char *upper_digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; -char *ecvtbuf(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); -extern volatile uint64_t tohost; -extern volatile uint64_t fromhost; -ee_size_t strnlen(const char *s, ee_size_t count) -{ - const char *sc; - for (sc = s; *sc != '\0' && count--; ++sc); - return sc - s; -} -static char *number(char *str, long num, int base, int size, int precision, int type) -{ - char c, sign, tmp[66]; - char *dig = digits; - int i; - - if (type & UPPERCASE) dig = upper_digits; - if (type & LEFT) type &= ~ZEROPAD; - if (base < 2 || base > 36) return 0; - - c = (type & ZEROPAD) ? '0' : ' '; - sign = 0; - if (type & SIGN) - { - if (num < 0) - { - sign = '-'; - num = -num; - size--; - } - else if (type & PLUS) - { - sign = '+'; - size--; - } - else if (type & SPACE) - { - sign = ' '; - size--; - } - } - - if (type & HEX_PREP) - { - if (base == 16) - size -= 2; - else if (base == 8) - size--; - } - - i = 0; - - if (num == 0) - tmp[i++] = '0'; - else - { - while (num != 0) - { - tmp[i++] = dig[((unsigned long) num) % (unsigned) base]; - num = ((unsigned long) num) / (unsigned) base; - } - } - - if (i > precision) precision = i; - size -= precision; - if (!(type & (ZEROPAD | LEFT))) while (size-- > 0) *str++ = ' '; - if (sign) *str++ = sign; - - if (type & HEX_PREP) - { - if (base == 8) - *str++ = '0'; - else if (base == 16) - { - *str++ = '0'; - *str++ = digits[33]; - } - } - - if (!(type & LEFT)) while (size-- > 0) *str++ = c; - while (i < precision--) *str++ = '0'; - while (i-- > 0) *str++ = tmp[i]; - while (size-- > 0) *str++ = ' '; - - return str; -} - -static char *eaddr(char *str, unsigned char *addr, int size, int precision, int type) -{ - char tmp[24]; - char *dig = digits; - int i, len; - - if (type & UPPERCASE) dig = upper_digits; - len = 0; - for (i = 0; i < 6; i++) - { - if (i != 0) tmp[len++] = ':'; - tmp[len++] = dig[addr[i] >> 4]; - tmp[len++] = dig[addr[i] & 0x0F]; - } - - if (!(type & LEFT)) while (len < size--) *str++ = ' '; - for (i = 0; i < len; ++i) *str++ = tmp[i]; - while (len < size--) *str++ = ' '; - - return str; -} -static int skip_atoi(const char **s) -{ - int i = 0; - while (is_digit(**s)) i = i*10 + *((*s)++) - '0'; - return i; -} -static char *iaddr(char *str, unsigned char *addr, int size, int precision, int type) -{ - char tmp[24]; - int i, n, len; - - len = 0; - for (i = 0; i < 4; i++) - { - if (i != 0) tmp[len++] = '.'; - n = addr[i]; - - if (n == 0) - tmp[len++] = digits[0]; - else - { - if (n >= 100) - { - tmp[len++] = digits[n / 100]; - n = n % 100; - tmp[len++] = digits[n / 10]; - n = n % 10; - } - else if (n >= 10) - { - tmp[len++] = digits[n / 10]; - n = n % 10; - } - - tmp[len++] = digits[n]; - } - } - - if (!(type & LEFT)) while (len < size--) *str++ = ' '; - for (i = 0; i < len; ++i) *str++ = tmp[i]; - while (len < size--) *str++ = ' '; - - return str; -} - -void ee_bufcpy(char *pd, char *ps, int count) { - char *pe=ps+count; - while (ps!=pe) - *pd++=*ps++; -} - -#if HAS_FLOAT - - - -static void parse_float(double value, char *buffer, char fmt, int precision) -{ - int decpt, sign, exp, pos; - char *digits = NULL; - char cvtbuf[80]; - int capexp = 0; - int magnitude; - - if (fmt == 'G' || fmt == 'E') - { - capexp = 1; - fmt += 'a' - 'A'; - } - - if (fmt == 'g') - { - digits = ecvtbuf(value, precision, &decpt, &sign, cvtbuf); - magnitude = decpt - 1; - if (magnitude < -4 || magnitude > precision - 1) - { - fmt = 'e'; - precision -= 1; - } - else - { - fmt = 'f'; - precision -= decpt; - } - } - - if (fmt == 'e') - { - digits = ecvtbuf(value, precision + 1, &decpt, &sign, cvtbuf); - - if (sign) *buffer++ = '-'; - *buffer++ = *digits; - if (precision > 0) *buffer++ = '.'; - ee_bufcpy(buffer, digits + 1, precision); - buffer += precision; - *buffer++ = capexp ? 'E' : 'e'; - - if (decpt == 0) - { - if (value == 0.0) - exp = 0; - else - exp = -1; - } - else - exp = decpt - 1; - - if (exp < 0) - { - *buffer++ = '-'; - exp = -exp; - } - else - *buffer++ = '+'; - - buffer[2] = (exp % 10) + '0'; - exp = exp / 10; - buffer[1] = (exp % 10) + '0'; - exp = exp / 10; - buffer[0] = (exp % 10) + '0'; - buffer += 3; - } - else if (fmt == 'f') - { - digits = fcvtbuf(value, precision, &decpt, &sign, cvtbuf); - if (sign) *buffer++ = '-'; - if (*digits) - { - if (decpt <= 0) - { - *buffer++ = '0'; - *buffer++ = '.'; - for (pos = 0; pos < -decpt; pos++) *buffer++ = '0'; - while (*digits) *buffer++ = *digits++; - } - else - { - pos = 0; - while (*digits) - { - if (pos++ == decpt) *buffer++ = '.'; - *buffer++ = *digits++; - } - } - } - else - { - *buffer++ = '0'; - if (precision > 0) - { - *buffer++ = '.'; - for (pos = 0; pos < precision; pos++) *buffer++ = '0'; - } - } - } - - *buffer = '\0'; -} - - -static char *flt(char *str, double num, int size, int precision, char fmt, int flags) -{ - char tmp[80]; - char c, sign; - int n, i; - - // Left align means no zero padding - if (flags & LEFT) flags &= ~ZEROPAD; - - // Determine padding and sign char - c = (flags & ZEROPAD) ? '0' : ' '; - sign = 0; - if (flags & SIGN) - { - if (num < 0.0) - { - sign = '-'; - num = -num; - size--; - } - else if (flags & PLUS) - { - sign = '+'; - size--; - } - else if (flags & SPACE) - { - sign = ' '; - size--; - } - } - - // Compute the precision value - if (precision < 0) - precision = 6; // Default precision: 6 - - // Convert floating point number to text - parse_float(num, tmp, fmt, precision); - - if ((flags & HEX_PREP) && precision == 0) decimal_point(tmp); - if (fmt == 'g' && !(flags & HEX_PREP)) cropzeros(tmp); - - n = strnlen(tmp,256); - - // Output number with alignment and padding - size -= n; - if (!(flags & (ZEROPAD | LEFT))) while (size-- > 0) *str++ = ' '; - if (sign) *str++ = sign; - if (!(flags & LEFT)) while (size-- > 0) *str++ = c; - for (i = 0; i < n; i++) *str++ = tmp[i]; - while (size-- > 0) *str++ = ' '; - - return str; -} - - -#endif -static void decimal_point(char *buffer) -{ - while (*buffer) - { - if (*buffer == '.') return; - if (*buffer == 'e' || *buffer == 'E') break; - buffer++; - } - - if (*buffer) - { - int n = strnlen(buffer,256); - while (n > 0) - { - buffer[n + 1] = buffer[n]; - n--; - } - - *buffer = '.'; - } - else - { - *buffer++ = '.'; - *buffer = '\0'; - } -} - -static void cropzeros(char *buffer) -{ - char *stop; - - while (*buffer && *buffer != '.') buffer++; - if (*buffer++) - { - while (*buffer && *buffer != 'e' && *buffer != 'E') buffer++; - stop = buffer--; - while (*buffer == '0') buffer--; - if (*buffer == '.') buffer--; - while (buffer!=stop) - *++buffer=0; - } -} - -static int ee_vsprintf(char *buf, const char *fmt, va_list args) -{ - int len; - unsigned long num; - int i, base; - char *str; - char *s; - - int flags; // Flags to number() - - int field_width; // Width of output field - int precision; // Min. # of digits for integers; max number of chars for from string - int qualifier; // 'h', 'l', or 'L' for integer fields - - for (str = buf; *fmt; fmt++) - { - if (*fmt != '%') - { - *str++ = *fmt; - continue; - } - - // Process flags - flags = 0; -repeat: - fmt++; // This also skips first '%' - switch (*fmt) - { - case '-': flags |= LEFT; goto repeat; - case '+': flags |= PLUS; goto repeat; - case ' ': flags |= SPACE; goto repeat; - case '#': flags |= HEX_PREP; goto repeat; - case '0': flags |= ZEROPAD; goto repeat; - } - - // Get field width - field_width = -1; - if (is_digit(*fmt)) - field_width = skip_atoi(&fmt); - else if (*fmt == '*') - { - fmt++; - field_width = va_arg(args, int); - if (field_width < 0) - { - field_width = -field_width; - flags |= LEFT; - } - } - - // Get the precision - precision = -1; - if (*fmt == '.') - { - ++fmt; - if (is_digit(*fmt)) - precision = skip_atoi(&fmt); - else if (*fmt == '*') - { - ++fmt; - precision = va_arg(args, int); - } - if (precision < 0) precision = 0; - } - - // Get the conversion qualifier - qualifier = -1; - if (*fmt == 'l' || *fmt == 'L') - { - qualifier = *fmt; - fmt++; - } - - // Default base - base = 10; - - switch (*fmt) - { - case 'c': - if (!(flags & LEFT)) while (--field_width > 0) *str++ = ' '; - *str++ = (unsigned char) va_arg(args, int); - while (--field_width > 0) *str++ = ' '; - continue; - - case 's': - s = va_arg(args, char *); - if (!s) s = ""; - len = strnlen(s, precision); - if (!(flags & LEFT)) while (len < field_width--) *str++ = ' '; - for (i = 0; i < len; ++i) *str++ = *s++; - while (len < field_width--) *str++ = ' '; - continue; - - case 'p': - if (field_width == -1) - { - field_width = 2 * sizeof(void *); - flags |= ZEROPAD; - } - str = number(str, (unsigned long) va_arg(args, void *), 16, field_width, precision, flags); - continue; - - case 'A': - flags |= UPPERCASE; - - case 'a': - if (qualifier == 'l') - str = eaddr(str, va_arg(args, unsigned char *), field_width, precision, flags); - else - str = iaddr(str, va_arg(args, unsigned char *), field_width, precision, flags); - continue; - - // Integer number formats - set up the flags and "break" - case 'o': - base = 8; - break; - - case 'X': - flags |= UPPERCASE; - - case 'x': - base = 16; - break; - - case 'd': - case 'i': - flags |= SIGN; - - case 'u': - break; - -#if HAS_FLOAT - - case 'f': - str = flt(str, va_arg(args, double), field_width, precision, *fmt, flags | SIGN); - continue; - -#endif - - default: - if (*fmt != '%') *str++ = '%'; - if (*fmt) - *str++ = *fmt; - else - --fmt; - continue; - } - - if (qualifier == 'l') - num = va_arg(args, unsigned long); - else if (flags & SIGN) - num = va_arg(args, int); - else - num = va_arg(args, unsigned int); - - str = number(str, num, base, field_width, precision, flags); - } - - *str = '\0'; - return str - buf; -} - -static uintptr_t syscall(uintptr_t which, uint64_t arg0, uint64_t arg1, uint64_t arg2) -{ - volatile uint64_t magic_mem[8] __attribute__((aligned(64))); - magic_mem[0] = which; - magic_mem[1] = arg0; - magic_mem[2] = arg1; - magic_mem[3] = arg2; - __sync_synchronize(); - - tohost = (uintptr_t)magic_mem; - while (fromhost == 0) - ; - fromhost = 0; - - __sync_synchronize(); - return magic_mem[0]; -} - -#define NUM_COUNTERS 2 -static uintptr_t counters[NUM_COUNTERS]; -static char* counter_names[NUM_COUNTERS]; - -void setStats(int enable) -{ - int i = 0; -#define READ_CTR(name) do { \ - while (i >= NUM_COUNTERS) ; \ - uintptr_t csr = read_csr(name); \ - if (!enable) { csr -= counters[i]; counter_names[i] = #name; } \ - counters[i++] = csr; \ - } while (0) - - READ_CTR(mcycle); - READ_CTR(minstret); - -#undef READ_CTR -} - -/*void __attribute__((noreturn)) tohost_exit(uintptr_t code) -{ - tohost = (code << 1) | 1; - while (1); -}*/ -void __attribute__((noreturn))tohost_exit(uintptr_t code){ - tohost=(code<<1)|1; - asm ("ecall"); - } - - -uintptr_t __attribute__((weak)) handle_trap(uintptr_t cause, uintptr_t epc, uintptr_t regs[32]) -{ - tohost_exit(1337); -} - -void exit(int code) -{ - tohost_exit(code); -} - -void abort() -{ - exit(128 + SIGABRT); -} - -void printstr(const char* s) -{ - syscall(SYS_write, 1, (uintptr_t)s, strlen(s)); -} - -void __attribute__((weak)) thread_entry(int cid, int nc) -{ - // multi-threaded programs override this function. - // for the case of single-threaded programs, only let core 0 proceed. - while (cid != 0); -} - -int __attribute__((weak)) main(int argc, char** argv) -{ - // single-threaded programs override this function. - printstr("Implement main(), foo!\n"); - return -1; -} - -static void init_tls() -{ - register void* thread_pointer asm("tp"); - extern char _tls_data; - extern __thread char _tdata_begin, _tdata_end, _tbss_end; - size_t tdata_size = &_tdata_end - &_tdata_begin; - memcpy(thread_pointer, &_tls_data, tdata_size); - size_t tbss_size = &_tbss_end - &_tdata_end; - memset(thread_pointer + tdata_size, 0, tbss_size); -} - -void _init(int cid, int nc) -{ - init_tls(); - thread_entry(cid, nc); - - // only single-threaded programs should ever get here. - int ret = main(0, 0); - - char buf[NUM_COUNTERS * 32] __attribute__((aligned(64))); - char* pbuf = buf; - for (int i = 0; i < NUM_COUNTERS; i++) - if (counters[i]) - pbuf += sprintf(pbuf, "%s = %d\n", counter_names[i], counters[i]); - if (pbuf != buf) - printstr(buf); - - exit(ret); -} - -#undef putchar -int putchar(int ch) -{ - static __thread char buf[64] __attribute__((aligned(64))); - static __thread int buflen = 0; - - buf[buflen++] = ch; - - if (ch == '\n' || buflen == sizeof(buf)) - { - syscall(SYS_write, 1, (uintptr_t)buf, buflen); - buflen = 0; - } - - return 0; -} - -void printhex(uint64_t x) -{ - char str[17]; - int i; - for (i = 0; i < 16; i++) - { - str[15-i] = (x & 0xF) + ((x & 0xF) < 10 ? '0' : 'a'-10); - x >>= 4; - } - str[16] = 0; - - printstr(str); -} - -static inline void printnum(void (*putch)(int, void**), void **putdat, - unsigned long long num, unsigned base, int width, int padc) -{ - unsigned digs[sizeof(num)*CHAR_BIT]; - int pos = 0; - - while (1) - { - digs[pos++] = num % base; - if (num < base) - break; - num /= base; - } - - while (width-- > pos) - putch(padc, putdat); - - while (pos-- > 0) - putch(digs[pos] + (digs[pos] >= 10 ? 'a' - 10 : '0'), putdat); -} - -static unsigned long long getuint(va_list *ap, int lflag) -{ - if (lflag >= 2) - return va_arg(*ap, unsigned long long); - else if (lflag) - return va_arg(*ap, unsigned long); - else - return va_arg(*ap, unsigned int); -} - -static long long getint(va_list *ap, int lflag) -{ - if (lflag >= 2) - return va_arg(*ap, long long); - else if (lflag) - return va_arg(*ap, long); - else - return va_arg(*ap, int); -} - -static void vprintfmt(void (*putch)(int, void**), void **putdat, const char *fmt, va_list ap) -{ - register const char* p; - const char* last_fmt; - register int ch, err; - unsigned long long num; - int base, lflag, width, precision, altflag; - char padc; - - while (1) { - while ((ch = *(unsigned char *) fmt) != '%') { - if (ch == '\0') - return; - fmt++; - putch(ch, putdat); - } - fmt++; - - // Process a %-escape sequence - last_fmt = fmt; - padc = ' '; - width = -1; - precision = -1; - lflag = 0; - altflag = 0; - reswitch: - switch (ch = *(unsigned char *) fmt++) { - - // flag to pad on the right - case '-': - padc = '-'; - goto reswitch; - - // flag to pad with 0's instead of spaces - case '0': - padc = '0'; - goto reswitch; - - // width field - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - for (precision = 0; ; ++fmt) { - precision = precision * 10 + ch - '0'; - ch = *fmt; - if (ch < '0' || ch > '9') - break; - } - goto process_precision; - - case '*': - precision = va_arg(ap, int); - goto process_precision; - - case '.': - if (width < 0) - width = 0; - goto reswitch; - - case '#': - altflag = 1; - goto reswitch; - - process_precision: - if (width < 0) - width = precision, precision = -1; - goto reswitch; - - // long flag (doubled for long long) - case 'l': - lflag++; - goto reswitch; - - // character - case 'c': - putch(va_arg(ap, int), putdat); - break; - - // string - case 's': - if ((p = va_arg(ap, char *)) == NULL) - p = "(null)"; - if (width > 0 && padc != '-') - for (width -= strnlen(p, precision); width > 0; width--) - putch(padc, putdat); - for (; (ch = *p) != '\0' && (precision < 0 || --precision >= 0); width--) { - putch(ch, putdat); - p++; - } - for (; width > 0; width--) - putch(' ', putdat); - break; - - // (signed) decimal - case 'd': - num = getint(&ap, lflag); - if ((long long) num < 0) { - putch('-', putdat); - num = -(long long) num; - } - base = 10; - goto signed_number; - - // unsigned decimal - case 'u': - base = 10; - goto unsigned_number; - - // (unsigned) octal - case 'o': - // should do something with padding so it's always 3 octits - base = 8; - goto unsigned_number; - - // pointer - case 'p': - static_assert(sizeof(long) == sizeof(void*)); - lflag = 1; - putch('0', putdat); - putch('x', putdat); - /* fall through to 'x' */ - - // (unsigned) hexadecimal - case 'X': - case 'x': - base = 16; - unsigned_number: - num = getuint(&ap, lflag); - signed_number: - printnum(putch, putdat, num, base, width, padc); - break; - - // escaped '%' character - case '%': - putch(ch, putdat); - break; - - // unrecognized escape sequence - just print it literally - default: - putch('%', putdat); - fmt = last_fmt; - break; - } - } -} -/* -int printf(const char* fmt, ...) -{ - va_list ap; - va_start(ap, fmt); - - vprintfmt((void*)putchar, 0, fmt, ap); - - va_end(ap); - return 0; // incorrect return value, but who cares, anyway? -}*/ - - -void _send_char(char c) { -/*#error "You must implement the method _send_char to use this file!\n"; -*/ -volatile unsigned char *THR=(unsigned char *)0x10000000; -volatile unsigned char *LSR=(unsigned char *)0x10000005; - -while(!(*LSR&0b100000)); -*THR=c; -while(!(*LSR&0b100000)); -} - - -int sprintf(char* str, const char* fmt, ...) -{ - va_list ap; - char* str0 = str; - va_start(ap, fmt); - - void sprintf_putch(int ch, void** data) - { - char** pstr = (char**)data; - **pstr = ch; - (*pstr)++; - } - - vprintfmt(sprintf_putch, (void**)&str, fmt, ap); - *str = 0; - - va_end(ap); - return str - str0; -} - -void* memcpy(void* dest, const void* src, size_t len) -{ - if ((((uintptr_t)dest | (uintptr_t)src | len) & (sizeof(uintptr_t)-1)) == 0) { - const uintptr_t* s = src; - uintptr_t *d = dest; - while (d < (uintptr_t*)(dest + len)) - *d++ = *s++; - } else { - const char* s = src; - char *d = dest; - while (d < (char*)(dest + len)) - *d++ = *s++; - } - return dest; -} - -void* memset(void* dest, int byte, size_t len) -{ - if ((((uintptr_t)dest | len) & (sizeof(uintptr_t)-1)) == 0) { - uintptr_t word = byte & 0xFF; - word |= word << 8; - word |= word << 16; - word |= word << 16 << 16; - - uintptr_t *d = dest; - while (d < (uintptr_t*)(dest + len)){ - *d = word; - d++;} - } else { - char *d = dest; - while (d < (char*)(dest + len)){ - *d = byte; - d++;} - } - return dest; -} -//recompile pls -size_t strlen(const char *s) -{ - const char *p = s; - while (*p) - p++; - return p - s; -} - -/*size_t strnlen(const char *s, size_t n) -{ - const char *p = s; - while (n-- && *p) - p++; - return p - s; -}*/ - -int strcmp(const char* s1, const char* s2) -{ - unsigned char c1, c2; - - do { - c1 = *s1++; - c2 = *s2++; - } while (c1 != 0 && c1 == c2); - - return c1 - c2; -} - -char* strcpy(char* dest, const char* src) -{ - char* d = dest; - while ((*d++ = *src++)) - ; - return dest; -} - -long atol(const char* str) -{ - long res = 0; - int sign = 0; - - while (*str == ' ') - str++; - - if (*str == '-' || *str == '+') { - sign = *str == '-'; - str++; - } - - while (*str) { - res *= 10; - res += *str++ - '0'; - } - - return sign ? -res : res; -} - -int sendstring(const char *p){ - int n=0; - while (*p) { - _send_char(*p); - n++; - p++; - } - - return n; -} -int gg_printf(const char *fmt, ...) -{ - char buf[256],*p; - va_list args; - int n=0; - - va_start(args, fmt); - ee_vsprintf(buf, fmt, args); - va_end(args); - p=buf; - /* while (*p) { - _send_char(*p); - n++; - p++; - } -*/ -n=sendstring(p); - return n; -} - - -int puts(const char* s) -{ - gg_printf(s); - gg_printf("\n"); - return 0; // incorrect return value, but who cares, anyway? -} - -unsigned long getTimer(void){ - unsigned long *MTIME = (unsigned long*)0x0200BFF8; - return *MTIME; - -} diff --git a/tests/riscv-coremark/riscv64-baremetal/syscalls.c b/tests/riscv-coremark/riscv64-baremetal/syscalls.c deleted file mode 100644 index c1824954f..000000000 --- a/tests/riscv-coremark/riscv64-baremetal/syscalls.c +++ /dev/null @@ -1,505 +0,0 @@ -// See LICENSE for license details. - -#include -#include -#include -#include -#include -#include -#include "util.h" - -#define SYS_write 64 - -#undef strcmp - -extern volatile uint64_t tohost; -extern volatile uint64_t fromhost; - - -void _send_char(char c) { -/*#error "You must implement the method _send_char to use this file!\n"; -*/ -volatile unsigned char *THR=(unsigned char *)0x10000000; -volatile unsigned char *LSR=(unsigned char *)0x10000005; - -while(!(*LSR&0b100000)); -*THR=c; -while(!(*LSR&0b100000)); -} - -int sendstring(const char *p){ - int n=0; - while (*p) { - _send_char(*p); - n++; - p++; - } - - return n; -} - -static uintptr_t syscall(uintptr_t which, uint64_t arg0, uint64_t arg1, uint64_t arg2) -{ - volatile uint64_t magic_mem[8] __attribute__((aligned(64))); - magic_mem[0] = which; - magic_mem[1] = arg0; - magic_mem[2] = arg1; - magic_mem[3] = arg2; - __sync_synchronize(); - - tohost = (uintptr_t)magic_mem; - while (fromhost == 0) - ; - fromhost = 0; - - __sync_synchronize(); - return magic_mem[0]; -} - -#define NUM_COUNTERS 2 -static uintptr_t counters[NUM_COUNTERS]; -static char* counter_names[NUM_COUNTERS]; - -void setStats(int enable) -{ - int i = 0; -#define READ_CTR(name) do { \ - while (i >= NUM_COUNTERS) ; \ - uintptr_t csr = read_csr(name); \ - if (!enable) { csr -= counters[i]; counter_names[i] = #name; } \ - counters[i++] = csr; \ - } while (0) - - READ_CTR(mcycle); - READ_CTR(minstret); - -#undef READ_CTR -} - -void __attribute__((noreturn)) tohost_exit(uintptr_t code) -{ - tohost = (code << 1) | 1; - asm ("ecall"); -} - -uintptr_t __attribute__((weak)) handle_trap(uintptr_t cause, uintptr_t epc, uintptr_t regs[32]) -{ - tohost_exit(1337); -} - -void exit(int code) -{ - tohost_exit(code); -} - -void abort() -{ - exit(128 + SIGABRT); -} - -void printstr(const char* s) -{ - syscall(SYS_write, 1, (uintptr_t)s, strlen(s)); -} - -void __attribute__((weak)) thread_entry(int cid, int nc) -{ - // multi-threaded programs override this function. - // for the case of single-threaded programs, only let core 0 proceed. - while (cid != 0); -} - -int __attribute__((weak)) main(int argc, char** argv) -{ - // single-threaded programs override this function. - printstr("Implement main(), foo!\n"); - return -1; -} - -static void init_tls() -{ - register void* thread_pointer asm("tp"); - extern char _tls_data; - extern __thread char _tdata_begin, _tdata_end, _tbss_end; - size_t tdata_size = &_tdata_end - &_tdata_begin; - memcpy(thread_pointer, &_tls_data, tdata_size); - size_t tbss_size = &_tbss_end - &_tdata_end; - memset(thread_pointer + tdata_size, 0, tbss_size); -} - -void _init(int cid, int nc) -{ - init_tls(); - thread_entry(cid, nc); - - // only single-threaded programs should ever get here. - int ret = main(0, 0); - - char buf[NUM_COUNTERS * 32] __attribute__((aligned(64))); - char* pbuf = buf; - for (int i = 0; i < NUM_COUNTERS; i++) - if (counters[i]) - pbuf += sprintf(pbuf, "%s = %d\n", counter_names[i], counters[i]); - if (pbuf != buf) - printstr(buf); - - exit(ret); -} - -#undef putchar -int putchar(int ch) -{ - /*static __thread char buf[64] __attribute__((aligned(64))); - static __thread int buflen = 0; - - buf[buflen++] = ch; - - if (ch == '\n' || buflen == sizeof(buf)) - { - syscall(SYS_write, 1, (uintptr_t)buf, buflen); - buflen = 0; - } - - return 0;*/ - _send_char(ch); - return 0; - -} - -void printhex(uint64_t x) -{ - char str[17]; - int i; - for (i = 0; i < 16; i++) - { - str[15-i] = (x & 0xF) + ((x & 0xF) < 10 ? '0' : 'a'-10); - x >>= 4; - } - str[16] = 0; - - printstr(str); -} - -static inline void printnum(void (*putch)(int, void**), void **putdat, - unsigned long long num, unsigned base, int width, int padc) -{ - unsigned digs[sizeof(num)*CHAR_BIT]; - int pos = 0; - - while (1) - { - digs[pos++] = num % base; - if (num < base) - break; - num /= base; - } - - while (width-- > pos) - putch(padc, putdat); - - while (pos-- > 0) - putch(digs[pos] + (digs[pos] >= 10 ? 'a' - 10 : '0'), putdat); -} - -static unsigned long long getuint(va_list *ap, int lflag) -{ - if (lflag >= 2) - return va_arg(*ap, unsigned long long); - else if (lflag) - return va_arg(*ap, unsigned long); - else - return va_arg(*ap, unsigned int); -} - -static long long getint(va_list *ap, int lflag) -{ - if (lflag >= 2) - return va_arg(*ap, long long); - else if (lflag) - return va_arg(*ap, long); - else - return va_arg(*ap, int); -} - -static void vprintfmt(void (*putch)(int, void**), void **putdat, const char *fmt, va_list ap) -{ - register const char* p; - const char* last_fmt; - register int ch, err; - unsigned long long num; - int base, lflag, width, precision, altflag; - char padc; - - while (1) { - while ((ch = *(unsigned char *) fmt) != '%') { - if (ch == '\0') - return; - fmt++; - putch(ch, putdat); - } - fmt++; - - // Process a %-escape sequence - last_fmt = fmt; - padc = ' '; - width = -1; - precision = -1; - lflag = 0; - altflag = 0; - reswitch: - switch (ch = *(unsigned char *) fmt++) { - - // flag to pad on the right - case '-': - padc = '-'; - goto reswitch; - - // flag to pad with 0's instead of spaces - case '0': - padc = '0'; - goto reswitch; - - // width field - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - for (precision = 0; ; ++fmt) { - precision = precision * 10 + ch - '0'; - ch = *fmt; - if (ch < '0' || ch > '9') - break; - } - goto process_precision; - - case '*': - precision = va_arg(ap, int); - goto process_precision; - - case '.': - if (width < 0) - width = 0; - goto reswitch; - - case '#': - altflag = 1; - goto reswitch; - - process_precision: - if (width < 0) - width = precision, precision = -1; - goto reswitch; - - // long flag (doubled for long long) - case 'l': - lflag++; - goto reswitch; - - // character - case 'c': - putch(va_arg(ap, int), putdat); - break; - - // string - case 's': - if ((p = va_arg(ap, char *)) == NULL) - p = "(null)"; - if (width > 0 && padc != '-') - for (width -= strnlen(p, precision); width > 0; width--) - putch(padc, putdat); - for (; (ch = *p) != '\0' && (precision < 0 || --precision >= 0); width--) { - putch(ch, putdat); - p++; - } - for (; width > 0; width--) - putch(' ', putdat); - break; - - // (signed) decimal - case 'd': - num = getint(&ap, lflag); - if ((long long) num < 0) { - putch('-', putdat); - num = -(long long) num; - } - base = 10; - goto signed_number; - - // unsigned decimal - case 'u': - base = 10; - goto unsigned_number; - - // (unsigned) octal - case 'o': - // should do something with padding so it's always 3 octits - base = 8; - goto unsigned_number; - - // pointer - case 'p': - static_assert(sizeof(long) == sizeof(void*)); - lflag = 1; - putch('0', putdat); - putch('x', putdat); - /* fall through to 'x' */ - - // (unsigned) hexadecimal - case 'X': - case 'x': - base = 16; - unsigned_number: - num = getuint(&ap, lflag); - signed_number: - printnum(putch, putdat, num, base, width, padc); - break; - - // escaped '%' character - case '%': - putch(ch, putdat); - break; - - // unrecognized escape sequence - just print it literally - default: - putch('%', putdat); - fmt = last_fmt; - break; - } - } -} - -int printf(const char* fmt, ...) -{ - va_list ap; - va_start(ap, fmt); - - vprintfmt((void*)putchar, 0, fmt, ap); - - va_end(ap); - return 0; // incorrect return value, but who cares, anyway? -} - -int puts(const char* s) -{ - printf(s); - printf("\n"); - return 0; // incorrect return value, but who cares, anyway? -} - -int sprintf(char* str, const char* fmt, ...) -{ - va_list ap; - char* str0 = str; - va_start(ap, fmt); - - void sprintf_putch(int ch, void** data) - { - char** pstr = (char**)data; - **pstr = ch; - (*pstr)++; - } - - vprintfmt(sprintf_putch, (void**)&str, fmt, ap); - *str = 0; - - va_end(ap); - return str - str0; -} - -void* memcpy(void* dest, const void* src, size_t len) -{ - if ((((uintptr_t)dest | (uintptr_t)src | len) & (sizeof(uintptr_t)-1)) == 0) { - const uintptr_t* s = src; - uintptr_t *d = dest; - while (d < (uintptr_t*)(dest + len)) - *d++ = *s++; - } else { - const char* s = src; - char *d = dest; - while (d < (char*)(dest + len)) - *d++ = *s++; - } - return dest; -} -void* memset(void* dest, int byte, size_t len) -{ - if ((((uintptr_t)dest | len) & (sizeof(uintptr_t)-1)) == 0) { - uintptr_t word = byte & 0xFF; - word |= word << 8; - word |= word << 16; - word |= word << 16 << 16; - - uintptr_t *d = dest; - while (d < (uintptr_t*)(dest + len)){ - *d = word; - d++;} - } else { - char *d = dest; - while (d < (char*)(dest + len)){ - *d = byte; - d++;} - } - return dest; -} - -size_t strlen(const char *s) -{ - const char *p = s; - while (*p) - p++; - return p - s; -} - -size_t strnlen(const char *s, size_t n) -{ - const char *p = s; - while (n-- && *p) - p++; - return p - s; -} - -int strcmp(const char* s1, const char* s2) -{ - unsigned char c1, c2; - - do { - c1 = *s1++; - c2 = *s2++; - } while (c1 != 0 && c1 == c2); - - return c1 - c2; -} - -char* strcpy(char* dest, const char* src) -{ - char* d = dest; - while ((*d++ = *src++)) - ; - return dest; -} - -long atol(const char* str) -{ - long res = 0; - int sign = 0; - - while (*str == ' ') - str++; - - if (*str == '-' || *str == '+') { - sign = *str == '-'; - str++; - } - - while (*str) { - res *= 10; - res += *str++ - '0'; - } - - return sign ? -res : res; -} diff --git a/tests/riscv-coremark/riscv64-baremetal/util.h b/tests/riscv-coremark/riscv64-baremetal/util.h deleted file mode 100644 index 081cfd634..000000000 --- a/tests/riscv-coremark/riscv64-baremetal/util.h +++ /dev/null @@ -1,90 +0,0 @@ -// See LICENSE for license details. - -#ifndef __UTIL_H -#define __UTIL_H - -extern void setStats(int enable); - -#include - -#define static_assert(cond) switch(0) { case 0: case !!(long)(cond): ; } - -static int verify(int n, const volatile int* test, const int* verify) -{ - int i; - // Unrolled for faster verification - for (i = 0; i < n/2*2; i+=2) - { - int t0 = test[i], t1 = test[i+1]; - int v0 = verify[i], v1 = verify[i+1]; - if (t0 != v0) return i+1; - if (t1 != v1) return i+2; - } - if (n % 2 != 0 && test[n-1] != verify[n-1]) - return n; - return 0; -} - -static int verifyDouble(int n, const volatile double* test, const double* verify) -{ - int i; - // Unrolled for faster verification - for (i = 0; i < n/2*2; i+=2) - { - double t0 = test[i], t1 = test[i+1]; - double v0 = verify[i], v1 = verify[i+1]; - int eq1 = t0 == v0, eq2 = t1 == v1; - if (!(eq1 & eq2)) return i+1+eq1; - } - if (n % 2 != 0 && test[n-1] != verify[n-1]) - return n; - return 0; -} - -static void __attribute__((noinline)) barrier(int ncores) -{ - static volatile int sense; - static volatile int count; - static __thread int threadsense; - - __sync_synchronize(); - - threadsense = !threadsense; - if (__sync_fetch_and_add(&count, 1) == ncores-1) - { - count = 0; - sense = threadsense; - } - else while(sense != threadsense) - ; - - __sync_synchronize(); -} - -static uint64_t lfsr(uint64_t x) -{ - uint64_t bit = (x ^ (x >> 1)) & 1; - return (x >> 1) | (bit << 62); -} - -static uintptr_t insn_len(uintptr_t pc) -{ - return (*(unsigned short*)pc & 3) ? 4 : 2; -} - -#ifdef __riscv -#include "encoding.h" -#endif - -#define stringify_1(s) #s -#define stringify(s) stringify_1(s) -#define stats(code, iter) do { \ - unsigned long _c = -read_csr(mcycle), _i = -read_csr(minstret); \ - code; \ - _c += read_csr(mcycle), _i += read_csr(minstret); \ - if (cid == 0) \ - printf("\n%s: %ld cycles, %ld.%ld cycles/iter, %ld.%ld CPI\n", \ - stringify(code), _c, _c/iter, 10*_c/iter%10, _c/_i, 10*_c/_i%10); \ - } while(0) - -#endif //__UTIL_H diff --git a/tests/riscv-coremark/riscv64/core_portme.c b/tests/riscv-coremark/riscv64/core_portme.c deleted file mode 100755 index 8f17cb8bd..000000000 --- a/tests/riscv-coremark/riscv64/core_portme.c +++ /dev/null @@ -1,346 +0,0 @@ -/* -Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Original Author: Shay Gal-on -*/ - -#include -#include -#include "coremark.h" -#if CALLGRIND_RUN -#include -#endif - -#if (MEM_METHOD==MEM_MALLOC) -#include -/* Function: portable_malloc - Provide malloc() functionality in a platform specific way. -*/ -void *portable_malloc(size_t size) { - return malloc(size); -} -/* Function: portable_free - Provide free() functionality in a platform specific way. -*/ -void portable_free(void *p) { - free(p); -} -#else -void *portable_malloc(size_t size) { - return NULL; -} -void portable_free(void *p) { - p=NULL; -} -#endif - -#if (SEED_METHOD==SEED_VOLATILE) -#if VALIDATION_RUN - volatile ee_s32 seed1_volatile=0x3415; - volatile ee_s32 seed2_volatile=0x3415; - volatile ee_s32 seed3_volatile=0x66; -#endif -#if PERFORMANCE_RUN - volatile ee_s32 seed1_volatile=0x0; - volatile ee_s32 seed2_volatile=0x0; - volatile ee_s32 seed3_volatile=0x66; -#endif -#if PROFILE_RUN - volatile ee_s32 seed1_volatile=0x8; - volatile ee_s32 seed2_volatile=0x8; - volatile ee_s32 seed3_volatile=0x8; -#endif - volatile ee_s32 seed4_volatile=ITERATIONS; - volatile ee_s32 seed5_volatile=0; -#endif -/* Porting: Timing functions - How to capture time and convert to seconds must be ported to whatever is supported by the platform. - e.g. Read value from on board RTC, read value from cpu clock cycles performance counter etc. - Sample implementation for standard time.h and windows.h definitions included. -*/ -/* Define: TIMER_RES_DIVIDER - Divider to trade off timer resolution and total time that can be measured. - - Use lower values to increase resolution, but make sure that overflow does not occur. - If there are issues with the return value overflowing, increase this value. - */ -#if USE_CLOCK - #define NSECS_PER_SEC CLOCKS_PER_SEC - #define EE_TIMER_TICKER_RATE 1000 - #define CORETIMETYPE clock_t - #define GETMYTIME(_t) (*_t=clock()) - #define MYTIMEDIFF(fin,ini) ((fin)-(ini)) - #define TIMER_RES_DIVIDER 1 - #define SAMPLE_TIME_IMPLEMENTATION 1 -#elif defined(_MSC_VER) - #define NSECS_PER_SEC 10000000 - #define EE_TIMER_TICKER_RATE 1000 - #define CORETIMETYPE FILETIME - #define GETMYTIME(_t) GetSystemTimeAsFileTime(_t) - #define MYTIMEDIFF(fin,ini) (((*(__int64*)&fin)-(*(__int64*)&ini))/TIMER_RES_DIVIDER) - /* setting to millisces resolution by default with MSDEV */ - #ifndef TIMER_RES_DIVIDER - #define TIMER_RES_DIVIDER 1000 - #endif - #define SAMPLE_TIME_IMPLEMENTATION 1 -#elif HAS_TIME_H - #define NSECS_PER_SEC 1000000000 - #define EE_TIMER_TICKER_RATE 1000 - #define CORETIMETYPE struct timespec - #define GETMYTIME(_t) clock_gettime(CLOCK_REALTIME,_t) - #define MYTIMEDIFF(fin,ini) ((fin.tv_sec-ini.tv_sec)*(NSECS_PER_SEC/TIMER_RES_DIVIDER)+(fin.tv_nsec-ini.tv_nsec)/TIMER_RES_DIVIDER) - /* setting to 1/1000 of a second resolution by default with linux */ - #ifndef TIMER_RES_DIVIDER - #define TIMER_RES_DIVIDER 1000000 - #endif - #define SAMPLE_TIME_IMPLEMENTATION 1 -#else - // Defined for RISCV - #define NSECS_PER_SEC 1000000000 // TODO: What freq are we assuming? - #define EE_TIMER_TICKER_RATE 1000 // TODO: What is this? - #define CORETIMETYPE clock_t - #define read_csr(reg) ({ unsigned long __tmp; \ - asm volatile ("csrr %0, " #reg : "=r"(__tmp)); \ - __tmp; }) - #define GETMYTIME(_t) (*_t=read_csr(cycle)) - #define MYTIMEDIFF(fin,ini) ((fin)-(ini)) - #define TIMER_RES_DIVIDER 1 - #define SAMPLE_TIME_IMPLEMENTATION 1 -#endif -#define EE_TICKS_PER_SEC (NSECS_PER_SEC / TIMER_RES_DIVIDER) - -#if SAMPLE_TIME_IMPLEMENTATION -/** Define Host specific (POSIX), or target specific global time variables. */ -static CORETIMETYPE start_time_val, stop_time_val; - -/* Function: start_time - This function will be called right before starting the timed portion of the benchmark. - - Implementation may be capturing a system timer (as implemented in the example code) - or zeroing some system parameters - e.g. setting the cpu clocks cycles to 0. -*/ -void start_time(void) { - GETMYTIME(&start_time_val ); -#if CALLGRIND_RUN - CALLGRIND_START_INSTRUMENTATION -#endif -#if MICA - asm volatile("int3");/*1 */ -#endif -} -/* Function: stop_time - This function will be called right after ending the timed portion of the benchmark. - - Implementation may be capturing a system timer (as implemented in the example code) - or other system parameters - e.g. reading the current value of cpu cycles counter. -*/ -void stop_time(void) { -#if CALLGRIND_RUN - CALLGRIND_STOP_INSTRUMENTATION -#endif -#if MICA - asm volatile("int3");/*1 */ -#endif - GETMYTIME(&stop_time_val ); -} -/* Function: get_time - Return an abstract "ticks" number that signifies time on the system. - - Actual value returned may be cpu cycles, milliseconds or any other value, - as long as it can be converted to seconds by . - This methodology is taken to accomodate any hardware or simulated platform. - The sample implementation returns millisecs by default, - and the resolution is controlled by -*/ -CORE_TICKS get_time(void) { - CORE_TICKS elapsed=(CORE_TICKS)(MYTIMEDIFF(stop_time_val, start_time_val)); - return elapsed; -} -/* Function: time_in_secs - Convert the value returned by get_time to seconds. - - The type is used to accomodate systems with no support for floating point. - Default implementation implemented by the EE_TICKS_PER_SEC macro above. -*/ -secs_ret time_in_secs(CORE_TICKS ticks) { - secs_ret retval=((secs_ret)ticks) / (secs_ret)EE_TICKS_PER_SEC; - return retval; -} -#else -#error "Please implement timing functionality in core_portme.c" -#endif /* SAMPLE_TIME_IMPLEMENTATION */ - -ee_u32 default_num_contexts=MULTITHREAD; - -/* Function: portable_init - Target specific initialization code - Test for some common mistakes. -*/ -void portable_init(core_portable *p, int *argc, char *argv[]) -{ -#if PRINT_ARGS - int i; - for (i=0; i<*argc; i++) { - ee_printf("Arg[%d]=%s\n",i,argv[i]); - } -#endif - if (sizeof(ee_ptr_int) != sizeof(ee_u8 *)) { - ee_printf("ERROR! Please define ee_ptr_int to a type that holds a pointer!\n"); - } - if (sizeof(ee_u32) != 4) { - ee_printf("ERROR! Please define ee_u32 to a 32b unsigned type!\n"); - } -#if (MAIN_HAS_NOARGC && (SEED_METHOD==SEED_ARG)) - ee_printf("ERROR! Main has no argc, but SEED_METHOD defined to SEED_ARG!\n"); -#endif - -#if (MULTITHREAD>1) && (SEED_METHOD==SEED_ARG) - int nargs=*argc,i; - if ((nargs>1) && (*argv[1]=='M')) { - default_num_contexts=parseval(argv[1]+1); - if (default_num_contexts>MULTITHREAD) - default_num_contexts=MULTITHREAD; - /* Shift args since first arg is directed to the portable part and not to coremark main */ - --nargs; - for (i=1; i*/ - p->portable_id=1; -} -/* Function: portable_fini - Target specific final code -*/ -void portable_fini(core_portable *p) -{ - p->portable_id=0; -} - -#if (MULTITHREAD>1) - -/* Function: core_start_parallel - Start benchmarking in a parallel context. - - Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets. - Other implementations using MCAPI or other standards can easily be devised. -*/ -/* Function: core_stop_parallel - Stop a parallel context execution of coremark, and gather the results. - - Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets. - Other implementations using MCAPI or other standards can easily be devised. -*/ -#if USE_PTHREAD -ee_u8 core_start_parallel(core_results *res) { - return (ee_u8)pthread_create(&(res->port.thread),NULL,iterate,(void *)res); -} -ee_u8 core_stop_parallel(core_results *res) { - void *retval; - return (ee_u8)pthread_join(res->port.thread,&retval); -} -#elif USE_FORK -static int key_id=0; -ee_u8 core_start_parallel(core_results *res) { - key_t key=4321+key_id; - key_id++; - res->port.pid=fork(); - res->port.shmid=shmget(key, 8, IPC_CREAT | 0666); - if (res->port.shmid<0) { - ee_printf("ERROR in shmget!\n"); - } - if (res->port.pid==0) { - iterate(res); - res->port.shm=shmat(res->port.shmid, NULL, 0); - /* copy the validation values to the shared memory area and quit*/ - if (res->port.shm == (char *) -1) { - ee_printf("ERROR in child shmat!\n"); - } else { - memcpy(res->port.shm,&(res->crc),8); - shmdt(res->port.shm); - } - exit(0); - } - return 1; -} -ee_u8 core_stop_parallel(core_results *res) { - int status; - pid_t wpid = waitpid(res->port.pid,&status,WUNTRACED); - if (wpid != res->port.pid) { - ee_printf("ERROR waiting for child.\n"); - if (errno == ECHILD) ee_printf("errno=No such child %d\n",res->port.pid); - if (errno == EINTR) ee_printf("errno=Interrupted\n"); - return 0; - } - /* after process is done, get the values from the shared memory area */ - res->port.shm=shmat(res->port.shmid, NULL, 0); - if (res->port.shm == (char *) -1) { - ee_printf("ERROR in parent shmat!\n"); - return 0; - } - memcpy(&(res->crc),res->port.shm,8); - shmdt(res->port.shm); - return 1; -} -#elif USE_SOCKET -static int key_id=0; -ee_u8 core_start_parallel(core_results *res) { - int bound, buffer_length=8; - res->port.sa.sin_family = AF_INET; - res->port.sa.sin_addr.s_addr = htonl(0x7F000001); - res->port.sa.sin_port = htons(7654+key_id); - key_id++; - res->port.pid=fork(); - if (res->port.pid==0) { /* benchmark child */ - iterate(res); - res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); - if (-1 == res->port.sock) /* if socket failed to initialize, exit */ { - ee_printf("Error Creating Socket"); - } else { - int bytes_sent = sendto(res->port.sock, &(res->crc), buffer_length, 0,(struct sockaddr*)&(res->port.sa), sizeof (struct sockaddr_in)); - if (bytes_sent < 0) - ee_printf("Error sending packet: %s\n", strerror(errno)); - close(res->port.sock); /* close the socket */ - } - exit(0); - } - /* parent process, open the socket */ - res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); - bound = bind(res->port.sock,(struct sockaddr*)&(res->port.sa), sizeof(struct sockaddr)); - if (bound < 0) - ee_printf("bind(): %s\n",strerror(errno)); - return 1; -} -ee_u8 core_stop_parallel(core_results *res) { - int status; - int fromlen=sizeof(struct sockaddr); - int recsize = recvfrom(res->port.sock, &(res->crc), 8, 0, (struct sockaddr*)&(res->port.sa), &fromlen); - if (recsize < 0) { - ee_printf("Error in receive: %s\n", strerror(errno)); - return 0; - } - pid_t wpid = waitpid(res->port.pid,&status,WUNTRACED); - if (wpid != res->port.pid) { - ee_printf("ERROR waiting for child.\n"); - if (errno == ECHILD) ee_printf("errno=No such child %d\n",res->port.pid); - if (errno == EINTR) ee_printf("errno=Interrupted\n"); - return 0; - } - return 1; -} -#else /* no standard multicore implementation */ -#error "Please implement multicore functionality in core_portme.c to use multiple contexts." -#endif /* multithread implementations */ -#endif diff --git a/tests/riscv-coremark/riscv64/core_portme.h b/tests/riscv-coremark/riscv64/core_portme.h deleted file mode 100755 index 4e28afd36..000000000 --- a/tests/riscv-coremark/riscv64/core_portme.h +++ /dev/null @@ -1,296 +0,0 @@ -/* -Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Original Author: Shay Gal-on -*/ - -/* Topic: Description - This file contains configuration constants required to execute on different platforms -*/ -#ifndef CORE_PORTME_H -#define CORE_PORTME_H -/************************/ -/* Data types and settings */ -/************************/ -/* Configuration: HAS_FLOAT - Define to 1 if the platform supports floating point. -*/ -#ifndef HAS_FLOAT -#define HAS_FLOAT 1 -#endif -/* Configuration: HAS_TIME_H - Define to 1 if platform has the time.h header file, - and implementation of functions thereof. -*/ -#ifndef HAS_TIME_H -#define HAS_TIME_H 0 -#endif -/* Configuration: USE_CLOCK - Define to 1 if platform has the time.h header file, - and implementation of functions thereof. -*/ -#ifndef USE_CLOCK -#define USE_CLOCK 0 -#endif -/* Configuration: HAS_STDIO - Define to 1 if the platform has stdio.h. -*/ -#ifndef HAS_STDIO -#define HAS_STDIO 1 -#endif -/* Configuration: HAS_PRINTF - Define to 1 if the platform has stdio.h and implements the printf function. -*/ -#ifndef HAS_PRINTF -#define HAS_PRINTF 1 -#endif - -/* Configuration: CORE_TICKS - Define type of return from the timing functions. - */ -#if defined(_MSC_VER) -#include -typedef size_t CORE_TICKS; -#elif HAS_TIME_H -#include -typedef clock_t CORE_TICKS; -#else -/* Configuration: size_t and clock_t - Note these need to match the size of the clock output and the xLen the processor supports - */ -typedef unsigned long int size_t; -typedef unsigned long int clock_t; -typedef clock_t CORE_TICKS; -#endif - -/* Definitions: COMPILER_VERSION, COMPILER_FLAGS, MEM_LOCATION - Initialize these strings per platform -*/ -#ifndef COMPILER_VERSION - #ifdef __GNUC__ - #define COMPILER_VERSION "GCC"__VERSION__ - #else - #define COMPILER_VERSION "Please put compiler version here (e.g. gcc 4.1)" - #endif -#endif -#ifndef COMPILER_FLAGS - #define COMPILER_FLAGS FLAGS_STR /* "Please put compiler flags here (e.g. -o3)" */ -#endif -#ifndef MEM_LOCATION - #define MEM_LOCATION "Please put data memory location here\n\t\t\t(e.g. code in flash, data on heap etc)" - #define MEM_LOCATION_UNSPEC 1 -#endif - -/* Data Types: - To avoid compiler issues, define the data types that need ot be used for 8b, 16b and 32b in . - - *Imprtant*: - ee_ptr_int needs to be the data type used to hold pointers, otherwise coremark may fail!!! -*/ -typedef signed short ee_s16; -typedef unsigned short ee_u16; -typedef signed int ee_s32; -typedef double ee_f32; -typedef unsigned char ee_u8; -typedef unsigned int ee_u32; -typedef unsigned long long ee_ptr_int; -typedef size_t ee_size_t; -/* align an offset to point to a 32b value */ -#define align_mem(x) (void *)(4 + (((ee_ptr_int)(x) - 1) & ~3)) - -/* Configuration: SEED_METHOD - Defines method to get seed values that cannot be computed at compile time. - - Valid values: - SEED_ARG - from command line. - SEED_FUNC - from a system function. - SEED_VOLATILE - from volatile variables. -*/ -#ifndef SEED_METHOD -#define SEED_METHOD SEED_ARG -#endif - -/* Configuration: MEM_METHOD - Defines method to get a block of memry. - - Valid values: - MEM_MALLOC - for platforms that implement malloc and have malloc.h. - MEM_STATIC - to use a static memory array. - MEM_STACK - to allocate the data block on the stack (NYI). -*/ -#ifndef MEM_METHOD -#define MEM_METHOD MEM_MALLOC -#endif - -/* Configuration: MULTITHREAD - Define for parallel execution - - Valid values: - 1 - only one context (default). - N>1 - will execute N copies in parallel. - - Note: - If this flag is defined to more then 1, an implementation for launching parallel contexts must be defined. - - Two sample implementations are provided. Use or to enable them. - - It is valid to have a different implementation of and in , - to fit a particular architecture. -*/ -#ifndef MULTITHREAD -#define MULTITHREAD 1 -#endif - -/* Configuration: USE_PTHREAD - Sample implementation for launching parallel contexts - This implementation uses pthread_thread_create and pthread_join. - - Valid values: - 0 - Do not use pthreads API. - 1 - Use pthreads API - - Note: - This flag only matters if MULTITHREAD has been defined to a value greater then 1. -*/ -#ifndef USE_PTHREAD -#define USE_PTHREAD 0 -#endif - -/* Configuration: USE_FORK - Sample implementation for launching parallel contexts - This implementation uses fork, waitpid, shmget,shmat and shmdt. - - Valid values: - 0 - Do not use fork API. - 1 - Use fork API - - Note: - This flag only matters if MULTITHREAD has been defined to a value greater then 1. -*/ -#ifndef USE_FORK -#define USE_FORK 0 -#endif - -/* Configuration: USE_SOCKET - Sample implementation for launching parallel contexts - This implementation uses fork, socket, sendto and recvfrom - - Valid values: - 0 - Do not use fork and sockets API. - 1 - Use fork and sockets API - - Note: - This flag only matters if MULTITHREAD has been defined to a value greater then 1. -*/ -#ifndef USE_SOCKET -#define USE_SOCKET 0 -#endif - -/* Configuration: MAIN_HAS_NOARGC - Needed if platform does not support getting arguments to main. - - Valid values: - 0 - argc/argv to main is supported - 1 - argc/argv to main is not supported -*/ -#ifndef MAIN_HAS_NOARGC -#define MAIN_HAS_NOARGC 0 -#endif - -/* Configuration: MAIN_HAS_NORETURN - Needed if platform does not support returning a value from main. - - Valid values: - 0 - main returns an int, and return value will be 0. - 1 - platform does not support returning a value from main -*/ -#ifndef MAIN_HAS_NORETURN -#define MAIN_HAS_NORETURN 0 -#endif - -/* Variable: default_num_contexts - Number of contexts to spawn in multicore context. - Override this global value to change number of contexts used. - - Note: - This value may not be set higher then the define. - - To experiment, you can set the define to the highest value expected, and use argc/argv in the to set this value from the command line. -*/ -extern ee_u32 default_num_contexts; - -#if (MULTITHREAD>1) -#if USE_PTHREAD - #include - #define PARALLEL_METHOD "PThreads" -#elif USE_FORK - #include - #include - #include - #include - #include /* for memcpy */ - #define PARALLEL_METHOD "Fork" -#elif USE_SOCKET - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #define PARALLEL_METHOD "Sockets" -#else - #define PARALLEL_METHOD "Proprietary" - #error "Please implement multicore functionality in core_portme.c to use multiple contexts." -#endif /* Method for multithreading */ -#endif /* MULTITHREAD > 1 */ - -typedef struct CORE_PORTABLE_S { -#if (MULTITHREAD>1) - #if USE_PTHREAD - pthread_t thread; - #elif USE_FORK - pid_t pid; - int shmid; - void *shm; - #elif USE_SOCKET - pid_t pid; - int sock; - struct sockaddr_in sa; - #endif /* Method for multithreading */ -#endif /* MULTITHREAD>1 */ - ee_u8 portable_id; -} core_portable; - -/* target specific init/fini */ -void portable_init(core_portable *p, int *argc, char *argv[]); -void portable_fini(core_portable *p); - -#if (SEED_METHOD==SEED_VOLATILE) - #if (VALIDATION_RUN || PERFORMANCE_RUN || PROFILE_RUN) - #define RUN_TYPE_FLAG 1 - #else - #if (TOTAL_DATA_SIZE==1200) - #define PROFILE_RUN 1 - #else - #define PERFORMANCE_RUN 1 - #endif - #endif -#endif /* SEED_METHOD==SEED_VOLATILE */ - -#endif /* CORE_PORTME_H */ diff --git a/tests/riscv-coremark/riscv64/core_portme.mak b/tests/riscv-coremark/riscv64/core_portme.mak deleted file mode 100755 index edc341abc..000000000 --- a/tests/riscv-coremark/riscv64/core_portme.mak +++ /dev/null @@ -1,147 +0,0 @@ -# Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# Original Author: Shay Gal-on - -#File: core_portme.mak - -# Flag: RISCVTOOLS -# Use this flag to point to your RISCV tools -RISCVTOOLS=$(RISCV) -# Flag: RISCVTYPE -# Type of toolchain to use -RISCVTYPE=riscv64-unknown-elf -# Flag: OUTFLAG -# Use this flag to define how to to get an executable (e.g -o) -OUTFLAG= -o -# Flag: CC -# Use this flag to define compiler to use -CC = $(RISCVTOOLS)/bin/$(RISCVTYPE)-gcc -# Flag: CFLAGS -# Use this flag to define compiler options. Note, you can add compiler options from the command line using XCFLAGS="other flags" -#PORT_CFLAGS = -O2 -static -std=gnu99 -PORT_CFLAGS = -O2 -FLAGS_STR = "$(PORT_CFLAGS) $(XCFLAGS) $(XLFLAGS) $(LFLAGS_END)" -CFLAGS = $(PORT_CFLAGS) -I$(PORT_DIR) -I. -DFLAGS_STR=\"$(FLAGS_STR)\" -#Flag: LFLAGS_END -# Define any libraries needed for linking or other flags that should come at the end of the link line (e.g. linker scripts). -# Note: On certain platforms, the default clock_gettime implementation is supported but requires linking of librt. -LFLAGS_END += -# Flag: PORT_SRCS -# Port specific source files can be added here -PORT_SRCS = $(PORT_DIR)/core_portme.c -# Flag: LOAD -# Define this flag if you need to load to a target, as in a cross compile environment. - -# Flag: RUN -# Define this flag if running does not consist of simple invocation of the binary. -# In a cross compile environment, you need to define this. - -#For flashing and using a tera term macro, you could use -#LOAD = flash ADDR -#RUN = ttpmacro coremark.ttl - -#For copying to target and executing via SSH connection, you could use -#LOAD = scp $(OUTFILE) user@target:~ -#RUN = ssh user@target -c - -#For native compilation and execution -LOAD = echo Loading done -RUN = spike pk - -OEXT = .o -EXE = .riscv - -# Flag: SEPARATE_COMPILE -# Define if you need to separate compilation from link stage. -# In this case, you also need to define below how to create an object file, and how to link. -ifdef SEPARATE_COMPILE - -LD = $(RISCVTOOLS)/bin/$(RISCVTYPE)-gcc -OBJOUT = -o -LFLAGS = -OFLAG = -o -COUT = -c -# Flag: PORT_OBJS -# Port specific object files can be added here -PORT_OBJS = $(PORT_DIR)/core_portme$(OEXT) -PORT_CLEAN = *$(OEXT) - -$(OPATH)%$(OEXT) : %.c - $(CC) $(CFLAGS) $(XCFLAGS) $(COUT) $< $(OBJOUT) $@ - -endif - -# Target: port_prebuild -# Generate any files that are needed before actual build starts. -# E.g. generate profile guidance files. Sample PGO generation for gcc enabled with PGO=1 -# - First, check if PGO was defined on the command line, if so, need to add -fprofile-use to compile line. -# - Second, if PGO reference has not yet been generated, add a step to the prebuild that will build a profile-generate version and run it. -# Note - Using REBUILD=1 -# -# Use make PGO=1 to invoke this sample processing. - -ifdef PGO - ifeq (,$(findstring $(PGO),gen)) - PGO_STAGE=build_pgo_gcc - CFLAGS+=-fprofile-use - endif - PORT_CLEAN+=*.gcda *.gcno gmon.out -endif - -.PHONY: port_prebuild -port_prebuild: $(PGO_STAGE) - -.PHONY: build_pgo_gcc -build_pgo_gcc: - $(MAKE) PGO=gen XCFLAGS="$(XCFLAGS) -fprofile-generate -DTOTAL_DATA_SIZE=1200" ITERATIONS=10 gen_pgo_data REBUILD=1 - -# Target: port_postbuild -# Generate any files that are needed after actual build end. -# E.g. change format to srec, bin, zip in order to be able to load into flash -.PHONY: port_postbuild -port_postbuild: - -# Target: port_postrun -# Do platform specific after run stuff. -# E.g. reset the board, backup the logfiles etc. -.PHONY: port_postrun -port_postrun: - -# Target: port_prerun -# Do platform specific after run stuff. -# E.g. reset the board, backup the logfiles etc. -.PHONY: port_prerun -port_prerun: - -# Target: port_postload -# Do platform specific after load stuff. -# E.g. reset the reset power to the flash eraser -.PHONY: port_postload -port_postload: - -# Target: port_preload -# Do platform specific before load stuff. -# E.g. reset the reset power to the flash eraser -.PHONY: port_preload -port_preload: - -# FLAG: OPATH -# Path to the output folder. Default - current folder. -OPATH = ./ -MKDIR = mkdir -p - -# FLAG: PERL -# Define perl executable to calculate the geomean if running separate. -PERL=/usr/bin/perl diff --git a/tests/riscv-coremark/trace b/tests/riscv-coremark/trace deleted file mode 100644 index 7c76d0bfa..000000000 --- a/tests/riscv-coremark/trace +++ /dev/null @@ -1,48 +0,0 @@ -Imperas riscvOVPsimPlus - - -riscvOVPsimPlus (64-Bit) v20210329.0 Open Virtual Platform simulator from www.IMPERAS.com. -Copyright (c) 2005-2021 Imperas Software Ltd. Contains Imperas Proprietary Information. -Licensed Software, All Rights Reserved. -Visit www.IMPERAS.com for multicore debug, verification and analysis solutions. - -riscvOVPsimPlus started: Wed May 12 17:55:33 2021 - - -Info (GDBT_PORT) Host: Tera.Eng.HMC.Edu, Port: 55460 -Info (DBC_LGDB) Starting Debugger /cad/riscv/imperas-riscv-tests/riscv-ovpsim-plus/bin/Linux64/riscv-none-embed-gdb -Info (GDBT_WAIT) Waiting for remote debugger to connect... -Info (OR_OF) Target 'riscvOVPsim/cpu' has object file read from 'coremark.bare.riscv' -Info (OR_PH) Program Headers: -Info (OR_PH) Type Offset VirtAddr PhysAddr -Info (OR_PH) FileSiz MemSiz Flags Align -Info (OR_PD) LOAD 0x0000000000001000 0x0000000080000000 0x0000000080000000 -Info (OR_PD) 0x0000000000000204 0x0000000000000204 R-E 1000 -Info (OR_PD) LOAD 0x0000000000002000 0x0000000080001000 0x0000000080001000 -Info (OR_PD) 0x00000000000047e0 0x0000000000004ff0 RWE 1000 -Info (GDBT_CONNECTED) Client connected -Info (GDBT_GON) Client disappeared 'riscvOVPsim/cpu' -Info -Info --------------------------------------------------- -Info CPU 'riscvOVPsim/cpu' STATISTICS -Info Type : riscv (RV64GC) -Info Nominal MIPS : 100 -Info Final program counter : 0x80003558 -Info Simulated instructions: 1,455,608 -Info Simulated MIPS : 0.0 -Info --------------------------------------------------- -Info -Info --------------------------------------------------- -Info SIMULATION TIME STATISTICS -Info Simulated time : 0.02 seconds -Info User time : 99.23 seconds -Info System time : 254.08 seconds -Info Elapsed time : 1107.49 seconds -Info --------------------------------------------------- - -riscvOVPsimPlus finished: Wed May 12 18:14:04 2021 - - -riscvOVPsimPlus (64-Bit) v20210329.0 Open Virtual Platform simulator from www.IMPERAS.com. -Visit www.IMPERAS.com for multicore debug, verification and analysis solutions. - diff --git a/tests/riscv-coremark/transferobjdump.sh b/tests/riscv-coremark/transferobjdump.sh deleted file mode 100755 index 69578566a..000000000 --- a/tests/riscv-coremark/transferobjdump.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env bash -./build-coremark.sh - -riscv64-unknown-elf-objdump -D coremark.bare.riscv > coremarkcodemod.bare.riscv.objdump -cp coremarkcodemod.bare.riscv.objdump ~/riscv-wally/tests/imperas-riscv-tests/riscv-ovpsim-plus/examples/CoreMark/. -pushd ~/riscv-wally/tests/imperas-riscv-tests/riscv-ovpsim-plus/examples/CoreMark -./exe2memfile.pl coremarkcodemod.bare.riscv -popd diff --git a/toy/riscvpipelined.sv b/toy/riscvpipelined.sv new file mode 100644 index 000000000..74290a2db --- /dev/null +++ b/toy/riscvpipelined.sv @@ -0,0 +1,570 @@ +// riscvpipelined.sv + +// RISC-V pipelined processor +// From Section 7.6 of Digital Design & Computer Architecture: RISC-V Edition +// 27 April 2020 +// David_Harris@hmc.edu +// Sarah.Harris@unlv.edu + +// run 210 +// Expect simulator to print "Simulation succeeded" +// when the value 25 (0x19) is written to address 100 (0x64) + +// Pipelined implementation of RISC-V (RV32I) +// User-level Instruction Set Architecture V2.2 (May 7, 2017) +// Implements a subset of the base integer instructions: +// lw, sw +// add, sub, and, or, slt, +// addi, andi, ori, slti +// beq +// jal +// Exceptions, traps, and interrupts not implemented +// little-endian memory + +// 31 32-bit registers x1-x31, x0 hardwired to 0 +// R-Type instructions +// add, sub, and, or, slt +// INSTR rd, rs1, rs2 +// Instr[31:25] = funct7 (funct7b5 & opb5 = 1 for sub, 0 for others) +// Instr[24:20] = rs2 +// Instr[19:15] = rs1 +// Instr[14:12] = funct3 +// Instr[11:7] = rd +// Instr[6:0] = opcode +// I-Type Instructions +// lw, I-type ALU (addi, andi, ori, slti) +// lw: INSTR rd, imm(rs1) +// I-type ALU: INSTR rd, rs1, imm (12-bit signed) +// Instr[31:20] = imm[11:0] +// Instr[24:20] = rs2 +// Instr[19:15] = rs1 +// Instr[14:12] = funct3 +// Instr[11:7] = rd +// Instr[6:0] = opcode +// S-Type Instruction +// sw rs2, imm(rs1) (store rs2 into address specified by rs1 + immm) +// Instr[31:25] = imm[11:5] (offset[11:5]) +// Instr[24:20] = rs2 (src) +// Instr[19:15] = rs1 (base) +// Instr[14:12] = funct3 +// Instr[11:7] = imm[4:0] (offset[4:0]) +// Instr[6:0] = opcode +// B-Type Instruction +// beq rs1, rs2, imm (PCTarget = PC + (signed imm x 2)) +// Instr[31:25] = imm[12], imm[10:5] +// Instr[24:20] = rs2 +// Instr[19:15] = rs1 +// Instr[14:12] = funct3 +// Instr[11:7] = imm[4:1], imm[11] +// Instr[6:0] = opcode +// J-Type Instruction +// jal rd, imm (signed imm is multiplied by 2 and added to PC, rd = PC+4) +// Instr[31:12] = imm[20], imm[10:1], imm[11], imm[19:12] +// Instr[11:7] = rd +// Instr[6:0] = opcode + +// Instruction opcode funct3 funct7 +// add 0110011 000 0000000 +// sub 0110011 000 0100000 +// and 0110011 111 0000000 +// or 0110011 110 0000000 +// slt 0110011 010 0000000 +// addi 0010011 000 immediate +// andi 0010011 111 immediate +// ori 0010011 110 immediate +// slti 0010011 010 immediate +// beq 1100011 000 immediate +// lw 0000011 010 immediate +// sw 0100011 010 immediate +// jal 1101111 immediate immediate + +module testbench(); + + logic clk; + logic reset; + + logic [31:0] WriteData, DataAdr; + logic MemWrite; + + // instantiate device to be tested + top dut(clk, reset, WriteData, DataAdr, MemWrite); + + // initialize test + initial + begin + reset <= 1; # 22; reset <= 0; + end + + // generate clock to sequence tests + always + begin + clk <= 1; # 5; clk <= 0; # 5; + end + + // check results + always @(negedge clk) + begin + if(MemWrite) begin + if(DataAdr === 100 & WriteData === 25) begin + $display("Simulation succeeded"); + $stop; + end else if (DataAdr !== 96) begin + $display("Simulation failed"); + $stop; + end + end + end +endmodule + +module top(input logic clk, reset, + output logic [31:0] WriteDataM, DataAdrM, + output logic MemWriteM); + + logic [31:0] PCF, InstrF, ReadDataM; + + // instantiate processor and memories + riscv riscv(clk, reset, PCF, InstrF, MemWriteM, DataAdrM, + WriteDataM, ReadDataM); + imem imem(PCF, InstrF); + dmem dmem(clk, MemWriteM, DataAdrM, WriteDataM, ReadDataM); +endmodule + +module riscv(input logic clk, reset, + output logic [31:0] PCF, + input logic [31:0] InstrF, + output logic MemWriteM, + output logic [31:0] ALUResultM, WriteDataM, + input logic [31:0] ReadDataM); + + logic [6:0] opD; + logic [2:0] funct3D; + logic funct7b5D; + logic [1:0] ImmSrcD; + logic ZeroE; + logic PCSrcE; + logic [2:0] ALUControlE; + logic ALUSrcE; + logic ResultSrcEb0; + logic RegWriteM; + logic [1:0] ResultSrcW; + logic RegWriteW; + + logic [1:0] ForwardAE, ForwardBE; + logic StallF, StallD, FlushD, FlushE; + + logic [4:0] Rs1D, Rs2D, Rs1E, Rs2E, RdE, RdM, RdW; + + controller c(clk, reset, + opD, funct3D, funct7b5D, ImmSrcD, + FlushE, ZeroE, PCSrcE, ALUControlE, ALUSrcE, ResultSrcEb0, + MemWriteM, RegWriteM, + RegWriteW, ResultSrcW); + + datapath dp(clk, reset, + StallF, PCF, InstrF, + opD, funct3D, funct7b5D, StallD, FlushD, ImmSrcD, + FlushE, ForwardAE, ForwardBE, PCSrcE, ALUControlE, ALUSrcE, ZeroE, + MemWriteM, WriteDataM, ALUResultM, ReadDataM, + RegWriteW, ResultSrcW, + Rs1D, Rs2D, Rs1E, Rs2E, RdE, RdM, RdW); + + hazard hu(Rs1D, Rs2D, Rs1E, Rs2E, RdE, RdM, RdW, + PCSrcE, ResultSrcEb0, RegWriteM, RegWriteW, + ForwardAE, ForwardBE, StallF, StallD, FlushD, FlushE); +endmodule + + +module controller(input logic clk, reset, + // Decode stage control signals + input logic [6:0] opD, + input logic [2:0] funct3D, + input logic funct7b5D, + output logic [1:0] ImmSrcD, + // Execute stage control signals + input logic FlushE, + input logic ZeroE, + output logic PCSrcE, // for datapath and Hazard Unit + output logic [2:0] ALUControlE, + output logic ALUSrcE, + output logic ResultSrcEb0, // for Hazard Unit + // Memory stage control signals + output logic MemWriteM, + output logic RegWriteM, // for Hazard Unit + // Writeback stage control signals + output logic RegWriteW, // for datapath and Hazard Unit + output logic [1:0] ResultSrcW); + + // pipelined control signals + logic RegWriteD, RegWriteE; + logic [1:0] ResultSrcD, ResultSrcE, ResultSrcM; + logic MemWriteD, MemWriteE; + logic JumpD, JumpE; + logic BranchD, BranchE; + logic [1:0] ALUOpD; + logic [2:0] ALUControlD; + logic ALUSrcD; + + // Decode stage logic + maindec md(opD, ResultSrcD, MemWriteD, BranchD, + ALUSrcD, RegWriteD, JumpD, ImmSrcD, ALUOpD); + aludec ad(opD[5], funct3D, funct7b5D, ALUOpD, ALUControlD); + + // Execute stage pipeline control register and logic + floprc #(10) controlregE(clk, reset, FlushE, + {RegWriteD, ResultSrcD, MemWriteD, JumpD, BranchD, ALUControlD, ALUSrcD}, + {RegWriteE, ResultSrcE, MemWriteE, JumpE, BranchE, ALUControlE, ALUSrcE}); + + assign PCSrcE = (BranchE & ZeroE) | JumpE; + assign ResultSrcEb0 = ResultSrcE[0]; + + // Memory stage pipeline control register + flopr #(4) controlregM(clk, reset, + {RegWriteE, ResultSrcE, MemWriteE}, + {RegWriteM, ResultSrcM, MemWriteM}); + + // Writeback stage pipeline control register + flopr #(3) controlregW(clk, reset, + {RegWriteM, ResultSrcM}, + {RegWriteW, ResultSrcW}); +endmodule + +module maindec(input logic [6:0] op, + output logic [1:0] ResultSrc, + output logic MemWrite, + output logic Branch, ALUSrc, + output logic RegWrite, Jump, + output logic [1:0] ImmSrc, + output logic [1:0] ALUOp); + + logic [10:0] controls; + + assign {RegWrite, ImmSrc, ALUSrc, MemWrite, + ResultSrc, Branch, ALUOp, Jump} = controls; + + always_comb + case(op) + // RegWrite_ImmSrc_ALUSrc_MemWrite_ResultSrc_Branch_ALUOp_Jump + 7'b0000011: controls = 11'b1_00_1_0_01_0_00_0; // lw + 7'b0100011: controls = 11'b0_01_1_1_00_0_00_0; // sw + 7'b0110011: controls = 11'b1_xx_0_0_00_0_10_0; // R-type + 7'b1100011: controls = 11'b0_10_0_0_00_1_01_0; // beq + 7'b0010011: controls = 11'b1_00_1_0_00_0_10_0; // I-type ALU + 7'b1101111: controls = 11'b1_11_0_0_10_0_00_1; // jal + 7'b0000000: controls = 11'b0_00_0_0_00_0_00_0; // need valid values at reset + default: controls = 11'bx_xx_x_x_xx_x_xx_x; // non-implemented instruction + endcase +endmodule + +module aludec(input logic opb5, + input logic [2:0] funct3, + input logic funct7b5, + input logic [1:0] ALUOp, + output logic [2:0] ALUControl); + + logic RtypeSub; + assign RtypeSub = funct7b5 & opb5; // TRUE for R-type subtract instruction + + always_comb + case(ALUOp) + 2'b00: ALUControl = 3'b000; // addition + 2'b01: ALUControl = 3'b001; // subtraction + default: case(funct3) // R-type or I-type ALU + 3'b000: if (RtypeSub) + ALUControl = 3'b001; // sub + else + ALUControl = 3'b000; // add, addi + 3'b010: ALUControl = 3'b101; // slt, slti + 3'b110: ALUControl = 3'b011; // or, ori + 3'b111: ALUControl = 3'b010; // and, andi + default: ALUControl = 3'bxxx; // ??? + endcase + endcase +endmodule + +module datapath(input logic clk, reset, + // Fetch stage signals + input logic StallF, + output logic [31:0] PCF, + input logic [31:0] InstrF, + // Decode stage signals + output logic [6:0] opD, + output logic [2:0] funct3D, + output logic funct7b5D, + input logic StallD, FlushD, + input logic [1:0] ImmSrcD, + // Execute stage signals + input logic FlushE, + input logic [1:0] ForwardAE, ForwardBE, + input logic PCSrcE, + input logic [2:0] ALUControlE, + input logic ALUSrcE, + output logic ZeroE, + // Memory stage signals + input logic MemWriteM, + output logic [31:0] WriteDataM, ALUResultM, + input logic [31:0] ReadDataM, + // Writeback stage signals + input logic RegWriteW, + input logic [1:0] ResultSrcW, + // Hazard Unit signals + output logic [4:0] Rs1D, Rs2D, Rs1E, Rs2E, + output logic [4:0] RdE, RdM, RdW); + + // Fetch stage signals + logic [31:0] PCNextF, PCPlus4F; + // Decode stage signals + logic [31:0] InstrD; + logic [31:0] PCD, PCPlus4D; + logic [31:0] RD1D, RD2D; + logic [31:0] ImmExtD; + logic [4:0] RdD; + // Execute stage signals + logic [31:0] RD1E, RD2E; + logic [31:0] PCE, ImmExtE; + logic [31:0] SrcAE, SrcBE; + logic [31:0] ALUResultE; + logic [31:0] WriteDataE; + logic [31:0] PCPlus4E; + logic [31:0] PCTargetE; + // Memory stage signals + logic [31:0] PCPlus4M; + // Writeback stage signals + logic [31:0] ALUResultW; + logic [31:0] ReadDataW; + logic [31:0] PCPlus4W; + logic [31:0] ResultW; + + // Fetch stage pipeline register and logic + mux2 #(32) pcmux(PCPlus4F, PCTargetE, PCSrcE, PCNextF); + flopenr #(32) pcreg(clk, reset, ~StallF, PCNextF, PCF); + adder pcadd(PCF, 32'h4, PCPlus4F); + + // Decode stage pipeline register and logic + flopenrc #(96) regD(clk, reset, FlushD, ~StallD, + {InstrF, PCF, PCPlus4F}, + {InstrD, PCD, PCPlus4D}); + assign opD = InstrD[6:0]; + assign funct3D = InstrD[14:12]; + assign funct7b5D = InstrD[30]; + assign Rs1D = InstrD[19:15]; + assign Rs2D = InstrD[24:20]; + assign RdD = InstrD[11:7]; + + regfile rf(clk, RegWriteW, Rs1D, Rs2D, RdW, ResultW, RD1D, RD2D); + extend ext(InstrD[31:7], ImmSrcD, ImmExtD); + + // Execute stage pipeline register and logic + floprc #(175) regE(clk, reset, FlushE, + {RD1D, RD2D, PCD, Rs1D, Rs2D, RdD, ImmExtD, PCPlus4D}, + {RD1E, RD2E, PCE, Rs1E, Rs2E, RdE, ImmExtE, PCPlus4E}); + + mux3 #(32) faemux(RD1E, ResultW, ALUResultM, ForwardAE, SrcAE); + mux3 #(32) fbemux(RD2E, ResultW, ALUResultM, ForwardBE, WriteDataE); + mux2 #(32) srcbmux(WriteDataE, ImmExtE, ALUSrcE, SrcBE); + alu alu(SrcAE, SrcBE, ALUControlE, ALUResultE, ZeroE); + adder branchadd(ImmExtE, PCE, PCTargetE); + + // Memory stage pipeline register + flopr #(101) regM(clk, reset, + {ALUResultE, WriteDataE, RdE, PCPlus4E}, + {ALUResultM, WriteDataM, RdM, PCPlus4M}); + + // Writeback stage pipeline register and logic + flopr #(101) regW(clk, reset, + {ALUResultM, ReadDataM, RdM, PCPlus4M}, + {ALUResultW, ReadDataW, RdW, PCPlus4W}); + mux3 #(32) resultmux(ALUResultW, ReadDataW, PCPlus4W, ResultSrcW, ResultW); +endmodule + +// Hazard Unit: forward, stall, and flush +module hazard(input logic [4:0] Rs1D, Rs2D, Rs1E, Rs2E, RdE, RdM, RdW, + input logic PCSrcE, ResultSrcEb0, + input logic RegWriteM, RegWriteW, + output logic [1:0] ForwardAE, ForwardBE, + output logic StallF, StallD, FlushD, FlushE); + + logic lwStallD; + + // forwarding logic + always_comb begin + ForwardAE = 2'b00; + ForwardBE = 2'b00; + if (Rs1E != 5'b0) + if ((Rs1E == RdM) & RegWriteM) ForwardAE = 2'b10; + else if ((Rs1E == RdW) & RegWriteW) ForwardAE = 2'b01; + + if (Rs2E != 5'b0) + if ((Rs2E == RdM) & RegWriteM) ForwardBE = 2'b10; + else if ((Rs2E == RdW) & RegWriteW) ForwardBE = 2'b01; + end + + // stalls and flushes + assign lwStallD = ResultSrcEb0 & ((Rs1D == RdE) | (Rs2D == RdE)); + assign StallD = lwStallD; + assign StallF = lwStallD; + assign FlushD = PCSrcE; + assign FlushE = lwStallD | PCSrcE; +endmodule + +module regfile(input logic clk, + input logic we3, + input logic [ 4:0] a1, a2, a3, + input logic [31:0] wd3, + output logic [31:0] rd1, rd2); + + logic [31:0] rf[31:0]; + + // three ported register file + // read two ports combinationally (A1/RD1, A2/RD2) + // write third port on rising edge of clock (A3/WD3/WE3) + // write occurs on falling edge of clock + // register 0 hardwired to 0 + + always_ff @(negedge clk) + if (we3) rf[a3] <= wd3; + + assign rd1 = (a1 != 0) ? rf[a1] : 0; + assign rd2 = (a2 != 0) ? rf[a2] : 0; +endmodule + +module adder(input [31:0] a, b, + output [31:0] y); + + assign y = a + b; +endmodule + +module extend(input logic [31:7] instr, + input logic [1:0] immsrc, + output logic [31:0] immext); + + always_comb + case(immsrc) + // I-type + 2'b00: immext = {{20{instr[31]}}, instr[31:20]}; + // S-type (stores) + 2'b01: immext = {{20{instr[31]}}, instr[31:25], instr[11:7]}; + // B-type (branches) + 2'b10: immext = {{20{instr[31]}}, instr[7], instr[30:25], instr[11:8], 1'b0}; + // J-type (jal) + 2'b11: immext = {{12{instr[31]}}, instr[19:12], instr[20], instr[30:21], 1'b0}; + default: immext = 32'bx; // undefined + endcase +endmodule + +module flopr #(parameter WIDTH = 8) + (input logic clk, reset, + input logic [WIDTH-1:0] d, + output logic [WIDTH-1:0] q); + + always_ff @(posedge clk, posedge reset) + if (reset) q <= 0; + else q <= d; +endmodule + +module flopenr #(parameter WIDTH = 8) + (input logic clk, reset, en, + input logic [WIDTH-1:0] d, + output logic [WIDTH-1:0] q); + + always_ff @(posedge clk, posedge reset) + if (reset) q <= 0; + else if (en) q <= d; +endmodule + +module flopenrc #(parameter WIDTH = 8) + (input logic clk, reset, clear, en, + input logic [WIDTH-1:0] d, + output logic [WIDTH-1:0] q); + + always_ff @(posedge clk, posedge reset) + if (reset) q <= 0; + else if (en) + if (clear) q <= 0; + else q <= d; +endmodule + +module floprc #(parameter WIDTH = 8) + (input logic clk, + input logic reset, + input logic clear, + input logic [WIDTH-1:0] d, + output logic [WIDTH-1:0] q); + + always_ff @(posedge clk, posedge reset) + if (reset) q <= 0; + else + if (clear) q <= 0; + else q <= d; +endmodule + +module mux2 #(parameter WIDTH = 8) + (input logic [WIDTH-1:0] d0, d1, + input logic s, + output logic [WIDTH-1:0] y); + + assign y = s ? d1 : d0; +endmodule + +module mux3 #(parameter WIDTH = 8) + (input logic [WIDTH-1:0] d0, d1, d2, + input logic [1:0] s, + output logic [WIDTH-1:0] y); + + assign y = s[1] ? d2 : (s[0] ? d1 : d0); +endmodule + +module imem(input logic [31:0] a, + output logic [31:0] rd); + + logic [31:0] RAM[63:0]; + + initial + $readmemh("riscvtest.txt",RAM); + + assign rd = RAM[a[31:2]]; // word aligned +endmodule + +module dmem(input logic clk, we, + input logic [31:0] a, wd, + output logic [31:0] rd); + + logic [31:0] RAM[63:0]; + + assign rd = RAM[a[31:2]]; // word aligned + + always_ff @(posedge clk) + if (we) RAM[a[31:2]] <= wd; +endmodule + +module alu(input logic [31:0] a, b, + input logic [2:0] alucontrol, + output logic [31:0] result, + output logic zero); + + logic [31:0] condinvb, sum; + logic v; // overflow + logic isAddSub; // true when is add or subtract operation + + assign condinvb = alucontrol[0] ? ~b : b; + assign sum = a + condinvb + alucontrol[0]; + assign isAddSub = ~alucontrol[2] & ~alucontrol[1] | + ~alucontrol[1] & alucontrol[0]; + + always_comb + case (alucontrol) + 3'b000: result = sum; // add + 3'b001: result = sum; // subtract + 3'b010: result = a & b; // and + 3'b011: result = a | b; // or + 3'b100: result = a ^ b; // xor + 3'b101: result = sum[31] ^ v; // slt + 3'b110: result = a << b[4:0]; // sll + 3'b111: result = a >> b[4:0]; // srl + default: result = 32'bx; + endcase + + assign zero = (result == 32'b0); + assign v = ~(alucontrol[0] ^ a[31] ^ b[31]) & (a[31] ^ sum[31]) & isAddSub; + +endmodule + diff --git a/toy/riscvsingle.do b/toy/riscvsingle.do new file mode 100644 index 000000000..d09f1728b --- /dev/null +++ b/toy/riscvsingle.do @@ -0,0 +1,37 @@ +# riscv-single.do +# +# Simulate with vsim -do riscvsingle.do + +# run with vsim -do "do wally-pipelined.do rv64ic riscvarchtest-64m" + +#onbreak {resume} + +# create library +if [file exists work] { + vdel -all +} +vlib work + +vlog -lint riscvsingle.sv +vopt +acc work.testbench -o workopt +vsim workopt + +view wave +-- display input and output signals as hexadecimal values +add wave -noupdate /testbench/clk +add wave -noupdate /testbench/reset +add wave -divider "Main Datapath" +add wave -noupdate /testbench/dut/PC +add wave -noupdate /testbench/dut/Instr +add wave -noupdate /testbench/dut/rvsingle/dp/SrcA +add wave -noupdate /testbench/dut/rvsingle/dp/SrcB +add wave -noupdate /testbench/dut/rvsingle/dp/Result +add wave -divider "Memory Bus" +add wave -noupdate /testbench/MemWrite +add wave -noupdate /testbench/DataAdr +add wave -noupdate /testbench/WriteData +add wave -noupdate /testbench/dut/ReadData + +-- Run the Simulation +run -all +view wave diff --git a/toy/riscvsingle.sv b/toy/riscvsingle.sv new file mode 100644 index 000000000..4c4d99b5a --- /dev/null +++ b/toy/riscvsingle.sv @@ -0,0 +1,384 @@ +// riscvsingle.sv + +// RISC-V single-cycle processor +// From Section 7.6 of Digital Design & Computer Architecture +// 27 April 2020 +// David_Harris@hmc.edu +// Sarah.Harris@unlv.edu + +// run 210 +// Expect simulator to print "Simulation succeeded" +// when the value 25 (0x19) is written to address 100 (0x64) + +// Single-cycle implementation of RISC-V (RV32I) +// User-level Instruction Set Architecture V2.2 (May 7, 2017) +// Implements a subset of the base integer instructions: +// lw, sw +// add, sub, and, or, slt, +// addi, andi, ori, slti +// beq +// jal +// Exceptions, traps, and interrupts not implemented +// little-endian memory + +// 31 32-bit registers x1-x31, x0 hardwired to 0 +// R-Type instructions +// add, sub, and, or, slt +// INSTR rd, rs1, rs2 +// Instr[31:25] = funct7 (funct7b5 & opb5 = 1 for sub, 0 for others) +// Instr[24:20] = rs2 +// Instr[19:15] = rs1 +// Instr[14:12] = funct3 +// Instr[11:7] = rd +// Instr[6:0] = opcode +// I-Type Instructions +// lw, I-type ALU (addi, andi, ori, slti) +// lw: INSTR rd, imm(rs1) +// I-type ALU: INSTR rd, rs1, imm (12-bit signed) +// Instr[31:20] = imm[11:0] +// Instr[24:20] = rs2 +// Instr[19:15] = rs1 +// Instr[14:12] = funct3 +// Instr[11:7] = rd +// Instr[6:0] = opcode +// S-Type Instruction +// sw rs2, imm(rs1) (store rs2 into address specified by rs1 + immm) +// Instr[31:25] = imm[11:5] (offset[11:5]) +// Instr[24:20] = rs2 (src) +// Instr[19:15] = rs1 (base) +// Instr[14:12] = funct3 +// Instr[11:7] = imm[4:0] (offset[4:0]) +// Instr[6:0] = opcode +// B-Type Instruction +// beq rs1, rs2, imm (PCTarget = PC + (signed imm x 2)) +// Instr[31:25] = imm[12], imm[10:5] +// Instr[24:20] = rs2 +// Instr[19:15] = rs1 +// Instr[14:12] = funct3 +// Instr[11:7] = imm[4:1], imm[11] +// Instr[6:0] = opcode +// J-Type Instruction +// jal rd, imm (signed imm is multiplied by 2 and added to PC, rd = PC+4) +// Instr[31:12] = imm[20], imm[10:1], imm[11], imm[19:12] +// Instr[11:7] = rd +// Instr[6:0] = opcode + +// Instruction opcode funct3 funct7 +// add 0110011 000 0000000 +// sub 0110011 000 0100000 +// and 0110011 111 0000000 +// or 0110011 110 0000000 +// slt 0110011 010 0000000 +// addi 0010011 000 immediate +// andi 0010011 111 immediate +// ori 0010011 110 immediate +// slti 0010011 010 immediate +// beq 1100011 000 immediate +// lw 0000011 010 immediate +// sw 0100011 010 immediate +// jal 1101111 immediate immediate + +module testbench; + + logic clk; + logic reset; + + logic [31:0] WriteData, DataAdr; + logic MemWrite; + + // instantiate device to be tested + top dut(clk, reset, WriteData, DataAdr, MemWrite); + + // initialize test + initial + begin + reset <= 1; # 22; reset <= 0; + end + + // generate clock to sequence tests + always + begin + clk <= 1; # 5; clk <= 0; # 5; + end + + // check results + always @(negedge clk) + begin + if(MemWrite) begin + if(DataAdr === 100 & WriteData === 25) begin + $display("Simulation succeeded"); + $stop; + end else if (DataAdr !== 96) begin + $display("Simulation failed"); + $stop; + end + end + end +endmodule + +module top(input logic clk, reset, + output logic [31:0] WriteData, DataAdr, + output logic MemWrite); + + logic [31:0] PC, Instr, ReadData; + + // instantiate processor and memories + riscvsingle rvsingle(clk, reset, PC, Instr, MemWrite, DataAdr, + WriteData, ReadData); + imem imem(PC, Instr); + dmem dmem(clk, MemWrite, DataAdr, WriteData, ReadData); +endmodule + +module riscvsingle(input logic clk, reset, + output logic [31:0] PC, + input logic [31:0] Instr, + output logic MemWrite, + output logic [31:0] ALUResult, WriteData, + input logic [31:0] ReadData); + + logic ALUSrc, RegWrite, Jump, Zero, PCSrc; + logic [1:0] ResultSrc, ImmSrc; + logic [2:0] ALUControl; + + controller c(Instr[6:0], Instr[14:12], Instr[30], Zero, + ResultSrc, MemWrite, PCSrc, + ALUSrc, RegWrite, Jump, + ImmSrc, ALUControl); + datapath dp(clk, reset, ResultSrc, PCSrc, + ALUSrc, RegWrite, + ImmSrc, ALUControl, + Zero, PC, Instr, + ALUResult, WriteData, ReadData); +endmodule + +module controller(input logic [6:0] op, + input logic [2:0] funct3, + input logic funct7b5, + input logic Zero, + output logic [1:0] ResultSrc, + output logic MemWrite, + output logic PCSrc, ALUSrc, + output logic RegWrite, Jump, + output logic [1:0] ImmSrc, + output logic [2:0] ALUControl); + + logic [1:0] ALUOp; + logic Branch; + + maindec md(op, ResultSrc, MemWrite, Branch, + ALUSrc, RegWrite, Jump, ImmSrc, ALUOp); + aludec ad(op[5], funct3, funct7b5, ALUOp, ALUControl); + + assign PCSrc = Branch & Zero | Jump; +endmodule + +module maindec(input logic [6:0] op, + output logic [1:0] ResultSrc, + output logic MemWrite, + output logic Branch, ALUSrc, + output logic RegWrite, Jump, + output logic [1:0] ImmSrc, + output logic [1:0] ALUOp); + + logic [10:0] controls; + + assign {RegWrite, ImmSrc, ALUSrc, MemWrite, + ResultSrc, Branch, ALUOp, Jump} = controls; + + always_comb + case(op) + // RegWrite_ImmSrc_ALUSrc_MemWrite_ResultSrc_Branch_ALUOp_Jump + 7'b0000011: controls = 11'b1_00_1_0_01_0_00_0; // lw + 7'b0100011: controls = 11'b0_01_1_1_00_0_00_0; // sw + 7'b0110011: controls = 11'b1_xx_0_0_00_0_10_0; // R-type + 7'b1100011: controls = 11'b0_10_0_0_00_1_01_0; // beq + 7'b0010011: controls = 11'b1_00_1_0_00_0_10_0; // I-type ALU + 7'b1101111: controls = 11'b1_11_0_0_10_0_00_1; // jal + default: controls = 11'bx_xx_x_x_xx_x_xx_x; // non-implemented instruction + endcase +endmodule + +module aludec(input logic opb5, + input logic [2:0] funct3, + input logic funct7b5, + input logic [1:0] ALUOp, + output logic [2:0] ALUControl); + + logic RtypeSub; + assign RtypeSub = funct7b5 & opb5; // TRUE for R-type subtract instruction + + always_comb + case(ALUOp) + 2'b00: ALUControl = 3'b000; // addition + 2'b01: ALUControl = 3'b001; // subtraction + default: case(funct3) // R-type or I-type ALU + 3'b000: if (RtypeSub) + ALUControl = 3'b001; // sub + else + ALUControl = 3'b000; // add, addi + 3'b010: ALUControl = 3'b101; // slt, slti + 3'b110: ALUControl = 3'b011; // or, ori + 3'b111: ALUControl = 3'b010; // and, andi + default: ALUControl = 3'bxxx; // ??? + endcase + endcase +endmodule + +module datapath(input logic clk, reset, + input logic [1:0] ResultSrc, + input logic PCSrc, ALUSrc, + input logic RegWrite, + input logic [1:0] ImmSrc, + input logic [2:0] ALUControl, + output logic Zero, + output logic [31:0] PC, + input logic [31:0] Instr, + output logic [31:0] ALUResult, WriteData, + input logic [31:0] ReadData); + + logic [31:0] PCNext, PCPlus4, PCTarget; + logic [31:0] ImmExt; + logic [31:0] SrcA, SrcB; + logic [31:0] Result; + + // next PC logic + flopr #(32) pcreg(clk, reset, PCNext, PC); + adder pcadd4(PC, 32'd4, PCPlus4); + adder pcaddbranch(PC, ImmExt, PCTarget); + mux2 #(32) pcmux(PCPlus4, PCTarget, PCSrc, PCNext); + + // register file logic + regfile rf(clk, RegWrite, Instr[19:15], Instr[24:20], + Instr[11:7], Result, SrcA, WriteData); + extend ext(Instr[31:7], ImmSrc, ImmExt); + + // ALU logic + mux2 #(32) srcbmux(WriteData, ImmExt, ALUSrc, SrcB); + alu alu(SrcA, SrcB, ALUControl, ALUResult, Zero); + mux3 #(32) resultmux(ALUResult, ReadData, PCPlus4, ResultSrc, Result); +endmodule + +module regfile(input logic clk, + input logic we3, + input logic [ 4:0] a1, a2, a3, + input logic [31:0] wd3, + output logic [31:0] rd1, rd2); + + logic [31:0] rf[31:0]; + + // three ported register file + // read two ports combinationally (A1/RD1, A2/RD2) + // write third port on rising edge of clock (A3/WD3/WE3) + // register 0 hardwired to 0 + + always_ff @(posedge clk) + if (we3) rf[a3] <= wd3; + + assign rd1 = (a1 != 0) ? rf[a1] : 0; + assign rd2 = (a2 != 0) ? rf[a2] : 0; +endmodule + +module adder(input [31:0] a, b, + output [31:0] y); + + assign y = a + b; +endmodule + +module extend(input logic [31:7] instr, + input logic [1:0] immsrc, + output logic [31:0] immext); + + always_comb + case(immsrc) + // I-type + 2'b00: immext = {{20{instr[31]}}, instr[31:20]}; + // S-type (stores) + 2'b01: immext = {{20{instr[31]}}, instr[31:25], instr[11:7]}; + // B-type (branches) + 2'b10: immext = {{20{instr[31]}}, instr[7], instr[30:25], instr[11:8], 1'b0}; + // J-type (jal) + 2'b11: immext = {{12{instr[31]}}, instr[19:12], instr[20], instr[30:21], 1'b0}; + default: immext = 32'bx; // undefined + endcase +endmodule + +module flopr #(parameter WIDTH = 8) + (input logic clk, reset, + input logic [WIDTH-1:0] d, + output logic [WIDTH-1:0] q); + + always_ff @(posedge clk, posedge reset) + if (reset) q <= 0; + else q <= d; +endmodule + +module mux2 #(parameter WIDTH = 8) + (input logic [WIDTH-1:0] d0, d1, + input logic s, + output logic [WIDTH-1:0] y); + + assign y = s ? d1 : d0; +endmodule + +module mux3 #(parameter WIDTH = 8) + (input logic [WIDTH-1:0] d0, d1, d2, + input logic [1:0] s, + output logic [WIDTH-1:0] y); + + assign y = s[1] ? d2 : (s[0] ? d1 : d0); +endmodule + +module imem(input logic [31:0] a, + output logic [31:0] rd); + + logic [31:0] RAM[63:0]; + + initial + $readmemh("riscvtest.txt",RAM); + + assign rd = RAM[a[31:2]]; // word aligned +endmodule + +module dmem(input logic clk, we, + input logic [31:0] a, wd, + output logic [31:0] rd); + + logic [31:0] RAM[63:0]; + + assign rd = RAM[a[31:2]]; // word aligned + + always_ff @(posedge clk) + if (we) RAM[a[31:2]] <= wd; +endmodule + +module alu(input logic [31:0] a, b, + input logic [2:0] alucontrol, + output logic [31:0] result, + output logic zero); + + logic [31:0] condinvb, sum; + logic v; // overflow + logic isAddSub; // true when is add or subtract operation + + assign condinvb = alucontrol[0] ? ~b : b; + assign sum = a + condinvb + alucontrol[0]; + assign isAddSub = ~alucontrol[2] & ~alucontrol[1] | + ~alucontrol[1] & alucontrol[0]; + + always_comb + case (alucontrol) + 3'b000: result = sum; // add + 3'b001: result = sum; // subtract + 3'b010: result = a & b; // and + 3'b011: result = a | b; // or + 3'b100: result = a ^ b; // xor + 3'b101: result = sum[31] ^ v; // slt + 3'b110: result = a << b[4:0]; // sll + 3'b111: result = a >> b[4:0]; // srl + default: result = 32'bx; + endcase + + assign zero = (result == 32'b0); + assign v = ~(alucontrol[0] ^ a[31] ^ b[31]) & (a[31] ^ sum[31]) & isAddSub; + +endmodule diff --git a/toy/riscvtest.S b/toy/riscvtest.S new file mode 100644 index 000000000..4c85cf9d0 --- /dev/null +++ b/toy/riscvtest.S @@ -0,0 +1,33 @@ +# riscvtest.S +# Sarah.Harris@unlv.edu +# David_Harris@hmc.edu +# 27 Oct 2020 +# +# Test the RISC-V processor. +# add, sub, and, or, slt, addi, lw, sw, beq, jal +# If successful, it should write the value 25 to address 100 + +# RISC-V Assembly Description Address Machine Code +main: addi x2, x0, 5 # x2 = 5 0 00500113 + addi x3, x0, 12 # x3 = 12 4 00C00193 + addi x7, x3, -9 # x7 = (12 - 9) = 3 8 FF718393 + or x4, x7, x2 # x4 = (3 OR 5) = 7 C 0023E233 + and x5, x3, x4 # x5 = (12 AND 7) = 4 10 0041F2B3 + add x5, x5, x4 # x5 = (4 + 7) = 11 14 004282B3 + beq x5, x7, end # shouldn't be taken 18 02728863 + slt x4, x3, x4 # x4 = (12 < 7) = 0 1C 0041A233 + beq x4, x0, around # should be taken 20 00020463 + addi x5, x0, 0 # shouldn't happen 24 00000293 +around: slt x4, x7, x2 # x4 = (3 < 5) = 1 28 0023A233 + add x7, x4, x5 # x7 = (1 + 11) = 12 2C 005203B3 + sub x7, x7, x2 # x7 = (12 - 5) = 7 30 402383B3 + sw x7, 84(x3) # [96] = 7 34 0471AA23 + lw x2, 96(x0) # x2 = [96] = 7 38 06002103 + add x9, x2, x5 # x9 = (7 + 11) = 18 3C 005104B3 + jal x3, end # jump to end, x3 = 0x44 40 008001EF + addi x2, x0, 1 # shouldn't happen 44 00100113 +end: add x2, x2, x9 # x2 = (7 + 18) = 25 48 00910133 + sw x2, 0x20(x3) # mem[100] = 25 4C 0221A023 +done: beq x2, x2, done # infinite loop 50 00210063 + + \ No newline at end of file diff --git a/toy/riscvtest.txt b/toy/riscvtest.txt new file mode 100644 index 000000000..3a565dfa2 --- /dev/null +++ b/toy/riscvtest.txt @@ -0,0 +1,21 @@ +00500113 +00C00193 +FF718393 +0023E233 +0041F2B3 +004282B3 +02728863 +0041A233 +00020463 +00000293 +0023A233 +005203B3 +402383B3 +0471AA23 +06002103 +005104B3 +008001EF +00100113 +00910133 +0221A023 +00210063 diff --git a/wally-pipelined/testbench/testbench-coremark_bare.sv b/wally-pipelined/testbench/testbench-coremark_bare.sv index 86311b9a7..0b4590aaf 100644 --- a/wally-pipelined/testbench/testbench-coremark_bare.sv +++ b/wally-pipelined/testbench/testbench-coremark_bare.sv @@ -48,7 +48,8 @@ module testbench(); // pick tests based on modes supported initial - tests = {"../../tests/imperas-riscv-tests/riscv-ovpsim-plus/examples/CoreMark/coremarkcodemod.bare.riscv.memfile", "1000"}; +// tests = {"../../tests/imperas-riscv-tests/riscv-ovpsim-plus/examples/CoreMark/coremarkcodemod.bare.riscv.memfile", "1000"}; + tests = {"../../benchmarks/riscv-coremark/coremark.bare.riscv.memfile", "1000"}; string signame, memfilename; logic [31:0] GPIOPinsIn, GPIOPinsOut, GPIOPinsEn; logic UARTSin, UARTSout; From 54fef3e2ca75db45853f41ca13aed0597f835c6c Mon Sep 17 00:00:00 2001 From: David Harris Date: Thu, 18 Nov 2021 18:40:13 -0800 Subject: [PATCH 117/132] vert "Simplifying riscv-coremark" This reverts commit bdc212cf882dc95dc67519234216fed486220128. --- tests/riscv-coremark/.gitignore | 2 + tests/riscv-coremark/.gitmodules | 3 + tests/riscv-coremark/LICENSE | 29 + tests/riscv-coremark/README.md | 23 + tests/riscv-coremark/build-coremark.sh | 18 + tests/riscv-coremark/coremark/LICENSE.md | 100 ++ tests/riscv-coremark/coremark/Makefile | 139 ++ tests/riscv-coremark/coremark/README.md | 398 +++++ .../coremark/barebones/core_portme.c | 153 ++ .../coremark/barebones/core_portme.h | 210 +++ .../coremark/barebones/core_portme.mak | 87 + tests/riscv-coremark/coremark/barebones/cvt.c | 127 ++ .../coremark/barebones/ee_printf.c | 700 ++++++++ .../riscv-coremark/coremark/core_list_join.c | 580 +++++++ tests/riscv-coremark/coremark/core_main.c | 447 +++++ tests/riscv-coremark/coremark/core_matrix.c | 359 ++++ tests/riscv-coremark/coremark/core_state.c | 330 ++++ tests/riscv-coremark/coremark/core_util.c | 249 +++ tests/riscv-coremark/coremark/coremark.h | 183 ++ tests/riscv-coremark/coremark/coremark.md5 | 6 + .../coremark/cygwin/core_portme.c | 336 ++++ .../coremark/cygwin/core_portme.h | 293 ++++ .../coremark/cygwin/core_portme.mak | 17 + tests/riscv-coremark/coremark/docs/READM.md | 1 + .../coremark/docs/balance_O0_joined.png | Bin 0 -> 48672 bytes .../html/files/PIC32/core_portme-mak.html | 68 + .../docs/html/files/core_list_join-c.html | 58 + .../coremark/docs/html/files/core_main-c.html | 42 + .../docs/html/files/core_matrix-c.html | 56 + .../docs/html/files/core_state-c.html | 46 + .../coremark/docs/html/files/core_util-c.html | 42 + .../coremark/docs/html/files/coremark-h.html | 46 + .../docs/html/files/docs/core_state.png | Bin 0 -> 72093 bytes .../docs/html/files/linux/core_portme-c.html | 58 + .../docs/html/files/linux/core_portme-h.html | 72 + .../html/files/linux/core_portme-mak.html | 76 + .../coremark/docs/html/files/readme-txt.html | 71 + .../docs/html/files/release_notes-txt.html | 56 + .../coremark/docs/html/index.html | 1 + .../docs/html/index/BuildTargets.html | 31 + .../docs/html/index/Configuration.html | 51 + .../docs/html/index/Configurations.html | 45 + .../coremark/docs/html/index/Files.html | 35 + .../coremark/docs/html/index/Functions.html | 55 + .../coremark/docs/html/index/General.html | 75 + .../coremark/docs/html/index/General2.html | 47 + .../coremark/docs/html/index/Types.html | 31 + .../coremark/docs/html/index/Variables.html | 55 + .../coremark/docs/html/javascript/main.js | 836 ++++++++++ .../docs/html/javascript/searchdata.js | 212 +++ .../docs/html/search/BuildTargetsP.html | 18 + .../docs/html/search/ConfigurationC.html | 18 + .../docs/html/search/ConfigurationH.html | 18 + .../docs/html/search/ConfigurationM.html | 18 + .../docs/html/search/ConfigurationS.html | 18 + .../docs/html/search/ConfigurationT.html | 18 + .../docs/html/search/ConfigurationU.html | 18 + .../docs/html/search/ConfigurationsH.html | 20 + .../docs/html/search/ConfigurationsM.html | 20 + .../docs/html/search/ConfigurationsS.html | 20 + .../docs/html/search/ConfigurationsT.html | 20 + .../coremark/docs/html/search/FilesC.html | 18 + .../coremark/docs/html/search/FilesR.html | 18 + .../coremark/docs/html/search/FunctionsC.html | 18 + .../coremark/docs/html/search/FunctionsG.html | 18 + .../coremark/docs/html/search/FunctionsI.html | 18 + .../coremark/docs/html/search/FunctionsM.html | 18 + .../coremark/docs/html/search/FunctionsP.html | 18 + .../coremark/docs/html/search/FunctionsS.html | 18 + .../coremark/docs/html/search/FunctionsT.html | 18 + .../coremark/docs/html/search/GeneralB.html | 18 + .../coremark/docs/html/search/GeneralC.html | 18 + .../coremark/docs/html/search/GeneralD.html | 18 + .../coremark/docs/html/search/GeneralF.html | 18 + .../coremark/docs/html/search/GeneralG.html | 18 + .../coremark/docs/html/search/GeneralH.html | 18 + .../coremark/docs/html/search/GeneralI.html | 18 + .../coremark/docs/html/search/GeneralL.html | 18 + .../coremark/docs/html/search/GeneralM.html | 18 + .../coremark/docs/html/search/GeneralO.html | 18 + .../coremark/docs/html/search/GeneralP.html | 18 + .../coremark/docs/html/search/GeneralR.html | 18 + .../coremark/docs/html/search/GeneralS.html | 18 + .../coremark/docs/html/search/GeneralT.html | 18 + .../coremark/docs/html/search/GeneralU.html | 18 + .../coremark/docs/html/search/GeneralV.html | 18 + .../coremark/docs/html/search/GeneralW.html | 18 + .../coremark/docs/html/search/NoResults.html | 13 + .../coremark/docs/html/search/TypesS.html | 18 + .../coremark/docs/html/search/VariablesC.html | 18 + .../coremark/docs/html/search/VariablesD.html | 18 + .../coremark/docs/html/search/VariablesL.html | 18 + .../coremark/docs/html/search/VariablesO.html | 18 + .../coremark/docs/html/search/VariablesP.html | 18 + .../coremark/docs/html/search/VariablesR.html | 18 + .../coremark/docs/html/search/VariablesS.html | 18 + .../coremark/docs/html/styles/1.css | 767 +++++++++ .../coremark/docs/html/styles/2.css | 6 + .../coremark/docs/html/styles/main.css | 2 + .../coremark/freebsd/core_portme.mak | 17 + .../coremark/linux/core_portme.c | 338 ++++ .../coremark/linux/core_portme.h | 290 ++++ .../coremark/linux/core_portme.mak | 17 + .../coremark/linux64/core_portme.c | 336 ++++ .../coremark/linux64/core_portme.h | 291 ++++ .../coremark/linux64/core_portme.mak | 140 ++ .../coremark/macos/core_portme.mak | 18 + .../coremark/posix/core_portme.c | 419 +++++ .../coremark/posix/core_portme.h | 314 ++++ .../coremark/posix/core_portme.mak | 151 ++ .../posix/core_portme_posix_overrides.h | 28 + .../coremark/rtems/core_portme.mak | 18 + tests/riscv-coremark/coremark/rtems/init.c | 63 + .../coremark/simple/core_portme.c | 149 ++ .../coremark/simple/core_portme.h | 208 +++ .../coremark/simple/core_portme.mak | 60 + tests/riscv-coremark/extraPortmes/README.md | 7 + .../extraPortmes/cygwin/core_portme.c | 336 ++++ .../extraPortmes/cygwin/core_portme.h | 293 ++++ .../extraPortmes/cygwin/core_portme.mak | 17 + .../extraPortmes/linux/core_portme.c | 338 ++++ .../extraPortmes/linux/core_portme.h | 290 ++++ .../extraPortmes/linux/core_portme.mak | 17 + .../extraPortmes/linux64/core_portme.c | 336 ++++ .../extraPortmes/linux64/core_portme.h | 291 ++++ .../extraPortmes/linux64/core_portme.mak | 140 ++ .../riscv64-baremetal/core_portme.c | 382 +++++ .../riscv64-baremetal/core_portme.h | 296 ++++ .../riscv64-baremetal/core_portme.mak | 147 ++ tests/riscv-coremark/riscv64-baremetal/crt.S | 237 +++ .../riscv64-baremetal/encoding.h | 1471 +++++++++++++++++ .../riscv-coremark/riscv64-baremetal/link.ld | 66 + .../riscv64-baremetal/syscallbackup.c | 1072 ++++++++++++ .../riscv64-baremetal/syscalls.c | 505 ++++++ tests/riscv-coremark/riscv64-baremetal/util.h | 90 + tests/riscv-coremark/riscv64/core_portme.c | 346 ++++ tests/riscv-coremark/riscv64/core_portme.h | 296 ++++ tests/riscv-coremark/riscv64/core_portme.mak | 147 ++ tests/riscv-coremark/trace | 48 + tests/riscv-coremark/transferobjdump.sh | 8 + toy/riscvpipelined.sv | 570 ------- toy/riscvsingle.do | 37 - toy/riscvsingle.sv | 384 ----- toy/riscvtest.S | 33 - toy/riscvtest.txt | 21 - .../testbench/testbench-coremark_bare.sv | 3 +- 146 files changed, 18595 insertions(+), 1047 deletions(-) create mode 100644 tests/riscv-coremark/.gitignore create mode 100644 tests/riscv-coremark/.gitmodules create mode 100644 tests/riscv-coremark/LICENSE create mode 100644 tests/riscv-coremark/README.md create mode 100755 tests/riscv-coremark/build-coremark.sh create mode 100644 tests/riscv-coremark/coremark/LICENSE.md create mode 100644 tests/riscv-coremark/coremark/Makefile create mode 100644 tests/riscv-coremark/coremark/README.md create mode 100644 tests/riscv-coremark/coremark/barebones/core_portme.c create mode 100644 tests/riscv-coremark/coremark/barebones/core_portme.h create mode 100755 tests/riscv-coremark/coremark/barebones/core_portme.mak create mode 100644 tests/riscv-coremark/coremark/barebones/cvt.c create mode 100644 tests/riscv-coremark/coremark/barebones/ee_printf.c create mode 100644 tests/riscv-coremark/coremark/core_list_join.c create mode 100644 tests/riscv-coremark/coremark/core_main.c create mode 100644 tests/riscv-coremark/coremark/core_matrix.c create mode 100644 tests/riscv-coremark/coremark/core_state.c create mode 100644 tests/riscv-coremark/coremark/core_util.c create mode 100644 tests/riscv-coremark/coremark/coremark.h create mode 100644 tests/riscv-coremark/coremark/coremark.md5 create mode 100755 tests/riscv-coremark/coremark/cygwin/core_portme.c create mode 100755 tests/riscv-coremark/coremark/cygwin/core_portme.h create mode 100644 tests/riscv-coremark/coremark/cygwin/core_portme.mak create mode 100644 tests/riscv-coremark/coremark/docs/READM.md create mode 100644 tests/riscv-coremark/coremark/docs/balance_O0_joined.png create mode 100644 tests/riscv-coremark/coremark/docs/html/files/PIC32/core_portme-mak.html create mode 100644 tests/riscv-coremark/coremark/docs/html/files/core_list_join-c.html create mode 100644 tests/riscv-coremark/coremark/docs/html/files/core_main-c.html create mode 100644 tests/riscv-coremark/coremark/docs/html/files/core_matrix-c.html create mode 100644 tests/riscv-coremark/coremark/docs/html/files/core_state-c.html create mode 100644 tests/riscv-coremark/coremark/docs/html/files/core_util-c.html create mode 100644 tests/riscv-coremark/coremark/docs/html/files/coremark-h.html create mode 100644 tests/riscv-coremark/coremark/docs/html/files/docs/core_state.png create mode 100644 tests/riscv-coremark/coremark/docs/html/files/linux/core_portme-c.html create mode 100644 tests/riscv-coremark/coremark/docs/html/files/linux/core_portme-h.html create mode 100644 tests/riscv-coremark/coremark/docs/html/files/linux/core_portme-mak.html create mode 100644 tests/riscv-coremark/coremark/docs/html/files/readme-txt.html create mode 100644 tests/riscv-coremark/coremark/docs/html/files/release_notes-txt.html create mode 100644 tests/riscv-coremark/coremark/docs/html/index.html create mode 100644 tests/riscv-coremark/coremark/docs/html/index/BuildTargets.html create mode 100644 tests/riscv-coremark/coremark/docs/html/index/Configuration.html create mode 100644 tests/riscv-coremark/coremark/docs/html/index/Configurations.html create mode 100644 tests/riscv-coremark/coremark/docs/html/index/Files.html create mode 100644 tests/riscv-coremark/coremark/docs/html/index/Functions.html create mode 100644 tests/riscv-coremark/coremark/docs/html/index/General.html create mode 100644 tests/riscv-coremark/coremark/docs/html/index/General2.html create mode 100644 tests/riscv-coremark/coremark/docs/html/index/Types.html create mode 100644 tests/riscv-coremark/coremark/docs/html/index/Variables.html create mode 100644 tests/riscv-coremark/coremark/docs/html/javascript/main.js create mode 100644 tests/riscv-coremark/coremark/docs/html/javascript/searchdata.js create mode 100644 tests/riscv-coremark/coremark/docs/html/search/BuildTargetsP.html create mode 100644 tests/riscv-coremark/coremark/docs/html/search/ConfigurationC.html create mode 100644 tests/riscv-coremark/coremark/docs/html/search/ConfigurationH.html create mode 100644 tests/riscv-coremark/coremark/docs/html/search/ConfigurationM.html create mode 100644 tests/riscv-coremark/coremark/docs/html/search/ConfigurationS.html create mode 100644 tests/riscv-coremark/coremark/docs/html/search/ConfigurationT.html create mode 100644 tests/riscv-coremark/coremark/docs/html/search/ConfigurationU.html create mode 100644 tests/riscv-coremark/coremark/docs/html/search/ConfigurationsH.html create mode 100644 tests/riscv-coremark/coremark/docs/html/search/ConfigurationsM.html create mode 100644 tests/riscv-coremark/coremark/docs/html/search/ConfigurationsS.html create mode 100644 tests/riscv-coremark/coremark/docs/html/search/ConfigurationsT.html create mode 100644 tests/riscv-coremark/coremark/docs/html/search/FilesC.html create mode 100644 tests/riscv-coremark/coremark/docs/html/search/FilesR.html create mode 100644 tests/riscv-coremark/coremark/docs/html/search/FunctionsC.html create mode 100644 tests/riscv-coremark/coremark/docs/html/search/FunctionsG.html create mode 100644 tests/riscv-coremark/coremark/docs/html/search/FunctionsI.html create mode 100644 tests/riscv-coremark/coremark/docs/html/search/FunctionsM.html create mode 100644 tests/riscv-coremark/coremark/docs/html/search/FunctionsP.html create mode 100644 tests/riscv-coremark/coremark/docs/html/search/FunctionsS.html create mode 100644 tests/riscv-coremark/coremark/docs/html/search/FunctionsT.html create mode 100644 tests/riscv-coremark/coremark/docs/html/search/GeneralB.html create mode 100644 tests/riscv-coremark/coremark/docs/html/search/GeneralC.html create mode 100644 tests/riscv-coremark/coremark/docs/html/search/GeneralD.html create mode 100644 tests/riscv-coremark/coremark/docs/html/search/GeneralF.html create mode 100644 tests/riscv-coremark/coremark/docs/html/search/GeneralG.html create mode 100644 tests/riscv-coremark/coremark/docs/html/search/GeneralH.html create mode 100644 tests/riscv-coremark/coremark/docs/html/search/GeneralI.html create mode 100644 tests/riscv-coremark/coremark/docs/html/search/GeneralL.html create mode 100644 tests/riscv-coremark/coremark/docs/html/search/GeneralM.html create mode 100644 tests/riscv-coremark/coremark/docs/html/search/GeneralO.html create mode 100644 tests/riscv-coremark/coremark/docs/html/search/GeneralP.html create mode 100644 tests/riscv-coremark/coremark/docs/html/search/GeneralR.html create mode 100644 tests/riscv-coremark/coremark/docs/html/search/GeneralS.html create mode 100644 tests/riscv-coremark/coremark/docs/html/search/GeneralT.html create mode 100644 tests/riscv-coremark/coremark/docs/html/search/GeneralU.html create mode 100644 tests/riscv-coremark/coremark/docs/html/search/GeneralV.html create mode 100644 tests/riscv-coremark/coremark/docs/html/search/GeneralW.html create mode 100644 tests/riscv-coremark/coremark/docs/html/search/NoResults.html create mode 100644 tests/riscv-coremark/coremark/docs/html/search/TypesS.html create mode 100644 tests/riscv-coremark/coremark/docs/html/search/VariablesC.html create mode 100644 tests/riscv-coremark/coremark/docs/html/search/VariablesD.html create mode 100644 tests/riscv-coremark/coremark/docs/html/search/VariablesL.html create mode 100644 tests/riscv-coremark/coremark/docs/html/search/VariablesO.html create mode 100644 tests/riscv-coremark/coremark/docs/html/search/VariablesP.html create mode 100644 tests/riscv-coremark/coremark/docs/html/search/VariablesR.html create mode 100644 tests/riscv-coremark/coremark/docs/html/search/VariablesS.html create mode 100644 tests/riscv-coremark/coremark/docs/html/styles/1.css create mode 100644 tests/riscv-coremark/coremark/docs/html/styles/2.css create mode 100644 tests/riscv-coremark/coremark/docs/html/styles/main.css create mode 100644 tests/riscv-coremark/coremark/freebsd/core_portme.mak create mode 100755 tests/riscv-coremark/coremark/linux/core_portme.c create mode 100755 tests/riscv-coremark/coremark/linux/core_portme.h create mode 100644 tests/riscv-coremark/coremark/linux/core_portme.mak create mode 100755 tests/riscv-coremark/coremark/linux64/core_portme.c create mode 100755 tests/riscv-coremark/coremark/linux64/core_portme.h create mode 100755 tests/riscv-coremark/coremark/linux64/core_portme.mak create mode 100644 tests/riscv-coremark/coremark/macos/core_portme.mak create mode 100644 tests/riscv-coremark/coremark/posix/core_portme.c create mode 100644 tests/riscv-coremark/coremark/posix/core_portme.h create mode 100755 tests/riscv-coremark/coremark/posix/core_portme.mak create mode 100644 tests/riscv-coremark/coremark/posix/core_portme_posix_overrides.h create mode 100644 tests/riscv-coremark/coremark/rtems/core_portme.mak create mode 100644 tests/riscv-coremark/coremark/rtems/init.c create mode 100644 tests/riscv-coremark/coremark/simple/core_portme.c create mode 100644 tests/riscv-coremark/coremark/simple/core_portme.h create mode 100755 tests/riscv-coremark/coremark/simple/core_portme.mak create mode 100644 tests/riscv-coremark/extraPortmes/README.md create mode 100755 tests/riscv-coremark/extraPortmes/cygwin/core_portme.c create mode 100755 tests/riscv-coremark/extraPortmes/cygwin/core_portme.h create mode 100644 tests/riscv-coremark/extraPortmes/cygwin/core_portme.mak create mode 100755 tests/riscv-coremark/extraPortmes/linux/core_portme.c create mode 100755 tests/riscv-coremark/extraPortmes/linux/core_portme.h create mode 100644 tests/riscv-coremark/extraPortmes/linux/core_portme.mak create mode 100755 tests/riscv-coremark/extraPortmes/linux64/core_portme.c create mode 100755 tests/riscv-coremark/extraPortmes/linux64/core_portme.h create mode 100755 tests/riscv-coremark/extraPortmes/linux64/core_portme.mak create mode 100755 tests/riscv-coremark/riscv64-baremetal/core_portme.c create mode 100755 tests/riscv-coremark/riscv64-baremetal/core_portme.h create mode 100755 tests/riscv-coremark/riscv64-baremetal/core_portme.mak create mode 100644 tests/riscv-coremark/riscv64-baremetal/crt.S create mode 100644 tests/riscv-coremark/riscv64-baremetal/encoding.h create mode 100644 tests/riscv-coremark/riscv64-baremetal/link.ld create mode 100644 tests/riscv-coremark/riscv64-baremetal/syscallbackup.c create mode 100644 tests/riscv-coremark/riscv64-baremetal/syscalls.c create mode 100644 tests/riscv-coremark/riscv64-baremetal/util.h create mode 100755 tests/riscv-coremark/riscv64/core_portme.c create mode 100755 tests/riscv-coremark/riscv64/core_portme.h create mode 100755 tests/riscv-coremark/riscv64/core_portme.mak create mode 100644 tests/riscv-coremark/trace create mode 100755 tests/riscv-coremark/transferobjdump.sh delete mode 100644 toy/riscvpipelined.sv delete mode 100644 toy/riscvsingle.do delete mode 100644 toy/riscvsingle.sv delete mode 100644 toy/riscvtest.S delete mode 100644 toy/riscvtest.txt diff --git a/tests/riscv-coremark/.gitignore b/tests/riscv-coremark/.gitignore new file mode 100644 index 000000000..0f2251abe --- /dev/null +++ b/tests/riscv-coremark/.gitignore @@ -0,0 +1,2 @@ +coremark.riscv +coremark.bare.riscv \ No newline at end of file diff --git a/tests/riscv-coremark/.gitmodules b/tests/riscv-coremark/.gitmodules new file mode 100644 index 000000000..938028cb7 --- /dev/null +++ b/tests/riscv-coremark/.gitmodules @@ -0,0 +1,3 @@ +[submodule "coremark"] + path = coremark + url = https://github.com/eembc/coremark diff --git a/tests/riscv-coremark/LICENSE b/tests/riscv-coremark/LICENSE new file mode 100644 index 000000000..860ca9cc6 --- /dev/null +++ b/tests/riscv-coremark/LICENSE @@ -0,0 +1,29 @@ +BSD 3-Clause License + +Copyright (c) 2017, Christopher Celio +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/tests/riscv-coremark/README.md b/tests/riscv-coremark/README.md new file mode 100644 index 000000000..7c02eb1bf --- /dev/null +++ b/tests/riscv-coremark/README.md @@ -0,0 +1,23 @@ +Coremark EEMBC Wrapper +====================== + +This repository provides the utility files to port [CoreMark EEMBC](https://www.eembc.org/coremark/) to RISC-V. + +### Requirements + + - You must have installed the RISC-V tools + +### Setup + + - `git submodule update --init` + - Run the `./build-coremark.sh` script that does the following + - Builds a version of Coremark for Linux or pk (coremark.riscv) + - Builds a version of Coremark for bare-metal (coremark.bare.riscv) + - Copies the output binaries into this directory + +### Default Files + +The default files target **RV64GC** and use minimal amount of compilation flags. Additionally, the `*.mak` file in the `riscv64` +folder setups `spike pk` as the default `run` rule. + +Feel free to change these to suit your needs. diff --git a/tests/riscv-coremark/build-coremark.sh b/tests/riscv-coremark/build-coremark.sh new file mode 100755 index 000000000..bdd100725 --- /dev/null +++ b/tests/riscv-coremark/build-coremark.sh @@ -0,0 +1,18 @@ +#!/bin/bash + +set -e + +BASEDIR=$PWD +CM_FOLDER=coremark +#RISCV=/home/ehedenberg/riscvcompiler +RISCV=/courses/e190ax/riscvcompiler +XCFLAGS="-march=rv64im" +cd $BASEDIR/$CM_FOLDER + +# run the compile +echo "Start compilation" +#make PORT_DIR=../riscv64 compile RISCV=$RISCV +#mv coremark.riscv ../ + +make PORT_DIR=../riscv64-baremetal compile RISCV=$RISCV XCFLAGS=$XCFLAGS +mv coremark.bare.riscv ../ diff --git a/tests/riscv-coremark/coremark/LICENSE.md b/tests/riscv-coremark/coremark/LICENSE.md new file mode 100644 index 000000000..14e53e9ee --- /dev/null +++ b/tests/riscv-coremark/coremark/LICENSE.md @@ -0,0 +1,100 @@ +# COREMARK® ACCEPTABLE USE AGREEMENT + +This ACCEPTABLE USE AGREEMENT (this “Agreementâ€) is offered by Embedded Microprocessor Benchmark Consortium, a California nonprofit corporation (“Licensorâ€), to users of its CoreMark® software (“Licenseeâ€) exclusively on the following terms. + +Licensor offers benchmarking software (“Softwareâ€) pursuant to an open source license, but carefully controls use of its benchmarks and their associated goodwill. Licensor has registered its trademark in one of the benchmarks available through the Software, COREMARK, Ser. No. 85/487,290; Reg. No. 4,179,307 (the “Trademarkâ€), and promotes the use of a standard metric as a benchmark for assessing the performance of embedded systems. Solely on the terms described herein, Licensee may use and display the Trademark in connection with the generation of data regarding measurement and analysis of computer and embedded system benchmarking via the Software (the “Licensed Useâ€). + +## Article 1 – License Grant. +1.1. License. Subject to the terms and conditions of this Agreement, Licensor hereby grants to Licensee, and Licensee hereby accepts from Licensor, a personal, non-exclusive, royalty-free, revocable right and license to use and display the Trademark during the term of this Agreement (the “Termâ€), solely and exclusively in connection with the Licensed Use. During the Term, Licensee (i) shall not modify or otherwise create derivative works of the Trademark, and (ii) may use the Trademark only to the extent permitted under this License. Neither Licensee nor any affiliate or agent thereof shall otherwise use the Trademark without the prior express written consent of Licensor, which may be withheld in its sole and absolute discretion. All rights not expressly granted to Licensee hereunder shall remain the exclusive property of Licensor. + +1.2. Modifications to the Software. Licensee shall not use the Trademark in connection with any use of a modified, derivative, or otherwise altered copy of the Software. + +1.3. Licensor’s Use. Nothing in this Agreement shall preclude Licensor or any of its successors or assigns from using or permitting other entities to use the Trademark, whether or not such entity directly or indirectly competes or conflicts with Licensee’s Licensed Use in any manner. + +1.4. Term and Termination. This Agreement is perpetual unless terminated by either of the parties. Licensee may terminate this Agreement for convenience, without cause or liability, for any reason or for no reason whatsoever, upon ten (10) business days written notice. Licensor may terminate this Agreement effective immediately upon notice of breach. Upon termination, Licensee shall immediately remove all implementations of the Trademark from the Licensed Use, and delete all digitals files and records of all materials related to the Trademark. + +## Article 2 – Ownership. +2.1. Ownership. Licensee acknowledges and agrees that Licensor is the owner of all right, title, and interest in and to the Trademark, and all such right, title, and interest shall remain with Licensor. Licensee shall not contest, dispute, challenge, oppose, or seek to cancel Licensor’s right, title, and interest in and to the Trademark. Licensee shall not prosecute any application for registration of the Trademark. Licensee shall display appropriate notices regarding ownership of the Trademark in connection with the Licensed Use. + +2.2. Goodwill. Licensee acknowledges that Licensee shall not acquire any right, title, or interest in the Trademark by virtue of this Agreement other than the license granted hereunder, and disclaims any such right, title, interest, or ownership. All goodwill and reputation generated by Licensee’s use of the Trademark shall inure to the exclusive benefit of Licensor. Licensee shall not by any act or omission use the Trademark in any manner that disparages or reflects adversely on Licensor or its Licensed Use or reputation. Licensee shall not take any action that would interfere with or prejudice Licensor’s ownership or registration of the Trademark, the validity of the Trademark or the validity of the license granted by this Agreement. If Licensor determines and notifies Licensee that any act taken in connection with the Licensed Use (i) is inaccurate, unlawful or offensive to good taste; (ii) fails to provide for proper trademark notices, or (iii) otherwise violates Licensee’s obligations under this Agreement, the license granted under this Agreement shall terminate. + +## Article 3 – Indemnification. +3.1. Indemnification Generally. Licensee agrees to indemnify, defend, and hold harmless (collectively “indemnify†or “indemnificationâ€) Licensor, including Licensor’s members, managers, officers, and employees (collectively “Related Personsâ€), from and against, and pay or reimburse Licensor and such Related Persons for, any and all third-party actions, claims, demands, proceedings, investigations, inquiries (collectively, “Claimsâ€), and any and all liabilities, obligations, fines, deficiencies, costs, expenses, royalties, losses, and damages (including reasonable outside counsel fees and expenses) associated with such Claims, to the extent that such Claim arises out of (i) Licensee’s material breach of this Agreement, or (ii) any allegation(s) that Licensee’s actions infringe or violate any third-party intellectual property right, including without limitation, any U.S. copyright, patent, or trademark, or are otherwise found to be tortious or criminal (whether or not such indemnified person is a named party in a legal proceeding). + +3.2. Notice and Defense of Claims. Licensor shall promptly notify Licensee of any Claim for which indemnification is sought, following actual knowledge of such Claim, provided however that the failure to give such notice shall not relieve Licensee of its obligations hereunder except to the extent that Licensee is materially prejudiced by such failure. In the event that any third-party Claim is brought, Licensee shall have the right and option to undertake and control the defense of such action with counsel of its choice, provided however that (i) Licensor at its own expense may participate and appear on an equal footing with Licensee in the defense of any such Claim, (ii) Licensor may undertake and control such defense in the event of the material failure of Licensee to undertake and control the same; and (iii) the defense of any Claim relating to the intellectual property rights of Licensor or its licensors and any related counterclaims shall be solely controlled by Licensor with counsel of its choice. Licensee shall not consent to judgment or concede or settle or compromise any Claim without the prior written approval of Licensor (whose approval shall not be unreasonably withheld), unless such concession or settlement or compromise includes a full and unconditional release of Licensor and any applicable Related Persons from all liabilities in respect of such Claim. + +## Article 4 – Miscellaneous. +4.1. Relationship of the Parties. This Agreement does not create a partnership, franchise, joint venture, agency, fiduciary, or employment relationship between the parties. + +4.2. No Third-Party Beneficiaries. Except for the rights of Related Persons under Article 3 (Indemnification), there are no third-party beneficiaries to this Agreement. + +4.3. Assignment. Licensee’s rights hereunder are non-assignable, and may not be sublicensed. + +4.4. Equitable Relief. Licensee acknowledges that the remedies available at law for any breach of this Agreement will, by their nature, be inadequate. Accordingly, Licensor may obtain injunctive relief or other equitable relief to restrain a breach or threatened breach of this Agreement or to specifically enforce this Agreement, without proving that any monetary damages have been sustained, and without the requirement of posting of a bond prior to obtaining such equitable relief. + +4.5. Governing Law. This Agreement will be interpreted, construed, and enforced in all respects in accordance with the laws of the State of California, without reference to its conflict of law principles. + +4.6. Attorneys’ Fees. If any legal action, arbitration or other proceeding is brought for the enforcement of this Agreement, or because of an alleged dispute, breach, default, or misrepresentation in connection with any of the provisions of this Agreement, the successful or prevailing party shall be entitled to recover its reasonable attorneys’ fees and other reasonable costs incurred in that action or proceeding, in addition to any other relief to which it may be entitled. + +4.7. Amendment; Waiver. This Agreement may not be amended, nor may any rights under it be waived, except in writing by Licensor. + +4.8. Severability. If any provision of this Agreement is held by a court of competent jurisdiction to be contrary to law, the provision shall be modified by the court and interpreted so as best to accomplish the objectives of the original provision to the fullest extent +permitted by law, and the remaining provisions of this Agreement shall remain in effect. + +4.9. Entire Agreement. This Agreement constitutes the entire agreement between the parties and supersedes all prior and contemporaneous agreements, proposals or representations, written or oral, concerning its subject matter. + + +# Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ + +## TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + You must give any other recipients of the Work or Derivative Works a copy of this License; and + You must cause any modified files to carry prominent notices stating that You changed the files; and + You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS diff --git a/tests/riscv-coremark/coremark/Makefile b/tests/riscv-coremark/coremark/Makefile new file mode 100644 index 000000000..51760d1dd --- /dev/null +++ b/tests/riscv-coremark/coremark/Makefile @@ -0,0 +1,139 @@ +# Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Original Author: Shay Gal-on + +# Make sure the default target is to simply build and run the benchmark. +RSTAMP = v1.0 + +.PHONY: run score +run: $(OUTFILE) rerun score + +score: + @echo "Check run1.log and run2.log for results." + @echo "See README.md for run and reporting rules." + +ifndef PORT_DIR +# Ports for a couple of common self hosted platforms +UNAME=$(shell if command -v uname 2> /dev/null; then uname ; fi) +ifneq (,$(findstring CYGWIN,$(UNAME))) +PORT_DIR=cygwin +endif +ifneq (,$(findstring Linux,$(UNAME))) +MACHINE=$(shell uname -m) +ifneq (,$(findstring 64,$(MACHINE))) +PORT_DIR=linux64 +else +PORT_DIR=linux +endif +endif +endif +ifndef PORT_DIR +$(error PLEASE define PORT_DIR! (e.g. make PORT_DIR=simple)) +endif +vpath %.c $(PORT_DIR) +vpath %.h $(PORT_DIR) +vpath %.mak $(PORT_DIR) +include $(PORT_DIR)/core_portme.mak + +ifndef $(ITERATIONS) +ITERATIONS=0 +endif +ifdef REBUILD +FORCE_REBUILD=force_rebuild +endif + +CFLAGS += -DITERATIONS=$(ITERATIONS) + +CORE_FILES = core_list_join core_main core_matrix core_state core_util +ORIG_SRCS = $(addsuffix .c,$(CORE_FILES)) +SRCS = $(ORIG_SRCS) $(PORT_SRCS) +OBJS = $(addprefix $(OPATH),$(addsuffix $(OEXT),$(CORE_FILES)) $(PORT_OBJS)) +OUTNAME = coremark$(EXE) +OUTFILE = $(OPATH)$(OUTNAME) +LOUTCMD = $(OFLAG) $(OUTFILE) $(LFLAGS_END) +OUTCMD = $(OUTFLAG) $(OUTFILE) $(LFLAGS_END) + +HEADERS = coremark.h +CHECK_FILES = $(ORIG_SRCS) $(HEADERS) + +$(OPATH): + $(MKDIR) $(OPATH) + +.PHONY: compile link +ifdef SEPARATE_COMPILE +$(OPATH)$(PORT_DIR): + $(MKDIR) $(OPATH)$(PORT_DIR) + +compile: $(OPATH) $(OPATH)$(PORT_DIR) $(OBJS) $(HEADERS) +link: compile + $(LD) $(LFLAGS) $(XLFLAGS) $(OBJS) $(LOUTCMD) + +else + +compile: $(OPATH) $(SRCS) $(HEADERS) + $(CC) $(CFLAGS) $(XCFLAGS) $(SRCS) $(OUTCMD) +link: compile + @echo "Link performed along with compile" + +endif + +$(OUTFILE): $(SRCS) $(HEADERS) Makefile core_portme.mak $(FORCE_REBUILD) + $(MAKE) port_prebuild + $(MAKE) link + $(MAKE) port_postbuild + +.PHONY: rerun +rerun: + $(MAKE) XCFLAGS="$(XCFLAGS) -DPERFORMANCE_RUN=1" load run1.log + $(MAKE) XCFLAGS="$(XCFLAGS) -DVALIDATION_RUN=1" load run2.log + +PARAM1=$(PORT_PARAMS) 0x0 0x0 0x66 $(ITERATIONS) +PARAM2=$(PORT_PARAMS) 0x3415 0x3415 0x66 $(ITERATIONS) +PARAM3=$(PORT_PARAMS) 8 8 8 $(ITERATIONS) + +run1.log-PARAM=$(PARAM1) 7 1 2000 +run2.log-PARAM=$(PARAM2) 7 1 2000 +run3.log-PARAM=$(PARAM3) 7 1 1200 + +run1.log run2.log run3.log: load + $(MAKE) port_prerun + $(RUN) $(OUTFILE) $($(@)-PARAM) > $(OPATH)$@ + $(MAKE) port_postrun + +.PHONY: gen_pgo_data +gen_pgo_data: run3.log + +.PHONY: load +load: $(OUTFILE) + $(MAKE) port_preload + $(LOAD) $(OUTFILE) + $(MAKE) port_postload + +.PHONY: clean +clean: + rm -f $(OUTFILE) $(OPATH)*.log *.info $(OPATH)index.html $(PORT_CLEAN) + +.PHONY: force_rebuild +force_rebuild: + echo "Forcing Rebuild" + +.PHONY: check +check: + md5sum -c coremark.md5 + +ifdef ETC +# Targets related to testing and releasing CoreMark. Not part of the general release! +include Makefile.internal +endif diff --git a/tests/riscv-coremark/coremark/README.md b/tests/riscv-coremark/coremark/README.md new file mode 100644 index 000000000..16b54b7b3 --- /dev/null +++ b/tests/riscv-coremark/coremark/README.md @@ -0,0 +1,398 @@ + +# Introduction + +CoreMark's primary goals are simplicity and providing a method for testing only a processor's core features. For more information about EEMBC's comprehensive embedded benchmark suites, please see www.eembc.org. + +For a more compute-intensive version of CoreMark that uses larger datasets and execution loops taken from common applications, please check out EEMBC's [CoreMark-PRO](https://www.github.com/eembc/coremark-pro) benchmark, also on GitHub. + +# Building and Running + +To build and run the benchmark, type + +`> make` + +Full results are available in the files `run1.log` and `run2.log`. CoreMark result can be found in `run1.log`. + +## Cross Compiling + +For cross compile platforms please adjust `core_portme.mak`, `core_portme.h` (and possibly `core_portme.c`) according to the specific platform used. When porting to a new platform, it is recommended to copy one of the default port folders (e.g. `mkdir && cp linux/* `), adjust the porting files, and run: +~~~ +% make PORT_DIR= +~~~ + +## Make Targets +`run` - Default target, creates `run1.log` and `run2.log`. +`run1.log` - Run the benchmark with performance parameters, and output to `run1.log` +`run2.log` - Run the benchmark with validation parameters, and output to `run2.log` +`run3.log` - Run the benchmark with profile generation parameters, and output to `run3.log` +`compile` - compile the benchmark executable +`link` - link the benchmark executable +`check` - test MD5 of sources that may not be modified +`clean` - clean temporary files + +### Make flag: `ITERATIONS` +By default, the benchmark will run between 10-100 seconds. To override, use `ITERATIONS=N` +~~~ +% make ITERATIONS=10 +~~~ +Will run the benchmark for 10 iterations. It is recommended to set a specific number of iterations in certain situations e.g.: + +* Running with a simulator +* Measuring power/energy +* Timing cannot be restarted + +Minimum required run time: **Results are only valid for reporting if the benchmark ran for at least 10 secs!** + +### Make flag: `XCFLAGS` +To add compiler flags from the command line, use `XCFLAGS` e.g.: + +~~~ +% make XCFLAGS="-g -DMULTITHREAD=4 -DUSE_FORK=1" +~~~ + +### Make flag: `CORE_DEBUG` + +Define to compile for a debug run if you get incorrect CRC. + +~~~ +% make XCFLAGS="-DCORE_DEBUG=1" +~~~ + +### Make flag: `REBUILD` + +Force a rebuild of the executable. + +## Systems Without `make` +The following files need to be compiled: +* `core_list_join.c` +* `core_main.c` +* `core_matrix.c` +* `core_state.c` +* `core_util.c` +* `PORT_DIR/core_portme.c` + +For example: +~~~ +% gcc -O2 -o coremark.exe core_list_join.c core_main.c core_matrix.c core_state.c core_util.c simple/core_portme.c -DPERFORMANCE_RUN=1 -DITERATIONS=1000 +% ./coremark.exe > run1.log +~~~ +The above will compile the benchmark for a performance run and 1000 iterations. Output is redirected to `run1.log`. + +# Parallel Execution +Use `XCFLAGS=-DMULTITHREAD=N` where N is number of threads to run in parallel. Several implementations are available to execute in multiple contexts, or you can implement your own in `core_portme.c`. + +~~~ +% make XCFLAGS="-DMULTITHREAD=4 -DUSE_PTHREAD" +~~~ + +The above will compile the benchmark for execution on 4 cores, using POSIX Threads API. + +Note: linking may fail on the previous command if your linker does not automatically add the `pthread` library. If you encounter `undefined reference` errors, please modify the `core_portme.mak` file for your platform, (e.g. `linux/core_portme.mak`) and add `-lpthread` to the `LFLAGS_END` parameter. + +# Run Parameters for the Benchmark Executable +CoreMark's executable takes several parameters as follows (but only if `main()` accepts arguments): +1st - A seed value used for initialization of data. +2nd - A seed value used for initialization of data. +3rd - A seed value used for initialization of data. +4th - Number of iterations (0 for auto : default value) +5th - Reserved for internal use. +6th - Reserved for internal use. +7th - For malloc users only, ovreride the size of the input data buffer. + +The run target from make will run coremark with 2 different data initialization seeds. + +## Alternative parameters: +If not using `malloc` or command line arguments are not supported, the buffer size +for the algorithms must be defined via the compiler define `TOTAL_DATA_SIZE`. +`TOTAL_DATA_SIZE` must be set to 2000 bytes (default) for standard runs. +The default for such a target when testing different configurations could be: + +~~~ +% make XCFLAGS="-DTOTAL_DATA_SIZE=6000 -DMAIN_HAS_NOARGC=1" +~~~ + +# Submitting Results + +CoreMark results can be submitted on the web. Open a web browser and go to the [submission page](https://www.eembc.org/coremark/submit.php). After registering an account you may enter a score. + +# Run Rules +What is and is not allowed. + +## Required +1. The benchmark needs to run for at least 10 seconds. +2. All validation must succeed for seeds `0,0,0x66` and `0x3415,0x3415,0x66`, buffer size of 2000 bytes total. + * If not using command line arguments to main: +~~~ + % make XCFLAGS="-DPERFORMANCE_RUN=1" REBUILD=1 run1.log + % make XCFLAGS="-DVALIDATION_RUN=1" REBUILD=1 run2.log +~~~ +3. If using profile guided optimization, profile must be generated using seeds of `8,8,8`, and buffer size of 1200 bytes total. +~~~ + % make XCFLAGS="-DTOTAL_DATA_SIZE=1200 -DPROFILE_RUN=1" REBUILD=1 run3.log +~~~ +4. All source files must be compiled with the same flags. +5. All data type sizes must match size in bits such that: + * `ee_u8` is an unsigned 8-bit datatype. + * `ee_s16` is a signed 16-bit datatype. + * `ee_u16` is an unsigned 16-bit datatype. + * `ee_s32` is a signed 32-bit datatype. + * `ee_u32` is an unsigned 32-bit datatype. + +## Allowed + +1. Changing number of iterations +2. Changing toolchain and build/load/run options +3. Changing method of acquiring a data memory block +5. Changing the method of acquiring seed values +6. Changing implementation `in core_portme.c` +7. Changing configuration values in `core_portme.h` +8. Changing `core_portme.mak` + +## NOT ALLOWED +1. Changing of source file other then `core_portme*` (use `make check` to validate) + +# Reporting rules +Use the following syntax to report results on a data sheet: + +CoreMark 1.0 : N / C [/ P] [/ M] + +N - Number of iterations per second with seeds 0,0,0x66,size=2000) + +C - Compiler version and flags + +P - Parameters such as data and code allocation specifics + +* This parameter *may* be omitted if all data was allocated on the heap in RAM. +* This parameter *may not* be omitted when reporting CoreMark/MHz + +M - Type of parallel execution (if used) and number of contexts +* This parameter may be omitted if parallel execution was not used. + +e.g.: + +~~~ +CoreMark 1.0 : 128 / GCC 4.1.2 -O2 -fprofile-use / Heap in TCRAM / FORK:2 +~~~ +or +~~~ +CoreMark 1.0 : 1400 / GCC 3.4 -O4 +~~~ + +If reporting scaling results, the results must be reported as follows: + +CoreMark/MHz 1.0 : N / C / P [/ M] + +P - When reporting scaling results, memory parameter must also indicate memory frequency:core frequency ratio. +1. If the core has cache and cache frequency to core frequency ratio is configurable, that must also be included. + +e.g.: + +~~~ +CoreMark/MHz 1.0 : 1.47 / GCC 4.1.2 -O2 / DDR3(Heap) 30:1 Memory 1:1 Cache +~~~ + +# Log File Format +The log files have the following format + +~~~ +2K performance run parameters for coremark. (Run type) +CoreMark Size : 666 (Buffer size) +Total ticks : 25875 (platform dependent value) +Total time (secs) : 25.875000 (actual time in seconds) +Iterations/Sec : 3864.734300 (Performance value to report) +Iterations : 100000 (number of iterations used) +Compiler version : GCC3.4.4 (Compiler and version) +Compiler flags : -O2 (Compiler and linker flags) +Memory location : Code in flash, data in on chip RAM +seedcrc : 0xe9f5 (identifier for the input seeds) +[0]crclist : 0xe714 (validation for list part) +[0]crcmatrix : 0x1fd7 (validation for matrix part) +[0]crcstate : 0x8e3a (validation for state part) +[0]crcfinal : 0x33ff (iteration dependent output) +Correct operation validated. See README.md for run and reporting rules. (*Only when run is successful*) +CoreMark 1.0 : 6508.490622 / GCC3.4.4 -O2 / Heap (*Only on a successful performance run*) +~~~ + +# Theory of Operation + +This section describes the initial goals of CoreMark and their implementation. + +## Small and easy to understand + +* X number of source code lines for timed portion of the benchmark. +* Meaningful names for variables and functions. +* Comments for each block of code more than 10 lines long. + +## Portability + +A thin abstraction layer will be provided for I/O and timing in a separate file. All I/O and timing of the benchmark will be done through this layer. + +### Code / data size + +* Compile with gcc on x86 and make sure all sizes are according to requirements. +* If dynamic memory allocation is used, take total memory allocated into account as well. +* Avoid recursive functions and keep track of stack usage. +* Use the same memory block as data site for all algorithms, and initialize the data before each algorithm – while this means that initialization with data happens during the timed portion, it will only happen once during the timed portion and so have negligible effect on the results. + +## Controlled output + +This may be the most difficult goal. Compilers are constantly improving and getting better at analyzing code. To create work that cannot be computed at compile time and must be computed at run time, we will rely on two assumptions: + +* Some system functions (e.g. time, scanf) and parameters cannot be computed at compile time. In most cases, marking a variable volatile means the compiler is force to read this variable every time it is read. This will be used to introduce a factor into the input that cannot be precomputed at compile time. Since the results are input dependent, that will make sure that computation has to happen at run time. + +* Either a system function or I/O (e.g. scanf) or command line parameters or volatile variables will be used before the timed portion to generate data which is not available at compile time. Specific method used is not relevant as long as it can be controlled, and that it cannot be computed or eliminated by the compiler at compile time. E.g. if the clock() functions is a compiler stub, it may not be used. The derived values will be reported on the output so that verification can be done on a different machine. + +* We cannot rely on command line parameters since some embedded systems do not have the capability to provide command line parameters. All 3 methods above will be implemented (time based, scanf and command line parameters) and all 3 are valid if the compiler cannot determine the value at compile time. + +* It is important to note that The actual values that are to be supplied at run time will be standardized. The methodology is not intended to provide random data, but simply to provide controlled data that cannot be precomputed at compile time. + +* Printed results must be valid at run time. This will be used to make sure the computation has been executed. + +* Some embedded systems do not provide “printf†or other I/O functionality. All I/O will be done through a thin abstraction interface to allow execution on such systems (e.g. allow output via JTAG). + +## Key Algorithms + +### Linked List + +The following linked list structure will be used: + +~~~ +typedef struct list_data_s { + ee_s16 data16; + ee_s16 idx; +} list_data; + +typedef struct list_head_s { + struct list_head_s *next; + struct list_data_s *info; +} list_head; +~~~ + +While adding a level of indirection accessing the data, this structure is realistic and used in many embedded applications for small to medium lists. + +The list itself will be initialized on a block of memory that will be passed in to the initialization function. While in general linked lists use malloc for new nodes, embedded applications sometime control the memory for small data structures such as arrays and lists directly to avoid the overhead of system calls, so this approach is realistic. + +The linked list will be initialized such that 1/4 of the list pointers point to sequential areas in memory, and 3/4 of the list pointers are distributed in a non sequential manner. This is done to emulate a linked list that had add/remove happen for a while disrupting the neat order, and then a series of adds that are likely to come from sequential memory locations. + +For the benchmark itself: +- Multiple find operations are going to be performed. These find operations may result in the whole list being traversed. The result of each find will become part of the output chain. +- The list will be sorted using merge sort based on the data16 value, and then derive CRC of the data16 item in order for part of the list. The CRC will become part of the output chain. +- The list will be sorted again using merge sort based on the idx value. This sort will guarantee that the list is returned to the primary state before leaving the function, so that multiple iterations of the function will have the same result. CRC of the data16 for part of the list will again be calculated and become part of the output chain. + +The actual `data16` in each cell will be pseudo random based on a single 16b input that cannot be determined at compile time. In addition, the part of the list which is used for CRC will also be passed to the function, and determined based on an input that cannot be determined at run time. + +### Matrix Multiply + +This very simple algorithm forms the basis of many more complex algorithms. The tight inner loop is the focus of many optimizations (compiler as well as hardware based) and is thus relevant for embedded processing. + +The total available data space will be divided to 3 parts: +1. NxN matrix A. +2. NxN matrix B. +3. NxN matrix C. + +E.g. for 2K we will have 3 12x12 matrices (assuming data type of 32b 12(len)*12(wid)*4(size)*3(num) =1728 bytes). + +Matrix A will be initialized with small values (upper 3/4 of the bits all zero). +Matrix B will be initialized with medium values (upper half of the bits all zero). +Matrix C will be used for the result. + +For the benchmark itself: +- Multiple A by a constant into C, add the upper bits of each of the values in the result matrix. The result will become part of the output chain. +- Multiple A by column X of B into C, add the upper bits of each of the values in the result matrix. The result will become part of the output chain. +- Multiple A by B into C, add the upper bits of each of the values in the result matrix. The result will become part of the output chain. + +The actual values for A and B must be derived based on input that is not available at compile time. + +### State Machine + +This part of the code needs to exercise switch and if statements. As such, we will use a small Moore state machine. In particular, this will be a state machine that identifies string input as numbers and divides them according to format. + +The state machine will parse the input string until either a “,†separator or end of input is encountered. An invalid number will cause the state machine to return invalid state and a valid number will cause the state machine to return with type of number format (int/float/scientific). + +This code will perform a realistic task, be small enough to easily understand, and exercise the required functionality. The other option used in embedded systems is a mealy based state machine, which is driven by a table. The table then determines the number of states and complexity of transitions. This approach, however, tests mainly the load/store and function call mechanisms and less the handling of branches. If analysis of the final results shows that the load/store functionality of the processor is not exercised thoroughly, it may be a good addition to the benchmark (codesize allowing). + +For input, the memory block will be initialized with comma separated values of mixed formats, as well as invalid inputs. + +For the benchmark itself: +- Invoke the state machine on all of the input and count final states and state transitions. CRC of all final states and transitions will become part of the output chain. +- Modify the input at intervals (inject errors) and repeat the state machine operation. +- Modify the input back to original form. + +The actual input must be initialized based on data that cannot be determined at compile time. In addition the intervals for modification of the input and the actual modification must be based on input that cannot be determined at compile time. + +# Validation + +This release was tested on the following platforms: +* x86 cygwin and gcc 3.4 (Quad, dual and single core systems) +* x86 linux (Ubuntu/Fedora) and gcc (4.2/4.1) (Quad and single core systems) +* MIPS64 BE linux and gcc 3.4 16 cores system +* MIPS32 BE linux with CodeSourcery compiler 4.2-177 on Malta/Linux with a 1004K 3-core system +* PPC simulator with gcc 4.2.2 (No OS) +* PPC 64b BE linux (yellowdog) with gcc 3.4 and 4.1 (Dual core system) +* BF533 with VDSP50 +* Renesas R8C/H8 MCU with HEW 4.05 +* NXP LPC1700 armcc v4.0.0.524 +* NEC 78K with IAR v4.61 +* ARM simulator with armcc v4 + +# Memory Analysis + +Valgrind 3.4.0 used and no errors reported. + +# Balance Analysis + +Number of instructions executed for each function tested with cachegrind and found balanced with gcc and -O0. + +# Statistics + +Lines: +~~~ +Lines Blank Cmnts Source AESL +===== ===== ===== ===== ========== ======================================= + 469 66 170 251 627.5 core_list_join.c (C) + 330 18 54 268 670.0 core_main.c (C) + 256 32 80 146 365.0 core_matrix.c (C) + 240 16 51 186 465.0 core_state.c (C) + 165 11 20 134 335.0 core_util.c (C) + 150 23 36 98 245.0 coremark.h (C) + 1610 166 411 1083 2707.5 ----- Benchmark ----- (6 files) + 293 15 74 212 530.0 linux/core_portme.c (C) + 235 30 104 104 260.0 linux/core_portme.h (C) + 528 45 178 316 790.0 ----- Porting ----- (2 files) + +* For comparison, here are the stats for Dhrystone +Lines Blank Cmnts Source AESL +===== ===== ===== ===== ========== ======================================= + 311 15 242 54 135.0 dhry.h (C) + 789 132 119 553 1382.5 dhry_1.c (C) + 186 26 68 107 267.5 dhry_2.c (C) + 1286 173 429 714 1785.0 ----- C ----- (3 files) +~~~ + +# Credits +Many thanks to all of the individuals who helped with the development or testing of CoreMark including (Sorted by company name; note that company names may no longer be accurate as this was written in 2009). +* Alan Anderson, ADI +* Adhikary Rajiv, ADI +* Elena Stohr, ARM +* Ian Rickards, ARM +* Andrew Pickard, ARM +* Trent Parker, CAVIUM +* Shay Gal-On, EEMBC +* Markus Levy, EEMBC +* Peter Torelli, EEMBC +* Ron Olson, IBM +* Eyal Barzilay, MIPS +* Jens Eltze, NEC +* Hirohiko Ono, NEC +* Ulrich Drees, NEC +* Frank Roscheda, NEC +* Rob Cosaro, NXP +* Shumpei Kawasaki, RENESAS + +# Legal +Please refer to LICENSE.md in this reposity for a description of your rights to use this code. + +# Copyright +Copyright © 2009 EEMBC All rights reserved. +CoreMark is a trademark of EEMBC and EEMBC is a registered trademark of the Embedded Microprocessor Benchmark Consortium. + diff --git a/tests/riscv-coremark/coremark/barebones/core_portme.c b/tests/riscv-coremark/coremark/barebones/core_portme.c new file mode 100644 index 000000000..18967676b --- /dev/null +++ b/tests/riscv-coremark/coremark/barebones/core_portme.c @@ -0,0 +1,153 @@ +/* +Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +Original Author: Shay Gal-on +*/ +#include "coremark.h" +#include "core_portme.h" + +#if VALIDATION_RUN +volatile ee_s32 seed1_volatile = 0x3415; +volatile ee_s32 seed2_volatile = 0x3415; +volatile ee_s32 seed3_volatile = 0x66; +#endif +#if PERFORMANCE_RUN +volatile ee_s32 seed1_volatile = 0x0; +volatile ee_s32 seed2_volatile = 0x0; +volatile ee_s32 seed3_volatile = 0x66; +#endif +#if PROFILE_RUN +volatile ee_s32 seed1_volatile = 0x8; +volatile ee_s32 seed2_volatile = 0x8; +volatile ee_s32 seed3_volatile = 0x8; +#endif +volatile ee_s32 seed4_volatile = ITERATIONS; +volatile ee_s32 seed5_volatile = 0; +/* Porting : Timing functions + How to capture time and convert to seconds must be ported to whatever is + supported by the platform. e.g. Read value from on board RTC, read value from + cpu clock cycles performance counter etc. Sample implementation for standard + time.h and windows.h definitions included. +*/ +CORETIMETYPE +barebones_clock() +{ +#error \ + "You must implement a method to measure time in barebones_clock()! This function should return current time.\n" +} +/* Define : TIMER_RES_DIVIDER + Divider to trade off timer resolution and total time that can be + measured. + + Use lower values to increase resolution, but make sure that overflow + does not occur. If there are issues with the return value overflowing, + increase this value. + */ +#define GETMYTIME(_t) (*_t = barebones_clock()) +#define MYTIMEDIFF(fin, ini) ((fin) - (ini)) +#define TIMER_RES_DIVIDER 1 +#define SAMPLE_TIME_IMPLEMENTATION 1 +#define EE_TICKS_PER_SEC (CLOCKS_PER_SEC / TIMER_RES_DIVIDER) + +/** Define Host specific (POSIX), or target specific global time variables. */ +static CORETIMETYPE start_time_val, stop_time_val; + +/* Function : start_time + This function will be called right before starting the timed portion of + the benchmark. + + Implementation may be capturing a system timer (as implemented in the + example code) or zeroing some system parameters - e.g. setting the cpu clocks + cycles to 0. +*/ +void +start_time(void) +{ + GETMYTIME(&start_time_val); +} +/* Function : stop_time + This function will be called right after ending the timed portion of the + benchmark. + + Implementation may be capturing a system timer (as implemented in the + example code) or other system parameters - e.g. reading the current value of + cpu cycles counter. +*/ +void +stop_time(void) +{ + GETMYTIME(&stop_time_val); +} +/* Function : get_time + Return an abstract "ticks" number that signifies time on the system. + + Actual value returned may be cpu cycles, milliseconds or any other + value, as long as it can be converted to seconds by . This + methodology is taken to accomodate any hardware or simulated platform. The + sample implementation returns millisecs by default, and the resolution is + controlled by +*/ +CORE_TICKS +get_time(void) +{ + CORE_TICKS elapsed + = (CORE_TICKS)(MYTIMEDIFF(stop_time_val, start_time_val)); + return elapsed; +} +/* Function : time_in_secs + Convert the value returned by get_time to seconds. + + The type is used to accomodate systems with no support for + floating point. Default implementation implemented by the EE_TICKS_PER_SEC + macro above. +*/ +secs_ret +time_in_secs(CORE_TICKS ticks) +{ + secs_ret retval = ((secs_ret)ticks) / (secs_ret)EE_TICKS_PER_SEC; + return retval; +} + +ee_u32 default_num_contexts = 1; + +/* Function : portable_init + Target specific initialization code + Test for some common mistakes. +*/ +void +portable_init(core_portable *p, int *argc, char *argv[]) +{ +#error \ + "Call board initialization routines in portable init (if needed), in particular initialize UART!\n" + if (sizeof(ee_ptr_int) != sizeof(ee_u8 *)) + { + ee_printf( + "ERROR! Please define ee_ptr_int to a type that holds a " + "pointer!\n"); + } + if (sizeof(ee_u32) != 4) + { + ee_printf("ERROR! Please define ee_u32 to a 32b unsigned type!\n"); + } + p->portable_id = 1; +} +/* Function : portable_fini + Target specific final code +*/ +void +portable_fini(core_portable *p) +{ + p->portable_id = 0; +} diff --git a/tests/riscv-coremark/coremark/barebones/core_portme.h b/tests/riscv-coremark/coremark/barebones/core_portme.h new file mode 100644 index 000000000..55f643bf3 --- /dev/null +++ b/tests/riscv-coremark/coremark/barebones/core_portme.h @@ -0,0 +1,210 @@ +/* +Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +Original Author: Shay Gal-on +*/ +/* Topic : Description + This file contains configuration constants required to execute on + different platforms +*/ +#ifndef CORE_PORTME_H +#define CORE_PORTME_H +/************************/ +/* Data types and settings */ +/************************/ +/* Configuration : HAS_FLOAT + Define to 1 if the platform supports floating point. +*/ +#ifndef HAS_FLOAT +#define HAS_FLOAT 1 +#endif +/* Configuration : HAS_TIME_H + Define to 1 if platform has the time.h header file, + and implementation of functions thereof. +*/ +#ifndef HAS_TIME_H +#define HAS_TIME_H 1 +#endif +/* Configuration : USE_CLOCK + Define to 1 if platform has the time.h header file, + and implementation of functions thereof. +*/ +#ifndef USE_CLOCK +#define USE_CLOCK 1 +#endif +/* Configuration : HAS_STDIO + Define to 1 if the platform has stdio.h. +*/ +#ifndef HAS_STDIO +#define HAS_STDIO 0 +#endif +/* Configuration : HAS_PRINTF + Define to 1 if the platform has stdio.h and implements the printf + function. +*/ +#ifndef HAS_PRINTF +#define HAS_PRINTF 0 +#endif + +/* Definitions : COMPILER_VERSION, COMPILER_FLAGS, MEM_LOCATION + Initialize these strings per platform +*/ +#ifndef COMPILER_VERSION +#ifdef __GNUC__ +#define COMPILER_VERSION "GCC"__VERSION__ +#else +#define COMPILER_VERSION "Please put compiler version here (e.g. gcc 4.1)" +#endif +#endif +#ifndef COMPILER_FLAGS +#define COMPILER_FLAGS \ + FLAGS_STR /* "Please put compiler flags here (e.g. -o3)" */ +#endif +#ifndef MEM_LOCATION +#define MEM_LOCATION "STACK" +#endif + +/* Data Types : + To avoid compiler issues, define the data types that need ot be used for + 8b, 16b and 32b in . + + *Imprtant* : + ee_ptr_int needs to be the data type used to hold pointers, otherwise + coremark may fail!!! +*/ +typedef signed short ee_s16; +typedef unsigned short ee_u16; +typedef signed int ee_s32; +typedef double ee_f32; +typedef unsigned char ee_u8; +typedef unsigned int ee_u32; +typedef ee_u32 ee_ptr_int; +typedef size_t ee_size_t; +#define NULL ((void *)0) +/* align_mem : + This macro is used to align an offset to point to a 32b value. It is + used in the Matrix algorithm to initialize the input memory blocks. +*/ +#define align_mem(x) (void *)(4 + (((ee_ptr_int)(x)-1) & ~3)) + +/* Configuration : CORE_TICKS + Define type of return from the timing functions. + */ +#define CORETIMETYPE ee_u32 +typedef ee_u32 CORE_TICKS; + +/* Configuration : SEED_METHOD + Defines method to get seed values that cannot be computed at compile + time. + + Valid values : + SEED_ARG - from command line. + SEED_FUNC - from a system function. + SEED_VOLATILE - from volatile variables. +*/ +#ifndef SEED_METHOD +#define SEED_METHOD SEED_VOLATILE +#endif + +/* Configuration : MEM_METHOD + Defines method to get a block of memry. + + Valid values : + MEM_MALLOC - for platforms that implement malloc and have malloc.h. + MEM_STATIC - to use a static memory array. + MEM_STACK - to allocate the data block on the stack (NYI). +*/ +#ifndef MEM_METHOD +#define MEM_METHOD MEM_STACK +#endif + +/* Configuration : MULTITHREAD + Define for parallel execution + + Valid values : + 1 - only one context (default). + N>1 - will execute N copies in parallel. + + Note : + If this flag is defined to more then 1, an implementation for launching + parallel contexts must be defined. + + Two sample implementations are provided. Use or + to enable them. + + It is valid to have a different implementation of + and in , to fit a particular architecture. +*/ +#ifndef MULTITHREAD +#define MULTITHREAD 1 +#define USE_PTHREAD 0 +#define USE_FORK 0 +#define USE_SOCKET 0 +#endif + +/* Configuration : MAIN_HAS_NOARGC + Needed if platform does not support getting arguments to main. + + Valid values : + 0 - argc/argv to main is supported + 1 - argc/argv to main is not supported + + Note : + This flag only matters if MULTITHREAD has been defined to a value + greater then 1. +*/ +#ifndef MAIN_HAS_NOARGC +#define MAIN_HAS_NOARGC 0 +#endif + +/* Configuration : MAIN_HAS_NORETURN + Needed if platform does not support returning a value from main. + + Valid values : + 0 - main returns an int, and return value will be 0. + 1 - platform does not support returning a value from main +*/ +#ifndef MAIN_HAS_NORETURN +#define MAIN_HAS_NORETURN 0 +#endif + +/* Variable : default_num_contexts + Not used for this simple port, must cintain the value 1. +*/ +extern ee_u32 default_num_contexts; + +typedef struct CORE_PORTABLE_S +{ + ee_u8 portable_id; +} core_portable; + +/* target specific init/fini */ +void portable_init(core_portable *p, int *argc, char *argv[]); +void portable_fini(core_portable *p); + +#if !defined(PROFILE_RUN) && !defined(PERFORMANCE_RUN) \ + && !defined(VALIDATION_RUN) +#if (TOTAL_DATA_SIZE == 1200) +#define PROFILE_RUN 1 +#elif (TOTAL_DATA_SIZE == 2000) +#define PERFORMANCE_RUN 1 +#else +#define VALIDATION_RUN 1 +#endif +#endif + +int ee_printf(const char *fmt, ...); + +#endif /* CORE_PORTME_H */ diff --git a/tests/riscv-coremark/coremark/barebones/core_portme.mak b/tests/riscv-coremark/coremark/barebones/core_portme.mak new file mode 100755 index 000000000..81594697d --- /dev/null +++ b/tests/riscv-coremark/coremark/barebones/core_portme.mak @@ -0,0 +1,87 @@ +# Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Original Author: Shay Gal-on + +#File : core_portme.mak + +# Flag : OUTFLAG +# Use this flag to define how to to get an executable (e.g -o) +OUTFLAG= -o +# Flag : CC +# Use this flag to define compiler to use +CC = gcc +# Flag : LD +# Use this flag to define compiler to use +LD = gld +# Flag : AS +# Use this flag to define compiler to use +AS = gas +# Flag : CFLAGS +# Use this flag to define compiler options. Note, you can add compiler options from the command line using XCFLAGS="other flags" +PORT_CFLAGS = -O0 -g +FLAGS_STR = "$(PORT_CFLAGS) $(XCFLAGS) $(XLFLAGS) $(LFLAGS_END)" +CFLAGS = $(PORT_CFLAGS) -I$(PORT_DIR) -I. -DFLAGS_STR=\"$(FLAGS_STR)\" +#Flag : LFLAGS_END +# Define any libraries needed for linking or other flags that should come at the end of the link line (e.g. linker scripts). +# Note : On certain platforms, the default clock_gettime implementation is supported but requires linking of librt. +SEPARATE_COMPILE=1 +# Flag : SEPARATE_COMPILE +# You must also define below how to create an object file, and how to link. +OBJOUT = -o +LFLAGS = +ASFLAGS = +OFLAG = -o +COUT = -c + +LFLAGS_END = +# Flag : PORT_SRCS +# Port specific source files can be added here +# You may also need cvt.c if the fcvt functions are not provided as intrinsics by your compiler! +PORT_SRCS = $(PORT_DIR)/core_portme.c $(PORT_DIR)/ee_printf.c +vpath %.c $(PORT_DIR) +vpath %.s $(PORT_DIR) + +# Flag : LOAD +# For a simple port, we assume self hosted compile and run, no load needed. + +# Flag : RUN +# For a simple port, we assume self hosted compile and run, simple invocation of the executable + +LOAD = echo "Please set LOAD to the process of loading the executable to the flash" +RUN = echo "Please set LOAD to the process of running the executable (e.g. via jtag, or board reset)" + +OEXT = .o +EXE = .bin + +$(OPATH)$(PORT_DIR)/%$(OEXT) : %.c + $(CC) $(CFLAGS) $(XCFLAGS) $(COUT) $< $(OBJOUT) $@ + +$(OPATH)%$(OEXT) : %.c + $(CC) $(CFLAGS) $(XCFLAGS) $(COUT) $< $(OBJOUT) $@ + +$(OPATH)$(PORT_DIR)/%$(OEXT) : %.s + $(AS) $(ASFLAGS) $< $(OBJOUT) $@ + +# Target : port_pre% and port_post% +# For the purpose of this simple port, no pre or post steps needed. + +.PHONY : port_prebuild port_postbuild port_prerun port_postrun port_preload port_postload +port_pre% port_post% : + +# FLAG : OPATH +# Path to the output folder. Default - current folder. +OPATH = ./ +MKDIR = mkdir -p + diff --git a/tests/riscv-coremark/coremark/barebones/cvt.c b/tests/riscv-coremark/coremark/barebones/cvt.c new file mode 100644 index 000000000..333e8ead2 --- /dev/null +++ b/tests/riscv-coremark/coremark/barebones/cvt.c @@ -0,0 +1,127 @@ +/* +Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ +#include +#define CVTBUFSIZE 80 +static char CVTBUF[CVTBUFSIZE]; + +static char * +cvt(double arg, int ndigits, int *decpt, int *sign, char *buf, int eflag) +{ + int r2; + double fi, fj; + char * p, *p1; + + if (ndigits < 0) + ndigits = 0; + if (ndigits >= CVTBUFSIZE - 1) + ndigits = CVTBUFSIZE - 2; + r2 = 0; + *sign = 0; + p = &buf[0]; + if (arg < 0) + { + *sign = 1; + arg = -arg; + } + arg = modf(arg, &fi); + p1 = &buf[CVTBUFSIZE]; + + if (fi != 0) + { + p1 = &buf[CVTBUFSIZE]; + while (fi != 0) + { + fj = modf(fi / 10, &fi); + *--p1 = (int)((fj + .03) * 10) + '0'; + r2++; + } + while (p1 < &buf[CVTBUFSIZE]) + *p++ = *p1++; + } + else if (arg > 0) + { + while ((fj = arg * 10) < 1) + { + arg = fj; + r2--; + } + } + p1 = &buf[ndigits]; + if (eflag == 0) + p1 += r2; + *decpt = r2; + if (p1 < &buf[0]) + { + buf[0] = '\0'; + return buf; + } + while (p <= p1 && p < &buf[CVTBUFSIZE]) + { + arg *= 10; + arg = modf(arg, &fj); + *p++ = (int)fj + '0'; + } + if (p1 >= &buf[CVTBUFSIZE]) + { + buf[CVTBUFSIZE - 1] = '\0'; + return buf; + } + p = p1; + *p1 += 5; + while (*p1 > '9') + { + *p1 = '0'; + if (p1 > buf) + ++*--p1; + else + { + *p1 = '1'; + (*decpt)++; + if (eflag == 0) + { + if (p > buf) + *p = '0'; + p++; + } + } + } + *p = '\0'; + return buf; +} + +char * +ecvt(double arg, int ndigits, int *decpt, int *sign) +{ + return cvt(arg, ndigits, decpt, sign, CVTBUF, 1); +} + +char * +ecvtbuf(double arg, int ndigits, int *decpt, int *sign, char *buf) +{ + return cvt(arg, ndigits, decpt, sign, buf, 1); +} + +char * +fcvt(double arg, int ndigits, int *decpt, int *sign) +{ + return cvt(arg, ndigits, decpt, sign, CVTBUF, 0); +} + +char * +fcvtbuf(double arg, int ndigits, int *decpt, int *sign, char *buf) +{ + return cvt(arg, ndigits, decpt, sign, buf, 0); +} diff --git a/tests/riscv-coremark/coremark/barebones/ee_printf.c b/tests/riscv-coremark/coremark/barebones/ee_printf.c new file mode 100644 index 000000000..f2d362dc0 --- /dev/null +++ b/tests/riscv-coremark/coremark/barebones/ee_printf.c @@ -0,0 +1,700 @@ +/* +Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +#include +#include + +#define ZEROPAD (1 << 0) /* Pad with zero */ +#define SIGN (1 << 1) /* Unsigned/signed long */ +#define PLUS (1 << 2) /* Show plus */ +#define SPACE (1 << 3) /* Spacer */ +#define LEFT (1 << 4) /* Left justified */ +#define HEX_PREP (1 << 5) /* 0x */ +#define UPPERCASE (1 << 6) /* 'ABCDEF' */ + +#define is_digit(c) ((c) >= '0' && (c) <= '9') + +static char * 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) +{ + const char *sc; + for (sc = s; *sc != '\0' && count--; ++sc) + ; + return sc - s; +} + +static int +skip_atoi(const char **s) +{ + int i = 0; + while (is_digit(**s)) + i = i * 10 + *((*s)++) - '0'; + return i; +} + +static char * +number(char *str, long num, int base, int size, int precision, int type) +{ + char c, sign, tmp[66]; + char *dig = digits; + int i; + + if (type & UPPERCASE) + dig = upper_digits; + if (type & LEFT) + type &= ~ZEROPAD; + if (base < 2 || base > 36) + return 0; + + c = (type & ZEROPAD) ? '0' : ' '; + sign = 0; + if (type & SIGN) + { + if (num < 0) + { + sign = '-'; + num = -num; + size--; + } + else if (type & PLUS) + { + sign = '+'; + size--; + } + else if (type & SPACE) + { + sign = ' '; + size--; + } + } + + if (type & HEX_PREP) + { + if (base == 16) + size -= 2; + else if (base == 8) + size--; + } + + i = 0; + + if (num == 0) + tmp[i++] = '0'; + else + { + while (num != 0) + { + tmp[i++] = dig[((unsigned long)num) % (unsigned)base]; + num = ((unsigned long)num) / (unsigned)base; + } + } + + if (i > precision) + precision = i; + size -= precision; + if (!(type & (ZEROPAD | LEFT))) + while (size-- > 0) + *str++ = ' '; + if (sign) + *str++ = sign; + + if (type & HEX_PREP) + { + if (base == 8) + *str++ = '0'; + else if (base == 16) + { + *str++ = '0'; + *str++ = digits[33]; + } + } + + if (!(type & LEFT)) + while (size-- > 0) + *str++ = c; + while (i < precision--) + *str++ = '0'; + while (i-- > 0) + *str++ = tmp[i]; + while (size-- > 0) + *str++ = ' '; + + return str; +} + +static char * +eaddr(char *str, unsigned char *addr, int size, int precision, int type) +{ + char tmp[24]; + char *dig = digits; + int i, len; + + if (type & UPPERCASE) + dig = upper_digits; + len = 0; + for (i = 0; i < 6; i++) + { + if (i != 0) + tmp[len++] = ':'; + tmp[len++] = dig[addr[i] >> 4]; + tmp[len++] = dig[addr[i] & 0x0F]; + } + + if (!(type & LEFT)) + while (len < size--) + *str++ = ' '; + for (i = 0; i < len; ++i) + *str++ = tmp[i]; + while (len < size--) + *str++ = ' '; + + return str; +} + +static char * +iaddr(char *str, unsigned char *addr, int size, int precision, int type) +{ + char tmp[24]; + int i, n, len; + + len = 0; + for (i = 0; i < 4; i++) + { + if (i != 0) + tmp[len++] = '.'; + n = addr[i]; + + if (n == 0) + tmp[len++] = digits[0]; + else + { + if (n >= 100) + { + tmp[len++] = digits[n / 100]; + n = n % 100; + tmp[len++] = digits[n / 10]; + n = n % 10; + } + else if (n >= 10) + { + tmp[len++] = digits[n / 10]; + n = n % 10; + } + + tmp[len++] = digits[n]; + } + } + + if (!(type & LEFT)) + while (len < size--) + *str++ = ' '; + for (i = 0; i < len; ++i) + *str++ = tmp[i]; + while (len < size--) + *str++ = ' '; + + return str; +} + +#if HAS_FLOAT + +char * ecvtbuf(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); + +void +ee_bufcpy(char *pd, char *ps, int count) +{ + char *pe = ps + count; + while (ps != pe) + *pd++ = *ps++; +} + +static void +parse_float(double value, char *buffer, char fmt, int precision) +{ + int decpt, sign, exp, pos; + char *digits = NULL; + char cvtbuf[80]; + int capexp = 0; + int magnitude; + + if (fmt == 'G' || fmt == 'E') + { + capexp = 1; + fmt += 'a' - 'A'; + } + + if (fmt == 'g') + { + digits = ecvtbuf(value, precision, &decpt, &sign, cvtbuf); + magnitude = decpt - 1; + if (magnitude < -4 || magnitude > precision - 1) + { + fmt = 'e'; + precision -= 1; + } + else + { + fmt = 'f'; + precision -= decpt; + } + } + + if (fmt == 'e') + { + digits = ecvtbuf(value, precision + 1, &decpt, &sign, cvtbuf); + + if (sign) + *buffer++ = '-'; + *buffer++ = *digits; + if (precision > 0) + *buffer++ = '.'; + ee_bufcpy(buffer, digits + 1, precision); + buffer += precision; + *buffer++ = capexp ? 'E' : 'e'; + + if (decpt == 0) + { + if (value == 0.0) + exp = 0; + else + exp = -1; + } + else + exp = decpt - 1; + + if (exp < 0) + { + *buffer++ = '-'; + exp = -exp; + } + else + *buffer++ = '+'; + + buffer[2] = (exp % 10) + '0'; + exp = exp / 10; + buffer[1] = (exp % 10) + '0'; + exp = exp / 10; + buffer[0] = (exp % 10) + '0'; + buffer += 3; + } + else if (fmt == 'f') + { + digits = fcvtbuf(value, precision, &decpt, &sign, cvtbuf); + if (sign) + *buffer++ = '-'; + if (*digits) + { + if (decpt <= 0) + { + *buffer++ = '0'; + *buffer++ = '.'; + for (pos = 0; pos < -decpt; pos++) + *buffer++ = '0'; + while (*digits) + *buffer++ = *digits++; + } + else + { + pos = 0; + while (*digits) + { + if (pos++ == decpt) + *buffer++ = '.'; + *buffer++ = *digits++; + } + } + } + else + { + *buffer++ = '0'; + if (precision > 0) + { + *buffer++ = '.'; + for (pos = 0; pos < precision; pos++) + *buffer++ = '0'; + } + } + } + + *buffer = '\0'; +} + +static void +decimal_point(char *buffer) +{ + while (*buffer) + { + if (*buffer == '.') + return; + if (*buffer == 'e' || *buffer == 'E') + break; + buffer++; + } + + if (*buffer) + { + int n = strnlen(buffer, 256); + while (n > 0) + { + buffer[n + 1] = buffer[n]; + n--; + } + + *buffer = '.'; + } + else + { + *buffer++ = '.'; + *buffer = '\0'; + } +} + +static void +cropzeros(char *buffer) +{ + char *stop; + + while (*buffer && *buffer != '.') + buffer++; + if (*buffer++) + { + while (*buffer && *buffer != 'e' && *buffer != 'E') + buffer++; + stop = buffer--; + while (*buffer == '0') + buffer--; + if (*buffer == '.') + buffer--; + while (buffer != stop) + *++buffer = 0; + } +} + +static char * +flt(char *str, double num, int size, int precision, char fmt, int flags) +{ + char tmp[80]; + char c, sign; + int n, i; + + // Left align means no zero padding + if (flags & LEFT) + flags &= ~ZEROPAD; + + // Determine padding and sign char + c = (flags & ZEROPAD) ? '0' : ' '; + sign = 0; + if (flags & SIGN) + { + if (num < 0.0) + { + sign = '-'; + num = -num; + size--; + } + else if (flags & PLUS) + { + sign = '+'; + size--; + } + else if (flags & SPACE) + { + sign = ' '; + size--; + } + } + + // Compute the precision value + if (precision < 0) + precision = 6; // Default precision: 6 + + // Convert floating point number to text + parse_float(num, tmp, fmt, precision); + + if ((flags & HEX_PREP) && precision == 0) + decimal_point(tmp); + if (fmt == 'g' && !(flags & HEX_PREP)) + cropzeros(tmp); + + n = strnlen(tmp, 256); + + // Output number with alignment and padding + size -= n; + if (!(flags & (ZEROPAD | LEFT))) + while (size-- > 0) + *str++ = ' '; + if (sign) + *str++ = sign; + if (!(flags & LEFT)) + while (size-- > 0) + *str++ = c; + for (i = 0; i < n; i++) + *str++ = tmp[i]; + while (size-- > 0) + *str++ = ' '; + + return str; +} + +#endif + +static int +ee_vsprintf(char *buf, const char *fmt, va_list args) +{ + int len; + unsigned long num; + int i, base; + char * str; + char * s; + + int flags; // Flags to number() + + int field_width; // Width of output field + int precision; // Min. # of digits for integers; max number of chars for + // from string + int qualifier; // 'h', 'l', or 'L' for integer fields + + for (str = buf; *fmt; fmt++) + { + if (*fmt != '%') + { + *str++ = *fmt; + continue; + } + + // Process flags + flags = 0; + repeat: + fmt++; // This also skips first '%' + switch (*fmt) + { + case '-': + flags |= LEFT; + goto repeat; + case '+': + flags |= PLUS; + goto repeat; + case ' ': + flags |= SPACE; + goto repeat; + case '#': + flags |= HEX_PREP; + goto repeat; + case '0': + flags |= ZEROPAD; + goto repeat; + } + + // Get field width + field_width = -1; + if (is_digit(*fmt)) + field_width = skip_atoi(&fmt); + else if (*fmt == '*') + { + fmt++; + field_width = va_arg(args, int); + if (field_width < 0) + { + field_width = -field_width; + flags |= LEFT; + } + } + + // Get the precision + precision = -1; + if (*fmt == '.') + { + ++fmt; + if (is_digit(*fmt)) + precision = skip_atoi(&fmt); + else if (*fmt == '*') + { + ++fmt; + precision = va_arg(args, int); + } + if (precision < 0) + precision = 0; + } + + // Get the conversion qualifier + qualifier = -1; + if (*fmt == 'l' || *fmt == 'L') + { + qualifier = *fmt; + fmt++; + } + + // Default base + base = 10; + + switch (*fmt) + { + case 'c': + if (!(flags & LEFT)) + while (--field_width > 0) + *str++ = ' '; + *str++ = (unsigned char)va_arg(args, int); + while (--field_width > 0) + *str++ = ' '; + continue; + + case 's': + s = va_arg(args, char *); + if (!s) + s = ""; + len = strnlen(s, precision); + if (!(flags & LEFT)) + while (len < field_width--) + *str++ = ' '; + for (i = 0; i < len; ++i) + *str++ = *s++; + while (len < field_width--) + *str++ = ' '; + continue; + + case 'p': + if (field_width == -1) + { + field_width = 2 * sizeof(void *); + flags |= ZEROPAD; + } + str = number(str, + (unsigned long)va_arg(args, void *), + 16, + field_width, + precision, + flags); + continue; + + case 'A': + flags |= UPPERCASE; + + case 'a': + if (qualifier == 'l') + str = eaddr(str, + va_arg(args, unsigned char *), + field_width, + precision, + flags); + else + str = iaddr(str, + va_arg(args, unsigned char *), + field_width, + precision, + flags); + continue; + + // Integer number formats - set up the flags and "break" + case 'o': + base = 8; + break; + + case 'X': + flags |= UPPERCASE; + + case 'x': + base = 16; + break; + + case 'd': + case 'i': + flags |= SIGN; + + case 'u': + break; + +#if HAS_FLOAT + + case 'f': + str = flt(str, + va_arg(args, double), + field_width, + precision, + *fmt, + flags | SIGN); + continue; + +#endif + + default: + if (*fmt != '%') + *str++ = '%'; + if (*fmt) + *str++ = *fmt; + else + --fmt; + continue; + } + + if (qualifier == 'l') + num = va_arg(args, unsigned long); + else if (flags & SIGN) + num = va_arg(args, int); + else + num = va_arg(args, unsigned int); + + str = number(str, num, base, field_width, precision, flags); + } + + *str = '\0'; + return str - buf; +} + +void +uart_send_char(char c) +{ +#error "You must implement the method uart_send_char to use this file!\n"; + /* Output of a char to a UART usually follows the following model: + Wait until UART is ready + Write char to UART + Wait until UART is done + + Or in code: + while (*UART_CONTROL_ADDRESS != UART_READY); + *UART_DATA_ADDRESS = c; + while (*UART_CONTROL_ADDRESS != UART_READY); + + Check the UART sample code on your platform or the board + documentation. + */ +} + +int +ee_printf(const char *fmt, ...) +{ + char buf[1024], *p; + va_list args; + int n = 0; + + va_start(args, fmt); + ee_vsprintf(buf, fmt, args); + va_end(args); + p = buf; + while (*p) + { + uart_send_char(*p); + n++; + p++; + } + + return n; +} diff --git a/tests/riscv-coremark/coremark/core_list_join.c b/tests/riscv-coremark/coremark/core_list_join.c new file mode 100644 index 000000000..4bffeeccf --- /dev/null +++ b/tests/riscv-coremark/coremark/core_list_join.c @@ -0,0 +1,580 @@ +/* +Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +Original Author: Shay Gal-on +*/ + +#include "coremark.h" +//#include +//#include +/* +Topic: Description + Benchmark using a linked list. + + Linked list is a common data structure used in many applications. + + For our purposes, this will excercise the memory units of the processor. + In particular, usage of the list pointers to find and alter data. + + We are not using Malloc since some platforms do not support this library. + + Instead, the memory block being passed in is used to create a list, + and the benchmark takes care not to add more items then can be + accomodated by the memory block. The porting layer will make sure + that we have a valid memory block. + + All operations are done in place, without using any extra memory. + + The list itself contains list pointers and pointers to data items. + Data items contain the following: + + idx - An index that captures the initial order of the list. + data - Variable data initialized based on the input parameters. The 16b are divided as follows: + o Upper 8b are backup of original data. + o Bit 7 indicates if the lower 7 bits are to be used as is or calculated. + o Bits 0-2 indicate type of operation to perform to get a 7b value. + o Bits 3-6 provide input for the operation. + +*/ + +/* local functions */ + +list_head *core_list_find(list_head *list,list_data *info); +list_head *core_list_reverse(list_head *list); +list_head *core_list_remove(list_head *item); +list_head *core_list_undo_remove(list_head *item_removed, list_head *item_modified); +list_head *core_list_insert_new(list_head *insert_point + , list_data *info, list_head **memblock, list_data **datablock + , list_head *memblock_end, list_data *datablock_end); +typedef ee_s32(*list_cmp)(list_data *a, list_data *b, core_results *res); +list_head *core_list_mergesort(list_head *list, list_cmp cmp, core_results *res); + +ee_s16 calc_func(ee_s16 *pdata, core_results *res) { + ee_s16 data=*pdata; + ee_s16 retval; + ee_u8 optype=(data>>7) & 1; /* bit 7 indicates if the function result has been cached */ + if (optype) /* if cached, use cache */ + return (data & 0x007f); + else { /* otherwise calculate and cache the result */ + ee_s16 flag=data & 0x7; /* bits 0-2 is type of function to perform */ + ee_s16 dtype=((data>>3) & 0xf); /* bits 3-6 is specific data for the operation */ + dtype |= dtype << 4; /* replicate the lower 4 bits to get an 8b value */ + switch (flag) { + case 0: + if (dtype<0x22) /* set min period for bit corruption */ + dtype=0x22; + retval=core_bench_state(res->size,res->memblock[3],res->seed1,res->seed2,dtype,res->crc); + if (res->crcstate==0) + res->crcstate=retval; + break; + case 1: + retval=core_bench_matrix(&(res->mat),dtype,res->crc); + if (res->crcmatrix==0) + res->crcmatrix=retval; + break; + default: + retval=data; + break; + } + res->crc=crcu16(retval,res->crc); + retval &= 0x007f; + *pdata = (data & 0xff00) | 0x0080 | retval; /* cache the result */ + return retval; + } +} +/* Function: cmp_complex + Compare the data item in a list cell. + + Can be used by mergesort. +*/ +ee_s32 cmp_complex(list_data *a, list_data *b, core_results *res) { + ee_s16 val1=calc_func(&(a->data16),res); + ee_s16 val2=calc_func(&(b->data16),res); + return val1 - val2; +} + +/* Function: cmp_idx + Compare the idx item in a list cell, and regen the data. + + Can be used by mergesort. +*/ +ee_s32 cmp_idx(list_data *a, list_data *b, core_results *res) { + if (res==NULL) { + a->data16 = (a->data16 & 0xff00) | (0x00ff & (a->data16>>8)); + b->data16 = (b->data16 & 0xff00) | (0x00ff & (b->data16>>8)); + } + return a->idx - b->idx; +} + +/*void ehitoa(int value, char *str, int base){ + if (value>100000) strcpy(str,"too big"); + else{ + int places[6] = {100000, 10000, 1000, 100, 10, 1}; + int col; + int pv; + for(col = 0; col<6; col++){ + pv = 0; + while (value >= places[col]){ + value=value -places[col]; + pv++; + + } + str[col]=pv+'0'; + } + str[6]=0; + } +}*/ + +void copy_info(list_data *to,list_data *from) { + to->data16=from->data16; + to->idx=from->idx; +} + +/* Benchmark for linked list: + - Try to find multiple data items. + - List sort + - Operate on data from list (crc) + - Single remove/reinsert + * At the end of this function, the list is back to original state +*/ +ee_u16 core_bench_list(core_results *res, ee_s16 finder_idx) { + ee_u16 retval=0; + ee_u16 found=0,missed=0; + list_head *list=res->list; + ee_s16 find_num=res->seed3; + list_head *this_find; + list_head *finder, *remover; + list_data info; + ee_s16 i; + //ee_printf("entered corebenchlist \n"); + info.idx=finder_idx; + /* find values in the list, and change the list each time (reverse and cache if value found) */ + for (i=0; inext->info->data16 >> 8) & 1; + //ee_printf("if statement \n"); + } + else { + found++; + //ee_printf("else statement \n"); + if (this_find->info->data16 & 0x1) /* use found value */ + retval+=(this_find->info->data16 >> 9) & 1; + /* and cache next item at the head of the list (if any) */ + if (this_find->next != NULL) { + finder = this_find->next; + this_find->next = finder->next; + finder->next=list->next; + list->next=finder; + } + } + if (info.idx>=0) + info.idx++; +#if CORE_DEBUG + //ee_printf("List find %d: [%d,%d,%d]\n",i,retval,missed,found); +#endif + } + retval+=found*4-missed; + /* sort the list by data content and remove one item*/ + if (finder_idx>0) + list=core_list_mergesort(list,cmp_complex,res); + remover=core_list_remove(list->next); + /* CRC data content of list from location of index N forward, and then undo remove */ + finder=core_list_find(list,&info); + if (!finder) + finder=list->next; + while (finder) { + retval=crc16(list->info->data16,retval); + finder=finder->next; + } +#if CORE_DEBUG + //ee_printf("List sort 1: %04x\n",retval); +#endif + remover=core_list_undo_remove(remover,list->next); + /* sort the list by index, in effect returning the list to original state */ + list=core_list_mergesort(list,cmp_idx,NULL); + /* CRC data content of list */ + finder=list->next; + while (finder) { + retval=crc16(list->info->data16,retval); + finder=finder->next; + } +#if CORE_DEBUG + //ee_printf("List sort 2: %04x\n",retval); +#endif + return retval; +} +/* Function: core_list_init + Initialize list with data. + + Parameters: + blksize - Size of memory to be initialized. + memblock - Pointer to memory block. + seed - Actual values chosen depend on the seed parameter. + The seed parameter MUST be supplied from a source that cannot be determined at compile time + + Returns: + Pointer to the head of the list. + +*/ +list_head *core_list_init(ee_u32 blksize, list_head *memblock, ee_s16 seed) { + /* calculated pointers for the list */ + //ee_printf("%d \n blksize", blksize); + ee_u32 per_item=16+sizeof(struct list_data_s); + //ee_printf("%d \n sizeof", sizeof(struct list_data_s)); + //ee_printf("%d \n per_item", per_item); + ee_u32 size=(blksize/per_item)-2; + //char bufftwo[200]; + //ehitoa(size, bufftwo, 10); + //ee_printf(" size = %s done \n", bufftwo); + //ee_printf("%d", size);/* to accomodate systems with 64b pointers, and make sure same code is executed, set max list elements */ + list_head *memblock_end=memblock+size; + + list_data *datablock=(list_data *)(memblock_end); + list_data *datablock_end=datablock+size; + //ee_printf("datablock_end"); + /* some useful variables */ + ee_u32 i; + list_head *finder,*list=memblock; + list_data info; + //ehitoa(size, bufftwo, 10); + //ee_printf(" size2 = %s done \n", bufftwo); + + /* create a fake items for the list head and tail */ + list->next=NULL; + list->info=datablock; + list->info->idx=0x0000; + list->info->data16=(ee_s16)0x8080; + memblock++; + datablock++; + info.idx=0x7fff; + info.data16=(ee_s16)0xffff; + //ehitoa(size, bufftwo, 10); + //ee_printf(" size3 = %s done \n", bufftwo); + core_list_insert_new(list,&info,&memblock,&datablock,memblock_end,datablock_end); + //ehitoa(size, bufftwo, 10); + //ee_printf(" size4 = %s done \n", bufftwo);; + /* then insert size items */ + for (i=0; inext; + i=1; + //ehitoa(i, bufftwo, 10); + //ee_printf(" i = %s done \n", bufftwo); + while (finder->next!=NULL) { + //ee_printf("enter while statement \n"); + if (iinfo->idx=i++; + //ehitoa(i, bufftwo, 10); + //ee_printf(" if i = %s done \n", bufftwo); + } + + else { + ee_u16 pat=(ee_u16)(i++ ^ seed); /* get a pseudo random number */ + finder->info->idx=0x3fff & (((i & 0x07) << 8) | pat); /* make sure the mixed items end up after the ones in sequence */ + //ehitoa(i, bufftwo, 10); + //ee_printf(" else i = %s done \n", bufftwo); + } + finder=finder->next; + } + //ehitoa(i, bufftwo, 10); + //ee_printf(" i2 = %s done \n", bufftwo); + list = core_list_mergesort(list,cmp_idx,NULL); +#if CORE_DEBUG + //ee_printf("Initialized list:\n"); + finder=list; + while (finder) { + //ee_printf("[%04x,%04x]",finder->info->idx,(ee_u16)finder->info->data16); + finder=finder->next; + } + //ee_printf("\n"); +#endif + return list; +} + +/* Function: core_list_insert + Insert an item to the list + + Parameters: + insert_point - where to insert the item. + info - data for the cell. + memblock - pointer for the list header + datablock - pointer for the list data + memblock_end - end of region for list headers + datablock_end - end of region for list data + + Returns: + Pointer to new item. +*/ +list_head *core_list_insert_new(list_head *insert_point, list_data *info, list_head **memblock, list_data **datablock + , list_head *memblock_end, list_data *datablock_end) { + list_head *newitem; + + if ((*memblock+1) >= memblock_end) + return NULL; + if ((*datablock+1) >= datablock_end) + return NULL; + + newitem=*memblock; + (*memblock)++; + newitem->next=insert_point->next; + insert_point->next=newitem; + + newitem->info=*datablock; + (*datablock)++; + copy_info(newitem->info,info); + + return newitem; +} + +/* Function: core_list_remove + Remove an item from the list. + + Operation: + For a singly linked list, remove by copying the data from the next item + over to the current cell, and unlinking the next item. + + Note: + since there is always a fake item at the end of the list, no need to check for NULL. + + Returns: + Removed item. +*/ +list_head *core_list_remove(list_head *item) { + list_data *tmp; + list_head *ret=item->next; + /* swap data pointers */ + tmp=item->info; + item->info=ret->info; + ret->info=tmp; + /* and eliminate item */ + item->next=item->next->next; + ret->next=NULL; + return ret; +} + +/* Function: core_list_undo_remove + Undo a remove operation. + + Operation: + Since we want each iteration of the benchmark to be exactly the same, + we need to be able to undo a remove. + Link the removed item back into the list, and switch the info items. + + Parameters: + item_removed - Return value from the + item_modified - List item that was modified during + + Returns: + The item that was linked back to the list. + +*/ +list_head *core_list_undo_remove(list_head *item_removed, list_head *item_modified) { + list_data *tmp; + /* swap data pointers */ + tmp=item_removed->info; + item_removed->info=item_modified->info; + item_modified->info=tmp; + /* and insert item */ + item_removed->next=item_modified->next; + item_modified->next=item_removed; + return item_removed; +} + +/* Function: core_list_find + Find an item in the list + + Operation: + Find an item by idx (if not 0) or specific data value + + Parameters: + list - list head + info - idx or data to find + + Returns: + Found item, or NULL if not found. +*/ +list_head *core_list_find(list_head *list,list_data *info) { + //ee_printf("entered core_list_find \n"); + if (info->idx>=0) { + //ee_printf("find if \n"); + while (list && (list->info->idx != info->idx)){ + list=list->next; + //ee_printf("find while if \n"); + } + //ee_printf("core_list_find end \n"); + return list; + } else { + //ee_printf("find else"); + while (list && ((list->info->data16 & 0xff) != info->data16)){ + list=list->next; + //ee_printf("find while else \n"); + } + //ee_printf("core list find end \n"); + return list; + } +} +/* Function: core_list_reverse + Reverse a list + + Operation: + Rearrange the pointers so the list is reversed. + + Parameters: + list - list head + info - idx or data to find + + Returns: + Found item, or NULL if not found. +*/ + +list_head *core_list_reverse(list_head *list) { +// ee_printf("entered core_list_reverse"); + list_head *next=NULL, *tmp; + while (list) { + tmp=list->next; + list->next=next; + next=list; + list=tmp; + } + //ee_printf("core_list_reverse done"); + return next; +} +/* Function: core_list_mergesort + Sort the list in place without recursion. + + Description: + Use mergesort, as for linked list this is a realistic solution. + Also, since this is aimed at embedded, care was taken to use iterative rather then recursive algorithm. + The sort can either return the list to original order (by idx) , + or use the data item to invoke other other algorithms and change the order of the list. + + Parameters: + list - list to be sorted. + cmp - cmp function to use + + Returns: + New head of the list. + + Note: + We have a special header for the list that will always be first, + but the algorithm could theoretically modify where the list starts. + + */ +list_head *core_list_mergesort(list_head *list, list_cmp cmp, core_results *res) { + list_head *p, *q, *e, *tail; + ee_s32 insize, nmerges, psize, qsize, i; + + insize = 1; + //char bufftwo[200]; + while (1) { + p = list; + list = NULL; + tail = NULL; + + nmerges = 0; /* count number of merges we do in this pass */ + //ehitoa(nmerges, bufftwo, 10); + //ee_printf(" nmerges default value = %s done \n", bufftwo); + while (p) { + nmerges++; /* there exists a merge to be done */ + //ehitoa(nmerges, bufftwo, 10); + //ee_printf(" current nmerges = %s done \n", bufftwo); + /* step `insize' places along from p */ + q = p; + psize = 0; + //ehitoa(insize, bufftwo, 10); + //ee_printf(" insize = %s done \n", bufftwo); + for (i = 0; i < insize; i++) { + //ehitoa(i, bufftwo, 10); + //ee_printf(" i = %s done \n", bufftwo); + psize++; + q = q->next; + if (!q) break; + } + + /* if q hasn't fallen off end, we have two lists to merge */ + qsize = insize; + //ehitoa(qsize, bufftwo, 10); + //ee_printf(" qsize = %s done \n", bufftwo); + + /* now we have two lists; merge them */ + while (psize > 0 || (qsize > 0 && q)) { + + /* decide whether next element of merge comes from p or q */ + if (psize == 0) { + //ee_printf("if \n"); + /* p is empty; e must come from q. */ + e = q; q = q->next; qsize--; + } else if (qsize == 0 || !q) { + //ee_printf("else if \n"); + /* q is empty; e must come from p. */ + e = p; p = p->next; psize--; + } else if (cmp(p->info,q->info,res) <= 0) { + //ee_printf("else if 2 \n"); + /* First element of p is lower (or same); e must come from p. */ + e = p; p = p->next; psize--; + } else { + //ee_printf("else \n"); + /* First element of q is lower; e must come from q. */ + e = q; q = q->next; qsize--; + } + + /* add the next element to the merged list */ + if (tail) { + //ee_printf("tail if \n"); + tail->next = e; + } else { + //ee_printf("tail else \n"); + list = e; + } + tail = e; + } + + /* now p has stepped `insize' places along, and q has too */ + p = q; + } + + tail->next = NULL; + + /* If we have done only one merge, we're finished. */ + if (nmerges <= 1) /* allow for nmerges==0, the empty list case */ + return list; + + /* Otherwise repeat, merging lists twice the size */ + insize *= 2; + //ehitoa(insize, bufftwo, 10); + //ee_printf(" insize2 = %s done \n", bufftwo); + } +#if COMPILER_REQUIRES_SORT_RETURN + return list; +#endif +} diff --git a/tests/riscv-coremark/coremark/core_main.c b/tests/riscv-coremark/coremark/core_main.c new file mode 100644 index 000000000..b1ec758bf --- /dev/null +++ b/tests/riscv-coremark/coremark/core_main.c @@ -0,0 +1,447 @@ +/* +Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +Original Author: Shay Gal-on +*/ + +/* File: core_main.c + This file contains the framework to acquire a block of memory, seed + initial parameters, tun t he benchmark and report the results. +*/ +#include "coremark.h" + +/* Function: iterate + Run the benchmark for a specified number of iterations. + + Operation: + For each type of benchmarked algorithm: + a - Initialize the data block for the algorithm. + b - Execute the algorithm N times. + + Returns: + NULL. +*/ +static ee_u16 list_known_crc[] = { (ee_u16)0xd4b0, + (ee_u16)0x3340, + (ee_u16)0x6a79, + (ee_u16)0xe714, + (ee_u16)0xe3c1 }; +static ee_u16 matrix_known_crc[] = { (ee_u16)0xbe52, + (ee_u16)0x1199, + (ee_u16)0x5608, + (ee_u16)0x1fd7, + (ee_u16)0x0747 }; +static ee_u16 state_known_crc[] = { (ee_u16)0x5e47, + (ee_u16)0x39bf, + (ee_u16)0xe5a4, + (ee_u16)0x8e3a, + (ee_u16)0x8d84 }; +void * +iterate(void *pres) +{ + ee_u32 i; + ee_u16 crc; + core_results *res = (core_results *)pres; + ee_u32 iterations = res->iterations; + res->crc = 0; + res->crclist = 0; + res->crcmatrix = 0; + res->crcstate = 0; + + for (i = 0; i < iterations; i++) + { + crc = core_bench_list(res, 1); + res->crc = crcu16(crc, res->crc); + crc = core_bench_list(res, -1); + res->crc = crcu16(crc, res->crc); + if (i == 0) + res->crclist = res->crc; + } + return NULL; +} + +#if (SEED_METHOD == SEED_ARG) +ee_s32 get_seed_args(int i, int argc, char *argv[]); +#define get_seed(x) (ee_s16) get_seed_args(x, argc, argv) +#define get_seed_32(x) get_seed_args(x, argc, argv) +#else /* via function or volatile */ +ee_s32 get_seed_32(int i); +#define get_seed(x) (ee_s16) get_seed_32(x) +#endif + +#if (MEM_METHOD == MEM_STATIC) +ee_u8 static_memblk[TOTAL_DATA_SIZE]; +#endif +char *mem_name[3] = { "Static", "Heap", "Stack" }; +/* Function: main + Main entry routine for the benchmark. + This function is responsible for the following steps: + + 1 - Initialize input seeds from a source that cannot be determined at + compile time. 2 - Initialize memory block for use. 3 - Run and time the + benchmark. 4 - Report results, testing the validity of the output if the + seeds are known. + + Arguments: + 1 - first seed : Any value + 2 - second seed : Must be identical to first for iterations to be + identical 3 - third seed : Any value, should be at least an order of + magnitude less then the input size, but bigger then 32. 4 - Iterations : + Special, if set to 0, iterations will be automatically determined such that + the benchmark will run between 10 to 100 secs + +*/ + +#if MAIN_HAS_NOARGC +MAIN_RETURN_TYPE +main(void) +{ + int argc = 0; + char *argv[1]; +#else +MAIN_RETURN_TYPE +main(int argc, char *argv[]) +{ +#endif + ee_printf("SHOWTIME\n"); + ee_u16 i, j = 0, num_algorithms = 0; + ee_s16 known_id = -1, total_errors = 0; + ee_u16 seedcrc = 0; + CORE_TICKS total_time; + core_results results[MULTITHREAD]; +#if (MEM_METHOD == MEM_STACK) + ee_u8 stack_memblock[TOTAL_DATA_SIZE * MULTITHREAD]; +#endif + /* first call any initializations needed */ + portable_init(&(results[0].port), &argc, argv); + /* First some checks to make sure benchmark will run ok */ + if (sizeof(struct list_head_s) > 128) + { + ee_printf("list_head structure too big for comparable data!\n"); + return MAIN_RETURN_VAL; + } + results[0].seed1 = get_seed(1); + results[0].seed2 = get_seed(2); + results[0].seed3 = get_seed(3); + results[0].iterations = get_seed_32(4); +#if CORE_DEBUG + results[0].iterations = 1; +#endif + results[0].execs = get_seed_32(5); + if (results[0].execs == 0) + { /* if not supplied, execute all algorithms */ + results[0].execs = ALL_ALGORITHMS_MASK; + } + /* put in some default values based on one seed only for easy testing */ + if ((results[0].seed1 == 0) && (results[0].seed2 == 0) + && (results[0].seed3 == 0)) + { /* perfromance run */ + results[0].seed1 = 0; + results[0].seed2 = 0; + results[0].seed3 = 0x66; + } + if ((results[0].seed1 == 1) && (results[0].seed2 == 0) + && (results[0].seed3 == 0)) + { /* validation run */ + results[0].seed1 = 0x3415; + results[0].seed2 = 0x3415; + results[0].seed3 = 0x66; + } +#if (MEM_METHOD == MEM_STATIC) + results[0].memblock[0] = (void *)static_memblk; + results[0].size = TOTAL_DATA_SIZE; + results[0].err = 0; +#if (MULTITHREAD > 1) +#error "Cannot use a static data area with multiple contexts!" +#endif +#elif (MEM_METHOD == MEM_MALLOC) + for (i = 0; i < MULTITHREAD; i++) + { + ee_s32 malloc_override = get_seed(7); + if (malloc_override != 0) + results[i].size = malloc_override; + else + results[i].size = TOTAL_DATA_SIZE; + results[i].memblock[0] = portable_malloc(results[i].size); + results[i].seed1 = results[0].seed1; + results[i].seed2 = results[0].seed2; + results[i].seed3 = results[0].seed3; + results[i].err = 0; + results[i].execs = results[0].execs; + } +#elif (MEM_METHOD == MEM_STACK) +for (i = 0; i < MULTITHREAD; i++) +{ + results[i].memblock[0] = stack_memblock + i * TOTAL_DATA_SIZE; + results[i].size = TOTAL_DATA_SIZE; + results[i].seed1 = results[0].seed1; + results[i].seed2 = results[0].seed2; + results[i].seed3 = results[0].seed3; + results[i].err = 0; + results[i].execs = results[0].execs; +} +#else +#error "Please define a way to initialize a memory block." +#endif + /* Data init */ + /* Find out how space much we have based on number of algorithms */ + for (i = 0; i < NUM_ALGORITHMS; i++) + { + if ((1 << (ee_u32)i) & results[0].execs) + num_algorithms++; + } + for (i = 0; i < MULTITHREAD; i++) + results[i].size = results[i].size / num_algorithms; + /* Assign pointers */ + for (i = 0; i < NUM_ALGORITHMS; i++) + { + ee_u32 ctx; + if ((1 << (ee_u32)i) & results[0].execs) + { + for (ctx = 0; ctx < MULTITHREAD; ctx++) + results[ctx].memblock[i + 1] + = (char *)(results[ctx].memblock[0]) + results[0].size * j; + j++; + } + } + /* call inits */ + for (i = 0; i < MULTITHREAD; i++) + { + if (results[i].execs & ID_LIST) + { + results[i].list = core_list_init( + results[0].size, results[i].memblock[1], results[i].seed1); + } + if (results[i].execs & ID_MATRIX) + { + core_init_matrix(results[0].size, + results[i].memblock[2], + (ee_s32)results[i].seed1 + | (((ee_s32)results[i].seed2) << 16), + &(results[i].mat)); + } + if (results[i].execs & ID_STATE) + { + core_init_state( + results[0].size, results[i].seed1, results[i].memblock[3]); + } + } + + /* automatically determine number of iterations if not set */ + if (results[0].iterations == 0) + { + secs_ret secs_passed = 0; + ee_u32 divisor; + results[0].iterations = 1; + while (secs_passed < (secs_ret)1) + { + results[0].iterations *= 10; + start_time(); + iterate(&results[0]); + stop_time(); + secs_passed = time_in_secs(get_time()); + } + /* now we know it executes for at least 1 sec, set actual run time at + * about 10 secs */ + divisor = (ee_u32)secs_passed; + if (divisor == 0) /* some machines cast float to int as 0 since this + conversion is not defined by ANSI, but we know at + least one second passed */ + divisor = 1; + results[0].iterations *= 1 + 10 / divisor; + } + /* perform actual benchmark */ + start_time(); +#if (MULTITHREAD > 1) + if (default_num_contexts > MULTITHREAD) + { + default_num_contexts = MULTITHREAD; + } + for (i = 0; i < default_num_contexts; i++) + { + results[i].iterations = results[0].iterations; + results[i].execs = results[0].execs; + core_start_parallel(&results[i]); + } + for (i = 0; i < default_num_contexts; i++) + { + core_stop_parallel(&results[i]); + } +#else + iterate(&results[0]); +#endif + stop_time(); + total_time = get_time(); + /* get a function of the input to report */ + seedcrc = crc16(results[0].seed1, seedcrc); + seedcrc = crc16(results[0].seed2, seedcrc); + seedcrc = crc16(results[0].seed3, seedcrc); + seedcrc = crc16(results[0].size, seedcrc); + + switch (seedcrc) + { /* test known output for common seeds */ + case 0x8a02: /* seed1=0, seed2=0, seed3=0x66, size 2000 per algorithm */ + known_id = 0; + ee_printf("6k performance run parameters for coremark.\n"); + break; + case 0x7b05: /* seed1=0x3415, seed2=0x3415, seed3=0x66, size 2000 per + algorithm */ + known_id = 1; + ee_printf("6k validation run parameters for coremark.\n"); + break; + case 0x4eaf: /* seed1=0x8, seed2=0x8, seed3=0x8, size 400 per algorithm + */ + known_id = 2; + ee_printf("Profile generation run parameters for coremark.\n"); + break; + case 0xe9f5: /* seed1=0, seed2=0, seed3=0x66, size 666 per algorithm */ + known_id = 3; + ee_printf("2K performance run parameters for coremark.\n"); + break; + case 0x18f2: /* seed1=0x3415, seed2=0x3415, seed3=0x66, size 666 per + algorithm */ + known_id = 4; + ee_printf("2K validation run parameters for coremark.\n"); + break; + default: + total_errors = -1; + break; + } + if (known_id >= 0) + { + for (i = 0; i < default_num_contexts; i++) + { + results[i].err = 0; + if ((results[i].execs & ID_LIST) + && (results[i].crclist != list_known_crc[known_id])) + { + ee_printf("[%u]ERROR! list crc 0x%04x - should be 0x%04x\n", + i, + results[i].crclist, + list_known_crc[known_id]); + results[i].err++; + } + if ((results[i].execs & ID_MATRIX) + && (results[i].crcmatrix != matrix_known_crc[known_id])) + { + ee_printf("[%u]ERROR! matrix crc 0x%04x - should be 0x%04x\n", + i, + results[i].crcmatrix, + matrix_known_crc[known_id]); + results[i].err++; + } + if ((results[i].execs & ID_STATE) + && (results[i].crcstate != state_known_crc[known_id])) + { + ee_printf("[%u]ERROR! state crc 0x%04x - should be 0x%04x\n", + i, + results[i].crcstate, + state_known_crc[known_id]); + results[i].err++; + } + total_errors += results[i].err; + } + } + total_errors += check_data_types(); + /* and report results */ + ee_printf("CoreMark Size : %lu\n", (long unsigned)results[0].size); + ee_printf("Total ticks : %lu\n", (long unsigned)total_time); +#if HAS_FLOAT + ee_printf("Total time (secs): %f\n", time_in_secs(total_time)); + if (time_in_secs(total_time) > 0) + ee_printf("Iterations/Sec : %f\n", + default_num_contexts * results[0].iterations + / time_in_secs(total_time)); +#else + ee_printf("Total time (secs): %d\n", time_in_secs(total_time)); + if (time_in_secs(total_time) > 0) + ee_printf("Iterations/Sec : %d\n", + default_num_contexts * results[0].iterations + / time_in_secs(total_time)); +#endif + if (time_in_secs(total_time) < 10) + { + ee_printf( + "ERROR! Must execute for at least 10 secs for a valid result!\n"); + total_errors++; + } + + ee_printf("Iterations : %lu\n", + (long unsigned)default_num_contexts * results[0].iterations); + ee_printf("Compiler version : %s\n", COMPILER_VERSION); + ee_printf("Compiler flags : %s\n", COMPILER_FLAGS); +#if (MULTITHREAD > 1) + ee_printf("Parallel %s : %d\n", PARALLEL_METHOD, default_num_contexts); +#endif + ee_printf("Memory location : %s\n", MEM_LOCATION); + /* output for verification */ + ee_printf("seedcrc : 0x%04x\n", seedcrc); + if (results[0].execs & ID_LIST) + for (i = 0; i < default_num_contexts; i++) + ee_printf("[%d]crclist : 0x%04x\n", i, results[i].crclist); + if (results[0].execs & ID_MATRIX) + for (i = 0; i < default_num_contexts; i++) + ee_printf("[%d]crcmatrix : 0x%04x\n", i, results[i].crcmatrix); + if (results[0].execs & ID_STATE) + for (i = 0; i < default_num_contexts; i++) + ee_printf("[%d]crcstate : 0x%04x\n", i, results[i].crcstate); + for (i = 0; i < default_num_contexts; i++) + ee_printf("[%d]crcfinal : 0x%04x\n", i, results[i].crc); + if (total_errors == 0) + { + ee_printf( + "Correct operation validated. See README.md for run and reporting " + "rules.\n"); +#if HAS_FLOAT + if (known_id == 3) + { + unsigned long long tmp = (unsigned long long) 1000.0*default_num_contexts*results[0].iterations/time_in_secs(total_time); + secs_ret totalmsecs = time_in_secs(total_time); + int totalmint = (int) totalmsecs; + ee_printf("ELAPSED TIME: %d\n", totalmint); + + ee_printf("CoreMark 1.0 : %d / %s %s", + tmp, + COMPILER_VERSION, + COMPILER_FLAGS); +#if defined(MEM_LOCATION) && !defined(MEM_LOCATION_UNSPEC) + ee_printf(" / %s", MEM_LOCATION); +#else + ee_printf(" / %s", mem_name[MEM_METHOD]); +#endif + +#if (MULTITHREAD > 1) + ee_printf(" / %d:%s", default_num_contexts, PARALLEL_METHOD); +#endif + ee_printf("\n"); + } +#endif + } + if (total_errors > 0) + ee_printf("Errors detected\n"); + if (total_errors < 0) + ee_printf( + "Cannot validate operation for these seed values, please compare " + "with results on a known platform.\n"); + +#if (MEM_METHOD == MEM_MALLOC) + for (i = 0; i < MULTITHREAD; i++) + portable_free(results[i].memblock[0]); +#endif + /* And last call any target specific code for finalizing */ + portable_fini(&(results[0].port)); + + return MAIN_RETURN_VAL; +} diff --git a/tests/riscv-coremark/coremark/core_matrix.c b/tests/riscv-coremark/coremark/core_matrix.c new file mode 100644 index 000000000..29fd8ab45 --- /dev/null +++ b/tests/riscv-coremark/coremark/core_matrix.c @@ -0,0 +1,359 @@ +/* +Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +Original Author: Shay Gal-on +*/ + +#include "coremark.h" +/* +Topic: Description + Matrix manipulation benchmark + + This very simple algorithm forms the basis of many more complex +algorithms. + + The tight inner loop is the focus of many optimizations (compiler as +well as hardware based) and is thus relevant for embedded processing. + + The total available data space will be divided to 3 parts: + NxN Matrix A - initialized with small values (upper 3/4 of the bits all +zero). NxN Matrix B - initialized with medium values (upper half of the bits all +zero). NxN Matrix C - used for the result. + + The actual values for A and B must be derived based on input that is not +available at compile time. +*/ +ee_s16 matrix_test(ee_u32 N, MATRES *C, MATDAT *A, MATDAT *B, MATDAT val); +ee_s16 matrix_sum(ee_u32 N, MATRES *C, MATDAT clipval); +void matrix_mul_const(ee_u32 N, MATRES *C, MATDAT *A, MATDAT val); +void matrix_mul_vect(ee_u32 N, MATRES *C, MATDAT *A, MATDAT *B); +void matrix_mul_matrix(ee_u32 N, MATRES *C, MATDAT *A, MATDAT *B); +void matrix_mul_matrix_bitextract(ee_u32 N, MATRES *C, MATDAT *A, MATDAT *B); +void matrix_add_const(ee_u32 N, MATDAT *A, MATDAT val); + +#define matrix_test_next(x) (x + 1) +#define matrix_clip(x, y) ((y) ? (x)&0x0ff : (x)&0x0ffff) +#define matrix_big(x) (0xf000 | (x)) +#define bit_extract(x, from, to) (((x) >> (from)) & (~(0xffffffff << (to)))) + +#if CORE_DEBUG +void +printmat(MATDAT *A, ee_u32 N, char *name) +{ + ee_u32 i, j; + ee_printf("Matrix %s [%dx%d]:\n", name, N, N); + for (i = 0; i < N; i++) + { + for (j = 0; j < N; j++) + { + if (j != 0) + ee_printf(","); + ee_printf("%d", A[i * N + j]); + } + ee_printf("\n"); + } +} +void +printmatC(MATRES *C, ee_u32 N, char *name) +{ + ee_u32 i, j; + ee_printf("Matrix %s [%dx%d]:\n", name, N, N); + for (i = 0; i < N; i++) + { + for (j = 0; j < N; j++) + { + if (j != 0) + ee_printf(","); + ee_printf("%d", C[i * N + j]); + } + ee_printf("\n"); + } +} +#endif +/* Function: core_bench_matrix + Benchmark function + + Iterate N times, + changing the matrix values slightly by a constant amount each time. +*/ +ee_u16 +core_bench_matrix(mat_params *p, ee_s16 seed, ee_u16 crc) +{ + ee_u32 N = p->N; + MATRES *C = p->C; + MATDAT *A = p->A; + MATDAT *B = p->B; + MATDAT val = (MATDAT)seed; + + crc = crc16(matrix_test(N, C, A, B, val), crc); + + return crc; +} + +/* Function: matrix_test + Perform matrix manipulation. + + Parameters: + N - Dimensions of the matrix. + C - memory for result matrix. + A - input matrix + B - operator matrix (not changed during operations) + + Returns: + A CRC value that captures all results calculated in the function. + In particular, crc of the value calculated on the result matrix + after each step by . + + Operation: + + 1 - Add a constant value to all elements of a matrix. + 2 - Multiply a matrix by a constant. + 3 - Multiply a matrix by a vector. + 4 - Multiply a matrix by a matrix. + 5 - Add a constant value to all elements of a matrix. + + After the last step, matrix A is back to original contents. +*/ +ee_s16 +matrix_test(ee_u32 N, MATRES *C, MATDAT *A, MATDAT *B, MATDAT val) +{ + ee_u16 crc = 0; + MATDAT clipval = matrix_big(val); + + matrix_add_const(N, A, val); /* make sure data changes */ +#if CORE_DEBUG + printmat(A, N, "matrix_add_const"); +#endif + matrix_mul_const(N, C, A, val); + crc = crc16(matrix_sum(N, C, clipval), crc); +#if CORE_DEBUG + printmatC(C, N, "matrix_mul_const"); +#endif + matrix_mul_vect(N, C, A, B); + crc = crc16(matrix_sum(N, C, clipval), crc); +#if CORE_DEBUG + printmatC(C, N, "matrix_mul_vect"); +#endif + matrix_mul_matrix(N, C, A, B); + crc = crc16(matrix_sum(N, C, clipval), crc); +#if CORE_DEBUG + printmatC(C, N, "matrix_mul_matrix"); +#endif + matrix_mul_matrix_bitextract(N, C, A, B); + crc = crc16(matrix_sum(N, C, clipval), crc); +#if CORE_DEBUG + printmatC(C, N, "matrix_mul_matrix_bitextract"); +#endif + + matrix_add_const(N, A, -val); /* return matrix to initial value */ + return crc; +} + +/* Function : matrix_init + Initialize the memory block for matrix benchmarking. + + Parameters: + blksize - Size of memory to be initialized. + memblk - Pointer to memory block. + seed - Actual values chosen depend on the seed parameter. + p - pointers to containing initialized matrixes. + + Returns: + Matrix dimensions. + + Note: + The seed parameter MUST be supplied from a source that cannot be + determined at compile time +*/ +ee_u32 +core_init_matrix(ee_u32 blksize, void *memblk, ee_s32 seed, mat_params *p) +{ + ee_u32 N = 0; + MATDAT *A; + MATDAT *B; + ee_s32 order = 1; + MATDAT val; + ee_u32 i = 0, j = 0; + if (seed == 0) + seed = 1; + while (j < blksize) + { + i++; + j = i * i * 2 * 4; + } + N = i - 1; + A = (MATDAT *)align_mem(memblk); + B = A + N * N; + + for (i = 0; i < N; i++) + { + for (j = 0; j < N; j++) + { + seed = ((order * seed) % 65536); + val = (seed + order); + val = matrix_clip(val, 0); + B[i * N + j] = val; + val = (val + order); + val = matrix_clip(val, 1); + A[i * N + j] = val; + order++; + } + } + + p->A = A; + p->B = B; + p->C = (MATRES *)align_mem(B + N * N); + p->N = N; +#if CORE_DEBUG + printmat(A, N, "A"); + printmat(B, N, "B"); +#endif + return N; +} + +/* Function: matrix_sum + Calculate a function that depends on the values of elements in the + matrix. + + For each element, accumulate into a temporary variable. + + As long as this value is under the parameter clipval, + add 1 to the result if the element is bigger then the previous. + + Otherwise, reset the accumulator and add 10 to the result. +*/ +ee_s16 +matrix_sum(ee_u32 N, MATRES *C, MATDAT clipval) +{ + MATRES tmp = 0, prev = 0, cur = 0; + ee_s16 ret = 0; + ee_u32 i, j; + for (i = 0; i < N; i++) + { + for (j = 0; j < N; j++) + { + cur = C[i * N + j]; + tmp += cur; + if (tmp > clipval) + { + ret += 10; + tmp = 0; + } + else + { + ret += (cur > prev) ? 1 : 0; + } + prev = cur; + } + } + return ret; +} + +/* Function: matrix_mul_const + Multiply a matrix by a constant. + This could be used as a scaler for instance. +*/ +void +matrix_mul_const(ee_u32 N, MATRES *C, MATDAT *A, MATDAT val) +{ + ee_u32 i, j; + for (i = 0; i < N; i++) + { + for (j = 0; j < N; j++) + { + C[i * N + j] = (MATRES)A[i * N + j] * (MATRES)val; + } + } +} + +/* Function: matrix_add_const + Add a constant value to all elements of a matrix. +*/ +void +matrix_add_const(ee_u32 N, MATDAT *A, MATDAT val) +{ + ee_u32 i, j; + for (i = 0; i < N; i++) + { + for (j = 0; j < N; j++) + { + A[i * N + j] += val; + } + } +} + +/* Function: matrix_mul_vect + Multiply a matrix by a vector. + This is common in many simple filters (e.g. fir where a vector of + coefficients is applied to the matrix.) +*/ +void +matrix_mul_vect(ee_u32 N, MATRES *C, MATDAT *A, MATDAT *B) +{ + ee_u32 i, j; + for (i = 0; i < N; i++) + { + C[i] = 0; + for (j = 0; j < N; j++) + { + C[i] += (MATRES)A[i * N + j] * (MATRES)B[j]; + } + } +} + +/* Function: matrix_mul_matrix + Multiply a matrix by a matrix. + Basic code is used in many algorithms, mostly with minor changes such as + scaling. +*/ +void +matrix_mul_matrix(ee_u32 N, MATRES *C, MATDAT *A, MATDAT *B) +{ + ee_u32 i, j, k; + for (i = 0; i < N; i++) + { + for (j = 0; j < N; j++) + { + C[i * N + j] = 0; + for (k = 0; k < N; k++) + { + C[i * N + j] += (MATRES)A[i * N + k] * (MATRES)B[k * N + j]; + } + } + } +} + +/* Function: matrix_mul_matrix_bitextract + Multiply a matrix by a matrix, and extract some bits from the result. + Basic code is used in many algorithms, mostly with minor changes such as + scaling. +*/ +void +matrix_mul_matrix_bitextract(ee_u32 N, MATRES *C, MATDAT *A, MATDAT *B) +{ + ee_u32 i, j, k; + for (i = 0; i < N; i++) + { + for (j = 0; j < N; j++) + { + C[i * N + j] = 0; + for (k = 0; k < N; k++) + { + MATRES tmp = (MATRES)A[i * N + k] * (MATRES)B[k * N + j]; + C[i * N + j] += bit_extract(tmp, 2, 4) * bit_extract(tmp, 5, 7); + } + } + } +} diff --git a/tests/riscv-coremark/coremark/core_state.c b/tests/riscv-coremark/coremark/core_state.c new file mode 100644 index 000000000..6dbab9dd9 --- /dev/null +++ b/tests/riscv-coremark/coremark/core_state.c @@ -0,0 +1,330 @@ +/* +Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +Original Author: Shay Gal-on +*/ + +#include "coremark.h" +/* local functions */ +enum CORE_STATE core_state_transition(ee_u8 **instr, ee_u32 *transition_count); + +/* +Topic: Description + Simple state machines like this one are used in many embedded products. + + For more complex state machines, sometimes a state transition table +implementation is used instead, trading speed of direct coding for ease of +maintenance. + + Since the main goal of using a state machine in CoreMark is to excercise +the switch/if behaviour, we are using a small moore machine. + + In particular, this machine tests type of string input, + trying to determine whether the input is a number or something else. + (see core_state.png). +*/ + +/* Function: core_bench_state + Benchmark function + + Go over the input twice, once direct, and once after introducing some + corruption. +*/ +ee_u16 +core_bench_state(ee_u32 blksize, + ee_u8 *memblock, + ee_s16 seed1, + ee_s16 seed2, + ee_s16 step, + ee_u16 crc) +{ + ee_u32 final_counts[NUM_CORE_STATES]; + ee_u32 track_counts[NUM_CORE_STATES]; + ee_u8 *p = memblock; + ee_u32 i; + +#if CORE_DEBUG + ee_printf("State Bench: %d,%d,%d,%04x\n", seed1, seed2, step, crc); +#endif + for (i = 0; i < NUM_CORE_STATES; i++) + { + final_counts[i] = track_counts[i] = 0; + } + /* run the state machine over the input */ + while (*p != 0) + { + enum CORE_STATE fstate = core_state_transition(&p, track_counts); + final_counts[fstate]++; +#if CORE_DEBUG + ee_printf("%d,", fstate); + } + ee_printf("\n"); +#else + } +#endif + p = memblock; + while (p < (memblock + blksize)) + { /* insert some corruption */ + if (*p != ',') + *p ^= (ee_u8)seed1; + p += step; + } + p = memblock; + /* run the state machine over the input again */ + while (*p != 0) + { + enum CORE_STATE fstate = core_state_transition(&p, track_counts); + final_counts[fstate]++; +#if CORE_DEBUG + ee_printf("%d,", fstate); + } + ee_printf("\n"); +#else + } +#endif + p = memblock; + while (p < (memblock + blksize)) + { /* undo corruption is seed1 and seed2 are equal */ + if (*p != ',') + *p ^= (ee_u8)seed2; + p += step; + } + /* end timing */ + for (i = 0; i < NUM_CORE_STATES; i++) + { + crc = crcu32(final_counts[i], crc); + crc = crcu32(track_counts[i], crc); + } + return crc; +} + +/* Default initialization patterns */ +static ee_u8 *intpat[4] + = { (ee_u8 *)"5012", (ee_u8 *)"1234", (ee_u8 *)"-874", (ee_u8 *)"+122" }; +static ee_u8 *floatpat[4] = { (ee_u8 *)"35.54400", + (ee_u8 *)".1234500", + (ee_u8 *)"-110.700", + (ee_u8 *)"+0.64400" }; +static ee_u8 *scipat[4] = { (ee_u8 *)"5.500e+3", + (ee_u8 *)"-.123e-2", + (ee_u8 *)"-87e+832", + (ee_u8 *)"+0.6e-12" }; +static ee_u8 *errpat[4] = { (ee_u8 *)"T0.3e-1F", + (ee_u8 *)"-T.T++Tq", + (ee_u8 *)"1T3.4e4z", + (ee_u8 *)"34.0e-T^" }; + +/* Function: core_init_state + Initialize the input data for the state machine. + + Populate the input with several predetermined strings, interspersed. + Actual patterns chosen depend on the seed parameter. + + Note: + The seed parameter MUST be supplied from a source that cannot be + determined at compile time +*/ +void +core_init_state(ee_u32 size, ee_s16 seed, ee_u8 *p) +{ + ee_u32 total = 0, next = 0, i; + ee_u8 *buf = 0; +#if CORE_DEBUG + ee_u8 *start = p; + ee_printf("State: %d,%d\n", size, seed); +#endif + size--; + next = 0; + while ((total + next + 1) < size) + { + if (next > 0) + { + for (i = 0; i < next; i++) + *(p + total + i) = buf[i]; + *(p + total + i) = ','; + total += next + 1; + } + seed++; + switch (seed & 0x7) + { + case 0: /* int */ + case 1: /* int */ + case 2: /* int */ + buf = intpat[(seed >> 3) & 0x3]; + next = 4; + break; + case 3: /* float */ + case 4: /* float */ + buf = floatpat[(seed >> 3) & 0x3]; + next = 8; + break; + case 5: /* scientific */ + case 6: /* scientific */ + buf = scipat[(seed >> 3) & 0x3]; + next = 8; + break; + case 7: /* invalid */ + buf = errpat[(seed >> 3) & 0x3]; + next = 8; + break; + default: /* Never happen, just to make some compilers happy */ + break; + } + } + size++; + while (total < size) + { /* fill the rest with 0 */ + *(p + total) = 0; + total++; + } +#if CORE_DEBUG + ee_printf("State Input: %s\n", start); +#endif +} + +static ee_u8 +ee_isdigit(ee_u8 c) +{ + ee_u8 retval; + retval = ((c >= '0') & (c <= '9')) ? 1 : 0; + return retval; +} + +/* Function: core_state_transition + Actual state machine. + + The state machine will continue scanning until either: + 1 - an invalid input is detcted. + 2 - a valid number has been detected. + + The input pointer is updated to point to the end of the token, and the + end state is returned (either specific format determined or invalid). +*/ + +enum CORE_STATE +core_state_transition(ee_u8 **instr, ee_u32 *transition_count) +{ + ee_u8 * str = *instr; + ee_u8 NEXT_SYMBOL; + enum CORE_STATE state = CORE_START; + for (; *str && state != CORE_INVALID; str++) + { + NEXT_SYMBOL = *str; + if (NEXT_SYMBOL == ',') /* end of this input */ + { + str++; + break; + } + switch (state) + { + case CORE_START: + if (ee_isdigit(NEXT_SYMBOL)) + { + state = CORE_INT; + } + else if (NEXT_SYMBOL == '+' || NEXT_SYMBOL == '-') + { + state = CORE_S1; + } + else if (NEXT_SYMBOL == '.') + { + state = CORE_FLOAT; + } + else + { + state = CORE_INVALID; + transition_count[CORE_INVALID]++; + } + transition_count[CORE_START]++; + break; + case CORE_S1: + if (ee_isdigit(NEXT_SYMBOL)) + { + state = CORE_INT; + transition_count[CORE_S1]++; + } + else if (NEXT_SYMBOL == '.') + { + state = CORE_FLOAT; + transition_count[CORE_S1]++; + } + else + { + state = CORE_INVALID; + transition_count[CORE_S1]++; + } + break; + case CORE_INT: + if (NEXT_SYMBOL == '.') + { + state = CORE_FLOAT; + transition_count[CORE_INT]++; + } + else if (!ee_isdigit(NEXT_SYMBOL)) + { + state = CORE_INVALID; + transition_count[CORE_INT]++; + } + break; + case CORE_FLOAT: + if (NEXT_SYMBOL == 'E' || NEXT_SYMBOL == 'e') + { + state = CORE_S2; + transition_count[CORE_FLOAT]++; + } + else if (!ee_isdigit(NEXT_SYMBOL)) + { + state = CORE_INVALID; + transition_count[CORE_FLOAT]++; + } + break; + case CORE_S2: + if (NEXT_SYMBOL == '+' || NEXT_SYMBOL == '-') + { + state = CORE_EXPONENT; + transition_count[CORE_S2]++; + } + else + { + state = CORE_INVALID; + transition_count[CORE_S2]++; + } + break; + case CORE_EXPONENT: + if (ee_isdigit(NEXT_SYMBOL)) + { + state = CORE_SCIENTIFIC; + transition_count[CORE_EXPONENT]++; + } + else + { + state = CORE_INVALID; + transition_count[CORE_EXPONENT]++; + } + break; + case CORE_SCIENTIFIC: + if (!ee_isdigit(NEXT_SYMBOL)) + { + state = CORE_INVALID; + transition_count[CORE_INVALID]++; + } + break; + default: + break; + } + } + *instr = str; + return state; +} diff --git a/tests/riscv-coremark/coremark/core_util.c b/tests/riscv-coremark/coremark/core_util.c new file mode 100644 index 000000000..67c5d7757 --- /dev/null +++ b/tests/riscv-coremark/coremark/core_util.c @@ -0,0 +1,249 @@ +/* +Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +Original Author: Shay Gal-on +*/ + +#include "coremark.h" +/* Function: get_seed + Get a values that cannot be determined at compile time. + + Since different embedded systems and compilers are used, 3 different + methods are provided: 1 - Using a volatile variable. This method is only + valid if the compiler is forced to generate code that reads the value of a + volatile variable from memory at run time. Please note, if using this method, + you would need to modify core_portme.c to generate training profile. 2 - + Command line arguments. This is the preferred method if command line + arguments are supported. 3 - System function. If none of the first 2 methods + is available on the platform, a system function which is not a stub can be + used. + + e.g. read the value on GPIO pins connected to switches, or invoke + special simulator functions. +*/ +#if (SEED_METHOD == SEED_VOLATILE) +extern volatile ee_s32 seed1_volatile; +extern volatile ee_s32 seed2_volatile; +extern volatile ee_s32 seed3_volatile; +extern volatile ee_s32 seed4_volatile; +extern volatile ee_s32 seed5_volatile; +ee_s32 +get_seed_32(int i) +{ + ee_s32 retval; + switch (i) + { + case 1: + retval = seed1_volatile; + break; + case 2: + retval = seed2_volatile; + break; + case 3: + retval = seed3_volatile; + break; + case 4: + retval = seed4_volatile; + break; + case 5: + retval = seed5_volatile; + break; + default: + retval = 0; + break; + } + return retval; +} +#elif (SEED_METHOD == SEED_ARG) +ee_s32 +parseval(char *valstring) +{ + ee_s32 retval = 0; + ee_s32 neg = 1; + int hexmode = 0; + if (*valstring == '-') + { + neg = -1; + valstring++; + } + if ((valstring[0] == '0') && (valstring[1] == 'x')) + { + hexmode = 1; + valstring += 2; + } + /* first look for digits */ + if (hexmode) + { + while (((*valstring >= '0') && (*valstring <= '9')) + || ((*valstring >= 'a') && (*valstring <= 'f'))) + { + ee_s32 digit = *valstring - '0'; + if (digit > 9) + digit = 10 + *valstring - 'a'; + retval *= 16; + retval += digit; + valstring++; + } + } + else + { + while ((*valstring >= '0') && (*valstring <= '9')) + { + ee_s32 digit = *valstring - '0'; + retval *= 10; + retval += digit; + valstring++; + } + } + /* now add qualifiers */ + if (*valstring == 'K') + retval *= 1024; + if (*valstring == 'M') + retval *= 1024 * 1024; + + retval *= neg; + return retval; +} + +ee_s32 +get_seed_args(int i, int argc, char *argv[]) +{ + if (argc > i) + return parseval(argv[i]); + return 0; +} + +#elif (SEED_METHOD == SEED_FUNC) +/* If using OS based function, you must define and implement the functions below + * in core_portme.h and core_portme.c ! */ +ee_s32 +get_seed_32(int i) +{ + ee_s32 retval; + switch (i) + { + case 1: + retval = portme_sys1(); + break; + case 2: + retval = portme_sys2(); + break; + case 3: + retval = portme_sys3(); + break; + case 4: + retval = portme_sys4(); + break; + case 5: + retval = portme_sys5(); + break; + default: + retval = 0; + break; + } + return retval; +} +#endif + +/* Function: crc* + Service functions to calculate 16b CRC code. + +*/ +ee_u16 +crcu8(ee_u8 data, ee_u16 crc) +{ + ee_u8 i = 0, x16 = 0, carry = 0; + + for (i = 0; i < 8; i++) + { + x16 = (ee_u8)((data & 1) ^ ((ee_u8)crc & 1)); + data >>= 1; + + if (x16 == 1) + { + crc ^= 0x4002; + carry = 1; + } + else + carry = 0; + crc >>= 1; + if (carry) + crc |= 0x8000; + else + crc &= 0x7fff; + } + return crc; +} +ee_u16 +crcu16(ee_u16 newval, ee_u16 crc) +{ + crc = crcu8((ee_u8)(newval), crc); + crc = crcu8((ee_u8)((newval) >> 8), crc); + return crc; +} +ee_u16 +crcu32(ee_u32 newval, ee_u16 crc) +{ + crc = crc16((ee_s16)newval, crc); + crc = crc16((ee_s16)(newval >> 16), crc); + return crc; +} +ee_u16 +crc16(ee_s16 newval, ee_u16 crc) +{ + return crcu16((ee_u16)newval, crc); +} + +ee_u8 +check_data_types() +{ + ee_u8 retval = 0; + if (sizeof(ee_u8) != 1) + { + ee_printf("ERROR: ee_u8 is not an 8b datatype!\n"); + retval++; + } + if (sizeof(ee_u16) != 2) + { + ee_printf("ERROR: ee_u16 is not a 16b datatype!\n"); + retval++; + } + if (sizeof(ee_s16) != 2) + { + ee_printf("ERROR: ee_s16 is not a 16b datatype!\n"); + retval++; + } + if (sizeof(ee_s32) != 4) + { + ee_printf("ERROR: ee_s32 is not a 32b datatype!\n"); + retval++; + } + if (sizeof(ee_u32) != 4) + { + ee_printf("ERROR: ee_u32 is not a 32b datatype!\n"); + retval++; + } + if (sizeof(ee_ptr_int) != sizeof(int *)) + { + ee_printf( + "ERROR: ee_ptr_int is not a datatype that holds an int pointer!\n"); + retval++; + } + if (retval > 0) + { + ee_printf("ERROR: Please modify the datatypes in core_portme.h!\n"); + } + return retval; +} diff --git a/tests/riscv-coremark/coremark/coremark.h b/tests/riscv-coremark/coremark/coremark.h new file mode 100644 index 000000000..9c5e4060a --- /dev/null +++ b/tests/riscv-coremark/coremark/coremark.h @@ -0,0 +1,183 @@ +/* +Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +Original Author: Shay Gal-on +*/ + +/* Topic: Description + This file contains declarations of the various benchmark functions. +*/ + +/* Configuration: TOTAL_DATA_SIZE + Define total size for data algorithms will operate on +*/ +#ifndef TOTAL_DATA_SIZE +#define TOTAL_DATA_SIZE 2 * 1000 +#endif + +#define SEED_ARG 0 +#define SEED_FUNC 1 +#define SEED_VOLATILE 2 + +#define MEM_STATIC 0 +#define MEM_MALLOC 1 +#define MEM_STACK 2 + +#include "core_portme.h" + +#if HAS_STDIO +#include +#endif +#if HAS_PRINTF +#define ee_printf printf +#endif + +/* Actual benchmark execution in iterate */ +void *iterate(void *pres); + +/* Typedef: secs_ret + For machines that have floating point support, get number of seconds as + a double. Otherwise an unsigned int. +*/ +#if HAS_FLOAT +typedef double secs_ret; +#else +typedef ee_u32 secs_ret; +#endif + +#if MAIN_HAS_NORETURN +#define MAIN_RETURN_VAL +#define MAIN_RETURN_TYPE void +#else +#define MAIN_RETURN_VAL 0 +#define MAIN_RETURN_TYPE int +#endif + +void start_time(void); +void stop_time(void); +CORE_TICKS get_time(void); +secs_ret time_in_secs(CORE_TICKS ticks); + +/* Misc useful functions */ +ee_u16 crcu8(ee_u8 data, ee_u16 crc); +ee_u16 crc16(ee_s16 newval, ee_u16 crc); +ee_u16 crcu16(ee_u16 newval, ee_u16 crc); +ee_u16 crcu32(ee_u32 newval, ee_u16 crc); +ee_u8 check_data_types(void); +void * portable_malloc(ee_size_t size); +void portable_free(void *p); +ee_s32 parseval(char *valstring); + +/* Algorithm IDS */ +#define ID_LIST (1 << 0) +#define ID_MATRIX (1 << 1) +#define ID_STATE (1 << 2) +#define ALL_ALGORITHMS_MASK (ID_LIST | ID_MATRIX | ID_STATE) +#define NUM_ALGORITHMS 3 + +/* list data structures */ +typedef struct list_data_s +{ + ee_s16 data16; + ee_s16 idx; +} list_data; + +typedef struct list_head_s +{ + struct list_head_s *next; + struct list_data_s *info; +} list_head; + +/*matrix benchmark related stuff */ +#define MATDAT_INT 1 +#if MATDAT_INT +typedef ee_s16 MATDAT; +typedef ee_s32 MATRES; +#else +typedef ee_f16 MATDAT; +typedef ee_f32 MATRES; +#endif + +typedef struct MAT_PARAMS_S +{ + int N; + MATDAT *A; + MATDAT *B; + MATRES *C; +} mat_params; + +/* state machine related stuff */ +/* List of all the possible states for the FSM */ +typedef enum CORE_STATE +{ + CORE_START = 0, + CORE_INVALID, + CORE_S1, + CORE_S2, + CORE_INT, + CORE_FLOAT, + CORE_EXPONENT, + CORE_SCIENTIFIC, + NUM_CORE_STATES +} core_state_e; + +/* Helper structure to hold results */ +typedef struct RESULTS_S +{ + /* inputs */ + ee_s16 seed1; /* Initializing seed */ + ee_s16 seed2; /* Initializing seed */ + ee_s16 seed3; /* Initializing seed */ + void * memblock[4]; /* Pointer to safe memory location */ + ee_u32 size; /* Size of the data */ + ee_u32 iterations; /* Number of iterations to execute */ + ee_u32 execs; /* Bitmask of operations to execute */ + struct list_head_s *list; + mat_params mat; + /* outputs */ + ee_u16 crc; + ee_u16 crclist; + ee_u16 crcmatrix; + ee_u16 crcstate; + ee_s16 err; + /* ultithread specific */ + core_portable port; +} core_results; + +/* Multicore execution handling */ +#if (MULTITHREAD > 1) +ee_u8 core_start_parallel(core_results *res); +ee_u8 core_stop_parallel(core_results *res); +#endif + +/* list benchmark functions */ +list_head *core_list_init(ee_u32 blksize, list_head *memblock, ee_s16 seed); +ee_u16 core_bench_list(core_results *res, ee_s16 finder_idx); + +/* state benchmark functions */ +void core_init_state(ee_u32 size, ee_s16 seed, ee_u8 *p); +ee_u16 core_bench_state(ee_u32 blksize, + ee_u8 *memblock, + ee_s16 seed1, + ee_s16 seed2, + ee_s16 step, + ee_u16 crc); + +/* matrix benchmark functions */ +ee_u32 core_init_matrix(ee_u32 blksize, + void * memblk, + ee_s32 seed, + mat_params *p); +ee_u16 core_bench_matrix(mat_params *p, ee_s16 seed, ee_u16 crc); diff --git a/tests/riscv-coremark/coremark/coremark.md5 b/tests/riscv-coremark/coremark/coremark.md5 new file mode 100644 index 000000000..94160db22 --- /dev/null +++ b/tests/riscv-coremark/coremark/coremark.md5 @@ -0,0 +1,6 @@ +8d082dc4a9676c02731a8cf209339072 core_list_join.c +c984863b84b59185d8b5fb81c1ca7535 core_main.c +5fa21a0f7c3964167c9691db531ca652 core_matrix.c +edcfc7a0b146a50028014f06e6826aa3 core_state.c +45540ba2145adea1ec7ea2c72a1fbbcb core_util.c +8ca974c013b380dc7f0d6d1afb76eb2d coremark.h diff --git a/tests/riscv-coremark/coremark/cygwin/core_portme.c b/tests/riscv-coremark/coremark/cygwin/core_portme.c new file mode 100755 index 000000000..fe8d29983 --- /dev/null +++ b/tests/riscv-coremark/coremark/cygwin/core_portme.c @@ -0,0 +1,336 @@ +/* +Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +Original Author: Shay Gal-on +*/ + +#include +#include +#include "coremark.h" +#if CALLGRIND_RUN +#include +#endif + +#if (MEM_METHOD==MEM_MALLOC) +#include +/* Function: portable_malloc + Provide malloc() functionality in a platform specific way. +*/ +void *portable_malloc(size_t size) { + return malloc(size); +} +/* Function: portable_free + Provide free() functionality in a platform specific way. +*/ +void portable_free(void *p) { + free(p); +} +#else +void *portable_malloc(size_t size) { + return NULL; +} +void portable_free(void *p) { + p=NULL; +} +#endif + +#if (SEED_METHOD==SEED_VOLATILE) +#if VALIDATION_RUN + volatile ee_s32 seed1_volatile=0x3415; + volatile ee_s32 seed2_volatile=0x3415; + volatile ee_s32 seed3_volatile=0x66; +#endif +#if PERFORMANCE_RUN + volatile ee_s32 seed1_volatile=0x0; + volatile ee_s32 seed2_volatile=0x0; + volatile ee_s32 seed3_volatile=0x66; +#endif +#if PROFILE_RUN + volatile ee_s32 seed1_volatile=0x8; + volatile ee_s32 seed2_volatile=0x8; + volatile ee_s32 seed3_volatile=0x8; +#endif + volatile ee_s32 seed4_volatile=ITERATIONS; + volatile ee_s32 seed5_volatile=0; +#endif +/* Porting: Timing functions + How to capture time and convert to seconds must be ported to whatever is supported by the platform. + e.g. Read value from on board RTC, read value from cpu clock cycles performance counter etc. + Sample implementation for standard time.h and windows.h definitions included. +*/ +/* Define: TIMER_RES_DIVIDER + Divider to trade off timer resolution and total time that can be measured. + + Use lower values to increase resolution, but make sure that overflow does not occur. + If there are issues with the return value overflowing, increase this value. + */ +#if USE_CLOCK + #define NSECS_PER_SEC CLOCKS_PER_SEC + #define EE_TIMER_TICKER_RATE 1000 + #define CORETIMETYPE clock_t + #define GETMYTIME(_t) (*_t=clock()) + #define MYTIMEDIFF(fin,ini) ((fin)-(ini)) + #define TIMER_RES_DIVIDER 1 + #define SAMPLE_TIME_IMPLEMENTATION 1 +#elif defined(_MSC_VER) + #define NSECS_PER_SEC 10000000 + #define EE_TIMER_TICKER_RATE 1000 + #define CORETIMETYPE FILETIME + #define GETMYTIME(_t) GetSystemTimeAsFileTime(_t) + #define MYTIMEDIFF(fin,ini) (((*(__int64*)&fin)-(*(__int64*)&ini))/TIMER_RES_DIVIDER) + /* setting to millisces resolution by default with MSDEV */ + #ifndef TIMER_RES_DIVIDER + #define TIMER_RES_DIVIDER 1000 + #endif + #define SAMPLE_TIME_IMPLEMENTATION 1 +#elif HAS_TIME_H + #define NSECS_PER_SEC 1000000000 + #define EE_TIMER_TICKER_RATE 1000 + #define CORETIMETYPE struct timespec + #define GETMYTIME(_t) clock_gettime(CLOCK_REALTIME,_t) + #define MYTIMEDIFF(fin,ini) ((fin.tv_sec-ini.tv_sec)*(NSECS_PER_SEC/TIMER_RES_DIVIDER)+(fin.tv_nsec-ini.tv_nsec)/TIMER_RES_DIVIDER) + /* setting to 1/1000 of a second resolution by default with linux */ + #ifndef TIMER_RES_DIVIDER + #define TIMER_RES_DIVIDER 1000000 + #endif + #define SAMPLE_TIME_IMPLEMENTATION 1 +#else + #define SAMPLE_TIME_IMPLEMENTATION 0 +#endif +#define EE_TICKS_PER_SEC (NSECS_PER_SEC / TIMER_RES_DIVIDER) + +#if SAMPLE_TIME_IMPLEMENTATION +/** Define Host specific (POSIX), or target specific global time variables. */ +static CORETIMETYPE start_time_val, stop_time_val; + +/* Function: start_time + This function will be called right before starting the timed portion of the benchmark. + + Implementation may be capturing a system timer (as implemented in the example code) + or zeroing some system parameters - e.g. setting the cpu clocks cycles to 0. +*/ +void start_time(void) { + GETMYTIME(&start_time_val ); +#if CALLGRIND_RUN + CALLGRIND_START_INSTRUMENTATION +#endif +#if MICA + asm volatile("int3");/*1 */ +#endif +} +/* Function: stop_time + This function will be called right after ending the timed portion of the benchmark. + + Implementation may be capturing a system timer (as implemented in the example code) + or other system parameters - e.g. reading the current value of cpu cycles counter. +*/ +void stop_time(void) { +#if CALLGRIND_RUN + CALLGRIND_STOP_INSTRUMENTATION +#endif +#if MICA + asm volatile("int3");/*1 */ +#endif + GETMYTIME(&stop_time_val ); +} +/* Function: get_time + Return an abstract "ticks" number that signifies time on the system. + + Actual value returned may be cpu cycles, milliseconds or any other value, + as long as it can be converted to seconds by . + This methodology is taken to accomodate any hardware or simulated platform. + The sample implementation returns millisecs by default, + and the resolution is controlled by +*/ +CORE_TICKS get_time(void) { + CORE_TICKS elapsed=(CORE_TICKS)(MYTIMEDIFF(stop_time_val, start_time_val)); + return elapsed; +} +/* Function: time_in_secs + Convert the value returned by get_time to seconds. + + The type is used to accomodate systems with no support for floating point. + Default implementation implemented by the EE_TICKS_PER_SEC macro above. +*/ +secs_ret time_in_secs(CORE_TICKS ticks) { + secs_ret retval=((secs_ret)ticks) / (secs_ret)EE_TICKS_PER_SEC; + return retval; +} +#else +#error "Please implement timing functionality in core_portme.c" +#endif /* SAMPLE_TIME_IMPLEMENTATION */ + +ee_u32 default_num_contexts=MULTITHREAD; + +/* Function: portable_init + Target specific initialization code + Test for some common mistakes. +*/ +void portable_init(core_portable *p, int *argc, char *argv[]) +{ +#if PRINT_ARGS + int i; + for (i=0; i<*argc; i++) { + ee_printf("Arg[%d]=%s\n",i,argv[i]); + } +#endif + if (sizeof(ee_ptr_int) != sizeof(ee_u8 *)) { + ee_printf("ERROR! Please define ee_ptr_int to a type that holds a pointer!\n"); + } + if (sizeof(ee_u32) != 4) { + ee_printf("ERROR! Please define ee_u32 to a 32b unsigned type!\n"); + } +#if (MAIN_HAS_NOARGC && (SEED_METHOD==SEED_ARG)) + ee_printf("ERROR! Main has no argc, but SEED_METHOD defined to SEED_ARG!\n"); +#endif + +#if (MULTITHREAD>1) && (SEED_METHOD==SEED_ARG) + int nargs=*argc,i; + if ((nargs>1) && (*argv[1]=='M')) { + default_num_contexts=parseval(argv[1]+1); + if (default_num_contexts>MULTITHREAD) + default_num_contexts=MULTITHREAD; + /* Shift args since first arg is directed to the portable part and not to coremark main */ + --nargs; + for (i=1; i*/ + p->portable_id=1; +} +/* Function: portable_fini + Target specific final code +*/ +void portable_fini(core_portable *p) +{ + p->portable_id=0; +} + +#if (MULTITHREAD>1) + +/* Function: core_start_parallel + Start benchmarking in a parallel context. + + Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets. + Other implementations using MCAPI or other standards can easily be devised. +*/ +/* Function: core_stop_parallel + Stop a parallel context execution of coremark, and gather the results. + + Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets. + Other implementations using MCAPI or other standards can easily be devised. +*/ +#if USE_PTHREAD +ee_u8 core_start_parallel(core_results *res) { + return (ee_u8)pthread_create(&(res->port.thread),NULL,iterate,(void *)res); +} +ee_u8 core_stop_parallel(core_results *res) { + void *retval; + return (ee_u8)pthread_join(res->port.thread,&retval); +} +#elif USE_FORK +static int key_id=0; +ee_u8 core_start_parallel(core_results *res) { + key_t key=4321+key_id; + key_id++; + res->port.pid=fork(); + res->port.shmid=shmget(key, 8, IPC_CREAT | 0666); + if (res->port.shmid<0) { + ee_printf("ERROR in shmget!\n"); + } + if (res->port.pid==0) { + iterate(res); + res->port.shm=shmat(res->port.shmid, NULL, 0); + /* copy the validation values to the shared memory area and quit*/ + if (res->port.shm == (char *) -1) { + ee_printf("ERROR in child shmat!\n"); + } else { + memcpy(res->port.shm,&(res->crc),8); + shmdt(res->port.shm); + } + exit(0); + } + return 1; +} +ee_u8 core_stop_parallel(core_results *res) { + int status; + pid_t wpid = waitpid(res->port.pid,&status,WUNTRACED); + if (wpid != res->port.pid) { + ee_printf("ERROR waiting for child.\n"); + if (errno == ECHILD) ee_printf("errno=No such child %d\n",res->port.pid); + if (errno == EINTR) ee_printf("errno=Interrupted\n"); + return 0; + } + /* after process is done, get the values from the shared memory area */ + res->port.shm=shmat(res->port.shmid, NULL, 0); + if (res->port.shm == (char *) -1) { + ee_printf("ERROR in parent shmat!\n"); + return 0; + } + memcpy(&(res->crc),res->port.shm,8); + shmdt(res->port.shm); + return 1; +} +#elif USE_SOCKET +static int key_id=0; +ee_u8 core_start_parallel(core_results *res) { + int bound, buffer_length=8; + res->port.sa.sin_family = AF_INET; + res->port.sa.sin_addr.s_addr = htonl(0x7F000001); + res->port.sa.sin_port = htons(7654+key_id); + key_id++; + res->port.pid=fork(); + if (res->port.pid==0) { /* benchmark child */ + iterate(res); + res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); + if (-1 == res->port.sock) /* if socket failed to initialize, exit */ { + ee_printf("Error Creating Socket"); + } else { + int bytes_sent = sendto(res->port.sock, &(res->crc), buffer_length, 0,(struct sockaddr*)&(res->port.sa), sizeof (struct sockaddr_in)); + if (bytes_sent < 0) + ee_printf("Error sending packet: %s\n", strerror(errno)); + close(res->port.sock); /* close the socket */ + } + exit(0); + } + /* parent process, open the socket */ + res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); + bound = bind(res->port.sock,(struct sockaddr*)&(res->port.sa), sizeof(struct sockaddr)); + if (bound < 0) + ee_printf("bind(): %s\n",strerror(errno)); + return 1; +} +ee_u8 core_stop_parallel(core_results *res) { + int status; + int fromlen=sizeof(struct sockaddr); + int recsize = recvfrom(res->port.sock, &(res->crc), 8, 0, (struct sockaddr*)&(res->port.sa), &fromlen); + if (recsize < 0) { + ee_printf("Error in receive: %s\n", strerror(errno)); + return 0; + } + pid_t wpid = waitpid(res->port.pid,&status,WUNTRACED); + if (wpid != res->port.pid) { + ee_printf("ERROR waiting for child.\n"); + if (errno == ECHILD) ee_printf("errno=No such child %d\n",res->port.pid); + if (errno == EINTR) ee_printf("errno=Interrupted\n"); + return 0; + } + return 1; +} +#else /* no standard multicore implementation */ +#error "Please implement multicore functionality in core_portme.c to use multiple contexts." +#endif /* multithread implementations */ +#endif diff --git a/tests/riscv-coremark/coremark/cygwin/core_portme.h b/tests/riscv-coremark/coremark/cygwin/core_portme.h new file mode 100755 index 000000000..9471b12ec --- /dev/null +++ b/tests/riscv-coremark/coremark/cygwin/core_portme.h @@ -0,0 +1,293 @@ +/* +Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +Original Author: Shay Gal-on +*/ + +/* Topic: Description + This file contains configuration constants required to execute on different platforms +*/ +#ifndef CORE_PORTME_H +#define CORE_PORTME_H +/************************/ +/* Data types and settings */ +/************************/ +/* Configuration: HAS_FLOAT + Define to 1 if the platform supports floating point. +*/ +#ifndef HAS_FLOAT +#define HAS_FLOAT 1 +#endif +/* Configuration: HAS_TIME_H + Define to 1 if platform has the time.h header file, + and implementation of functions thereof. +*/ +#ifndef HAS_TIME_H +#define HAS_TIME_H 1 +#endif +/* Configuration: USE_CLOCK + Define to 1 if platform has the time.h header file, + and implementation of functions thereof. +*/ +#ifndef USE_CLOCK +#define USE_CLOCK 0 +#endif +/* Configuration: HAS_STDIO + Define to 1 if the platform has stdio.h. +*/ +#ifndef HAS_STDIO +#define HAS_STDIO 1 +#endif +/* Configuration: HAS_PRINTF + Define to 1 if the platform has stdio.h and implements the printf function. +*/ +#ifndef HAS_PRINTF +#define HAS_PRINTF 1 +#endif + +/* Configuration: CORE_TICKS + Define type of return from the timing functions. + */ +#if defined(_MSC_VER) +#include +typedef size_t CORE_TICKS; +#elif HAS_TIME_H +#include +typedef clock_t CORE_TICKS; +#else +#error "Please define type of CORE_TICKS and implement start_time, end_time get_time and time_in_secs functions!" +#endif + +/* Definitions: COMPILER_VERSION, COMPILER_FLAGS, MEM_LOCATION + Initialize these strings per platform +*/ +#ifndef COMPILER_VERSION + #ifdef __GNUC__ + #define COMPILER_VERSION "GCC"__VERSION__ + #else + #define COMPILER_VERSION "Please put compiler version here (e.g. gcc 4.1)" + #endif +#endif +#ifndef COMPILER_FLAGS + #define COMPILER_FLAGS FLAGS_STR /* "Please put compiler flags here (e.g. -o3)" */ +#endif +#ifndef MEM_LOCATION + #define MEM_LOCATION "Please put data memory location here\n\t\t\t(e.g. code in flash, data on heap etc)" + #define MEM_LOCATION_UNSPEC 1 +#endif + +/* Data Types: + To avoid compiler issues, define the data types that need ot be used for 8b, 16b and 32b in . + + *Imprtant*: + ee_ptr_int needs to be the data type used to hold pointers, otherwise coremark may fail!!! +*/ +typedef signed short ee_s16; +typedef unsigned short ee_u16; +typedef signed int ee_s32; +typedef double ee_f32; +typedef unsigned char ee_u8; +typedef unsigned int ee_u32; +typedef ee_u32 ee_ptr_int; +typedef size_t ee_size_t; +/* align_mem: + This macro is used to align an offset to point to a 32b value. It is used in the Matrix algorithm to initialize the input memory blocks. +*/ +#define align_mem(x) (void *)(4 + (((ee_ptr_int)(x) - 1) & ~3)) + +/* Configuration: SEED_METHOD + Defines method to get seed values that cannot be computed at compile time. + + Valid values: + SEED_ARG - from command line. + SEED_FUNC - from a system function. + SEED_VOLATILE - from volatile variables. +*/ +#ifndef SEED_METHOD +#define SEED_METHOD SEED_ARG +#endif + +/* Configuration: MEM_METHOD + Defines method to get a block of memry. + + Valid values: + MEM_MALLOC - for platforms that implement malloc and have malloc.h. + MEM_STATIC - to use a static memory array. + MEM_STACK - to allocate the data block on the stack (NYI). +*/ +#ifndef MEM_METHOD +#define MEM_METHOD MEM_MALLOC +#endif + +/* Configuration: MULTITHREAD + Define for parallel execution + + Valid values: + 1 - only one context (default). + N>1 - will execute N copies in parallel. + + Note: + If this flag is defined to more then 1, an implementation for launching parallel contexts must be defined. + + Two sample implementations are provided. Use or to enable them. + + It is valid to have a different implementation of and in , + to fit a particular architecture. +*/ +#ifndef MULTITHREAD +#define MULTITHREAD 1 +#endif + +/* Configuration: USE_PTHREAD + Sample implementation for launching parallel contexts + This implementation uses pthread_thread_create and pthread_join. + + Valid values: + 0 - Do not use pthreads API. + 1 - Use pthreads API + + Note: + This flag only matters if MULTITHREAD has been defined to a value greater then 1. +*/ +#ifndef USE_PTHREAD +#define USE_PTHREAD 0 +#endif + +/* Configuration: USE_FORK + Sample implementation for launching parallel contexts + This implementation uses fork, waitpid, shmget,shmat and shmdt. + + Valid values: + 0 - Do not use fork API. + 1 - Use fork API + + Note: + This flag only matters if MULTITHREAD has been defined to a value greater then 1. +*/ +#ifndef USE_FORK +#define USE_FORK 0 +#endif + +/* Configuration: USE_SOCKET + Sample implementation for launching parallel contexts + This implementation uses fork, socket, sendto and recvfrom + + Valid values: + 0 - Do not use fork and sockets API. + 1 - Use fork and sockets API + + Note: + This flag only matters if MULTITHREAD has been defined to a value greater then 1. +*/ +#ifndef USE_SOCKET +#define USE_SOCKET 0 +#endif + +/* Configuration: MAIN_HAS_NOARGC + Needed if platform does not support getting arguments to main. + + Valid values: + 0 - argc/argv to main is supported + 1 - argc/argv to main is not supported +*/ +#ifndef MAIN_HAS_NOARGC +#define MAIN_HAS_NOARGC 0 +#endif + +/* Configuration: MAIN_HAS_NORETURN + Needed if platform does not support returning a value from main. + + Valid values: + 0 - main returns an int, and return value will be 0. + 1 - platform does not support returning a value from main +*/ +#ifndef MAIN_HAS_NORETURN +#define MAIN_HAS_NORETURN 0 +#endif + +/* Variable: default_num_contexts + Number of contexts to spawn in multicore context. + Override this global value to change number of contexts used. + + Note: + This value may not be set higher then the define. + + To experiment, you can set the define to the highest value expected, and use argc/argv in the to set this value from the command line. +*/ +extern ee_u32 default_num_contexts; + +#if (MULTITHREAD>1) +#if USE_PTHREAD + #include + #define PARALLEL_METHOD "PThreads" +#elif USE_FORK + #include + #include + #include + #include + #include /* for memcpy */ + #define PARALLEL_METHOD "Fork" +#elif USE_SOCKET + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #define PARALLEL_METHOD "Sockets" +#else + #define PARALLEL_METHOD "Proprietary" + #error "Please implement multicore functionality in core_portme.c to use multiple contexts." +#endif /* Method for multithreading */ +#endif /* MULTITHREAD > 1 */ + +typedef struct CORE_PORTABLE_S { +#if (MULTITHREAD>1) + #if USE_PTHREAD + pthread_t thread; + #elif USE_FORK + pid_t pid; + int shmid; + void *shm; + #elif USE_SOCKET + pid_t pid; + int sock; + struct sockaddr_in sa; + #endif /* Method for multithreading */ +#endif /* MULTITHREAD>1 */ + ee_u8 portable_id; +} core_portable; + +/* target specific init/fini */ +void portable_init(core_portable *p, int *argc, char *argv[]); +void portable_fini(core_portable *p); + +#if (SEED_METHOD==SEED_VOLATILE) + #if (VALIDATION_RUN || PERFORMANCE_RUN || PROFILE_RUN) + #define RUN_TYPE_FLAG 1 + #else + #if (TOTAL_DATA_SIZE==1200) + #define PROFILE_RUN 1 + #else + #define PERFORMANCE_RUN 1 + #endif + #endif +#endif /* SEED_METHOD==SEED_VOLATILE */ + +#endif /* CORE_PORTME_H */ diff --git a/tests/riscv-coremark/coremark/cygwin/core_portme.mak b/tests/riscv-coremark/coremark/cygwin/core_portme.mak new file mode 100644 index 000000000..97b6d6ace --- /dev/null +++ b/tests/riscv-coremark/coremark/cygwin/core_portme.mak @@ -0,0 +1,17 @@ +# Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Original Author: Shay Gal-on + +include posix/core_portme.mak diff --git a/tests/riscv-coremark/coremark/docs/READM.md b/tests/riscv-coremark/coremark/docs/READM.md new file mode 100644 index 000000000..6f71f426d --- /dev/null +++ b/tests/riscv-coremark/coremark/docs/READM.md @@ -0,0 +1 @@ +This folder contains the original, unaltered documents from the CoreMark V1.0 release. diff --git a/tests/riscv-coremark/coremark/docs/balance_O0_joined.png b/tests/riscv-coremark/coremark/docs/balance_O0_joined.png new file mode 100644 index 0000000000000000000000000000000000000000..46b41583a8b834d371c2bced376f956e0f54065b GIT binary patch literal 48672 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 + +core_portme.mak - CoreMark + + + + + + + +

core_portme.mak

Summary
core_portme.mak
Variables
OUTFLAGUse this flag to define how to to get an executable (e.g -o)
CFLAGSUse this flag to define compiler options.
LFLAGS_ENDDefine any libraries needed for linking or other flags that should come at the end of the link line (e.g.
SEPARATE_COMPILEDefine if you need to separate compilation from link stage.
PORT_OBJSPort specific object files can be added here
Build Targets
port_prebuildGenerate any files that are needed before actual build starts.
port_postbuildGenerate any files that are needed after actual build end.
port_postrunDo platform specific after run stuff.
port_prerunDo platform specific after run stuff.
port_postloadDo platform specific after load stuff.
port_preloadDo platform specific before load stuff.
Variables
OPATH
PERLDefine perl executable to calculate the geomean if running separate.
+ +

Variables

+ +

OUTFLAG

Use this flag to define how to to get an executable (e.g -o)

+ +

CFLAGS

Use this flag to define compiler options.  Note, you can add compiler options from the command line using XCFLAGS=”other flags”

+ +

LFLAGS_END

Define any libraries needed for linking or other flags that should come at the end of the link line (e.g. linker scripts).  Note: On certain platforms, the default clock_gettime implementation is supported but requires linking of librt.

+ +

SEPARATE_COMPILE

Define if you need to separate compilation from link stage.  In this case, you also need to define below how to create an object file, and how to link.

+ +

PORT_OBJS

Port specific object files can be added here

+ +

Build Targets

+ +

port_prebuild

Generate any files that are needed before actual build starts.  E.g. generate profile guidance files.  Sample PGO generation for gcc enabled with PGO=1

  • First, check if PGO was defined on the command line, if so, need to add -fprofile-use to compile line.
  • Second, if PGO reference has not yet been generated, add a step to the prebuild that will build a profile-generate version and run it.
NoteUsing REBUILD=1

Use make PGO=1 to invoke this sample processing.

+ +

port_postbuild

Generate any files that are needed after actual build end.  E.g. change format to srec, bin, zip in order to be able to load into flash

+ +

port_postrun

Do platform specific after run stuff.  E.g. reset the board, backup the logfiles etc.

+ +

port_prerun

Do platform specific after run stuff.  E.g. reset the board, backup the logfiles etc.

+ +

port_postload

Do platform specific after load stuff.  E.g. reset the reset power to the flash eraser

+ +

port_preload

Do platform specific before load stuff.  E.g. reset the reset power to the flash eraser

+ +

Variables

+ +

OPATH

Path to the output folder.  Defaultcurrent folder.
+ +

PERL

Define perl executable to calculate the geomean if running separate.

+ +
+ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/files/core_list_join-c.html b/tests/riscv-coremark/coremark/docs/html/files/core_list_join-c.html new file mode 100644 index 000000000..6ee2aeecd --- /dev/null +++ b/tests/riscv-coremark/coremark/docs/html/files/core_list_join-c.html @@ -0,0 +1,58 @@ + + +/cygdrive/d/dev/code/coremark/core_list_join.c - CoreMark + + + + + + + +

core_list_join.c

Summary
core_list_join.c
DescriptionBenchmark using a linked list.
Functions
cmp_complexCompare the data item in a list cell.
cmp_idxCompare the idx item in a list cell, and regen the data.
core_list_initInitialize list with data.
core_list_insertInsert an item to the list
core_list_removeRemove an item from the list.
core_list_undo_removeUndo a remove operation.
core_list_findFind an item in the list
core_list_reverseReverse a list
core_list_mergesortSort the list in place without recursion.
+ +

Description

Benchmark using a linked list.

Linked list is a common data structure used in many applications.

For our purposes, this will excercise the memory units of the processor.  In particular, usage of the list pointers to find and alter data.

We are not using Malloc since some platforms do not support this library.

Instead, the memory block being passed in is used to create a list, and the benchmark takes care not to add more items then can be accomodated by the memory block.  The porting layer will make sure that we have a valid memory block.

All operations are done in place, without using any extra memory.

The list itself contains list pointers and pointers to data items.  Data items contain the following:

idxAn index that captures the initial order of the list.
dataVariable data initialized based on the input parameters.  The 16b are divided as follows:
  • Upper 8b are backup of original data.
  • Bit 7 indicates if the lower 7 bits are to be used as is or calculated.
  • Bits 0-2 indicate type of operation to perform to get a 7b value.
  • Bits 3-6 provide input for the operation.
+ +

Functions

+ +

cmp_complex

ee_s32 cmp_complex(list_data *a,
list_data *b,
core_results *res)

Compare the data item in a list cell.

Can be used by mergesort.

+ +

cmp_idx

ee_s32 cmp_idx(list_data *a,
list_data *b,
core_results *res)

Compare the idx item in a list cell, and regen the data.

Can be used by mergesort.

+ +

core_list_init

list_head *core_list_init(ee_u32 blksize,
list_head *memblock,
ee_s16 seed)

Initialize list with data.

Parameters

blksizeSize of memory to be initialized.
memblockPointer to memory block.
seedActual values chosen depend on the seed parameter.  The seed parameter MUST be supplied from a source that cannot be determined at compile time

Returns

Pointer to the head of the list.

+ +

core_list_insert

list_head *core_list_insert_new(list_head *insert_point,
list_data *info,
list_head **memblock,
list_data **datablock ,
list_head *memblock_end,
list_data *datablock_end)

Insert an item to the list

Parameters

insert_pointwhere to insert the item.
infodata for the cell.
memblockpointer for the list header
datablockpointer for the list data
memblock_endend of region for list headers
datablock_endend of region for list data

Returns

Pointer to new item.

+ +

core_list_remove

list_head *core_list_remove(list_head *item)

Remove an item from the list.

Operation

For a singly linked list, remove by copying the data from the next item over to the current cell, and unlinking the next item.

Note

since there is always a fake item at the end of the list, no need to check for NULL.

Returns

Removed item.

+ +

core_list_undo_remove

list_head *core_list_undo_remove(list_head *item_removed,
list_head *item_modified)

Undo a remove operation.

Operation

Since we want each iteration of the benchmark to be exactly the same, we need to be able to undo a remove.  Link the removed item back into the list, and switch the info items.

Parameters

item_removedReturn value from the core_list_remove
item_modifiedList item that was modified during core_list_remove

Returns

The item that was linked back to the list.

+ +

core_list_find

list_head *core_list_find(list_head *list,
list_data *info)

Find an item in the list

Operation

Find an item by idx (if not 0) or specific data value

Parameters

listlist head
infoidx or data to find

Returns

Found item, or NULL if not found.

+ +

core_list_reverse

list_head *core_list_reverse(list_head *list)

Reverse a list

Operation

Rearrange the pointers so the list is reversed.

Parameters

listlist head
infoidx or data to find

Returns

Found item, or NULL if not found.

+ +

core_list_mergesort

list_head *core_list_mergesort(list_head *list,
list_cmp cmp,
core_results *res)

Sort the list in place without recursion.

Description

Use mergesort, as for linked list this is a realistic solution.  Also, since this is aimed at embedded, care was taken to use iterative rather then recursive algorithm.  The sort can either return the list to original order (by idx) , or use the data item to invoke other other algorithms and change the order of the list.

Parameters

listlist to be sorted.
cmpcmp function to use

Returns

New head of the list.

Note

We have a special header for the list that will always be first, but the algorithm could theoretically modify where the list starts.

+ +
+ + + + + + + + + + +
ee_s32 cmp_complex(list_data *a,
list_data *b,
core_results *res)
Compare the data item in a list cell.
ee_s32 cmp_idx(list_data *a,
list_data *b,
core_results *res)
Compare the idx item in a list cell, and regen the data.
list_head *core_list_init(ee_u32 blksize,
list_head *memblock,
ee_s16 seed)
Initialize list with data.
list_head *core_list_insert_new(list_head *insert_point,
list_data *info,
list_head **memblock,
list_data **datablock ,
list_head *memblock_end,
list_data *datablock_end)
Insert an item to the list
list_head *core_list_remove(list_head *item)
Remove an item from the list.
list_head *core_list_undo_remove(list_head *item_removed,
list_head *item_modified)
Undo a remove operation.
list_head *core_list_find(list_head *list,
list_data *info)
Find an item in the list
list_head *core_list_reverse(list_head *list)
Reverse a list
list_head *core_list_mergesort(list_head *list,
list_cmp cmp,
core_results *res)
Sort the list in place without recursion.
+ + + + + + + + \ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/files/core_main-c.html b/tests/riscv-coremark/coremark/docs/html/files/core_main-c.html new file mode 100644 index 000000000..847744131 --- /dev/null +++ b/tests/riscv-coremark/coremark/docs/html/files/core_main-c.html @@ -0,0 +1,42 @@ + + +core_main.c - CoreMark + + + + + + + +

core_main.c

This file contains the framework to acquire a block of memory, seed initial parameters, tun t he benchmark and report the results.

Summary
core_main.cThis file contains the framework to acquire a block of memory, seed initial parameters, tun t he benchmark and report the results.
Functions
iterateRun the benchmark for a specified number of iterations.
mainMain entry routine for the benchmark.
+ +

Functions

+ +

iterate

Run the benchmark for a specified number of iterations.

Operation

For each type of benchmarked algorithm: a - Initialize the data block for the algorithm. b - Execute the algorithm N times.

Returns

NULL.

+ +

main

#if MAIN_HAS_NOARGC MAIN_RETURN_TYPE main(void)

Main entry routine for the benchmark.  This function is responsible for the following steps:

1Initialize input seeds from a source that cannot be determined at compile time.
2Initialize memory block for use.
3Run and time the benchmark.
4Report results, testing the validity of the output if the seeds are known.

Arguments

1first seed : Any value
2second seed : Must be identical to first for iterations to be identical
3third seed : Any value, should be at least an order of magnitude less then the input size, but bigger then 32.
4Iterations : Special, if set to 0, iterations will be automatically determined such that the benchmark will run between 10 to 100 secs
+ +
+ + + + + + + + + + +
#if MAIN_HAS_NOARGC MAIN_RETURN_TYPE main(void)
Main entry routine for the benchmark.
+ + + + + + + + \ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/files/core_matrix-c.html b/tests/riscv-coremark/coremark/docs/html/files/core_matrix-c.html new file mode 100644 index 000000000..2ad041b71 --- /dev/null +++ b/tests/riscv-coremark/coremark/docs/html/files/core_matrix-c.html @@ -0,0 +1,56 @@ + + +/cygdrive/d/dev/code/coremark/core_matrix.c - CoreMark + + + + + + + +

core_matrix.c

Summary
core_matrix.c
DescriptionMatrix manipulation benchmark
Functions
core_bench_matrixBenchmark function
matrix_testPerform matrix manipulation.
matrix_sumCalculate a function that depends on the values of elements in the matrix.
matrix_mul_constMultiply a matrix by a constant.
matrix_add_constAdd a constant value to all elements of a matrix.
matrix_mul_vectMultiply a matrix by a vector.
matrix_mul_matrixMultiply a matrix by a matrix.
matrix_mul_matrix_bitextractMultiply a matrix by a matrix, and extract some bits from the result.
+ +

Description

Matrix manipulation benchmark

This very simple algorithm forms the basis of many more complex algorithms.

The tight inner loop is the focus of many optimizations (compiler as well as hardware based) and is thus relevant for embedded processing.

The total available data space will be divided to 3 parts

NxN Matrix Ainitialized with small values (upper 3/4 of the bits all zero).
NxN Matrix Binitialized with medium values (upper half of the bits all zero).
NxN Matrix Cused for the result.

The actual values for A and B must be derived based on input that is not available at compile time.

+ +

Functions

+ +

core_bench_matrix

ee_u16 core_bench_matrix(mat_params *p,
ee_s16 seed,
ee_u16 crc)

Benchmark function

Iterate matrix_test N times, changing the matrix values slightly by a constant amount each time.

+ +

matrix_test

ee_s16 matrix_test(ee_u32 N,
MATRES *C,
MATDAT *A,
MATDAT *B,
MATDAT val)

Perform matrix manipulation.

Parameters

NDimensions of the matrix.
Cmemory for result matrix.
Ainput matrix
Boperator matrix (not changed during operations)

Returns

A CRC value that captures all results calculated in the function.  In particular, crc of the value calculated on the result matrix after each step by matrix_sum.

Operation

1Add a constant value to all elements of a matrix.
2Multiply a matrix by a constant.
3Multiply a matrix by a vector.
4Multiply a matrix by a matrix.
5Add a constant value to all elements of a matrix.

After the last step, matrix A is back to original contents.

+ +

matrix_sum

ee_s16 matrix_sum(ee_u32 N,
MATRES *C,
MATDAT clipval)

Calculate a function that depends on the values of elements in the matrix.

For each element, accumulate into a temporary variable.

As long as this value is under the parameter clipval, add 1 to the result if the element is bigger then the previous.

Otherwise, reset the accumulator and add 10 to the result.

+ +

matrix_mul_const

void matrix_mul_const(ee_u32 N,
MATRES *C,
MATDAT *A,
MATDAT val)

Multiply a matrix by a constant.  This could be used as a scaler for instance.

+ +

matrix_add_const

void matrix_add_const(ee_u32 N,
MATDAT *A,
MATDAT val)

Add a constant value to all elements of a matrix.

+ +

matrix_mul_vect

void matrix_mul_vect(ee_u32 N,
MATRES *C,
MATDAT *A,
MATDAT *B)

Multiply a matrix by a vector.  This is common in many simple filters (e.g. fir where a vector of coefficients is applied to the matrix.)

+ +

matrix_mul_matrix

void matrix_mul_matrix(ee_u32 N,
MATRES *C,
MATDAT *A,
MATDAT *B)

Multiply a matrix by a matrix.  Basic code is used in many algorithms, mostly with minor changes such as scaling.

+ +

matrix_mul_matrix_bitextract

void matrix_mul_matrix_bitextract(ee_u32 N,
MATRES *C,
MATDAT *A,
MATDAT *B)

Multiply a matrix by a matrix, and extract some bits from the result.  Basic code is used in many algorithms, mostly with minor changes such as scaling.

+ +
+ + + + + + + + + + +
ee_u16 core_bench_matrix(mat_params *p,
ee_s16 seed,
ee_u16 crc)
Benchmark function
ee_s16 matrix_test(ee_u32 N,
MATRES *C,
MATDAT *A,
MATDAT *B,
MATDAT val)
Perform matrix manipulation.
ee_s16 matrix_sum(ee_u32 N,
MATRES *C,
MATDAT clipval)
Calculate a function that depends on the values of elements in the matrix.
void matrix_mul_const(ee_u32 N,
MATRES *C,
MATDAT *A,
MATDAT val)
Multiply a matrix by a constant.
void matrix_add_const(ee_u32 N,
MATDAT *A,
MATDAT val)
Add a constant value to all elements of a matrix.
void matrix_mul_vect(ee_u32 N,
MATRES *C,
MATDAT *A,
MATDAT *B)
Multiply a matrix by a vector.
void matrix_mul_matrix(ee_u32 N,
MATRES *C,
MATDAT *A,
MATDAT *B)
Multiply a matrix by a matrix.
void matrix_mul_matrix_bitextract(ee_u32 N,
MATRES *C,
MATDAT *A,
MATDAT *B)
Multiply a matrix by a matrix, and extract some bits from the result.
+ + + + + + + + \ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/files/core_state-c.html b/tests/riscv-coremark/coremark/docs/html/files/core_state-c.html new file mode 100644 index 000000000..9f8035990 --- /dev/null +++ b/tests/riscv-coremark/coremark/docs/html/files/core_state-c.html @@ -0,0 +1,46 @@ + + +/cygdrive/d/dev/code/coremark/core_state.c - CoreMark + + + + + + + +

core_state.c

Summary
core_state.c
DescriptionSimple state machines like this one are used in many embedded products.
Functions
core_bench_stateBenchmark function
core_init_stateInitialize the input data for the state machine.
core_state_transitionActual state machine.
+ +

Description

Simple state machines like this one are used in many embedded products.

For more complex state machines, sometimes a state transition table implementation is used instead, trading speed of direct coding for ease of maintenance.

Since the main goal of using a state machine in CoreMark is to excercise the switch/if behaviour, we are using a small moore machine.

In particular, this machine tests type of string input, trying to determine whether the input is a number or something else.  (see core_state).

core_state
+ +

Functions

+ +

core_bench_state

ee_u16 core_bench_state(ee_u32 blksize,
ee_u8 *memblock,
ee_s16 seed1,
ee_s16 seed2,
ee_s16 step,
ee_u16 crc)

Benchmark function

Go over the input twice, once direct, and once after introducing some corruption.

+ +

core_init_state

void core_init_state(ee_u32 size,
ee_s16 seed,
ee_u8 *p)

Initialize the input data for the state machine.

Populate the input with several predetermined strings, interspersed.  Actual patterns chosen depend on the seed parameter.

Note

The seed parameter MUST be supplied from a source that cannot be determined at compile time

+ +

core_state_transition

enum CORE_STATE core_state_transition(ee_u8 **instr ,
ee_u32 *transition_count)

Actual state machine.

The state machine will continue scanning until either

1an invalid input is detcted.
2a valid number has been detected.

The input pointer is updated to point to the end of the token, and the end state is returned (either specific format determined or invalid).

+ +
+ + + + + + + + + + +
ee_u16 core_bench_state(ee_u32 blksize,
ee_u8 *memblock,
ee_s16 seed1,
ee_s16 seed2,
ee_s16 step,
ee_u16 crc)
Benchmark function
void core_init_state(ee_u32 size,
ee_s16 seed,
ee_u8 *p)
Initialize the input data for the state machine.
enum CORE_STATE core_state_transition(ee_u8 **instr ,
ee_u32 *transition_count)
Actual state machine.
+ + + + + + + + \ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/files/core_util-c.html b/tests/riscv-coremark/coremark/docs/html/files/core_util-c.html new file mode 100644 index 000000000..3ebdb3879 --- /dev/null +++ b/tests/riscv-coremark/coremark/docs/html/files/core_util-c.html @@ -0,0 +1,42 @@ + + +/cygdrive/d/dev/code/coremark/core_util.c - CoreMark + + + + + + + +

core_util.c

Summary
core_util.c
Functions
get_seedGet a values that cannot be determined at compile time.
crc*Service functions to calculate 16b CRC code.
+ +

Functions

+ +

get_seed

Get a values that cannot be determined at compile time.

Since different embedded systems and compilers are used, 3 different methods are provided

1Using a volatile variable.  This method is only valid if the compiler is forced to generate code that reads the value of a volatile variable from memory at run time.  Please note, if using this method, you would need to modify core_portme.c to generate training profile.
2Command line arguments.  This is the preferred method if command line arguments are supported.
3System function.  If none of the first 2 methods is available on the platform, a system function which is not a stub can be used.

e.g. read the value on GPIO pins connected to switches, or invoke special simulator functions.

+ +

crc*

Service functions to calculate 16b CRC code.

+ +
+ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/files/coremark-h.html b/tests/riscv-coremark/coremark/docs/html/files/coremark-h.html new file mode 100644 index 000000000..337bc1a0c --- /dev/null +++ b/tests/riscv-coremark/coremark/docs/html/files/coremark-h.html @@ -0,0 +1,46 @@ + + +/cygdrive/d/dev/code/coremark/coremark.h - CoreMark + + + + + + + +

coremark.h

Summary
coremark.h
DescriptionThis file contains declarations of the various benchmark functions.
Configuration
TOTAL_DATA_SIZEDefine total size for data algorithms will operate on
Types
secs_retFor machines that have floating point support, get number of seconds as a double.
+ +

Description

This file contains declarations of the various benchmark functions.

+ +

Configuration

+ +

TOTAL_DATA_SIZE

Define total size for data algorithms will operate on

+ +

Types

+ +

secs_ret

For machines that have floating point support, get number of seconds as a double.  Otherwise an unsigned int.

+ +
+ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/files/docs/core_state.png b/tests/riscv-coremark/coremark/docs/html/files/docs/core_state.png new file mode 100644 index 0000000000000000000000000000000000000000..9b5a4ea6078f44f7ffab2d06574052d01ae0db55 GIT binary patch literal 72093 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

-<{l0?;4HdgCa;9v1yb=eM)DmazZuN3GDaP$1EpPBV0D)8k5_4I5Ip zfQ4<^-3t5Ed!x3sZbf~Y*;`H~I32EZe)Qtu&pCzeGK!5$ZE!6dWhT0K{zUJneTLs> zZqFSp(NUBnv|)B=5ZVE&$%F@3sBKp-tt^;>5mhbM5)y|05%o$Kz#dAV*ujqV65AfB z&wMu5<8z-)eC=Jidxi(``YrE0oWOM=Lpj(e#sfy3@9MoK{KC4-_lFKy_HWB~!1}x9 z)Tw{8ZsymdoR6>B_~M;a5B!w7sNz=s5N0hQM<%YN;;9uVM4%u=Xj!f^CUmR z%j07*C$ZI2Q&asWei(F%YB!*$^NzMFzi5_p~=u4(nEfGqvodJJ?639a_uq3#pZ9HmA`XaenF<; zWsra2YnbA;t;%lphgNCN2KAg4d7|nLlb}OL$CNz z1Z8C9oI&}o6eiXG96#A2u)~F|Cz93VG*4;?h;uu5l1lNVXZ>xz4^2@uVQkm)rn6#i zCFJ*dWIMcSU3$Us-G>)tUu(0DYG@;#3DgLm?`hOswQ+8&(V+{ehd-=2(KcyV zyx68}de^}a8wt{Gfvmyrg3~&;YF}{n%QdgD#?BBya_%BkqH^qFWo1ac1kVWSroF@E z!^lS%(*bmPF3vf6f12%m@ifsNX4Mi!DhkO2WAWJm|M!`_?Wuh!*`1lZ^egXnDuVM7 z*wjN88m!f_S25VKl7O?&>Su4BPGg-PW#uWfujF4wE;!gmnt`=2c&TzxBwm z!A8n@3!woy7GayTL!Q-cOH>0sb|8h4I3z5Cxq1AbKAqHp5)~$P{k`-^9#Aof z?#*Syw=bbr8@2$;QYl8XATX+Xe?1?)T3w4F_WA%kY~l?W{FNzl=WYb3D28AKv*Ns% zLy%qXaDT~zh}BRuv9*g;wTY0-v;XGe9BW8)dIk{3k*U{or?&{531~0VF}2j&=$`uL z!$d)jMR-C%>+?7w7)4^waMfb|zOW77-a>2`Sa)3Tu`uJW&DtRT!Cn;iYt>odhT@#tfw=QRYzOm_}oPI zZk&B%UKbNp+{=Ff5L^)rEj+-`<`NVSF zPheSEZAa`XzL~CLcXBq6Hn?sMFwL9#CWAg-F#B6T?Eq*uRm4FOTD9WOj~R*Y?$L|m zOPPsOHUFFACD6!ysCvRQTes_I zRnMhDcl`c&;&H^2WoS#eH=!Bq+7z5sARCN&)VRr#`zWhqKsPvy?z3(9j@Xrgtb~17 zH}9a=lThRwMZ9p@D*U2Ne!=0-^IH0T}F>EnCW?Sy(qv+ak2Joz{*pRh-E2*?GYSiv(}Uzt{nd6JQ4T#n zTWX)?z5`H`gc&%QtL8`271w^9%lzz1ug|gr#*V-IO|ojp#qZ%`o8>e$kFO!A?6pvh z?cy$k-9U$3qKplrL}H-9I;FW;@VPY2znU~rqtE;~eo*N4^56f)rKOD+tC;#gW|vd0 zJI24GY1l`U2Vp(BJ~0k^0DuvR`ZF|vmU|;M7MVv)On~qZfYu)NW@c9_!ZY$~Vj@El z|4|`qT=KIWr<%I_J-euf=o{F3yH0l0)|BC-NUA__=N0veN(1e)@aVnjs`&hvZK{c1 zN22^URF<3(0U{0_GdsxsG=Mr<3qwk{bYGI#rx#$p0+8F|@( zWRojCXYGE1N9hKuA;6bzA z<;M>+(oh{un`JO0C9gY-d%l)K2-RLALE_kIeSJP~4al4WgmCf`dqWX2cXE|_brUQT z@`M2*B%K4WpC?>tKDVRlt5>f?tBOEmvfK-;$EYwC&Z%zTdML3LSxj@^bng`DdF_MCcQ)b#Dd}s6-kS@bt@unYH(LVqcn+qO-wNw{$Lyh zC-H_dT1NHzsl$`7eMrVGAiFooZR?vvhfv6605d+HzI0M~%}9qVHjEr_^%Z?ZmM&G;U==S=h1H_SV4p|8$9i3jG$ojR2!cMslUuYk*ZQxu z>CX@$Wz!Laisd!53GNZ;UN;btnVw?4WbJ}thdSJn)&eInfcSZni)U$G5N?@C>W3y-4bJsZR!T@(yrmb>j{2U2A{-=cgIdr^{$YVb1D|*0~@Rfy}#U+7y_* z!~x_*Xi3h(kw%PB0Z`PDDa>4L>Tg2LiKQr|@k{aU;SQCPI%uG##$}^AyWoyc(WQOS zRu@P`(&B!+y#vfE8LA84K5)*wrU{sEw+@E*eeWmEp9=kDY*>wu6(~*(Rz^r|Nq;4n zl9>W)rVPz&jrm`cM5d-eKr>5V+3~;$=KHdzUR9WIMjV=n#(VyfTasKuJ}=|A))<@u zq0B<5^SpGJZsJ+==b21`1ZTmX?Pa*Okn8H>`zQSfCK>y*!-d;W1hg4EM&WrVvVeG3 zEc|;SV*#$I&Z0U9CU@;c6$E=A#VPlT_0MsG2iFz8jof8w8O$JeAmWb`@(5s|2&8r` zqk@qTHf-MP>Oa|(S<$-Um_?TCiiTZlQS0%5yeuD-bFQ#2> zMq&wgL$0bh0uR2KFll?p{Z`1Z55RfC`!$I@Ars2s+nQE4+)_0A(^mr=ePe3MjotmW z$yGiP+=?=%%Q5Yc4r!{u6s33}Y)?6k7;%O7(xI`5L)qO2X{vajYBkefQ^E&>hoA=$ zV4qYn$l2GA&vfV2OISbtb{obt^Y~NZ8f*dI1pGAX-o43xgfb|C42gp*CFw%`H8rxt zu`mfHj0?pE2Z?fFCXu`?nHEQ}afG=H;z>QAXdSHP)m+AH^?{e$=Ar2wv;12N&icVd z#isn+C!gLe%&v$PwOm}|%RKu~I zK+5&415RJfX#hNdu$iYpBSYoZnA<|$60{Mj$;mTjXfOimXTwP6qt;DEL5$N6+`+cX z^%b>*PX>e_of@C4u{cMlbg@Cdw6AJwZZ6e}Bl++6`EZtbyJ$Du4UxaKWf zco}!+JOSm%LdKKEP(-mAC{!Au+HL0Kjjy1GIcyd~pvN{7{;WGOl?pC~2r9ttsHg zi*4dl#XVYa{mA(PrKXN9Hb4Yrw@VSxPALm9DA}|C}AZE>I_PxB73rh48RKsX=e2eb(M1)2d185;rJh zSTU?lN-G_sME$1eWQTJzZCC!KsA=^436+K@|JY+P%S9CT8}9k)zE?6eMa)n{hWW!U z{l#Qy`UE^dB&w+s2{Pf#kbwaAQ;3`*Q7X6PaEneJ(3+wh^~gy$g%cJJVMayx2GKI9f{r7)$90*$Sd2q6(6rZ%#(JC}i7kSIQU#QD<;gi5iUkC?iaGstl(d zT(+@~*W}58+__vUUl!$#oAUbY0Mp05!0fDUKDfxulluqTvm#~k3t}Wlz{Lpw`J$c| zHnfw>(?ycM2F;X+cVw7}VfB|$JQEp>3TR}*tQe%`w$rD#0nMn#_m>YV8DB`)MB9j_ zCl;CsWsSrTb9hS}KWQMG4;n~iQ&yVq7-OOBzEw;N(-mgHgR~}oc>+Pp4eL48wEr=g z*Fwt-5(F^vF@NKLKcSon4$GZ0z*3MVl%b@*%x9IT9D;v`_Ebx}$kie_YqcqIkPh@X zwYrSqd{B}7pjr@@o>0#?%0lQa26B56Lh@hel(v!4t=Da%X7i@Ija6V4!DO|Ho8$Qq z-Y^qGL}<0HQ?NZP>L=cXtQwFRJJB{f1h1tsmYpbyXy0F*IP4I4iYN-ie+skFTpsl< z34v7=rH#x}L{EdpyXTx|q84Dh8#6E^YmQqj98_ZpbM=IZp+=A2>}h?qbeIi#2%v(@ zeQCiAXcD<9Gv`#1!^aaHx^@+FD`%Pc$;P$@|MG!Zph#{9 zqpNPdM6s}- zST5F0)u6qf+mvUVJ}|qEYS7h{$xoB!c3q#)D`{otS-*}UMptO?-~5dzQOHq)LP zT!u`6E}Ea*7=CFVu}m)g^qVLrd*17%<#X2h(YmuWMJHcP?fjU5U zdrST=3$|=iPV3#1?n|+1rCiy2;{R&_mVIk#9THnwe9_W*uuZnNu3ZBTN~;kg_G#(= z9hk0iEsUlB0z8zr9Vp5~H?tGybDOyX-V;h_K=kx=>QIZH*z_tz?CPdbe-e>ZsV^ zBo&5Jq4m-73W(A*6wC9U&T-SzD2eWKC)w$2bURh^$}jU$VFqRXfWhNiblLM@B{!y9 z6y(=jT>4Mj;(Ik3&J*@e-LYkhTUK~wcwub0pUa7gQI%@H%b$cL8C8#c+*NhB%23U! zKJ68N2l!l86NcDjXRGy+vh`ozyT&>VZy-k$HZ;53YoRHE#)>YP>vrDLZ?tz5(3wll z7Pwi>eEvDZ!`(Q*`O%RFUHxeMAvAsG^<$1)Ov84~4mxe>bZ)wqY1EED-=#N`CaGwT zu?e*q9r*cCtz_54t9Vw^-OvtDA(!12*yYj$6qD@0UcZ0(2|BlrXf<=4-UhpZ_*hdL zs&Om4IR1pcZenS<^Ik7MvqY7{ox%gt-*4Mb2`2-cF1^FJ-4q3Eu}M?_9A8U{@c4f| zj#)m+-*6gHpO^@dpzAiYHxP{>zYsf29U-lCI{1%Kpvw{6MsZSKvuR+Ifz*$X?7ojB zikO=A3Rwq<;&pYPr*04?g_bLl=G~ z4V+DAN-5`d2C|Lv>Rm}=mj!DDZXGMKG_EiS0I?jpfvc%TuW8de4TmeGb7H$6i*OD* zrn;BALj(kf0mly4ZQs6Ar_11yepbIG$%t)I^jueKyw&+3RH*dp_o_m7?>3~vkbwZV zikcocpf_|*AMMjPqz5r$4?}x0rk1F`{r{Ixp&vm1EqNwbl*!~J= zJ>I(CznwaC>9RGq&&l-Cg{^nvCMyG&_Uz?o-iey~KZ5D}o`V!(tp3SdTJtM4qUIgs zCZyrcoGxTH1dUiW+1padJzMchOVpdCBTbCC0=4z@ zT1WXTJHw!(2!w0kRMc8_;%VmCbI*ya2hbn0aOBjmd#ZaWNJL=xK|?QUq7pxd4oR~VvkdX;ih&IQ~J@Id5!#?{lDdKK1sHPQ|*kwPP= z1sMVBM!hB|O71(32FaBbdm8b^fjH&hW9kIiNJbRZmkOSrnICTqEI8Zm+W6ivJIS$9 zr7R|SWQyV71m4zhzru)HUA_Rl7|<8Wcc74wz`Y9nEqyLF6D%78_?wy9yXQ683b|Lm)w0>Mn7Yw8mhuA8l$Y82Dr zg(r}rK$Vmx$X3VQENQ2*+fb>(0$K`@8C<~to`4zt>l3nGTm)PBa&*kg3ktk(rDdT| zJ+mNw(QMEe32!;5!AC!S0(gxtiutq4p*Db1Apnj@m2Ue!p_dT1d35z+eJN{g7$_2@ zmG6^_W`E=HFdc!DXaSiy;TEcL#{^Ll*a^F;oJV2eF~g~!j+02r!)3OX(mahg>^tCL@1l+T zLptJKIhCZxw;zEFroXx#C5RvjBnj>R)BQ5WBSOe{M+%<~YHEhZ zO&tVE#GMiirdWlOhh#aU2ylT*=&k;!slOqHTAVxJd%C=R`NGznWQvYcfyfILge#}w z&wpnhr)w8?XAFbv-p_{4*|qS}kA~O{9jMGpSSqX^>R-^kkT0jg z{6v|J-2q@nx08m}Or^=5R)G&_enrLyG2ez=7C?A=qRk4adS5U~qssm!6vDD+K!$Ab z&j+(uTKnNHek!O;7jY?44G?HRH4Sxl{Ovr0B_O;yY0UL4jkQC7y=d98G?$$sp8$`Zu9R5VKtN81&z{M-^jLFdH*a za16Q1zm|*@e{H#BWO<|VyU9kzKve90sgdjk8^7ZQ=YV47(UUaNlzUDX@PY)zR-Gd*~mOOPR8I z9u4q;son8>kVW*nckK$G=94w2uniBntxsena|tfHdwpA)#x1BcPhYW3fYRVptp8u7k1eF;zzz>uf*h_2-+L$+re zRR~Og7KDSdmWZLd%Ef)1Xy)HtEDIfP2iD{M`EkP7yMKCoWjVc6;$U6}K)9 z7Bc!!`Es{*3~qtOhqnA7Q^FGNX$?XcTk>-pcb(Sf|Ld7uV(|Z@1e@CQ%7grT@dlq_ z`R0It@JM&upM|}?K_exrP?28*E{)x2^R@b;a6&w3N2M#ufN+wMB0CK0adOoshWqKs z1m_Vu`ja)9k67lumICN1pa56irvGep{g26e_K2U~Ah&MlybLSR z>xp`4<1DUh@L=)B7R5eW4$JYeV_4%wlJaMiiu_ehz5?WT4AWGpsh{;D(w#fDrUUwN z&-^c@)d^D8STgeP zKnfa3`2sotj7X;@F8#clk-6TY^AffBjT=hk3pE_S6%%pWaE1U$GOh3C=H!@y?&hE> zW~gdOtx6S*MHTOt7%5Qf=9GDL5qo;dl#tfX2J8d6+9i z$__OS@K(0Sa@sZ2k~3jm6Wuu?&sw?k5vE8?f6~CnTeEo`Zspf zPFq{@3YtfCn6x!?U}75xA&THWzEY*mPrN?G#0+J*6n3J;0^&@KwA5u3pfT*4r?&Ey z%kzQ?9zSLj$wG(&x=Zl`d*HaDjEY2a!q?~~ntv)7`-P?!7Rh~O8r)0pYZ(heyv zpu#GzeC}V&M5loKVq*uDBS!%*S!?Di4vY+sy~wr)qC+M%fOswx);e~1S)6`r2rrvp zgpB{i&FD0MVPTms0_exJ;}|{lE=n)pR}1RQ30Xe^osB)upF7u?{XWzQ_Y1Ut9D^P( zH8We&dX=%#6*2{+Z3Yu$0&PB6tm;77>i7N8EG8!{XjK+LvWpin-T^}2^U7GO)Tu$Z zy+ERq2@p`hdMgi5ONm0I;{!*uY_c{5`ck0xWYkdPbx_uQ>*|a#D$D{JUEy2a+~$A+ zL#gh#g>PW5vSr)zU88pR1>`TB&&5v>G zG`{ymW_(j0OhQEn1h^6+z%^=y>J!9C}CnP znT6W|e2m=E%S}6|l4K;K@P{X!49DQi_M$?jgk<3g*v7{x*%y)Z;|BQ$N#k%*UIdJ; zK!Aj6z^_PdWH4pYrHG#YkI(q5b_dSWupexb@D=_w0cik$TE8Fr_5VGH6H49Ikt+tU;MnT z)(C}zOh>I)u|nD}`>e!xv5;E7L3!75g=a2+i_`&-O9tAOZ^Wz_j!+bExsE1w2R#&l z$ZNv6W1WT$o%}e&Wi||sINrYc{&pq9TEB3nIJ4|yTj1un$PoiZAYN_Oeoz2yemf?2 zrT+#jB)fL0@F;t9LW-j^jHFNy>#iR9K39AA>h@xe$N6+QI=K;sb;(^E%f$UHAV6W& zRtbtqj01+%WpAPy5G?~i$mis@jpQ7$2B6Yx%+Ar|V!zlthRsc3mT=#)X&t4J#49AQ zj67R{n=G`(j3vOorgWMQ?x!w1dP=->mW}rhHG)N_`4RIP=N@$msX?XnAre@yuE06c zc2zu0maJ_D`KCj-Mmc!p3c~6?7@rWgzH8U44s_eLN}r$hEm9Ul}F$X;UE z)saSjQ^C>@+5d;s-Q92ZSy6XUJ&MysIe4#Od{FfnhSQ~O0jZbPhHtkm(&Az!uLv^r zO>_N!K?cic9giS7kINd53a9qlF@G_RGB_W9La zc*%}??)WtZ(mfV2kmP0@KAu|L1J+OcNlIQis6~L?Kyks)LNZ3u`*s3m1q=&>=_%gq zuaIUy)PNw7ZaA{qXYDrmjff)FExMfa zh-U^I&=Zl2(~z$D{fn+V7eEE#w`7pPLI^lvPuUTE+b6b_+lOWfh0puEMiNemadGQ) z9^$kR$;bDY{JP_crJEO#Q{OQ!CvyXMC?t33t_7}2QLe+3BtpsGv%k!Hy<%>F@PH`x32}ucNzrM-gd09u zVItHlAzE~&x-t%bI?};GpApf{u(f;8%z1J#d;a++wq(5fa!7XfxpVEv!`FPY4mLoR zb%RndjE$OS>11*jPwdTX0r|W0W)DKw4l#7@k(Frj0h(eDlwaW8w}!;fmaST8Qb}R= zm+lkmkoHbn@gjdp0Pk4tc}2o>Xsm5RmiM8Y$(HX%lL@-2M%bo|G|;yGgm6}ec|KC& zHIz43W}XlYFwKh!0_HK-j~akUWWb>v$BACF(e>5@l-M}SjQ>qGl&jgT1}ocL&aWf^sf_iH=ZyVt+} zKjV7+{ThENlx32LVMaNzGmJI!?SdXG@ATCC;R0o3;6mh?%IxWs4_5E;*(# zBp(pH68D*4bHm7%JLgOJ#`6gI^>9Mm zr**nKR{#}zw#hWjb@ZId11TZN&Y3^o)3~t*nCVDpli3R6v&i4*N)Uvxz=b0YL& zt;0Hoth|itpCis#%Vflf%J_(7CPDrqRI9`wx8Yf z(YhuxBn&jPFv*Cn&CB zA2oGDM9c~qE_N^Ucm?d_)PAC)19-a*X(X4cyK)C8?)^{0)oxfDs7q15Tjiz7; z*8r(XoIdu>n0Z2j15E~YLs23q_mpAd?+9nqxpO^ULlGen^Bu>H%k=3L)Oo{V1+tER zl&&Z~U!E{unjQj!yh0xV*aa|v=E-%;uu5*LxN_)IZy+XizVa5`I*SH=?!0+mUs)WN z`(TcfFRpBf6+HQC?6&U8a3v{NVIqqZu}u4BD&X5@bge`QwAojDEY4PDww{Kt8vgqa ziR@5P89urP8;tMOip`f8>8P0`Y^0bgrWcJidAEJzoB4n4L%!4bUPBQ}fFi%kpVd$T z+~hv32~YAqiR_Lpb@7LSewpuA-u~JtFj~~-*XF(qe5_>Ki{6D_)g(A zxMjzV4xnJyv8c7NvI?$ho|9Kr@#NUW+V-=n4ZT^Z5J8Hxb^p0BGO{azn#~2Z2a=iC z*(nn>eXcxKBeUqiQ`5`n+goc4i5qH||KNcp*lKiaYzFsKuHrs&!DNr?K>+aVQ?*+5 z>FEuh*qMLf7WRV}8-|Fs;`{fmJe9^L(@qTSk6}CB4j~M-M?q#p(~l$omjNt6Rz=HZK@ln7006%ZNDRd_UJ&ZpjqmnqHS%j!L225t?dMmGP54o;diacl z`=HiA#3y$?P(mxOnkfdu4c~te?|8Dkj2ggbfzej*aBbecNPGS;dG*5W?+x;tT@xQx zUR_kF(<(ym-U6vzM*u=|dGDvd-dy9AFXu;c`t0dg0e3;ZZpI70jeyo!YpP4jlxKUNfB5|8nBe5^H!NOH0xyBB zw8j`qwyc`1Ygk0l=XBR>RR=a%h^;BrZ>G4vvZ%B%!9V7MSR^`G1Eb9 zj>cf%Iyj(-mxkryrAnG6{wJ#I-jo`6a&51${A~Gibwqf0s4Qu%9C@)6$!f;Un|5yJ zQ$xpck0j-BiiiS(;x5vWh*}>;U$$M5q9pwUMMOlnpElRKh0I$DcoMz%=RpkEzCHs! zAT8H_g+Fv(5!WL|Khm56W!x){Ieqlg<(k6MjT?QZE#K+zZ1hw?Q1RolfCQ0YZj)8j zGSyr%-nmKlo;^K~iU?POC=vj6M)9Z5Pev*J&^>U#ly$bV&vtFV>z}#&`Kl1cI(y7_ zZMAr?{IZ%F;r|GlB#F;$yjJ%g!O!UEmaP$Ea8 zX3e$~T(PnHEMZP^JyfI(C-sYoZrBh-?_tf9+qP>LhIvIu0`A19`D)xv)?S!L2vzd z!3MQ&CJR$JX$IO6)%C^Dj4~S7XgyKE{ogXNV{J}pP31KG567P8mG;(2@^435ejJpM zm4f3dN0upU9#9`k7cZ3@yO`XJBX4yMoQ}P;(6z`!emBOt!|YF+#wX#_g)wLh+g|!{ zb$n82N=iQ&e93jxa`N)(E&58lxpj$_KlZE=&!)iOU@7leYH2laVWB-9W8L5ENocn4 zTSZ;LUn@R_*F8z_UG+1$L&wKQ2mhQudgg>BbT}_ReHu->ba>Mei_@)OZuKaJGxGB{ z!zudzQXci~$-?(Fr%%_!zBO>C+V!Lwb$_-GDMR<(y<3)=9B?HRSIA7rzVCFYk8Hp543GpcIgVJDvftOSRSW zv|6|J|GI?EOr~swwIEB2-64tAoMbNREs;`p-?Om8=QSp^w|&c2Ju&)Lm9y;jqghM5 zZ?wf^1uF=5qzls5lbQ9m46%##VS>0Aa%TJ`zrms#fyzTjaiLDRW9jL->e7V^AKrg! zVE(jN0hG9V-@XtE<}j~>yq+TWLZB~nwrokESU*HEp-~8=`sNUebw+X*+ntm9D-@zV zv4&VB%<=w*QH`WSYaU0Oket-*0(!wsx} zxUf?1(4n@Q-TH`&{U94rRDApP4RU+_=jEZ%tLU{X=FaT_z${0Q;{1MHR-MLjWu_!s zfw^lvson2d+JM23Cb(saR#_YzeRShCZ`&41@hj7JvU(Md%$q*CR>wn!PM-TSfw5bA z=6s=rgmKsw*`=QhFz`gde=>YxU0ze*!rRD#8$86DaoOUN4u8Gwz=7_fDF6?esB>)M z#X_TLk)s(}OCFVZ$@$&l_roIf7isErEH;Ol5kl zlVJ1&IIZm3iRTIH!cHrG19y7EO-Nr>AixHhKE8 zSX<}^*gXom#;9-Xt=-q3JUM^@xIvR95qAq^PFTvLg8GfZ_ds*<_K=dVK!(yF$3^PW zp&gXDSA_6I9B}qLc^YdLze;YhDF?H|U`F;kQ#n!BNOQ{F-{4Za*QS&D3u-}#8f%II zN3a$Od^bXuq<4wA%#!uhj*0HV|7=NY60}2jEs~Wbm~?K+{#Nm@56GuTAq}YocudFg z3w27FjzD~7^4D-WXn3VPhPk0@j`z%_7nEs-i9h@|V!ZCa0WyfDY-qtym}aY1 z-{Cyocc=!4l7<7gcOEOHjegItXKEo<#O7eR=oGDgNnFb5}iG+W!l&_8E z$p!G&`e+AV@!pbSCk*YdQMx4wjIe7|5pS+P1H~9ucNMiv(DrphFohtq1vBqMm~`Q! z$|;c(&%6;v0-4-!AsYSaYAP9f@%8u%5??0JMf=E~Vd%Y%Sd?_`T>S2`fM_E|b)}bq z*1y6g!e?vWP0{=D5^Mm4rZm$cs9}8S$-&y@=V=kPths_>Xs>d>aOIG6!5dfC)hvH{ z!B?c$_SVt14u20_Lr#*muc~T=khCQ>2G)JrDdrDshg*ZFuv^Z2d~yAHHOI?tb{D8q z`b<6(z*{E+z|;;_Xc(~Oq|thO_>rdMBLU&4Na)>zXw4+caUZ(-sl;{`K_JCWDC2LG zu~$J4fx*1SZMN~va!(PVBu#H#e*VdWnJ=VQCR*Pubnx-%FOrC0izA{Ap(YOjMMEH$ zGbe4ksp?gDThaNnq*}EU#iJoJweQMR}K(F>3&gMC9F3jk=J z@XCy)Owa@xg}WGmmeAJ4WlKh+tBZ>jLDB;HAQVOO4??T0m)DVuNbBx@6M#3NR14k~ zA0I6W0P%;?4x6iFlHh<4-wbB`2Aqj4y=88cZZcrqD06mjTByR zlkPKS0m_)2qYb|$w`=s<=|iz!9H$d%!<)&fJwV6J=C19m$&46g~~*Yl<|M5tv3+gQ#D zHUZ-`hxFMy$av}dKsw7Jo*T3GAsjq9jQEoV12Ts)Z!WhLXpa1~4qA@enB~(etm@HWr{5t#A_5ll^X_1bIo$={A;$L3`H;|rb{ zbFido29wrdGXssDKDe=vG@>L-OM8JFhLK$m#Plames0J-qPro}eYbyIttcNjfo^E^ zIJv?bqs#SaZ1X;e>Qkm&m@8_YpP$bxtNEfuePOP)MOqD5hnP!?;j&%(s1yShDbqq&AWr3Ok=5i-tez%dlIV*ZBR8e6C*>~UzKv*?HJBz( zMNv&WO7rPu*Ni$Th9@WWH={Q9d+hr=)^&29tvJA}k=_UmQTJP4uX2X>5U>({`KqX> zL~q&Bl{2;P%$aRMc0*l716T_dc+d$#AC-C z{Fe`Z!RA!K1Y}a==zD|v001{ov)Yn}t|JtZ74Ezem0HR2?Fqh~zd4=RrzpUpX#)(j zN6e)AjG@+WXJ8-rX*3ApL3QO1XD0VKyYgF)A7q3u^yno__5A>l(={F+7wu2-X+Lab z?AK4vwo8G)2w}|V_MP;F*hAbBcKPz>JBfviZf6MvoMOTBqI!ev?; z7~fEPL$nz(2~T(nIScYvAT?jcoSQY~{uko=XMjF+S^;mmoaEwv3J9yV=z$`J8{uB5 zsiC2>#^Q4cMT#d^${61|T|GU4B~Yjmn>wO&GzX}#Jioy~#%xWYTI~oLL6-ROWqAAwY zd4Ph7#dT=!py7@EI6kbSSF@td36oo&9W&3vY?L4~k1$Dp?Hz^~2IXkfm>xf_0$Pxl z!>DN={WGV9wsKWGAl>gKeBnX|X~z5qYIc3tQ|Yo~aLl%aq(QevE@%o$3gatvzYGW` z7u!r>!e2lh9?PP$lYuLzBOpRgF~d0imYC%5ri=JhCNZyHmyXAR_7C^&rkJTEcX2Y1 zr9gt1!^Nq{-e~km^eoETZ_hMt`)$kn_j6@77@kT9Qu+hk{E~>_mNRDPan#V@KlpI> z>1F?p#C!Cx7wX5{xCGGd&fOE~J0IybXU+{D-D?`=qT7*NL<1x#oVjC%yRJ^VHZ@f! zq(FzD7wi7rRH^n^8pr{gi%S&@HiX+;UTCSIxWcEH6cgU`5Rkm{%Sl+HzLp9|e8d2# zsjY&k>Ivmd7|#<6Kln)dtUYZqiWbQ}2$>cZRWr1WwC|4#wwMuAx1o@wgi7&xG7y1v zU+t20Vn>Vb3y-1yyq_}8F>IJN-AZ)Ru1R9HvZ%Rs!i5wZ&B4B##8_- z?>Ci1oqfYkd3;p2`JhRce!OYN3o#vVd;N?y!&eWL$rG7Y1?v-O8+BF=(DF3{+mYxS zkkgBh5v(7JB?Z^I*Iez@<^j|=m_T5LZ%%oKq3Le)lMMNZAuX+9AgaM(XHPi+hl>-N z90#Ig8Y?G&vUVNXn5_P|%Gc`+>7g6Y7 zXO{-Lq{19I&7B9-m(Vk^$!hxCl0(OiWzo{Ad+??Pjh`tn>@%egksSTC?0H88Yvn?Sfo?SRn!`=DW(ScY3i+~D^CKG7lNncXZh*vV%!^tTR z?|4x+z$A%DFIqU6Zy+Q9yyfj#|$7;=RJ>+EfVgEk#q_|Ix?*`DUzx@kly6t%U&Z69y%n%p_D~}TSEv^ z+FNc=VlE4|N77N22M zB2qR=d=wvn#^dUu=Gm_wy5$rMRSeI#h13Y{DWLw5&aIwQ0m9gF^cpGdFn=I z=d;t&jNw{=00RE2q%=Ep7|pfDMOvPeL@7w9bf7nYrliL$0h5TMj+=l8Eeyj*!{z_f zLsI97xJxP&M9rH9%zKbCA<$E?HCyj;&G&ZF*+PlB`Gh~DrfSi&=?0^lh6;-b6XKA6 zRPX%QyH~HmM=rLuVf5I2H%494cL#I-z2YCScD2FVas+j zOT1ESp-pexy5(uyO3w;X`4!U`o*+znsEsYy5-S%X4GKcx$jO)d;(pWpG0~flR&7F* zDVd5ngAvQh3P*{+nzQ%%&6{W>dC}C;QCMzY^JeJ2Zl{%KHWBAm4SDjt^kLb~R0q5~ z;Drn~P4?!5SP^&y|9y0B>7l373Vu4bZx*s+sBg4XKytY#|L%R8=efh&NG5QozIclCwBLebZmY}`fuKmYEP?>cB=3wkQKr!*=zs1R?! z4u{bk+MKYc^5qd8c#;p0}n{Zxs3_|KI2_YpGKLvV(1aH!oa z4_*AJ4N*tCDct&XzDbFDptr^DECu}UAO6S&W6I{tnQueR0JKV8#q`wir80TA@{wL>$$JZ7DHmbLSnBQ!J6F)BRo8k-Yq3yiV7K1|CsBG zk%Kc2@uzVzovwhmB-tBZuN2VUGBqgca8N0&W!8(s=DB+6T)Smx4lm^PW%euxVI(&s z=j@VM;t&fB4ht%7h{gu_^#aueQoyQd5Nm$GT_E??p`au*bud`9daN$lv5Lyvamthp zP@20aH}HosBcDqC-{o^xNug--+}6U(nN)>s#?;PP-w_j`Inhy96$wA`mgT3;Qe{(g z<2R^8yb{SK7}jQ+4s%elUJ(U7W328}VCW}TADTFCFY`i@6zCyjt27z6GdB>hh-`|qi2Qa|RY%GIrV=R1 zLzI*o$`iqYZnvvf_Y~BBHX}!hP7>fyjB$iPgacbg9|SDwHfxp&ibe{ZD}{v}Xa{B) z56oBNz6@IWUW-Cm9Ki&^;g$s>s+%&)v@vB+V1p*Dc7bW|mtyy?XT5qBNYOfeb7;*r zKmyK^3ZU)_Fl?UF@>A3)Ye-N`%ZOhKgLXG(6eHDdEx}caI+P^1XtrULo`O4^>@Qt6 zYBn=+l;{QB&>qNK-^E2qiiwuWrtc`_NNg6XRt+PC!Pet@kT>(#%mPgzF*$(EIb32q z&&tKk1sf~QQl(i=@nepiH7o(LoR$#dVca&~uKb4|-%y4g;3Cq1-5~we0Mzv#I57N^ z7PUT$xI4&H5lI7tCoXdI0Oo#7^G0=Jwv^tv4G!njK2~L&?Z$vg!p%938B>0(lxZmu zl5#LJR^Q^)^dRGkyqBx}e&;7u1p{c5J+k|Yk@h~{)e>Zd0-sj?*LmF;o}SYwCS^Dd zO|%ahv=Pj`-0Z$rMrxT}PNx`VW;ud*D2hy6{`XJznUWlTY}^2aVi!vyAvHnb8VYiU zNQ8>)?aq%dT@=l+}I?Jro8~U;r(?ICSii`Sj_#EE=nZSGVV$<5{Wxthf4V_DD7WBbNII zLdmP;S8R67I9qJV1UH57OQ&{noHlKvNHAqI1lhy8@tylMZr(ggU@A_J(bQQf9B zP3XmAFCcP+hw0l~}@t1%8a%@!Bvha@90(}eBtMJZ!nKhNw zQCx|*$U*wzWTWR~hQ>-H1G|UsA2O7!G6V>^7-f;K2Nw2^B5N{>9Bmy{6F%hRC ztC6TjJZy#%hiM#f)@=OOzNoBX9cDK{M1C(aVt5^e>2HpYAW}1FzTU)f%Dc{;Ym0{& z9&FZ-4G>Bdl!8KuyC=j+#m(1Fe4BQtb6UsKR?C)sZ?~ad(HB~LR6UpObz4zWu{&H# z&xG>_8IZ|*mQ0rtJY*vtyr>w9k(-YM_8&|B2yUj`W93mm`*Yj$^6S>Qj-oF^{aiq{P@+?^`}>3o%&e1l=U8-ot-@?&&vwM21&TnvE**nl+E(( zxg_&{S9>P>`b!8TniLsw2cl3+T^cnJ$pN}$Wr2m58b(fAy{9Jo9B;LVsU&cqGM346 zcrQ_T09yeGwb_-^RKX(whLfqr#6)wS0n=7kP7BQ{?&m$^^S6I3yKs7=lRMol8wyOM zp!XV$;`xT) z6-!~Zy@!Ed>Y#_mwOmMDaTkD!K;x5}@RuR5YI^_@(c_>k27W6?XvdU6(y3Feh~VkG z5Ny86OAI&34Q#5s##BVVNPu=DSHr)+%VpgQ8VQ+|k@a{vIpx<@Td!}kMnKTXMg@rI z>C04zMI)ru1uUmN6XgnaX7zV^u5r56(3F87N*c!r6B@m!`}rZ;xG2n?`wwvi4O8=% z!vcD62_yXA^KFk*6%4y9Vi_F6QUT2#@7~`^o;5-uDyB^d2^-NZB2W(R!0ti|*i~?l z?knZ?FtUgGf!i~?rE&wkBkdDAg9F9WpFx3fk@&RBW*u4k=>vkpQNqbK@SC4her z5%I&qlq?Ccpyrf1tBHu0fllSsMB76VJa9rGt`OoI#w(<ml4av9;6f>souuRdrS{cf}(>^jK-7Y*uyQ)G3#|LF%zyaw#6_xeflu5fifc)-9{-;H%$$5i4`m;QI-6ZZEE^L3b54J18@m z&W6F~Y2mir!|P2QkQ3Atu}MAg8{lzB*$0pi#Um$ra2~I6jm#fY@r3aGDEDQQ9AzGK z=jr$#*Crh#gdv+0D=(e_2&JqXBIC=-FuaEX(EO)uEMWvihKgZ=2eprU`t;)#UANPZ ziD#ni1PH*3QfsLWyHPp?hIajhj-6X-hRsjzz2TvE-->0ZFpU5i!f`WRfC9{o$1G*l zuxVp@cYfG3K>P;`4Nu%yT@xM*$8!Amn1B8bfNY=RPeu!+LkKWoxcg6AT}c*|D|g?&q- z!eH4K)s!{hfaQsb8=sw75p_})74A>#$hsvI!h-#w@eT$Gp>vLlw7t>q?0m(dLG9_R z5{ZN3rc{W9H(3HXse%B?7ZzP8Ide9Pzr^Kr@7_!w`|!jJMEAvV)#p|I8}r6zeE<27 z@_9f*u+DO&psE0kT&dR5F!}ER?I)%`Eu?s%>q;EbK+qQq{-CME?gJDz5%lZb1gRleu&U09LEXLTs4IuaUPXi1p}Z~Zf?70`$a8! z(+}kb?gqP|#ug3@EbD3K+7_)ngdvQCOrijdQZ}%Eam)UGFJ8V}%R$;r4Wc>0@Fl&> zqNPi{D&7KSR1l2dRZkymGVLYuVK-0D`t90nZ{?srk#Y|WX^MSZ9A^aufDn~pWJy1@ z`{+@qnw7hVV4~iYJy!4B=fu8@In+=ry!j&wht+lIe4Lk8Q_fRz(ikm0YbjTjH{n#hkj`i6DWJ1&(TutNIQWAnfkDW7#WDMu4_cM*LZ8gMaq@nQQ+jHDTCGjwLka` z;jV`Q9>nwTxC+!2A0DC@bpKAiciQBU?G(nrgR zRoOWKc5M?8=}H?gdd4(1CH^bzmnnRy#WIK5y?>RgB-J)|c4a-kCSLWqlsQ8?l|bye|>;eB#c-%2n@i;>*do|V@WSuRZgnIdaf4P6wmc@ z;bMj87m?zCJk#io;kk(p1+mnq1$T=U!A1vzvCD)7jh!5c)YQ*IHm^F@MqjVVt3)OF z`+!V2Yetvt=31CwiR+MK;pkj?zo4MoT($n+7|LK3S;-Jltj<Lsdl(_+6FG8)%))nUJRbI)(w>_2Mr_S@YJpD+K=e1?V! z@tA^E_H>EXknqks5&!G#JhpW5-VkqjFN1JR;^KL>_1K1a?v#q2tLG)9F>I)l`}_KR zT}Y3wy?tvu$_AXg{d08qOXIkdNAvH!9HC|Dc!Z{ITujp-X?KW$)Fxa}qV?Eg6)P?* zZ`%MJ4b9Dhig{@f25@$CWtLQTCoXLiRHJX-F^5k)@H=e3@~{ zts-|{zF|4wc``O=6sJLdXgQo*U@$ymC@5*v(cvA3D21;ZRQcy*^$i0R-NNVI7PCO9 z=D*XHS(#C9g6=-|{Ya`sr{G_7+P0HAJSZn!@t_xpx zRUkie=TU&IiQ_E>)D1{yts=gSzAH)XamzTTHU`fWz$L)=>Q8FpjThT|w)l1+&ZK2T zraABN&Ys&6yS+EW>%`2#q3lFudU3@Va3dn1EUOr`pvwgfnk(6wCh42mh+iK({BLF5 z>^PwphEqoM*a#vnztqOc3PIK>e2ZWZL?YIx_@)O==o%YHzPIlz;p?d<}SGsacF(a zL+`QsQ&XM3p2Q?ekTuSe@`{slmpeOav6Hp-+OFy0(X;-&@FOczj%}fW`1;DiQA=+f z;RP)q%{3e=gZ;3>43uYza~x$}<()R^dG+R&^=z?y z(#(3FCoE`uFEwVamuI!nRAzMFFIQv?UU&6v`?9geAAOj4WWJ4~mZj}OV7=`pwOhRY zd(-jg=S~S@7p%7Xqg&YdmeCy+jdDzVQ#@~zp$$LX`G~jevrnF>pPOH3Ym*ENb*hFR zcf6lD^F*dWRn^!5_zfPFD`PIu?iFiqk9GP8tCq5^hcUx+df`V;)q@`o*w&UY_QG(gFtvmFQ)LSCGB)y!2rN*i2nhc<~$NEY?< zH85~DZf1F-KBb*P3VFKDL+5(mBw2I)r1@(u5qr3ZZAjlkut9KkaRJE43BK}|YSw6R zs(Si#N95jJ`yXESQZ|()gN-J%a83p1l>{K8y?{KJ@-8B=TX?i;$k>!?kcfGG^L4LSpoJ@8g3>>;>~r?Z3a!(=!m&#-yV8jhk`M$;MC9j26Fe0gv({nF2a1?`Z=(J9 zqSmVQ@imjR8<<70h~TzQ|M2LMApR?+5R&A+O`O=H?VoZ^OcMUgS8}E(1#t{i$L3BJ zM~Zz(PYwA!nwdmYA}IJTPll?zRiHX&lR2xnGp1cX)ZTPYp{uHfDQP zV(aVO?9?WXQhwpZTo~z!z-bA>!uxo&XpzFyXOiQf^X5zZEz(-FE`NXXQu!B&o^0Nu z7y?WKR~hxTQ!>Y*O%}hOhYZm{{TgxUjrZBaCNt6+pFTeHS8VXw^3kWul}w$jQXkEy zsT9Y2ngcFfebuO*KehD!IC4s<+ys;h4uAIi`BYmde9(((>{L?XX%OYy#x@T zULj;t09t|S$QE(qDf)62wyMgc{=(S*Ku$hsavxWpH6OkWQ9ZVG14VA4cg435TA%$- z_YiJoD+h26<^LvX7*GED|Nryv3?cuv-z8Ae=kGr_*m8GM#lQa;KG*X9{Ag62a_P + +core_portme.c - CoreMark + + + + + + + +

core_portme.c

Summary
core_portme.c
portable_mallocProvide malloc() functionality in a platform specific way.
portable_freeProvide free() functionality in a platform specific way.
TIMER_RES_DIVIDERDivider to trade off timer resolution and total time that can be measured.
start_timeThis function will be called right before starting the timed portion of the benchmark.
stop_timeThis function will be called right after ending the timed portion of the benchmark.
get_timeReturn an abstract “ticks” number that signifies time on the system.
time_in_secsConvert the value returned by get_time to seconds.
portable_initTarget specific initialization code Test for some common mistakes.
portable_finiTarget specific final code
core_start_parallelStart benchmarking in a parallel context.
core_stop_parallelStop a parallel context execution of coremark, and gather the results.
+ +

portable_malloc

void *portable_malloc(size_t size)

Provide malloc() functionality in a platform specific way.

+ +

portable_free

void portable_free(void *p)

Provide free() functionality in a platform specific way.

+ +

TIMER_RES_DIVIDER

Divider to trade off timer resolution and total time that can be measured.

Use lower values to increase resolution, but make sure that overflow does not occur.  If there are issues with the return value overflowing, increase this value.

+ +

start_time

void start_time(void)

This function will be called right before starting the timed portion of the benchmark.

Implementation may be capturing a system timer (as implemented in the example code) or zeroing some system parameters - e.g. setting the cpu clocks cycles to 0.

+ +

stop_time

void stop_time(void)

This function will be called right after ending the timed portion of the benchmark.

Implementation may be capturing a system timer (as implemented in the example code) or other system parameters - e.g. reading the current value of cpu cycles counter.

+ +

get_time

CORE_TICKS get_time(void)

Return an abstract “ticks” number that signifies time on the system.

Actual value returned may be cpu cycles, milliseconds or any other value, as long as it can be converted to seconds by time_in_secs.  This methodology is taken to accomodate any hardware or simulated platform.  The sample implementation returns millisecs by default, and the resolution is controlled by TIMER_RES_DIVIDER

+ +

time_in_secs

secs_ret time_in_secs(CORE_TICKS ticks)

Convert the value returned by get_time to seconds.

The secs_ret type is used to accomodate systems with no support for floating point.  Default implementation implemented by the EE_TICKS_PER_SEC macro above.

+ +

portable_init

void portable_init(core_portable *p,
int *argc,
char *argv[])

Target specific initialization code Test for some common mistakes.

+ +

portable_fini

void portable_fini(core_portable *p)

Target specific final code

+ +

core_start_parallel

Start benchmarking in a parallel context.

Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets.  Other implementations using MCAPI or other standards can easily be devised.

+ +

core_stop_parallel

Stop a parallel context execution of coremark, and gather the results.

Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets.  Other implementations using MCAPI or other standards can easily be devised.

+ +
+ + + + + + + + + + +
void *portable_malloc(size_t size)
Provide malloc() functionality in a platform specific way.
void portable_free(void *p)
Provide free() functionality in a platform specific way.
void start_time(void)
This function will be called right before starting the timed portion of the benchmark.
void stop_time(void)
This function will be called right after ending the timed portion of the benchmark.
CORE_TICKS get_time(void)
Return an abstract “ticks” number that signifies time on the system.
secs_ret time_in_secs(CORE_TICKS ticks)
Convert the value returned by get_time to seconds.
void portable_init(core_portable *p,
int *argc,
char *argv[])
Target specific initialization code Test for some common mistakes.
void portable_fini(core_portable *p)
Target specific final code
Divider to trade off timer resolution and total time that can be measured.
For machines that have floating point support, get number of seconds as a double.
+ + + + + + + + \ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/files/linux/core_portme-h.html b/tests/riscv-coremark/coremark/docs/html/files/linux/core_portme-h.html new file mode 100644 index 000000000..90810f13d --- /dev/null +++ b/tests/riscv-coremark/coremark/docs/html/files/linux/core_portme-h.html @@ -0,0 +1,72 @@ + + +core_portme.h - CoreMark + + + + + + + +

core_portme.h

Summary
core_portme.h
DescriptionThis file contains configuration constants required to execute on different platforms
Configuration
HAS_FLOATDefine to 1 if the platform supports floating point.
HAS_TIME_HDefine to 1 if platform has the time.h header file, and implementation of functions thereof.
USE_CLOCKDefine to 1 if platform has the time.h header file, and implementation of functions thereof.
HAS_STDIODefine to 1 if the platform has stdio.h.
HAS_PRINTFDefine to 1 if the platform has stdio.h and implements the printf function.
CORE_TICKSDefine type of return from the timing functions.
SEED_METHODDefines method to get seed values that cannot be computed at compile time.
MEM_METHODDefines method to get a block of memry.
MULTITHREADDefine for parallel execution
USE_PTHREADSample implementation for launching parallel contexts This implementation uses pthread_thread_create and pthread_join.
USE_FORKSample implementation for launching parallel contexts This implementation uses fork, waitpid, shmget,shmat and shmdt.
USE_SOCKETSample implementation for launching parallel contexts This implementation uses fork, socket, sendto and recvfrom
MAIN_HAS_NOARGCNeeded if platform does not support getting arguments to main.
MAIN_HAS_NORETURNNeeded if platform does not support returning a value from main.
Variables
default_num_contextsNumber of contexts to spawn in multicore context.
+ +

Description

This file contains configuration constants required to execute on different platforms

+ +

Configuration

+ +

HAS_FLOAT

Define to 1 if the platform supports floating point.

+ +

HAS_TIME_H

Define to 1 if platform has the time.h header file, and implementation of functions thereof.

+ +

USE_CLOCK

Define to 1 if platform has the time.h header file, and implementation of functions thereof.

+ +

HAS_STDIO

Define to 1 if the platform has stdio.h.

+ +

HAS_PRINTF

Define to 1 if the platform has stdio.h and implements the printf function.

+ +

CORE_TICKS

Define type of return from the timing functions.

+ +

SEED_METHOD

Defines method to get seed values that cannot be computed at compile time.

Valid values

SEED_ARGfrom command line.
SEED_FUNCfrom a system function.
SEED_VOLATILEfrom volatile variables.
+ +

MEM_METHOD

Defines method to get a block of memry.

Valid values

MEM_MALLOCfor platforms that implement malloc and have malloc.h.
MEM_STATICto use a static memory array.
MEM_STACKto allocate the data block on the stack (NYI).
+ +

MULTITHREAD

Define for parallel execution

Valid values

1only one context (default).
N>1will execute N copies in parallel.

Note

If this flag is defined to more then 1, an implementation for launching parallel contexts must be defined.

Two sample implementations are provided.  Use USE_PTHREAD or USE_FORK to enable them.

It is valid to have a different implementation of core_start_parallel and <core_end_parallel> in core_portme.c, to fit a particular architecture.

+ +

USE_PTHREAD

Sample implementation for launching parallel contexts This implementation uses pthread_thread_create and pthread_join.

Valid values

0Do not use pthreads API.
1Use pthreads API

Note

This flag only matters if MULTITHREAD has been defined to a value greater then 1.

+ +

USE_FORK

Sample implementation for launching parallel contexts This implementation uses fork, waitpid, shmget,shmat and shmdt.

Valid values

0Do not use fork API.
1Use fork API

Note

This flag only matters if MULTITHREAD has been defined to a value greater then 1.

+ +

USE_SOCKET

Sample implementation for launching parallel contexts This implementation uses fork, socket, sendto and recvfrom

Valid values

0Do not use fork and sockets API.
1Use fork and sockets API

Note

This flag only matters if MULTITHREAD has been defined to a value greater then 1.

+ +

MAIN_HAS_NOARGC

Needed if platform does not support getting arguments to main.

Valid values

0argc/argv to main is supported
1argc/argv to main is not supported
+ +

MAIN_HAS_NORETURN

Needed if platform does not support returning a value from main.

Valid values

0main returns an int, and return value will be 0.
1platform does not support returning a value from main
+ +

Variables

+ +

default_num_contexts

extern ee_u32 default_num_contexts

Number of contexts to spawn in multicore context.  Override this global value to change number of contexts used.

Note

This value may not be set higher then the MULTITHREAD define.

To experiment, you can set the MULTITHREAD define to the highest value expected, and use argc/argv in the portable_init to set this value from the command line.

+ +
+ + + + + + + + + + +
extern ee_u32 default_num_contexts
Number of contexts to spawn in multicore context.
Sample implementation for launching parallel contexts This implementation uses pthread_thread_create and pthread_join.
Sample implementation for launching parallel contexts This implementation uses fork, waitpid, shmget,shmat and shmdt.
Start benchmarking in a parallel context.
Define for parallel execution
void portable_init(core_portable *p,
int *argc,
char *argv[])
Target specific initialization code Test for some common mistakes.
+ + + + + + + + \ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/files/linux/core_portme-mak.html b/tests/riscv-coremark/coremark/docs/html/files/linux/core_portme-mak.html new file mode 100644 index 000000000..ffd6cbe66 --- /dev/null +++ b/tests/riscv-coremark/coremark/docs/html/files/linux/core_portme-mak.html @@ -0,0 +1,76 @@ + + +core_portme.mak - CoreMark + + + + + + + +

core_portme.mak

Summary
core_portme.mak
Variables
OUTFLAGUse this flag to define how to to get an executable (e.g -o)
CCUse this flag to define compiler to use
CFLAGSUse this flag to define compiler options.
LFLAGS_ENDDefine any libraries needed for linking or other flags that should come at the end of the link line (e.g.
PORT_SRCSPort specific source files can be added here
LOADDefine this flag if you need to load to a target, as in a cross compile environment.
RUNDefine this flag if running does not consist of simple invocation of the binary.
SEPARATE_COMPILEDefine if you need to separate compilation from link stage.
PORT_OBJSPort specific object files can be added here
Build Targets
port_prebuildGenerate any files that are needed before actual build starts.
port_postbuildGenerate any files that are needed after actual build end.
port_postrunDo platform specific after run stuff.
port_prerunDo platform specific after run stuff.
port_postloadDo platform specific after load stuff.
port_preloadDo platform specific before load stuff.
Variables
OPATH
PERLDefine perl executable to calculate the geomean if running separate.
+ +

Variables

+ +

OUTFLAG

Use this flag to define how to to get an executable (e.g -o)

+ +

CC

Use this flag to define compiler to use

+ +

CFLAGS

Use this flag to define compiler options.  Note, you can add compiler options from the command line using XCFLAGS=”other flags”

+ +

LFLAGS_END

Define any libraries needed for linking or other flags that should come at the end of the link line (e.g. linker scripts).  Note: On certain platforms, the default clock_gettime implementation is supported but requires linking of librt.

+ +

PORT_SRCS

Port specific source files can be added here

+ +

LOAD

Define this flag if you need to load to a target, as in a cross compile environment.

+ +

RUN

Define this flag if running does not consist of simple invocation of the binary.  In a cross compile environment, you need to define this.

+ +

SEPARATE_COMPILE

Define if you need to separate compilation from link stage.  In this case, you also need to define below how to create an object file, and how to link.

+ +

PORT_OBJS

Port specific object files can be added here

+ +

Build Targets

+ +

port_prebuild

Generate any files that are needed before actual build starts.  E.g. generate profile guidance files.  Sample PGO generation for gcc enabled with PGO=1

  • First, check if PGO was defined on the command line, if so, need to add -fprofile-use to compile line.
  • Second, if PGO reference has not yet been generated, add a step to the prebuild that will build a profile-generate version and run it.
NoteUsing REBUILD=1

Use make PGO=1 to invoke this sample processing.

+ +

port_postbuild

Generate any files that are needed after actual build end.  E.g. change format to srec, bin, zip in order to be able to load into flash

+ +

port_postrun

Do platform specific after run stuff.  E.g. reset the board, backup the logfiles etc.

+ +

port_prerun

Do platform specific after run stuff.  E.g. reset the board, backup the logfiles etc.

+ +

port_postload

Do platform specific after load stuff.  E.g. reset the reset power to the flash eraser

+ +

port_preload

Do platform specific before load stuff.  E.g. reset the reset power to the flash eraser

+ +

Variables

+ +

OPATH

Path to the output folder.  Defaultcurrent folder.
+ +

PERL

Define perl executable to calculate the geomean if running separate.

+ +
+ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/files/readme-txt.html b/tests/riscv-coremark/coremark/docs/html/files/readme-txt.html new file mode 100644 index 000000000..2b57f37f4 --- /dev/null +++ b/tests/riscv-coremark/coremark/docs/html/files/readme-txt.html @@ -0,0 +1,71 @@ + + +CoreMark + + + + + + + +

CoreMark

Summary
CoreMark
WelcomeCopyright © 2009 EEMBC All rights reserved.
Building and runningDownload the release files from the www.coremark.org.
DocumentationWhen you unpack the documentation (tar -vzxf coremark_<version>_docs.tgz) a docs folder will be created.
Submitting resultsCoreMark results can be submitted on the web.
Run rulesWhat is and is not allowed.
Reporting rulesHow to report results on a data sheet?
Log File FormatThe log files have the following format
LegalSee LICENSE.txt or the word document file under docs/LICENSE.doc.
CreditsMany thanks to all of the individuals who helped with the development or testing of CoreMark including (Sorted by company name)
+ +

Welcome

Copyright © 2009 EEMBC All rights reserved.  CoreMark is a trademark of EEMBC and EEMBC is a registered trademark of the Embedded Microprocessor Benchmark Consortium.

CoreMark’s primary goals are simplicity and providing a method for testing only a processor’s core features.

For more information about EEMBC’s comprehensive embedded benchmark suites, please see www.eembc.org.

+ +

Building and running

Download the release files from the www.coremark.org.  You can verify the download using the coremark_<version>.md5 file

md5sum -c coremark_<version>.md5

Unpack the distribution (tar -vzxf coremark_<version>.tgz && tar -vzxf coremark_<version>_docs.tgz) then change to the coremark_<version> folder.

To build and run the benchmark, type

make

Full results are available in the files run1.log and run2.log.  CoreMark result can be found in run1.log.

For self hosted Linux or Cygwin platforms, a simple make should work.

Cross Compile

For cross compile platforms please adjust core_portme.mak, core_portme.h (and possibly core_portme.c) according to the specific platform used.  When porting to a new platform, it is recommended to copy one of the default port folders (e.g. mkdir <platform> && cp linux/* <platform>), adjust the porting files, and run

make PORT_DIR=<platform>

Systems without make

The following files need to be compiled:

For example

gcc -O2 -o coremark.exe core_list_join.c core_main.c core_matrix.c core_state.c core_util.c simple/core_portme.c -DPERFORMANCE_RUN=1 -DITERATIONS=1000
+./coremark.exe > run1.log

The above will compile the benchmark for a performance run and 1000 iterations.  Output is redirected to run1.log.

Make targets

runDefault target, creates run1.log and run2.log.
run1.logRun the benchmark with performance parameters, and output to run1.log
run2.logRun the benchmark with validation parameters, and output to run2.log
run3.logRun the benchmark with profile generation parameters, and output to run3.log
compilecompile the benchmark executable
linklink the benchmark executable
checktest MD5 of sources that may not be modified
cleanclean temporary files

ITERATIONS

By default, the benchmark will run between 10-100 seconds.  To override, use ITERATIONS=N

make ITERATIONS=10

Will run the benchmark for 10 iterations.  It is recommended to set a specific number of iterations in certain situations e.g.:

  • Running with a simulator
  • Measuring power/energy
  • Timing cannot be restarted

Minimum required run time

Results are only valid for reporting if the benchmark ran for at least 10 secs!

XCFLAGS

To add compiler flags from the command line, use XCFLAGS e.g.

make XCFLAGS="-g -DMULTITHREAD=4 -DUSE_FORK=1"
  • CORE_DEBUG

Define to compile for a debug run if you get incorrect CRC.

make XCFLAGS="-DCORE_DEBUG=1"
  • Parallel Execution

Use XCFLAGS=-DMULTITHREAD=N where N is number of threads to run in parallel.  Several implementations are available to execute in multiple contexts, or you can implement your own in core_portme.c.

make XCFLAGS="-DMULTITHREAD=4 -DUSE_PTHREAD"

Above will compile the benchmark for execution on 4 cores, using POSIX Threads API.

REBUILD

To force rebuild, add the flag REBUILD to the command line

make REBUILD=1

Check core_portme.mak for more important options.

Run parameters for the benchmark executable

Coremark executable takes several parameters as follows (if main accepts arguments).  1st - A seed value used for initialization of data.  2nd - A seed value used for initialization of data.  3rd - A seed value used for initialization of data.  4th - Number of iterations (0 for auto : default value) 5th - Reserved for internal use.  6th - Reserved for internal use.  7th - For malloc users only, ovreride the size of the input data buffer.

The run target from make will run coremark with 2 different data initialization seeds.

Alternative parameters

If not using malloc or command line arguments are not supported, the buffer size for the algorithms must be defined via the compiler define TOTAL_DATA_SIZE.  TOTAL_DATA_SIZE must be set to 2000 bytes (default) for standard runs.  The default for such a target when testing different configurations could be ...

make XCFLAGS="-DTOTAL_DATA_SIZE=6000 -DMAIN_HAS_NOARGC=1"
+ +

Documentation

When you unpack the documentation (tar -vzxf coremark_<version>_docs.tgz) a docs folder will be created.  Check the file docs/html/index.html and the website http://www.coremark.org for more info.

+ +

Submitting results

CoreMark results can be submitted on the web.

Open a web browser and go to http://www.coremark.org- /benchmark- /index.php?pg=benchmark Select the link to add a new score and follow the instructions.

+ +

Run rules

What is and is not allowed.

Required

1The benchmark needs to run for at least 10 seconds.
2All validation must succeed for seeds 0,0,0x66 and 0x3415,0x3415,0x66, buffer size of 2000 bytes total.
  • If not using command line arguments to main:
make XCFLAGS="-DPERFORMANCE_RUN=1" REBUILD=1 run1.log
+make XCFLAGS="-DVALIDATION_RUN=1" REBUILD=1 run2.log
3If using profile guided optimization, profile must be generated using seeds of 8,8,8, and buffer size of 1200 bytes total.
make XCFLAGS="-DTOTAL_DATA_SIZE=1200 -DPROFILE_RUN=1" REBUILD=1 run3.log
4All source files must be compiled with the same flags.
5All data type sizes must match size in bits such that:
  • ee_u8 is an 8 bits datatype.
  • ee_s16 is an 16 bits datatype.
  • ee_u16 is an 16 bits datatype.
  • ee_s32 is an 32 bits datatype.
  • ee_u32 is an 32 bits datatype.

Allowed

  • Changing number of iterations
  • Changing toolchain and build/load/run options
  • Changing method of acquiring a data memory block
  • Changing the method of acquiring seed values
  • Changing implementation in core_portme.c
  • Changing configuration values in core_portme.h
  • Changing core_portme.mak

Not allowed

  • Changing of source file other then core_portme* (use make check to validate)
+ +

Reporting rules

How to report results on a data sheet?

CoreMark 1.0 : N / C [/ P] [/ M]

NNumber of iterations per second with seeds 0,0,0x66,size=2000)
CCompiler version and flags
PParameters such as data and code allocation specifics
  • This parameter may be omitted if all data was allocated on the heap in RAM.
  • This parameter may not be omitted when reporting CoreMark/MHz
MType of parallel execution (if used) and number of contexts This parameter may be omitted if parallel execution was not used.

e.g.

CoreMark 1.0 : 128 / GCC 4.1.2 -O2 -fprofile-use / Heap in TCRAM / FORK:2

or

CoreMark 1.0 : 1400 / GCC 3.4 -O4

If reporting scaling results, the results must be reported as follows

CoreMark/MHz 1.0 : N / C / P [/ M]

PWhen reporting scaling results, memory parameter must also indicate memory frequency:core frequency ratio.
  • If the core has cache and cache frequency to core frequency ratio is configurable, that must also be included.

e.g.

CoreMark/MHz 1.0 : 1.47 / GCC 4.1.2 -O2 / DDR3(Heap) 30:1 Memory 1:1 Cache
+ +

Log File Format

The log files have the following format

2K performance run parameters for coremark. (Run type)
+CoreMark Size       : 666                   (Buffer size)
+Total ticks         : 25875                 (platform dependent value)
+Total time (secs)   : 25.875000             (actual time in seconds)
+Iterations/Sec      : 3864.734300           (Performance value to report)
+Iterations          : 100000                (number of iterations used)
+Compiler version    : GCC3.4.4              (Compiler and version)
+Compiler flags      : -O2                   (Compiler and linker flags)
+Memory location     : Code in flash, data in on chip RAM
+seedcrc             : 0xe9f5                (identifier for the input seeds)
+[0]crclist          : 0xe714                (validation for list part)
+[0]crcmatrix        : 0x1fd7                (validation for matrix part)
+[0]crcstate         : 0x8e3a                (validation for state part)
+[0]crcfinal         : 0x33ff                (iteration dependent output)
+Correct operation validated. See README.md for run and reporting rules.  (*Only when run is successful*)
+CoreMark 1.0 : 6508.490622 / GCC3.4.4 -O2 / Heap                          (*Only on a successful performance run*)
+ +

Legal

See LICENSE.txt or the word document file under docs/LICENSE.doc.  For more information on your legal rights to use this benchmark, please see http://www.coremark.org- /download- /register.php?pg=register

+ +

Credits

Many thanks to all of the individuals who helped with the development or testing of CoreMark including (Sorted by company name)

  • Alan Anderson, ADI
  • Adhikary Rajiv, ADI
  • Elena Stohr, ARM
  • Ian Rickards, ARM
  • Andrew Pickard, ARM
  • Trent Parker, CAVIUM
  • Shay Gal-On, EEMBC
  • Markus Levy, EEMBC
  • Ron Olson, IBM
  • Eyal Barzilay, MIPS
  • Jens Eltze, NEC
  • Hirohiko Ono, NEC
  • Ulrich Drees, NEC
  • Frank Roscheda, NEC
  • Rob Cosaro, NXP
  • Shumpei Kawasaki, RENESAS
+ +
+ + + + + + + + + + +
This file contains the framework to acquire a block of memory, seed initial parameters, tun t he benchmark and report the results.
+ + + + + + + + diff --git a/tests/riscv-coremark/coremark/docs/html/files/release_notes-txt.html b/tests/riscv-coremark/coremark/docs/html/files/release_notes-txt.html new file mode 100644 index 000000000..6658c7141 --- /dev/null +++ b/tests/riscv-coremark/coremark/docs/html/files/release_notes-txt.html @@ -0,0 +1,56 @@ + + +Release Notes - CoreMark + + + + + + + +

Release Notes

Version: 1.01

History

Version 1.01

  • Added validation testing the sizes of datatypes.

Version 1.00

  • First public version.

Validation

This release was tested on the following platforms

  • x86 cygwin and gcc 3.4 (Quad, dual and single core systems)
  • x86 linux (Ubuntu/Fedora) and gcc (4.2/4.1) (Quad and single core systems)
  • MIPS64 BE linux and gcc 3.4 16 cores system
  • MIPS32 BE linux with CodeSourcery compiler 4.2-177 on Malta/Linux with a 1004K 3-core system
  • PPC simulator with gcc 4.2.2 (No OS)
  • PPC 64b BE linux (yellowdog) with gcc 3.4 and 4.1 (Dual core system)
  • BF533 with VDSP50
  • Renesas R8C/H8 MCU with HEW 4.05
  • NXP LPC1700 armcc v4.0.0.524
  • NEC 78K with IAR v4.61
  • ARM simulator with armcc v4

Coverage

GCOV results can be found on SVN under cover.

Memory analysis

Valgrind 3.4.0 used and no errors reported.

Balance analysis

Number of instructions executed for each function tested with cachegrind and found balanced with gcc and -O0.

Statistics

Lines

Lines  Blank  Cmnts  Source     AESL
+=====  =====  =====  =====  ==========  =======================================
+  469     66    170    251       627.5  core_list_join.c  (C)
+  330     18     54    268       670.0  core_main.c  (C)
+  256     32     80    146       365.0  core_matrix.c  (C)
+  240     16     51    186       465.0  core_state.c  (C)
+  165     11     20    134       335.0  core_util.c  (C)
+  150     23     36     98       245.0  coremark.h  (C)
+ 1610    166    411   1083      2707.5  ----- Benchmark -----  (6 files)
+  293     15     74    212       530.0  linux/core_portme.c  (C)
+  235     30    104    104       260.0  linux/core_portme.h  (C)
+  528     45    178    316       790.0  ----- Porting -----  (2 files)
+
+
+* For comparison, here are the stats for Dhrystone
+Lines  Blank  Cmnts  Source     AESL
+=====  =====  =====  =====  ==========  =======================================
+  311     15    242     54       135.0  dhry.h  (C)
+  789    132    119    553      1382.5  dhry_1.c  (C)
+  186     26     68    107       267.5  dhry_2.c  (C)
+ 1286    173    429    714      1785.0  ----- C -----  (3 files)
+ +
+ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/index.html b/tests/riscv-coremark/coremark/docs/html/index.html new file mode 100644 index 000000000..f7a88682a --- /dev/null +++ b/tests/riscv-coremark/coremark/docs/html/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/index/BuildTargets.html b/tests/riscv-coremark/coremark/docs/html/index/BuildTargets.html new file mode 100644 index 000000000..635c0ff78 --- /dev/null +++ b/tests/riscv-coremark/coremark/docs/html/index/BuildTargets.html @@ -0,0 +1,31 @@ + + +Build Target Index - CoreMark + + + + + + + +
Build Target Index
$#! · 0-9 · A · B · C · D · E · F · G · H · I · J · K · L · M · N · O · P · Q · R · S · T · U · V · W · X · Y · Z
P
 port_postbuild
 port_postload
 port_postrun
 port_prebuild
 port_preload
 port_prerun
+ +
Generate any files that are needed after actual build end.
Do platform specific after load stuff.
Do platform specific after run stuff.
Generate any files that are needed before actual build starts.
Do platform specific before load stuff.
Do platform specific after run stuff.
+ +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/index/Configuration.html b/tests/riscv-coremark/coremark/docs/html/index/Configuration.html new file mode 100644 index 000000000..8e5ef3aab --- /dev/null +++ b/tests/riscv-coremark/coremark/docs/html/index/Configuration.html @@ -0,0 +1,51 @@ + + +Configuration Index - CoreMark + + + + + + + +
Configuration Index
$#! · 0-9 · A · B · C · D · E · F · G · H · I · J · K · L · M · N · O · P · Q · R · S · T · U · V · W · X · Y · Z
C
 CORE_TICKS
H
 HAS_FLOAT
 HAS_PRINTF
 HAS_STDIO
 HAS_TIME_H
M
 MAIN_HAS_NOARGC
 MAIN_HAS_NORETURN
 MEM_METHOD
 MULTITHREAD
S
 SEED_METHOD
T
 TOTAL_DATA_SIZE
U
 USE_CLOCK
 USE_FORK
 USE_PTHREAD
 USE_SOCKET
+ +
Define type of return from the timing functions.
+ + + +
Define to 1 if the platform supports floating point.
Define to 1 if the platform has stdio.h and implements the printf function.
Define to 1 if the platform has stdio.h.
Define to 1 if platform has the time.h header file, and implementation of functions thereof.
+ + + +
Needed if platform does not support getting arguments to main.
Needed if platform does not support returning a value from main.
Defines method to get a block of memry.
Define for parallel execution
+ + + +
Defines method to get seed values that cannot be computed at compile time.
+ + + +
Define total size for data algorithms will operate on
+ + + +
Define to 1 if platform has the time.h header file, and implementation of functions thereof.
Sample implementation for launching parallel contexts This implementation uses fork, waitpid, shmget,shmat and shmdt.
Sample implementation for launching parallel contexts This implementation uses pthread_thread_create and pthread_join.
Sample implementation for launching parallel contexts This implementation uses fork, socket, sendto and recvfrom
+ +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/index/Configurations.html b/tests/riscv-coremark/coremark/docs/html/index/Configurations.html new file mode 100644 index 000000000..0faee64a0 --- /dev/null +++ b/tests/riscv-coremark/coremark/docs/html/index/Configurations.html @@ -0,0 +1,45 @@ + + +Configuration Index + + + + + + + + + +
Configuration Index
$#! · 0-9 · A · B · C · D · E · F · G · H · I · J · K · L · M · N · O · P · Q · R · S · T · U · V · W · X · Y · Z
H
 HAS_FLOAT
 HAS_STDIO
 HAS_TIME_H
M
 MEM_METHOD
S
 SEED_METHOD
T
 TOTAL_DATA_SIZE
+ +
Define to 1 if the platform supports floating point.
Define to 1 if the platform has stdio.h and implements the printf function.
Define to 1 if platform has the time.h header file, and implementation of functions thereof.
+ + + +
Defines method to get a block of memry.
+ + + +
Defines method to get seed values that cannot be computed at compile time.
+ + + +
Define total size for data algorithms will operate on
+ +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/index/Files.html b/tests/riscv-coremark/coremark/docs/html/index/Files.html new file mode 100644 index 000000000..7e6d2fa04 --- /dev/null +++ b/tests/riscv-coremark/coremark/docs/html/index/Files.html @@ -0,0 +1,35 @@ + + +File Index - CoreMark + + + + + + + +
File Index
$#! · 0-9 · A · B · C · D · E · F · G · H · I · J · K · L · M · N · O · P · Q · R · S · T · U · V · W · X · Y · Z
C
 core_list_join.c
 core_main.c
 core_matrix.c
 core_portme.c
 core_portme.h
 core_portme.mak
 core_state.c
 core_util.c
 CoreMark
 coremark.h
R
 Release Notes
+ +
This file contains the framework to acquire a block of memory, seed initial parameters, tun t he benchmark and report the results.
+ + + +
Version: 1.01
+ +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/index/Functions.html b/tests/riscv-coremark/coremark/docs/html/index/Functions.html new file mode 100644 index 000000000..a249d5186 --- /dev/null +++ b/tests/riscv-coremark/coremark/docs/html/index/Functions.html @@ -0,0 +1,55 @@ + + +Function Index - CoreMark + + + + + + + +
Function Index
$#! · 0-9 · A · B · C · D · E · F · G · H · I · J · K · L · M · N · O · P · Q · R · S · T · U · V · W · X · Y · Z
C
 cmp_complex
 cmp_idx
 core_bench_matrix
 core_bench_state
 core_init_state
 core_list_find
 core_list_init
 core_list_insert
 core_list_mergesort
 core_list_remove
 core_list_reverse
 core_list_undo_remove
 core_start_parallel
 core_state_transition
 core_stop_parallel
 crc*
G
 get_seed
 get_time
I
 iterate
M
 main
 matrix_add_const
 matrix_mul_const
 matrix_mul_matrix
 matrix_mul_matrix_bitextract
 matrix_mul_vect
 matrix_sum
 matrix_test
P
 portable_fini
 portable_free
 portable_init
 portable_malloc
S
 start_time
 stop_time
T
 time_in_secs
+ +
ee_s32 cmp_complex(list_data *a,
list_data *b,
core_results *res)
Compare the data item in a list cell.
ee_s32 cmp_idx(list_data *a,
list_data *b,
core_results *res)
Compare the idx item in a list cell, and regen the data.
ee_u16 core_bench_matrix(mat_params *p,
ee_s16 seed,
ee_u16 crc)
Benchmark function
ee_u16 core_bench_state(ee_u32 blksize,
ee_u8 *memblock,
ee_s16 seed1,
ee_s16 seed2,
ee_s16 step,
ee_u16 crc)
Benchmark function
void core_init_state(ee_u32 size,
ee_s16 seed,
ee_u8 *p)
Initialize the input data for the state machine.
list_head *core_list_find(list_head *list,
list_data *info)
Find an item in the list
list_head *core_list_init(ee_u32 blksize,
list_head *memblock,
ee_s16 seed)
Initialize list with data.
list_head *core_list_insert_new(list_head *insert_point,
list_data *info,
list_head **memblock,
list_data **datablock ,
list_head *memblock_end,
list_data *datablock_end)
Insert an item to the list
list_head *core_list_mergesort(list_head *list,
list_cmp cmp,
core_results *res)
Sort the list in place without recursion.
list_head *core_list_remove(list_head *item)
Remove an item from the list.
list_head *core_list_reverse(list_head *list)
Reverse a list
list_head *core_list_undo_remove(list_head *item_removed,
list_head *item_modified)
Undo a remove operation.
Start benchmarking in a parallel context.
enum CORE_STATE core_state_transition(ee_u8 **instr ,
ee_u32 *transition_count)
Actual state machine.
Stop a parallel context execution of coremark, and gather the results.
Service functions to calculate 16b CRC code.
+ + + +
Get a values that cannot be determined at compile time.
CORE_TICKS get_time(void)
Return an abstract “ticks” number that signifies time on the system.
+ + + +
Run the benchmark for a specified number of iterations.
+ + + +
#if MAIN_HAS_NOARGC MAIN_RETURN_TYPE main(void)
Main entry routine for the benchmark.
void matrix_add_const(ee_u32 N,
MATDAT *A,
MATDAT val)
Add a constant value to all elements of a matrix.
void matrix_mul_const(ee_u32 N,
MATRES *C,
MATDAT *A,
MATDAT val)
Multiply a matrix by a constant.
void matrix_mul_matrix(ee_u32 N,
MATRES *C,
MATDAT *A,
MATDAT *B)
Multiply a matrix by a matrix.
void matrix_mul_matrix_bitextract(ee_u32 N,
MATRES *C,
MATDAT *A,
MATDAT *B)
Multiply a matrix by a matrix, and extract some bits from the result.
void matrix_mul_vect(ee_u32 N,
MATRES *C,
MATDAT *A,
MATDAT *B)
Multiply a matrix by a vector.
ee_s16 matrix_sum(ee_u32 N,
MATRES *C,
MATDAT clipval)
Calculate a function that depends on the values of elements in the matrix.
ee_s16 matrix_test(ee_u32 N,
MATRES *C,
MATDAT *A,
MATDAT *B,
MATDAT val)
Perform matrix manipulation.
+ + + +
void portable_fini(core_portable *p)
Target specific final code
void portable_free(void *p)
Provide free() functionality in a platform specific way.
void portable_init(core_portable *p,
int *argc,
char *argv[])
Target specific initialization code Test for some common mistakes.
void *portable_malloc(size_t size)
Provide malloc() functionality in a platform specific way.
+ + + +
void start_time(void)
This function will be called right before starting the timed portion of the benchmark.
void stop_time(void)
This function will be called right after ending the timed portion of the benchmark.
+ + + +
secs_ret time_in_secs(CORE_TICKS ticks)
Convert the value returned by get_time to seconds.
+ +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/index/General.html b/tests/riscv-coremark/coremark/docs/html/index/General.html new file mode 100644 index 000000000..bd47b299f --- /dev/null +++ b/tests/riscv-coremark/coremark/docs/html/index/General.html @@ -0,0 +1,75 @@ + + +Index - CoreMark + + + + + + + +
Index
$#! · 0-9 · A · B · C · D · E · F · G · H · I · J · K · L · M · N · O · P · Q · R · S · T · U · V · W · X · Y · Z
B
 Build Targets
 Building and running
C
 CC
 CFLAGS
 cmp_complex
 cmp_idx
 Configuration
 core_bench_matrix
 core_bench_state
 core_init_state
 core_list_find
 core_list_init
 core_list_insert
 core_list_join.c
 core_list_mergesort
 core_list_remove
 core_list_reverse
 core_list_undo_remove
 core_main.c
 core_matrix.c
 core_portme.c
 core_portme.h
 core_portme.mak
 core_start_parallel
 core_state.c
 core_state_transition
 core_stop_parallel
 CORE_TICKS
 core_util.c
 CoreMark
 coremark.h
 crc*
 Credits
D
 default_num_contexts
 Description
 Documentation
F
 Functions
G
 get_seed
 get_time
H
 HAS_FLOAT
 HAS_PRINTF
 HAS_STDIO
 HAS_TIME_H
I
 iterate
L
 Legal
 LFLAGS_END
 LOAD
 Log File Format
M
 main
 MAIN_HAS_NOARGC
 MAIN_HAS_NORETURN
 matrix_add_const
 matrix_mul_const
 matrix_mul_matrix
 matrix_mul_matrix_bitextract
 matrix_mul_vect
 matrix_sum
 matrix_test
 MEM_METHOD
 MULTITHREAD
O
 OPATH
 OUTFLAG
P
 PERL
 PORT_OBJS
 port_postbuild
 port_postload
 port_postrun
 port_prebuild
 port_preload
 port_prerun
 PORT_SRCS
 portable_fini
 portable_free
 portable_init
 portable_malloc
R
 Release Notes
 Reporting rules
 RUN
 Run rules
+ +
Download the release files from the www.coremark.org.
+ + + +
Use this flag to define compiler to use
Use this flag to define compiler options.
ee_s32 cmp_complex(list_data *a,
list_data *b,
core_results *res)
Compare the data item in a list cell.
ee_s32 cmp_idx(list_data *a,
list_data *b,
core_results *res)
Compare the idx item in a list cell, and regen the data.
ee_u16 core_bench_matrix(mat_params *p,
ee_s16 seed,
ee_u16 crc)
Benchmark function
ee_u16 core_bench_state(ee_u32 blksize,
ee_u8 *memblock,
ee_s16 seed1,
ee_s16 seed2,
ee_s16 step,
ee_u16 crc)
Benchmark function
void core_init_state(ee_u32 size,
ee_s16 seed,
ee_u8 *p)
Initialize the input data for the state machine.
list_head *core_list_find(list_head *list,
list_data *info)
Find an item in the list
list_head *core_list_init(ee_u32 blksize,
list_head *memblock,
ee_s16 seed)
Initialize list with data.
list_head *core_list_insert_new(list_head *insert_point,
list_data *info,
list_head **memblock,
list_data **datablock ,
list_head *memblock_end,
list_data *datablock_end)
Insert an item to the list
list_head *core_list_mergesort(list_head *list,
list_cmp cmp,
core_results *res)
Sort the list in place without recursion.
list_head *core_list_remove(list_head *item)
Remove an item from the list.
list_head *core_list_reverse(list_head *list)
Reverse a list
list_head *core_list_undo_remove(list_head *item_removed,
list_head *item_modified)
Undo a remove operation.
This file contains the framework to acquire a block of memory, seed initial parameters, tun t he benchmark and report the results.
Start benchmarking in a parallel context.
enum CORE_STATE core_state_transition(ee_u8 **instr ,
ee_u32 *transition_count)
Actual state machine.
Stop a parallel context execution of coremark, and gather the results.
Define type of return from the timing functions.
Service functions to calculate 16b CRC code.
Many thanks to all of the individuals who helped with the development or testing of CoreMark including (Sorted by company name)
+ + + +
extern ee_u32 default_num_contexts
Number of contexts to spawn in multicore context.
Benchmark using a linked list.
When you unpack the documentation (tar -vzxf coremark_version_docs.tgz) a docs folder will be created.
+ + + + + + + +
Get a values that cannot be determined at compile time.
CORE_TICKS get_time(void)
Return an abstract “ticks” number that signifies time on the system.
+ + + +
Define to 1 if the platform supports floating point.
Define to 1 if the platform has stdio.h and implements the printf function.
Define to 1 if the platform has stdio.h.
Define to 1 if platform has the time.h header file, and implementation of functions thereof.
+ + + +
Run the benchmark for a specified number of iterations.
+ + + +
See LICENSE.txt or the word document file under docs/LICENSE.doc.
Define any libraries needed for linking or other flags that should come at the end of the link line (e.g.
Define this flag if you need to load to a target, as in a cross compile environment.
The log files have the following format
+ + + +
#if MAIN_HAS_NOARGC MAIN_RETURN_TYPE main(void)
Main entry routine for the benchmark.
Needed if platform does not support getting arguments to main.
Needed if platform does not support returning a value from main.
void matrix_add_const(ee_u32 N,
MATDAT *A,
MATDAT val)
Add a constant value to all elements of a matrix.
void matrix_mul_const(ee_u32 N,
MATRES *C,
MATDAT *A,
MATDAT val)
Multiply a matrix by a constant.
void matrix_mul_matrix(ee_u32 N,
MATRES *C,
MATDAT *A,
MATDAT *B)
Multiply a matrix by a matrix.
void matrix_mul_matrix_bitextract(ee_u32 N,
MATRES *C,
MATDAT *A,
MATDAT *B)
Multiply a matrix by a matrix, and extract some bits from the result.
void matrix_mul_vect(ee_u32 N,
MATRES *C,
MATDAT *A,
MATDAT *B)
Multiply a matrix by a vector.
ee_s16 matrix_sum(ee_u32 N,
MATRES *C,
MATDAT clipval)
Calculate a function that depends on the values of elements in the matrix.
ee_s16 matrix_test(ee_u32 N,
MATRES *C,
MATDAT *A,
MATDAT *B,
MATDAT val)
Perform matrix manipulation.
Defines method to get a block of memry.
Define for parallel execution
+ + + +
Use this flag to define how to to get an executable (e.g -o)
+ + + +
Define perl executable to calculate the geomean if running separate.
Port specific object files can be added here
Generate any files that are needed after actual build end.
Do platform specific after load stuff.
Do platform specific after run stuff.
Generate any files that are needed before actual build starts.
Do platform specific before load stuff.
Do platform specific after run stuff.
Port specific source files can be added here
void portable_fini(core_portable *p)
Target specific final code
void portable_free(void *p)
Provide free() functionality in a platform specific way.
void portable_init(core_portable *p,
int *argc,
char *argv[])
Target specific initialization code Test for some common mistakes.
void *portable_malloc(size_t size)
Provide malloc() functionality in a platform specific way.
+ + + +
Version: 1.01
How to report results on a data sheet?
Define this flag if running does not consist of simple invocation of the binary.
What is and is not allowed.
+ +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/index/General2.html b/tests/riscv-coremark/coremark/docs/html/index/General2.html new file mode 100644 index 000000000..3852ab5aa --- /dev/null +++ b/tests/riscv-coremark/coremark/docs/html/index/General2.html @@ -0,0 +1,47 @@ + + +Index - CoreMark + + + + + + + +
Index
$#! · 0-9 · A · B · C · D · E · F · G · H · I · J · K · L · M · N · O · P · Q · R · S · T · U · V · W · X · Y · Z
S
 secs_ret
 SEED_METHOD
 SEPARATE_COMPILE
 start_time
 stop_time
 Submitting results
T
 time_in_secs
 TIMER_RES_DIVIDER
 TOTAL_DATA_SIZE
 Types
U
 USE_CLOCK
 USE_FORK
 USE_PTHREAD
 USE_SOCKET
V
 Variables
W
 Welcome
+ +
For machines that have floating point support, get number of seconds as a double.
Defines method to get seed values that cannot be computed at compile time.
Define if you need to separate compilation from link stage.
void start_time(void)
This function will be called right before starting the timed portion of the benchmark.
void stop_time(void)
This function will be called right after ending the timed portion of the benchmark.
CoreMark results can be submitted on the web.
+ + + +
secs_ret time_in_secs(CORE_TICKS ticks)
Convert the value returned by get_time to seconds.
Divider to trade off timer resolution and total time that can be measured.
Define total size for data algorithms will operate on
+ + + +
Define to 1 if platform has the time.h header file, and implementation of functions thereof.
Sample implementation for launching parallel contexts This implementation uses fork, waitpid, shmget,shmat and shmdt.
Sample implementation for launching parallel contexts This implementation uses pthread_thread_create and pthread_join.
Sample implementation for launching parallel contexts This implementation uses fork, socket, sendto and recvfrom
+ + + + + + + +
Copyright © 2009 EEMBC All rights reserved.
+ +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/index/Types.html b/tests/riscv-coremark/coremark/docs/html/index/Types.html new file mode 100644 index 000000000..1f4413653 --- /dev/null +++ b/tests/riscv-coremark/coremark/docs/html/index/Types.html @@ -0,0 +1,31 @@ + + +Type Index - CoreMark + + + + + + + +
Type Index
$#! · 0-9 · A · B · C · D · E · F · G · H · I · J · K · L · M · N · O · P · Q · R · S · T · U · V · W · X · Y · Z
S
 secs_ret
+ +
For machines that have floating point support, get number of seconds as a double.
+ +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/index/Variables.html b/tests/riscv-coremark/coremark/docs/html/index/Variables.html new file mode 100644 index 000000000..8c050daef --- /dev/null +++ b/tests/riscv-coremark/coremark/docs/html/index/Variables.html @@ -0,0 +1,55 @@ + + +Variable Index - CoreMark + + + + + + + +
Variable Index
$#! · 0-9 · A · B · C · D · E · F · G · H · I · J · K · L · M · N · O · P · Q · R · S · T · U · V · W · X · Y · Z
C
 CC
 CFLAGS
D
 default_num_contexts
L
 LFLAGS_END
 LOAD
O
 OPATH
 OUTFLAG
P
 PERL
 PORT_OBJS
 PORT_SRCS
R
 RUN
S
 SEPARATE_COMPILE
+ +
Use this flag to define compiler to use
Use this flag to define compiler options.
+ + + +
extern ee_u32 default_num_contexts
Number of contexts to spawn in multicore context.
+ + + +
Define any libraries needed for linking or other flags that should come at the end of the link line (e.g.
Define this flag if you need to load to a target, as in a cross compile environment.
+ + + +
Use this flag to define how to to get an executable (e.g -o)
+ + + +
Define perl executable to calculate the geomean if running separate.
Port specific object files can be added here
Port specific source files can be added here
+ + + +
Define this flag if running does not consist of simple invocation of the binary.
+ + + +
Define if you need to separate compilation from link stage.
+ +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/javascript/main.js b/tests/riscv-coremark/coremark/docs/html/javascript/main.js new file mode 100644 index 000000000..91991f507 --- /dev/null +++ b/tests/riscv-coremark/coremark/docs/html/javascript/main.js @@ -0,0 +1,836 @@ +// This file is part of Natural Docs, which is Copyright (C) 2003-2008 Greg Valure +// Natural Docs is licensed under the GPL + + +// +// Browser Styles +// ____________________________________________________________________________ + +var agt=navigator.userAgent.toLowerCase(); +var browserType; +var browserVer; + +if (agt.indexOf("opera") != -1) + { + browserType = "Opera"; + + if (agt.indexOf("opera 7") != -1 || agt.indexOf("opera/7") != -1) + { browserVer = "Opera7"; } + else if (agt.indexOf("opera 8") != -1 || agt.indexOf("opera/8") != -1) + { browserVer = "Opera8"; } + else if (agt.indexOf("opera 9") != -1 || agt.indexOf("opera/9") != -1) + { browserVer = "Opera9"; } + } + +else if (agt.indexOf("applewebkit") != -1) + { + browserType = "Safari"; + + if (agt.indexOf("version/3") != -1) + { browserVer = "Safari3"; } + else if (agt.indexOf("safari/4") != -1) + { browserVer = "Safari2"; } + } + +else if (agt.indexOf("khtml") != -1) + { + browserType = "Konqueror"; + } + +else if (agt.indexOf("msie") != -1) + { + browserType = "IE"; + + if (agt.indexOf("msie 6") != -1) + { browserVer = "IE6"; } + else if (agt.indexOf("msie 7") != -1) + { browserVer = "IE7"; } + } + +else if (agt.indexOf("gecko") != -1) + { + browserType = "Firefox"; + + if (agt.indexOf("rv:1.7") != -1) + { browserVer = "Firefox1"; } + else if (agt.indexOf("rv:1.8)") != -1 || agt.indexOf("rv:1.8.0") != -1) + { browserVer = "Firefox15"; } + else if (agt.indexOf("rv:1.8.1") != -1) + { browserVer = "Firefox2"; } + } + + +// +// Support Functions +// ____________________________________________________________________________ + + +function GetXPosition(item) + { + var position = 0; + + if (item.offsetWidth != null) + { + while (item != document.body && item != null) + { + position += item.offsetLeft; + item = item.offsetParent; + }; + }; + + return position; + }; + + +function GetYPosition(item) + { + var position = 0; + + if (item.offsetWidth != null) + { + while (item != document.body && item != null) + { + position += item.offsetTop; + item = item.offsetParent; + }; + }; + + return position; + }; + + +function MoveToPosition(item, x, y) + { + // Opera 5 chokes on the px extension, so it can use the Microsoft one instead. + + if (item.style.left != null) + { + item.style.left = x + "px"; + item.style.top = y + "px"; + } + else if (item.style.pixelLeft != null) + { + item.style.pixelLeft = x; + item.style.pixelTop = y; + }; + }; + + +// +// Menu +// ____________________________________________________________________________ + + +function ToggleMenu(id) + { + if (!window.document.getElementById) + { return; }; + + var display = window.document.getElementById(id).style.display; + + if (display == "none") + { display = "block"; } + else + { display = "none"; } + + window.document.getElementById(id).style.display = display; + } + +function HideAllBut(ids, max) + { + if (document.getElementById) + { + ids.sort( function(a,b) { return a - b; } ); + var number = 1; + + while (number < max) + { + if (ids.length > 0 && number == ids[0]) + { ids.shift(); } + else + { + document.getElementById("MGroupContent" + number).style.display = "none"; + }; + + number++; + }; + }; + } + + +// +// Tooltips +// ____________________________________________________________________________ + + +var tooltipTimer = 0; + +function ShowTip(event, tooltipID, linkID) + { + if (tooltipTimer) + { clearTimeout(tooltipTimer); }; + + var docX = event.clientX + window.pageXOffset; + var docY = event.clientY + window.pageYOffset; + + var showCommand = "ReallyShowTip('" + tooltipID + "', '" + linkID + "', " + docX + ", " + docY + ")"; + + tooltipTimer = setTimeout(showCommand, 1000); + } + +function ReallyShowTip(tooltipID, linkID, docX, docY) + { + tooltipTimer = 0; + + var tooltip; + var link; + + if (document.getElementById) + { + tooltip = document.getElementById(tooltipID); + link = document.getElementById(linkID); + } +/* else if (document.all) + { + tooltip = eval("document.all['" + tooltipID + "']"); + link = eval("document.all['" + linkID + "']"); + } +*/ + if (tooltip) + { + var left = GetXPosition(link); + var top = GetYPosition(link); + top += link.offsetHeight; + + + // The fallback method is to use the mouse X and Y relative to the document. We use a separate if and test if its a number + // in case some browser snuck through the above if statement but didn't support everything. + + if (!isFinite(top) || top == 0) + { + left = docX; + top = docY; + } + + // Some spacing to get it out from under the cursor. + + top += 10; + + // Make sure the tooltip doesnt get smushed by being too close to the edge, or in some browsers, go off the edge of the + // page. We do it here because Konqueror does get offsetWidth right even if it doesnt get the positioning right. + + if (tooltip.offsetWidth != null) + { + var width = tooltip.offsetWidth; + var docWidth = document.body.clientWidth; + + if (left + width > docWidth) + { left = docWidth - width - 1; } + + // If there's a horizontal scroll bar we could go past zero because it's using the page width, not the window width. + if (left < 0) + { left = 0; }; + } + + MoveToPosition(tooltip, left, top); + tooltip.style.visibility = "visible"; + } + } + +function HideTip(tooltipID) + { + if (tooltipTimer) + { + clearTimeout(tooltipTimer); + tooltipTimer = 0; + } + + var tooltip; + + if (document.getElementById) + { tooltip = document.getElementById(tooltipID); } + else if (document.all) + { tooltip = eval("document.all['" + tooltipID + "']"); } + + if (tooltip) + { tooltip.style.visibility = "hidden"; } + } + + +// +// Blockquote fix for IE +// ____________________________________________________________________________ + + +function NDOnLoad() + { + if (browserVer == "IE6") + { + var scrollboxes = document.getElementsByTagName('blockquote'); + + if (scrollboxes.item(0)) + { + NDDoResize(); + window.onresize=NDOnResize; + }; + }; + }; + + +var resizeTimer = 0; + +function NDOnResize() + { + if (resizeTimer != 0) + { clearTimeout(resizeTimer); }; + + resizeTimer = setTimeout(NDDoResize, 250); + }; + + +function NDDoResize() + { + var scrollboxes = document.getElementsByTagName('blockquote'); + + var i; + var item; + + i = 0; + while (item = scrollboxes.item(i)) + { + item.style.width = 100; + i++; + }; + + i = 0; + while (item = scrollboxes.item(i)) + { + item.style.width = item.parentNode.offsetWidth; + i++; + }; + + clearTimeout(resizeTimer); + resizeTimer = 0; + } + + + +/* ________________________________________________________________________________________________________ + + Class: SearchPanel + ________________________________________________________________________________________________________ + + A class handling everything associated with the search panel. + + Parameters: + + name - The name of the global variable that will be storing this instance. Is needed to be able to set timeouts. + mode - The mode the search is going to work in. Pass CommandLineOption()>, so the + value will be something like "HTML" or "FramedHTML". + + ________________________________________________________________________________________________________ +*/ + + +function SearchPanel(name, mode, resultsPath) + { + if (!name || !mode || !resultsPath) + { alert("Incorrect parameters to SearchPanel."); }; + + + // Group: Variables + // ________________________________________________________________________ + + /* + var: name + The name of the global variable that will be storing this instance of the class. + */ + this.name = name; + + /* + var: mode + The mode the search is going to work in, such as "HTML" or "FramedHTML". + */ + this.mode = mode; + + /* + var: resultsPath + The relative path from the current HTML page to the results page directory. + */ + this.resultsPath = resultsPath; + + /* + var: keyTimeout + The timeout used between a keystroke and when a search is performed. + */ + this.keyTimeout = 0; + + /* + var: keyTimeoutLength + The length of in thousandths of a second. + */ + this.keyTimeoutLength = 500; + + /* + var: lastSearchValue + The last search string executed, or an empty string if none. + */ + this.lastSearchValue = ""; + + /* + var: lastResultsPage + The last results page. The value is only relevant if is set. + */ + this.lastResultsPage = ""; + + /* + var: deactivateTimeout + + The timeout used between when a control is deactivated and when the entire panel is deactivated. Is necessary + because a control may be deactivated in favor of another control in the same panel, in which case it should stay + active. + */ + this.deactivateTimout = 0; + + /* + var: deactivateTimeoutLength + The length of in thousandths of a second. + */ + this.deactivateTimeoutLength = 200; + + + + + // Group: DOM Elements + // ________________________________________________________________________ + + + // Function: DOMSearchField + this.DOMSearchField = function() + { return document.getElementById("MSearchField"); }; + + // Function: DOMSearchType + this.DOMSearchType = function() + { return document.getElementById("MSearchType"); }; + + // Function: DOMPopupSearchResults + this.DOMPopupSearchResults = function() + { return document.getElementById("MSearchResults"); }; + + // Function: DOMPopupSearchResultsWindow + this.DOMPopupSearchResultsWindow = function() + { return document.getElementById("MSearchResultsWindow"); }; + + // Function: DOMSearchPanel + this.DOMSearchPanel = function() + { return document.getElementById("MSearchPanel"); }; + + + + + // Group: Event Handlers + // ________________________________________________________________________ + + + /* + Function: OnSearchFieldFocus + Called when focus is added or removed from the search field. + */ + this.OnSearchFieldFocus = function(isActive) + { + this.Activate(isActive); + }; + + + /* + Function: OnSearchFieldChange + Called when the content of the search field is changed. + */ + this.OnSearchFieldChange = function() + { + if (this.keyTimeout) + { + clearTimeout(this.keyTimeout); + this.keyTimeout = 0; + }; + + var searchValue = this.DOMSearchField().value.replace(/ +/g, ""); + + if (searchValue != this.lastSearchValue) + { + if (searchValue != "") + { + this.keyTimeout = setTimeout(this.name + ".Search()", this.keyTimeoutLength); + } + else + { + if (this.mode == "HTML") + { this.DOMPopupSearchResultsWindow().style.display = "none"; }; + this.lastSearchValue = ""; + }; + }; + }; + + + /* + Function: OnSearchTypeFocus + Called when focus is added or removed from the search type. + */ + this.OnSearchTypeFocus = function(isActive) + { + this.Activate(isActive); + }; + + + /* + Function: OnSearchTypeChange + Called when the search type is changed. + */ + this.OnSearchTypeChange = function() + { + var searchValue = this.DOMSearchField().value.replace(/ +/g, ""); + + if (searchValue != "") + { + this.Search(); + }; + }; + + + + // Group: Action Functions + // ________________________________________________________________________ + + + /* + Function: CloseResultsWindow + Closes the results window. + */ + this.CloseResultsWindow = function() + { + this.DOMPopupSearchResultsWindow().style.display = "none"; + this.Activate(false, true); + }; + + + /* + Function: Search + Performs a search. + */ + this.Search = function() + { + this.keyTimeout = 0; + + var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + var searchTopic = this.DOMSearchType().value; + + var pageExtension = searchValue.substr(0,1); + + if (pageExtension.match(/^[a-z]/i)) + { pageExtension = pageExtension.toUpperCase(); } + else if (pageExtension.match(/^[0-9]/)) + { pageExtension = 'Numbers'; } + else + { pageExtension = "Symbols"; }; + + var resultsPage; + var resultsPageWithSearch; + var hasResultsPage; + + // indexSectionsWithContent is defined in searchdata.js + if (indexSectionsWithContent[searchTopic][pageExtension] == true) + { + resultsPage = this.resultsPath + '/' + searchTopic + pageExtension + '.html'; + resultsPageWithSearch = resultsPage+'?'+escape(searchValue); + hasResultsPage = true; + } + else + { + resultsPage = this.resultsPath + '/NoResults.html'; + resultsPageWithSearch = resultsPage; + hasResultsPage = false; + }; + + var resultsFrame; + if (this.mode == "HTML") + { resultsFrame = window.frames.MSearchResults; } + else if (this.mode == "FramedHTML") + { resultsFrame = window.top.frames['Content']; }; + + + if (resultsPage != this.lastResultsPage || + + // Bug in IE. If everything becomes hidden in a run, none of them will be able to be reshown in the next for some + // reason. It counts the right number of results, and you can even read the display as "block" after setting it, but it + // just doesn't work in IE 6 or IE 7. So if we're on the right page but the previous search had no results, reload the + // page anyway to get around the bug. + (browserType == "IE" && hasResultsPage && + (!resultsFrame.searchResults || resultsFrame.searchResults.lastMatchCount == 0)) ) + + { + resultsFrame.location.href = resultsPageWithSearch; + } + + // So if the results page is right and there's no IE bug, reperform the search on the existing page. We have to check if there + // are results because NoResults.html doesn't have any JavaScript, and it would be useless to do anything on that page even + // if it did. + else if (hasResultsPage) + { + // We need to check if this exists in case the frame is present but didn't finish loading. + if (resultsFrame.searchResults) + { resultsFrame.searchResults.Search(searchValue); } + + // Otherwise just reload instead of waiting. + else + { resultsFrame.location.href = resultsPageWithSearch; }; + }; + + + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + + if (this.mode == "HTML" && domPopupSearchResultsWindow.style.display != "block") + { + var domSearchType = this.DOMSearchType(); + + var left = GetXPosition(domSearchType); + var top = GetYPosition(domSearchType) + domSearchType.offsetHeight; + + MoveToPosition(domPopupSearchResultsWindow, left, top); + domPopupSearchResultsWindow.style.display = 'block'; + }; + + + this.lastSearchValue = searchValue; + this.lastResultsPage = resultsPage; + }; + + + + // Group: Activation Functions + // Functions that handle whether the entire panel is active or not. + // ________________________________________________________________________ + + + /* + Function: Activate + + Activates or deactivates the search panel, resetting things to their default values if necessary. You can call this on every + control's OnBlur() and it will handle not deactivating the entire panel when focus is just switching between them transparently. + + Parameters: + + isActive - Whether you're activating or deactivating the panel. + ignoreDeactivateDelay - Set if you're positive the action will deactivate the panel and thus want to skip the delay. + */ + this.Activate = function(isActive, ignoreDeactivateDelay) + { + // We want to ignore isActive being false while the results window is open. + if (isActive || (this.mode == "HTML" && this.DOMPopupSearchResultsWindow().style.display == "block")) + { + if (this.inactivateTimeout) + { + clearTimeout(this.inactivateTimeout); + this.inactivateTimeout = 0; + }; + + this.DOMSearchPanel().className = 'MSearchPanelActive'; + + var searchField = this.DOMSearchField(); + + if (searchField.value == 'Search') + { searchField.value = ""; } + } + else if (!ignoreDeactivateDelay) + { + this.inactivateTimeout = setTimeout(this.name + ".InactivateAfterTimeout()", this.inactivateTimeoutLength); + } + else + { + this.InactivateAfterTimeout(); + }; + }; + + + /* + Function: InactivateAfterTimeout + + Called by , which is set by . Inactivation occurs on a timeout because a control may + receive OnBlur() when focus is really transferring to another control in the search panel. In this case we don't want to + actually deactivate the panel because not only would that cause a visible flicker but it could also reset the search value. + So by doing it on a timeout instead, there's a short period where the second control's OnFocus() can cancel the deactivation. + */ + this.InactivateAfterTimeout = function() + { + this.inactivateTimeout = 0; + + this.DOMSearchPanel().className = 'MSearchPanelInactive'; + this.DOMSearchField().value = "Search"; + + this.lastSearchValue = ""; + this.lastResultsPage = ""; + }; + }; + + + + +/* ________________________________________________________________________________________________________ + + Class: SearchResults + _________________________________________________________________________________________________________ + + The class that handles everything on the search results page. + _________________________________________________________________________________________________________ +*/ + + +function SearchResults(name, mode) + { + /* + var: mode + The mode the search is going to work in, such as "HTML" or "FramedHTML". + */ + this.mode = mode; + + /* + var: lastMatchCount + The number of matches from the last run of . + */ + this.lastMatchCount = 0; + + + /* + Function: Toggle + Toggles the visibility of the passed element ID. + */ + this.Toggle = function(id) + { + if (this.mode == "FramedHTML") + { return; }; + + var parentElement = document.getElementById(id); + + var element = parentElement.firstChild; + + while (element && element != parentElement) + { + if (element.nodeName == 'DIV' && element.className == 'ISubIndex') + { + if (element.style.display == 'block') + { element.style.display = "none"; } + else + { element.style.display = 'block'; } + }; + + if (element.nodeName == 'DIV' && element.hasChildNodes()) + { element = element.firstChild; } + else if (element.nextSibling) + { element = element.nextSibling; } + else + { + do + { + element = element.parentNode; + } + while (element && element != parentElement && !element.nextSibling); + + if (element && element != parentElement) + { element = element.nextSibling; }; + }; + }; + }; + + + /* + Function: Search + + Searches for the passed string. If there is no parameter, it takes it from the URL query. + + Always returns true, since other documents may try to call it and that may or may not be possible. + */ + this.Search = function(search) + { + if (!search) + { + search = window.location.search; + search = search.substring(1); // Remove the leading ? + search = unescape(search); + }; + + search = search.replace(/^ +/, ""); + search = search.replace(/ +$/, ""); + search = search.toLowerCase(); + + if (search.match(/[^a-z0-9]/)) // Just a little speedup so it doesn't have to go through the below unnecessarily. + { + search = search.replace(/\_/g, "_und"); + search = search.replace(/\ +/gi, "_spc"); + search = search.replace(/\~/g, "_til"); + search = search.replace(/\!/g, "_exc"); + search = search.replace(/\@/g, "_att"); + search = search.replace(/\#/g, "_num"); + search = search.replace(/\$/g, "_dol"); + search = search.replace(/\%/g, "_pct"); + search = search.replace(/\^/g, "_car"); + search = search.replace(/\&/g, "_amp"); + search = search.replace(/\*/g, "_ast"); + search = search.replace(/\(/g, "_lpa"); + search = search.replace(/\)/g, "_rpa"); + search = search.replace(/\-/g, "_min"); + search = search.replace(/\+/g, "_plu"); + search = search.replace(/\=/g, "_equ"); + search = search.replace(/\{/g, "_lbc"); + search = search.replace(/\}/g, "_rbc"); + search = search.replace(/\[/g, "_lbk"); + search = search.replace(/\]/g, "_rbk"); + search = search.replace(/\:/g, "_col"); + search = search.replace(/\;/g, "_sco"); + search = search.replace(/\"/g, "_quo"); + search = search.replace(/\'/g, "_apo"); + search = search.replace(/\/g, "_ran"); + search = search.replace(/\,/g, "_com"); + search = search.replace(/\./g, "_per"); + search = search.replace(/\?/g, "_que"); + search = search.replace(/\//g, "_sla"); + search = search.replace(/[^a-z0-9\_]i/gi, "_zzz"); + }; + + var resultRows = document.getElementsByTagName("div"); + var matches = 0; + + var i = 0; + while (i < resultRows.length) + { + var row = resultRows.item(i); + + if (row.className == "SRResult") + { + var rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); + + if (search.length <= rowMatchName.length && rowMatchName.substr(0, search.length) == search) + { + row.style.display = "block"; + matches++; + } + else + { row.style.display = "none"; }; + }; + + i++; + }; + + document.getElementById("Searching").style.display="none"; + + if (matches == 0) + { document.getElementById("NoMatches").style.display="block"; } + else + { document.getElementById("NoMatches").style.display="none"; } + + this.lastMatchCount = matches; + + return true; + }; + }; + diff --git a/tests/riscv-coremark/coremark/docs/html/javascript/searchdata.js b/tests/riscv-coremark/coremark/docs/html/javascript/searchdata.js new file mode 100644 index 000000000..901318e77 --- /dev/null +++ b/tests/riscv-coremark/coremark/docs/html/javascript/searchdata.js @@ -0,0 +1,212 @@ +var indexSectionsWithContent = { + "General": { + "Symbols": false, + "Numbers": false, + "A": false, + "B": false, + "C": true, + "D": true, + "E": false, + "F": true, + "G": true, + "H": false, + "I": true, + "J": false, + "K": false, + "L": false, + "M": true, + "N": false, + "O": false, + "P": false, + "Q": false, + "R": false, + "S": true, + "T": true, + "U": false, + "V": false, + "W": false, + "X": false, + "Y": false, + "Z": false + }, + "Variables": { + "Symbols": false, + "Numbers": false, + "A": false, + "B": false, + "C": true, + "D": true, + "E": false, + "F": false, + "G": false, + "H": false, + "I": false, + "J": false, + "K": false, + "L": true, + "M": false, + "N": false, + "O": true, + "P": true, + "Q": false, + "R": true, + "S": true, + "T": false, + "U": false, + "V": false, + "W": false, + "X": false, + "Y": false, + "Z": false + }, + "Functions": { + "Symbols": false, + "Numbers": false, + "A": false, + "B": false, + "C": true, + "D": false, + "E": false, + "F": false, + "G": true, + "H": false, + "I": true, + "J": false, + "K": false, + "L": false, + "M": true, + "N": false, + "O": false, + "P": true, + "Q": false, + "R": false, + "S": true, + "T": true, + "U": false, + "V": false, + "W": false, + "X": false, + "Y": false, + "Z": false + }, + "Files": { + "Symbols": false, + "Numbers": false, + "A": false, + "B": false, + "C": true, + "D": false, + "E": false, + "F": false, + "G": false, + "H": false, + "I": false, + "J": false, + "K": false, + "L": false, + "M": false, + "N": false, + "O": false, + "P": false, + "Q": false, + "R": true, + "S": false, + "T": false, + "U": false, + "V": false, + "W": false, + "X": false, + "Y": false, + "Z": false + }, + "Configuration": { + "Symbols": false, + "Numbers": false, + "A": false, + "B": false, + "C": true, + "D": false, + "E": false, + "F": false, + "G": false, + "H": true, + "I": false, + "J": false, + "K": false, + "L": false, + "M": true, + "N": false, + "O": false, + "P": false, + "Q": false, + "R": false, + "S": true, + "T": true, + "U": true, + "V": false, + "W": false, + "X": false, + "Y": false, + "Z": false + }, + "Types": { + "Symbols": false, + "Numbers": false, + "A": false, + "B": false, + "C": false, + "D": false, + "E": false, + "F": false, + "G": false, + "H": false, + "I": false, + "J": false, + "K": false, + "L": false, + "M": false, + "N": false, + "O": false, + "P": false, + "Q": false, + "R": false, + "S": true, + "T": false, + "U": false, + "V": false, + "W": false, + "X": false, + "Y": false, + "Z": false + }, + "BuildTargets": { + "Symbols": false, + "Numbers": false, + "A": false, + "B": false, + "C": false, + "D": false, + "E": false, + "F": false, + "G": false, + "H": false, + "I": false, + "J": false, + "K": false, + "L": false, + "M": false, + "N": false, + "O": false, + "P": true, + "Q": false, + "R": false, + "S": false, + "T": false, + "U": false, + "V": false, + "W": false, + "X": false, + "Y": false, + "Z": false + } + } \ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/BuildTargetsP.html b/tests/riscv-coremark/coremark/docs/html/search/BuildTargetsP.html new file mode 100644 index 000000000..65e741d65 --- /dev/null +++ b/tests/riscv-coremark/coremark/docs/html/search/BuildTargetsP.html @@ -0,0 +1,18 @@ + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/ConfigurationC.html b/tests/riscv-coremark/coremark/docs/html/search/ConfigurationC.html new file mode 100644 index 000000000..84b49ca3a --- /dev/null +++ b/tests/riscv-coremark/coremark/docs/html/search/ConfigurationC.html @@ -0,0 +1,18 @@ + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/ConfigurationH.html b/tests/riscv-coremark/coremark/docs/html/search/ConfigurationH.html new file mode 100644 index 000000000..3b0c39213 --- /dev/null +++ b/tests/riscv-coremark/coremark/docs/html/search/ConfigurationH.html @@ -0,0 +1,18 @@ + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/ConfigurationM.html b/tests/riscv-coremark/coremark/docs/html/search/ConfigurationM.html new file mode 100644 index 000000000..022606fa2 --- /dev/null +++ b/tests/riscv-coremark/coremark/docs/html/search/ConfigurationM.html @@ -0,0 +1,18 @@ + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/ConfigurationS.html b/tests/riscv-coremark/coremark/docs/html/search/ConfigurationS.html new file mode 100644 index 000000000..d26de19b9 --- /dev/null +++ b/tests/riscv-coremark/coremark/docs/html/search/ConfigurationS.html @@ -0,0 +1,18 @@ + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/ConfigurationT.html b/tests/riscv-coremark/coremark/docs/html/search/ConfigurationT.html new file mode 100644 index 000000000..183daf1ee --- /dev/null +++ b/tests/riscv-coremark/coremark/docs/html/search/ConfigurationT.html @@ -0,0 +1,18 @@ + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/ConfigurationU.html b/tests/riscv-coremark/coremark/docs/html/search/ConfigurationU.html new file mode 100644 index 000000000..d9b46a52d --- /dev/null +++ b/tests/riscv-coremark/coremark/docs/html/search/ConfigurationU.html @@ -0,0 +1,18 @@ + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/ConfigurationsH.html b/tests/riscv-coremark/coremark/docs/html/search/ConfigurationsH.html new file mode 100644 index 000000000..ade2ab757 --- /dev/null +++ b/tests/riscv-coremark/coremark/docs/html/search/ConfigurationsH.html @@ -0,0 +1,20 @@ + + + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/ConfigurationsM.html b/tests/riscv-coremark/coremark/docs/html/search/ConfigurationsM.html new file mode 100644 index 000000000..baa189221 --- /dev/null +++ b/tests/riscv-coremark/coremark/docs/html/search/ConfigurationsM.html @@ -0,0 +1,20 @@ + + + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/ConfigurationsS.html b/tests/riscv-coremark/coremark/docs/html/search/ConfigurationsS.html new file mode 100644 index 000000000..ceb8abf51 --- /dev/null +++ b/tests/riscv-coremark/coremark/docs/html/search/ConfigurationsS.html @@ -0,0 +1,20 @@ + + + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/ConfigurationsT.html b/tests/riscv-coremark/coremark/docs/html/search/ConfigurationsT.html new file mode 100644 index 000000000..ef138108f --- /dev/null +++ b/tests/riscv-coremark/coremark/docs/html/search/ConfigurationsT.html @@ -0,0 +1,20 @@ + + + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/FilesC.html b/tests/riscv-coremark/coremark/docs/html/search/FilesC.html new file mode 100644 index 000000000..e2b01c4b1 --- /dev/null +++ b/tests/riscv-coremark/coremark/docs/html/search/FilesC.html @@ -0,0 +1,18 @@ + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/FilesR.html b/tests/riscv-coremark/coremark/docs/html/search/FilesR.html new file mode 100644 index 000000000..6202fb7c7 --- /dev/null +++ b/tests/riscv-coremark/coremark/docs/html/search/FilesR.html @@ -0,0 +1,18 @@ + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/FunctionsC.html b/tests/riscv-coremark/coremark/docs/html/search/FunctionsC.html new file mode 100644 index 000000000..43993db85 --- /dev/null +++ b/tests/riscv-coremark/coremark/docs/html/search/FunctionsC.html @@ -0,0 +1,18 @@ + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/FunctionsG.html b/tests/riscv-coremark/coremark/docs/html/search/FunctionsG.html new file mode 100644 index 000000000..217e8540b --- /dev/null +++ b/tests/riscv-coremark/coremark/docs/html/search/FunctionsG.html @@ -0,0 +1,18 @@ + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/FunctionsI.html b/tests/riscv-coremark/coremark/docs/html/search/FunctionsI.html new file mode 100644 index 000000000..f17354d65 --- /dev/null +++ b/tests/riscv-coremark/coremark/docs/html/search/FunctionsI.html @@ -0,0 +1,18 @@ + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/FunctionsM.html b/tests/riscv-coremark/coremark/docs/html/search/FunctionsM.html new file mode 100644 index 000000000..345e2ba83 --- /dev/null +++ b/tests/riscv-coremark/coremark/docs/html/search/FunctionsM.html @@ -0,0 +1,18 @@ + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/FunctionsP.html b/tests/riscv-coremark/coremark/docs/html/search/FunctionsP.html new file mode 100644 index 000000000..c4b9d2dbe --- /dev/null +++ b/tests/riscv-coremark/coremark/docs/html/search/FunctionsP.html @@ -0,0 +1,18 @@ + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/FunctionsS.html b/tests/riscv-coremark/coremark/docs/html/search/FunctionsS.html new file mode 100644 index 000000000..33dfa5fa4 --- /dev/null +++ b/tests/riscv-coremark/coremark/docs/html/search/FunctionsS.html @@ -0,0 +1,18 @@ + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/FunctionsT.html b/tests/riscv-coremark/coremark/docs/html/search/FunctionsT.html new file mode 100644 index 000000000..65ae37ccd --- /dev/null +++ b/tests/riscv-coremark/coremark/docs/html/search/FunctionsT.html @@ -0,0 +1,18 @@ + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/GeneralB.html b/tests/riscv-coremark/coremark/docs/html/search/GeneralB.html new file mode 100644 index 000000000..66e27e49b --- /dev/null +++ b/tests/riscv-coremark/coremark/docs/html/search/GeneralB.html @@ -0,0 +1,18 @@ + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/GeneralC.html b/tests/riscv-coremark/coremark/docs/html/search/GeneralC.html new file mode 100644 index 000000000..f1ac9d2d3 --- /dev/null +++ b/tests/riscv-coremark/coremark/docs/html/search/GeneralC.html @@ -0,0 +1,18 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/GeneralD.html b/tests/riscv-coremark/coremark/docs/html/search/GeneralD.html new file mode 100644 index 000000000..b3c21002d --- /dev/null +++ b/tests/riscv-coremark/coremark/docs/html/search/GeneralD.html @@ -0,0 +1,18 @@ + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/GeneralF.html b/tests/riscv-coremark/coremark/docs/html/search/GeneralF.html new file mode 100644 index 000000000..126a24c57 --- /dev/null +++ b/tests/riscv-coremark/coremark/docs/html/search/GeneralF.html @@ -0,0 +1,18 @@ + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/GeneralG.html b/tests/riscv-coremark/coremark/docs/html/search/GeneralG.html new file mode 100644 index 000000000..217e8540b --- /dev/null +++ b/tests/riscv-coremark/coremark/docs/html/search/GeneralG.html @@ -0,0 +1,18 @@ + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/GeneralH.html b/tests/riscv-coremark/coremark/docs/html/search/GeneralH.html new file mode 100644 index 000000000..3b0c39213 --- /dev/null +++ b/tests/riscv-coremark/coremark/docs/html/search/GeneralH.html @@ -0,0 +1,18 @@ + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/GeneralI.html b/tests/riscv-coremark/coremark/docs/html/search/GeneralI.html new file mode 100644 index 000000000..f17354d65 --- /dev/null +++ b/tests/riscv-coremark/coremark/docs/html/search/GeneralI.html @@ -0,0 +1,18 @@ + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/GeneralL.html b/tests/riscv-coremark/coremark/docs/html/search/GeneralL.html new file mode 100644 index 000000000..22a700c93 --- /dev/null +++ b/tests/riscv-coremark/coremark/docs/html/search/GeneralL.html @@ -0,0 +1,18 @@ + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/GeneralM.html b/tests/riscv-coremark/coremark/docs/html/search/GeneralM.html new file mode 100644 index 000000000..57f55b249 --- /dev/null +++ b/tests/riscv-coremark/coremark/docs/html/search/GeneralM.html @@ -0,0 +1,18 @@ + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/GeneralO.html b/tests/riscv-coremark/coremark/docs/html/search/GeneralO.html new file mode 100644 index 000000000..b14f18001 --- /dev/null +++ b/tests/riscv-coremark/coremark/docs/html/search/GeneralO.html @@ -0,0 +1,18 @@ + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/GeneralP.html b/tests/riscv-coremark/coremark/docs/html/search/GeneralP.html new file mode 100644 index 000000000..063a6c13e --- /dev/null +++ b/tests/riscv-coremark/coremark/docs/html/search/GeneralP.html @@ -0,0 +1,18 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/GeneralR.html b/tests/riscv-coremark/coremark/docs/html/search/GeneralR.html new file mode 100644 index 000000000..24f33954e --- /dev/null +++ b/tests/riscv-coremark/coremark/docs/html/search/GeneralR.html @@ -0,0 +1,18 @@ + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/GeneralS.html b/tests/riscv-coremark/coremark/docs/html/search/GeneralS.html new file mode 100644 index 000000000..a18c40715 --- /dev/null +++ b/tests/riscv-coremark/coremark/docs/html/search/GeneralS.html @@ -0,0 +1,18 @@ + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/GeneralT.html b/tests/riscv-coremark/coremark/docs/html/search/GeneralT.html new file mode 100644 index 000000000..a2fde7e28 --- /dev/null +++ b/tests/riscv-coremark/coremark/docs/html/search/GeneralT.html @@ -0,0 +1,18 @@ + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/GeneralU.html b/tests/riscv-coremark/coremark/docs/html/search/GeneralU.html new file mode 100644 index 000000000..d9b46a52d --- /dev/null +++ b/tests/riscv-coremark/coremark/docs/html/search/GeneralU.html @@ -0,0 +1,18 @@ + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/GeneralV.html b/tests/riscv-coremark/coremark/docs/html/search/GeneralV.html new file mode 100644 index 000000000..9c53066a5 --- /dev/null +++ b/tests/riscv-coremark/coremark/docs/html/search/GeneralV.html @@ -0,0 +1,18 @@ + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/GeneralW.html b/tests/riscv-coremark/coremark/docs/html/search/GeneralW.html new file mode 100644 index 000000000..e22dcb062 --- /dev/null +++ b/tests/riscv-coremark/coremark/docs/html/search/GeneralW.html @@ -0,0 +1,18 @@ + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/NoResults.html b/tests/riscv-coremark/coremark/docs/html/search/NoResults.html new file mode 100644 index 000000000..49e385959 --- /dev/null +++ b/tests/riscv-coremark/coremark/docs/html/search/NoResults.html @@ -0,0 +1,13 @@ + + + + + + + + + + +
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/TypesS.html b/tests/riscv-coremark/coremark/docs/html/search/TypesS.html new file mode 100644 index 000000000..3d87649f5 --- /dev/null +++ b/tests/riscv-coremark/coremark/docs/html/search/TypesS.html @@ -0,0 +1,18 @@ + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/VariablesC.html b/tests/riscv-coremark/coremark/docs/html/search/VariablesC.html new file mode 100644 index 000000000..d3bdfef76 --- /dev/null +++ b/tests/riscv-coremark/coremark/docs/html/search/VariablesC.html @@ -0,0 +1,18 @@ + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/VariablesD.html b/tests/riscv-coremark/coremark/docs/html/search/VariablesD.html new file mode 100644 index 000000000..d4b961d3c --- /dev/null +++ b/tests/riscv-coremark/coremark/docs/html/search/VariablesD.html @@ -0,0 +1,18 @@ + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/VariablesL.html b/tests/riscv-coremark/coremark/docs/html/search/VariablesL.html new file mode 100644 index 000000000..09e4b9abc --- /dev/null +++ b/tests/riscv-coremark/coremark/docs/html/search/VariablesL.html @@ -0,0 +1,18 @@ + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/VariablesO.html b/tests/riscv-coremark/coremark/docs/html/search/VariablesO.html new file mode 100644 index 000000000..b14f18001 --- /dev/null +++ b/tests/riscv-coremark/coremark/docs/html/search/VariablesO.html @@ -0,0 +1,18 @@ + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/VariablesP.html b/tests/riscv-coremark/coremark/docs/html/search/VariablesP.html new file mode 100644 index 000000000..c687999aa --- /dev/null +++ b/tests/riscv-coremark/coremark/docs/html/search/VariablesP.html @@ -0,0 +1,18 @@ + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/VariablesR.html b/tests/riscv-coremark/coremark/docs/html/search/VariablesR.html new file mode 100644 index 000000000..9cd771d25 --- /dev/null +++ b/tests/riscv-coremark/coremark/docs/html/search/VariablesR.html @@ -0,0 +1,18 @@ + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/VariablesS.html b/tests/riscv-coremark/coremark/docs/html/search/VariablesS.html new file mode 100644 index 000000000..a1280a7d0 --- /dev/null +++ b/tests/riscv-coremark/coremark/docs/html/search/VariablesS.html @@ -0,0 +1,18 @@ + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/styles/1.css b/tests/riscv-coremark/coremark/docs/html/styles/1.css new file mode 100644 index 000000000..d5a8bd6a2 --- /dev/null +++ b/tests/riscv-coremark/coremark/docs/html/styles/1.css @@ -0,0 +1,767 @@ +/* + IMPORTANT: If you're editing this file in the output directory of one of + your projects, your changes will be overwritten the next time you run + Natural Docs. Instead, copy this file to your project directory, make your + changes, and you can use it with -s. Even better would be to make a CSS + file in your project directory with only your changes, which you can then + use with -s [original style] [your changes]. + + On the other hand, if you're editing this file in the Natural Docs styles + directory, the changes will automatically be applied to all your projects + that use this style the next time Natural Docs is run on them. + + This file is part of Natural Docs, which is Copyright (C) 2003-2008 Greg Valure + Natural Docs is licensed under the GPL +*/ + +body { + font: 10pt Verdana, Arial, sans-serif; + color: #000000; + margin: 0; padding: 0; + } + +.ContentPage, +.IndexPage, +.FramedMenuPage { + background-color: #E8E8E8; + } +.FramedContentPage, +.FramedIndexPage, +.FramedSearchResultsPage, +.PopupSearchResultsPage { + background-color: #FFFFFF; + } + + +a:link, +a:visited { color: #900000; text-decoration: none } +a:hover { color: #900000; text-decoration: underline } +a:active { color: #FF0000; text-decoration: underline } + +td { + vertical-align: top } + +img { border: 0; } + + +/* + Comment out this line to use web-style paragraphs (blank line between + paragraphs, no indent) instead of print-style paragraphs (no blank line, + indented.) +*/ +p { + text-indent: 5ex; margin: 0 } + + +/* Can't use something like display: none or it won't break. */ +.HB { + font-size: 1px; + visibility: hidden; + } + +/* Blockquotes are used as containers for things that may need to scroll. */ +blockquote { + padding: 0; + margin: 0; + overflow: auto; + } + + +.Firefox1 blockquote { + padding-bottom: .5em; + } + +/* Turn off scrolling when printing. */ +@media print { + blockquote { + overflow: visible; + } + .IE blockquote { + width: auto; + } + } + + + +#Menu { + font-size: 9pt; + padding: 10px 0 0 0; + } +.ContentPage #Menu, +.IndexPage #Menu { + position: absolute; + top: 0; + left: 0; + width: 31ex; + overflow: hidden; + } +.ContentPage .Firefox #Menu, +.IndexPage .Firefox #Menu { + width: 27ex; + } + + + .MTitle { + font-size: 16pt; font-weight: bold; font-variant: small-caps; + text-align: center; + padding: 5px 10px 15px 10px; + border-bottom: 1px dotted #000000; + margin-bottom: 15px } + + .MSubTitle { + font-size: 9pt; font-weight: normal; font-variant: normal; + margin-top: 1ex; margin-bottom: 5px } + + + .MEntry a:link, + .MEntry a:hover, + .MEntry a:visited { color: #606060; margin-right: 0 } + .MEntry a:active { color: #A00000; margin-right: 0 } + + + .MGroup { + font-variant: small-caps; font-weight: bold; + margin: 1em 0 1em 10px; + } + + .MGroupContent { + font-variant: normal; font-weight: normal } + + .MGroup a:link, + .MGroup a:hover, + .MGroup a:visited { color: #545454; margin-right: 10px } + .MGroup a:active { color: #A00000; margin-right: 10px } + + + .MFile, + .MText, + .MLink, + .MIndex { + padding: 1px 17px 2px 10px; + margin: .25em 0 .25em 0; + } + + .MText { + font-size: 8pt; font-style: italic } + + .MLink { + font-style: italic } + + #MSelected { + color: #000000; background-color: #FFFFFF; + /* Replace padding with border. */ + padding: 0 10px 0 10px; + border-width: 1px 2px 2px 0; border-style: solid; border-color: #000000; + margin-right: 5px; + } + + /* Close off the left side when its in a group. */ + .MGroup #MSelected { + padding-left: 9px; border-left-width: 1px } + + /* A treat for Mozilla users. Blatantly non-standard. Will be replaced with CSS 3 attributes when finalized/supported. */ + .Firefox #MSelected { + -moz-border-radius-topright: 10px; + -moz-border-radius-bottomright: 10px } + .Firefox .MGroup #MSelected { + -moz-border-radius-topleft: 10px; + -moz-border-radius-bottomleft: 10px } + + + #MSearchPanel { + padding: 0px 6px; + margin: .25em 0; + } + + + #MSearchField { + font: italic 9pt Verdana, sans-serif; + color: #606060; + background-color: #E8E8E8; + border: none; + padding: 2px 4px; + width: 100%; + } + /* Only Opera gets it right. */ + .Firefox #MSearchField, + .IE #MSearchField, + .Safari #MSearchField { + width: 94%; + } + .Opera9 #MSearchField, + .Konqueror #MSearchField { + width: 97%; + } + .FramedMenuPage .Firefox #MSearchField, + .FramedMenuPage .Safari #MSearchField, + .FramedMenuPage .Konqueror #MSearchField { + width: 98%; + } + + /* Firefox doesn't do this right in frames without #MSearchPanel added on. + It's presence doesn't hurt anything other browsers. */ + #MSearchPanel.MSearchPanelInactive:hover #MSearchField { + background-color: #FFFFFF; + border: 1px solid #C0C0C0; + padding: 1px 3px; + } + .MSearchPanelActive #MSearchField { + background-color: #FFFFFF; + border: 1px solid #C0C0C0; + font-style: normal; + padding: 1px 3px; + } + + #MSearchType { + visibility: hidden; + font: 8pt Verdana, sans-serif; + width: 98%; + padding: 0; + border: 1px solid #C0C0C0; + } + .MSearchPanelActive #MSearchType, + /* As mentioned above, Firefox doesn't do this right in frames without #MSearchPanel added on. */ + #MSearchPanel.MSearchPanelInactive:hover #MSearchType, + #MSearchType:focus { + visibility: visible; + color: #606060; + } + #MSearchType option#MSearchEverything { + font-weight: bold; + } + + .Opera8 .MSearchPanelInactive:hover, + .Opera8 .MSearchPanelActive { + margin-left: -1px; + } + + + iframe#MSearchResults { + width: 60ex; + height: 15em; + } + #MSearchResultsWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #000000; + background-color: #E8E8E8; + } + #MSearchResultsWindowClose { + font-weight: bold; + font-size: 8pt; + display: block; + padding: 2px 5px; + } + #MSearchResultsWindowClose:link, + #MSearchResultsWindowClose:visited { + color: #000000; + text-decoration: none; + } + #MSearchResultsWindowClose:active, + #MSearchResultsWindowClose:hover { + color: #800000; + text-decoration: none; + background-color: #F4F4F4; + } + + + + +#Content { + padding-bottom: 15px; + } + +.ContentPage #Content { + border-width: 0 0 1px 1px; + border-style: solid; + border-color: #000000; + background-color: #FFFFFF; + font-size: 9pt; /* To make 31ex match the menu's 31ex. */ + margin-left: 31ex; + } +.ContentPage .Firefox #Content { + margin-left: 27ex; + } + + + + .CTopic { + font-size: 10pt; + margin-bottom: 3em; + } + + + .CTitle { + font-size: 12pt; font-weight: bold; + border-width: 0 0 1px 0; border-style: solid; border-color: #A0A0A0; + margin: 0 15px .5em 15px } + + .CGroup .CTitle { + font-size: 16pt; font-variant: small-caps; + padding-left: 15px; padding-right: 15px; + border-width: 0 0 2px 0; border-color: #000000; + margin-left: 0; margin-right: 0 } + + .CClass .CTitle, + .CInterface .CTitle, + .CDatabase .CTitle, + .CDatabaseTable .CTitle, + .CSection .CTitle { + font-size: 18pt; + color: #FFFFFF; background-color: #A0A0A0; + padding: 10px 15px 10px 15px; + border-width: 2px 0; border-color: #000000; + margin-left: 0; margin-right: 0 } + + #MainTopic .CTitle { + font-size: 20pt; + color: #FFFFFF; background-color: #7070C0; + padding: 10px 15px 10px 15px; + border-width: 0 0 3px 0; border-color: #000000; + margin-left: 0; margin-right: 0 } + + .CBody { + margin-left: 15px; margin-right: 15px } + + + .CToolTip { + position: absolute; visibility: hidden; + left: 0; top: 0; + background-color: #FFFFE0; + padding: 5px; + border-width: 1px 2px 2px 1px; border-style: solid; border-color: #000000; + font-size: 8pt; + } + + .Opera .CToolTip { + max-width: 98%; + } + + /* Scrollbars would be useless. */ + .CToolTip blockquote { + overflow: hidden; + } + .IE6 .CToolTip blockquote { + overflow: visible; + } + + .CHeading { + font-weight: bold; font-size: 10pt; + margin: 1.5em 0 .5em 0; + } + + .CBody pre { + font: 10pt "Courier New", Courier, monospace; + margin: 1em 0; + } + + .CBody ul { + /* I don't know why CBody's margin doesn't apply, but it's consistent across browsers so whatever. + Reapply it here as padding. */ + padding-left: 15px; padding-right: 15px; + margin: .5em 5ex .5em 5ex; + } + + .CDescriptionList { + margin: .5em 5ex 0 5ex } + + .CDLEntry { + font: 10pt "Courier New", Courier, monospace; color: #808080; + padding-bottom: .25em; + white-space: nowrap } + + .CDLDescription { + font-size: 10pt; /* For browsers that don't inherit correctly, like Opera 5. */ + padding-bottom: .5em; padding-left: 5ex } + + + .CTopic img { + text-align: center; + display: block; + margin: 1em auto; + } + .CImageCaption { + font-variant: small-caps; + font-size: 8pt; + color: #808080; + text-align: center; + position: relative; + top: 1em; + } + + .CImageLink { + color: #808080; + font-style: italic; + } + a.CImageLink:link, + a.CImageLink:visited, + a.CImageLink:hover { color: #808080 } + + + + + +.Prototype { + font: 10pt "Courier New", Courier, monospace; + padding: 5px 3ex; + border-width: 1px; border-style: solid; + margin: 0 5ex 1.5em 5ex; + } + + .Prototype td { + font-size: 10pt; + } + + .PDefaultValue, + .PDefaultValuePrefix, + .PTypePrefix { + color: #8F8F8F; + } + .PTypePrefix { + text-align: right; + } + .PAfterParameters { + vertical-align: bottom; + } + + .IE .Prototype table { + padding: 0; + } + + .CFunction .Prototype { + background-color: #F4F4F4; border-color: #D0D0D0 } + .CProperty .Prototype { + background-color: #F4F4FF; border-color: #C0C0E8 } + .CVariable .Prototype { + background-color: #FFFFF0; border-color: #E0E0A0 } + + .CClass .Prototype { + border-width: 1px 2px 2px 1px; border-style: solid; border-color: #A0A0A0; + background-color: #F4F4F4; + } + .CInterface .Prototype { + border-width: 1px 2px 2px 1px; border-style: solid; border-color: #A0A0D0; + background-color: #F4F4FF; + } + + .CDatabaseIndex .Prototype, + .CConstant .Prototype { + background-color: #D0D0D0; border-color: #000000 } + .CType .Prototype, + .CEnumeration .Prototype { + background-color: #FAF0F0; border-color: #E0B0B0; + } + .CDatabaseTrigger .Prototype, + .CEvent .Prototype, + .CDelegate .Prototype { + background-color: #F0FCF0; border-color: #B8E4B8 } + + .CToolTip .Prototype { + margin: 0 0 .5em 0; + white-space: nowrap; + } + + + + + +.Summary { + margin: 1.5em 5ex 0 5ex } + + .STitle { + font-size: 12pt; font-weight: bold; + margin-bottom: .5em } + + + .SBorder { + background-color: #FFFFF0; + padding: 15px; + border: 1px solid #C0C060 } + + /* In a frame IE 6 will make them too long unless you set the width to 100%. Without frames it will be correct without a width + or slightly too long (but not enough to scroll) with a width. This arbitrary weirdness simply astounds me. IE 7 has the same + problem with frames, haven't tested it without. */ + .FramedContentPage .IE .SBorder { + width: 100% } + + /* A treat for Mozilla users. Blatantly non-standard. Will be replaced with CSS 3 attributes when finalized/supported. */ + .Firefox .SBorder { + -moz-border-radius: 20px } + + + .STable { + font-size: 9pt; width: 100% } + + .SEntry { + width: 30% } + .SDescription { + width: 70% } + + + .SMarked { + background-color: #F8F8D8 } + + .SDescription { padding-left: 2ex } + .SIndent1 .SEntry { padding-left: 1.5ex } .SIndent1 .SDescription { padding-left: 3.5ex } + .SIndent2 .SEntry { padding-left: 3.0ex } .SIndent2 .SDescription { padding-left: 5.0ex } + .SIndent3 .SEntry { padding-left: 4.5ex } .SIndent3 .SDescription { padding-left: 6.5ex } + .SIndent4 .SEntry { padding-left: 6.0ex } .SIndent4 .SDescription { padding-left: 8.0ex } + .SIndent5 .SEntry { padding-left: 7.5ex } .SIndent5 .SDescription { padding-left: 9.5ex } + + .SDescription a { color: #800000} + .SDescription a:active { color: #A00000 } + + .SGroup td { + padding-top: .5em; padding-bottom: .25em } + + .SGroup .SEntry { + font-weight: bold; font-variant: small-caps } + + .SGroup .SEntry a { color: #800000 } + .SGroup .SEntry a:active { color: #F00000 } + + + .SMain td, + .SClass td, + .SDatabase td, + .SDatabaseTable td, + .SSection td { + font-size: 10pt; + padding-bottom: .25em } + + .SClass td, + .SDatabase td, + .SDatabaseTable td, + .SSection td { + padding-top: 1em } + + .SMain .SEntry, + .SClass .SEntry, + .SDatabase .SEntry, + .SDatabaseTable .SEntry, + .SSection .SEntry { + font-weight: bold; + } + + .SMain .SEntry a, + .SClass .SEntry a, + .SDatabase .SEntry a, + .SDatabaseTable .SEntry a, + .SSection .SEntry a { color: #000000 } + + .SMain .SEntry a:active, + .SClass .SEntry a:active, + .SDatabase .SEntry a:active, + .SDatabaseTable .SEntry a:active, + .SSection .SEntry a:active { color: #A00000 } + + + + + +.ClassHierarchy { + margin: 0 15px 1em 15px } + + .CHEntry { + border-width: 1px 2px 2px 1px; border-style: solid; border-color: #A0A0A0; + margin-bottom: 3px; + padding: 2px 2ex; + font-size: 10pt; + background-color: #F4F4F4; color: #606060; + } + + .Firefox .CHEntry { + -moz-border-radius: 4px; + } + + .CHCurrent .CHEntry { + font-weight: bold; + border-color: #000000; + color: #000000; + } + + .CHChildNote .CHEntry { + font-style: italic; + font-size: 8pt; + } + + .CHIndent { + margin-left: 3ex; + } + + .CHEntry a:link, + .CHEntry a:visited, + .CHEntry a:hover { + color: #606060; + } + .CHEntry a:active { + color: #800000; + } + + + + + +#Index { + background-color: #FFFFFF; + } + +/* As opposed to .PopupSearchResultsPage #Index */ +.IndexPage #Index, +.FramedIndexPage #Index, +.FramedSearchResultsPage #Index { + padding: 15px; + } + +.IndexPage #Index { + border-width: 0 0 1px 1px; + border-style: solid; + border-color: #000000; + font-size: 9pt; /* To make 27ex match the menu's 27ex. */ + margin-left: 27ex; + } + + + .IPageTitle { + font-size: 20pt; font-weight: bold; + color: #FFFFFF; background-color: #7070C0; + padding: 10px 15px 10px 15px; + border-width: 0 0 3px 0; border-color: #000000; border-style: solid; + margin: -15px -15px 0 -15px } + + .FramedSearchResultsPage .IPageTitle { + margin-bottom: 15px; + } + + .INavigationBar { + font-size: 10pt; + text-align: center; + background-color: #FFFFF0; + padding: 5px; + border-bottom: solid 1px black; + margin: 0 -15px 15px -15px; + } + + .INavigationBar a { + font-weight: bold } + + .IHeading { + font-size: 16pt; font-weight: bold; + padding: 2.5em 0 .5em 0; + text-align: center; + width: 3.5ex; + } + #IFirstHeading { + padding-top: 0; + } + + .IEntry { + font-size: 10pt; + padding-left: 1ex; + } + .PopupSearchResultsPage .IEntry { + font-size: 8pt; + padding: 1px 5px; + } + .PopupSearchResultsPage .Opera9 .IEntry, + .FramedSearchResultsPage .Opera9 .IEntry { + text-align: left; + } + .FramedSearchResultsPage .IEntry { + padding: 0; + } + + .ISubIndex { + padding-left: 3ex; padding-bottom: .5em } + .PopupSearchResultsPage .ISubIndex { + display: none; + } + + /* While it may cause some entries to look like links when they aren't, I found it's much easier to read the + index if everything's the same color. */ + .ISymbol { + font-weight: bold; color: #900000 } + + .IndexPage .ISymbolPrefix, + .FramedIndexPage .ISymbolPrefix { + font-size: 10pt; + text-align: right; + color: #C47C7C; + background-color: #F8F8F8; + border-right: 3px solid #E0E0E0; + border-left: 1px solid #E0E0E0; + padding: 0 1px 0 2px; + } + .PopupSearchResultsPage .ISymbolPrefix, + .FramedSearchResultsPage .ISymbolPrefix { + color: #900000; + } + .PopupSearchResultsPage .ISymbolPrefix { + font-size: 8pt; + } + + .IndexPage #IFirstSymbolPrefix, + .FramedIndexPage #IFirstSymbolPrefix { + border-top: 1px solid #E0E0E0; + } + .IndexPage #ILastSymbolPrefix, + .FramedIndexPage #ILastSymbolPrefix { + border-bottom: 1px solid #E0E0E0; + } + .IndexPage #IOnlySymbolPrefix, + .FramedIndexPage #IOnlySymbolPrefix { + border-top: 1px solid #E0E0E0; + border-bottom: 1px solid #E0E0E0; + } + + a.IParent, + a.IFile { + display: block; + } + + .PopupSearchResultsPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + } + .FramedSearchResultsPage .SRStatus { + font-size: 10pt; + font-style: italic; + } + + .SRResult { + display: none; + } + + + +#Footer { + font-size: 8pt; + color: #989898; + text-align: right; + } + +#Footer p { + text-indent: 0; + margin-bottom: .5em; + } + +.ContentPage #Footer, +.IndexPage #Footer { + text-align: right; + margin: 2px; + } + +.FramedMenuPage #Footer { + text-align: center; + margin: 5em 10px 10px 10px; + padding-top: 1em; + border-top: 1px solid #C8C8C8; + } + + #Footer a:link, + #Footer a:hover, + #Footer a:visited { color: #989898 } + #Footer a:active { color: #A00000 } + diff --git a/tests/riscv-coremark/coremark/docs/html/styles/2.css b/tests/riscv-coremark/coremark/docs/html/styles/2.css new file mode 100644 index 000000000..69a1d1a7a --- /dev/null +++ b/tests/riscv-coremark/coremark/docs/html/styles/2.css @@ -0,0 +1,6 @@ +#Menu { + padding: 48px 0 0 0; + background: url(file:../../coremark_logo.jpg) no-repeat; + background-position: 30px 10px; + } + diff --git a/tests/riscv-coremark/coremark/docs/html/styles/main.css b/tests/riscv-coremark/coremark/docs/html/styles/main.css new file mode 100644 index 000000000..a672a9492 --- /dev/null +++ b/tests/riscv-coremark/coremark/docs/html/styles/main.css @@ -0,0 +1,2 @@ +@import URL("1.css"); +@import URL("2.css"); diff --git a/tests/riscv-coremark/coremark/freebsd/core_portme.mak b/tests/riscv-coremark/coremark/freebsd/core_portme.mak new file mode 100644 index 000000000..97b6d6ace --- /dev/null +++ b/tests/riscv-coremark/coremark/freebsd/core_portme.mak @@ -0,0 +1,17 @@ +# Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Original Author: Shay Gal-on + +include posix/core_portme.mak diff --git a/tests/riscv-coremark/coremark/linux/core_portme.c b/tests/riscv-coremark/coremark/linux/core_portme.c new file mode 100755 index 000000000..6b63610d1 --- /dev/null +++ b/tests/riscv-coremark/coremark/linux/core_portme.c @@ -0,0 +1,338 @@ +/* +Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +Original Author: Shay Gal-on +*/ + +#include +#include +#include "coremark.h" +#if CALLGRIND_RUN +#include +#endif + +#if (MEM_METHOD==MEM_MALLOC) +#include +/* Function: portable_malloc + Provide malloc() functionality in a platform specific way. +*/ +void *portable_malloc(size_t size) { + return malloc(size); +} +/* Function: portable_free + Provide free() functionality in a platform specific way. +*/ +void portable_free(void *p) { + free(p); +} +#else +void *portable_malloc(size_t size) { + return NULL; +} +void portable_free(void *p) { + p=NULL; +} +#endif + +#if (SEED_METHOD==SEED_VOLATILE) +#if VALIDATION_RUN + volatile ee_s32 seed1_volatile=0x3415; + volatile ee_s32 seed2_volatile=0x3415; + volatile ee_s32 seed3_volatile=0x66; +#endif +#if PERFORMANCE_RUN + volatile ee_s32 seed1_volatile=0x0; + volatile ee_s32 seed2_volatile=0x0; + volatile ee_s32 seed3_volatile=0x66; +#endif +#if PROFILE_RUN + volatile ee_s32 seed1_volatile=0x8; + volatile ee_s32 seed2_volatile=0x8; + volatile ee_s32 seed3_volatile=0x8; +#endif + volatile ee_s32 seed4_volatile=ITERATIONS; + volatile ee_s32 seed5_volatile=0; +#endif +/* Porting: Timing functions + How to capture time and convert to seconds must be ported to whatever is supported by the platform. + e.g. Read value from on board RTC, read value from cpu clock cycles performance counter etc. + Sample implementation for standard time.h and windows.h definitions included. +*/ +/* Define: TIMER_RES_DIVIDER + Divider to trade off timer resolution and total time that can be measured. + + Use lower values to increase resolution, but make sure that overflow does not occur. + If there are issues with the return value overflowing, increase this value. + */ +#if USE_CLOCK + #define NSECS_PER_SEC CLOCKS_PER_SEC + #define EE_TIMER_TICKER_RATE 1000 + #define CORETIMETYPE clock_t + #define GETMYTIME(_t) (*_t=clock()) + #define MYTIMEDIFF(fin,ini) ((fin)-(ini)) + #define TIMER_RES_DIVIDER 1 + #define SAMPLE_TIME_IMPLEMENTATION 1 +#elif defined(_MSC_VER) + #define NSECS_PER_SEC 10000000 + #define EE_TIMER_TICKER_RATE 1000 + #define CORETIMETYPE FILETIME + #define GETMYTIME(_t) GetSystemTimeAsFileTime(_t) + #define MYTIMEDIFF(fin,ini) (((*(__int64*)&fin)-(*(__int64*)&ini))/TIMER_RES_DIVIDER) + /* setting to millisces resolution by default with MSDEV */ + #ifndef TIMER_RES_DIVIDER + #define TIMER_RES_DIVIDER 1000 + #endif + #define SAMPLE_TIME_IMPLEMENTATION 1 +#elif HAS_TIME_H + #define NSECS_PER_SEC 1000000000 + #define EE_TIMER_TICKER_RATE 1000 + #define CORETIMETYPE struct timespec + #define GETMYTIME(_t) clock_gettime(CLOCK_REALTIME,_t) + #define MYTIMEDIFF(fin,ini) ((fin.tv_sec-ini.tv_sec)*(NSECS_PER_SEC/TIMER_RES_DIVIDER)+(fin.tv_nsec-ini.tv_nsec)/TIMER_RES_DIVIDER) + /* setting to 1/1000 of a second resolution by default with linux */ + #ifndef TIMER_RES_DIVIDER + #define TIMER_RES_DIVIDER 1000000 + #endif + #define SAMPLE_TIME_IMPLEMENTATION 1 +#else + #define SAMPLE_TIME_IMPLEMENTATION 0 +#endif +#define EE_TICKS_PER_SEC (NSECS_PER_SEC / TIMER_RES_DIVIDER) + +#if SAMPLE_TIME_IMPLEMENTATION +/** Define Host specific (POSIX), or target specific global time variables. */ +static CORETIMETYPE start_time_val, stop_time_val; + +/* Function: start_time + This function will be called right before starting the timed portion of the benchmark. + + Implementation may be capturing a system timer (as implemented in the example code) + or zeroing some system parameters - e.g. setting the cpu clocks cycles to 0. +*/ +void start_time(void) { + GETMYTIME(&start_time_val ); +#if CALLGRIND_RUN + CALLGRIND_START_INSTRUMENTATION +#endif +#if MICA + asm volatile("int3");/*1 */ +#endif +} +/* Function: stop_time + This function will be called right after ending the timed portion of the benchmark. + + Implementation may be capturing a system timer (as implemented in the example code) + or other system parameters - e.g. reading the current value of cpu cycles counter. +*/ +void stop_time(void) { +#if CALLGRIND_RUN + CALLGRIND_STOP_INSTRUMENTATION +#endif +#if MICA + asm volatile("int3");/*1 */ +#endif + GETMYTIME(&stop_time_val ); +} +/* Function: get_time + Return an abstract "ticks" number that signifies time on the system. + + Actual value returned may be cpu cycles, milliseconds or any other value, + as long as it can be converted to seconds by . + This methodology is taken to accomodate any hardware or simulated platform. + The sample implementation returns millisecs by default, + and the resolution is controlled by +*/ +CORE_TICKS get_time(void) { + CORE_TICKS elapsed=(CORE_TICKS)(MYTIMEDIFF(stop_time_val, start_time_val)); + return elapsed; +} +/* Function: time_in_secs + Convert the value returned by get_time to seconds. + + The type is used to accomodate systems with no support for floating point. + Default implementation implemented by the EE_TICKS_PER_SEC macro above. +*/ +secs_ret time_in_secs(CORE_TICKS ticks) { + secs_ret retval=((secs_ret)ticks) / (secs_ret)EE_TICKS_PER_SEC; + return retval; +} +#else +#error "Please implement timing functionality in core_portme.c" +#endif /* SAMPLE_TIME_IMPLEMENTATION */ + +ee_u32 default_num_contexts=MULTITHREAD; + +/* Function: portable_init + Target specific initialization code + Test for some common mistakes. +*/ +void portable_init(core_portable *p, int *argc, char *argv[]) +{ +#if PRINT_ARGS + int i; + for (i=0; i<*argc; i++) { + ee_printf("Arg[%d]=%s\n",i,argv[i]); + } +#endif + if (sizeof(ee_ptr_int) != sizeof(ee_u8 *)) { + ee_printf("ERROR! Please define ee_ptr_int to a type that holds a pointer!\n"); + } + if (sizeof(ee_u32) != 4) { + ee_printf("ERROR! Please define ee_u32 to a 32b unsigned type!\n"); + } +#if (MAIN_HAS_NOARGC && (SEED_METHOD==SEED_ARG)) + ee_printf("ERROR! Main has no argc, but SEED_METHOD defined to SEED_ARG!\n"); +#endif + +#if (MULTITHREAD>1) && (SEED_METHOD==SEED_ARG) + { + int nargs=*argc,i; + if ((nargs>1) && (*argv[1]=='M')) { + default_num_contexts=parseval(argv[1]+1); + if (default_num_contexts>MULTITHREAD) + default_num_contexts=MULTITHREAD; + /* Shift args since first arg is directed to the portable part and not to coremark main */ + --nargs; + for (i=1; i*/ + p->portable_id=1; +} +/* Function: portable_fini + Target specific final code +*/ +void portable_fini(core_portable *p) +{ + p->portable_id=0; +} + +#if (MULTITHREAD>1) + +/* Function: core_start_parallel + Start benchmarking in a parallel context. + + Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets. + Other implementations using MCAPI or other standards can easily be devised. +*/ +/* Function: core_stop_parallel + Stop a parallel context execution of coremark, and gather the results. + + Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets. + Other implementations using MCAPI or other standards can easily be devised. +*/ +#if USE_PTHREAD +ee_u8 core_start_parallel(core_results *res) { + return (ee_u8)pthread_create(&(res->port.thread),NULL,iterate,(void *)res); +} +ee_u8 core_stop_parallel(core_results *res) { + void *retval; + return (ee_u8)pthread_join(res->port.thread,&retval); +} +#elif USE_FORK +static int key_id=0; +ee_u8 core_start_parallel(core_results *res) { + key_t key=4321+key_id; + key_id++; + res->port.pid=fork(); + res->port.shmid=shmget(key, 8, IPC_CREAT | 0666); + if (res->port.shmid<0) { + ee_printf("ERROR in shmget!\n"); + } + if (res->port.pid==0) { + iterate(res); + res->port.shm=shmat(res->port.shmid, NULL, 0); + /* copy the validation values to the shared memory area and quit*/ + if (res->port.shm == (char *) -1) { + ee_printf("ERROR in child shmat!\n"); + } else { + memcpy(res->port.shm,&(res->crc),8); + shmdt(res->port.shm); + } + exit(0); + } + return 1; +} +ee_u8 core_stop_parallel(core_results *res) { + int status; + pid_t wpid = waitpid(res->port.pid,&status,WUNTRACED); + if (wpid != res->port.pid) { + ee_printf("ERROR waiting for child.\n"); + if (errno == ECHILD) ee_printf("errno=No such child %d\n",res->port.pid); + if (errno == EINTR) ee_printf("errno=Interrupted\n"); + return 0; + } + /* after process is done, get the values from the shared memory area */ + res->port.shm=shmat(res->port.shmid, NULL, 0); + if (res->port.shm == (char *) -1) { + ee_printf("ERROR in parent shmat!\n"); + return 0; + } + memcpy(&(res->crc),res->port.shm,8); + shmdt(res->port.shm); + return 1; +} +#elif USE_SOCKET +static int key_id=0; +ee_u8 core_start_parallel(core_results *res) { + int bound, buffer_length=8; + res->port.sa.sin_family = AF_INET; + res->port.sa.sin_addr.s_addr = htonl(0x7F000001); + res->port.sa.sin_port = htons(7654+key_id); + key_id++; + res->port.pid=fork(); + if (res->port.pid==0) { /* benchmark child */ + iterate(res); + res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); + if (-1 == res->port.sock) /* if socket failed to initialize, exit */ { + ee_printf("Error Creating Socket"); + } else { + int bytes_sent = sendto(res->port.sock, &(res->crc), buffer_length, 0,(struct sockaddr*)&(res->port.sa), sizeof (struct sockaddr_in)); + if (bytes_sent < 0) + ee_printf("Error sending packet: %s\n", strerror(errno)); + close(res->port.sock); /* close the socket */ + } + exit(0); + } + /* parent process, open the socket */ + res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); + bound = bind(res->port.sock,(struct sockaddr*)&(res->port.sa), sizeof(struct sockaddr)); + if (bound < 0) + ee_printf("bind(): %s\n",strerror(errno)); + return 1; +} +ee_u8 core_stop_parallel(core_results *res) { + int status; + int fromlen=sizeof(struct sockaddr); + int recsize = recvfrom(res->port.sock, &(res->crc), 8, 0, (struct sockaddr*)&(res->port.sa), &fromlen); + if (recsize < 0) { + ee_printf("Error in receive: %s\n", strerror(errno)); + return 0; + } + pid_t wpid = waitpid(res->port.pid,&status,WUNTRACED); + if (wpid != res->port.pid) { + ee_printf("ERROR waiting for child.\n"); + if (errno == ECHILD) ee_printf("errno=No such child %d\n",res->port.pid); + if (errno == EINTR) ee_printf("errno=Interrupted\n"); + return 0; + } + return 1; +} +#else /* no standard multicore implementation */ +#error "Please implement multicore functionality in core_portme.c to use multiple contexts." +#endif /* multithread implementations */ +#endif diff --git a/tests/riscv-coremark/coremark/linux/core_portme.h b/tests/riscv-coremark/coremark/linux/core_portme.h new file mode 100755 index 000000000..2cf4659a4 --- /dev/null +++ b/tests/riscv-coremark/coremark/linux/core_portme.h @@ -0,0 +1,290 @@ +/* +Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +Original Author: Shay Gal-on +*/ + +#ifndef CORE_PORTME_H +#define CORE_PORTME_H +/************************/ +/* Data types and settings */ +/************************/ +/* Configuration: HAS_FLOAT + Define to 1 if the platform supports floating point. +*/ +#ifndef HAS_FLOAT +#define HAS_FLOAT 1 +#endif +/* Configuration: HAS_TIME_H + Define to 1 if platform has the time.h header file, + and implementation of functions thereof. +*/ +#ifndef HAS_TIME_H +#define HAS_TIME_H 1 +#endif +/* Configuration: USE_CLOCK + Define to 1 if platform has the time.h header file, + and implementation of functions thereof. +*/ +#ifndef USE_CLOCK +#define USE_CLOCK 0 +#endif +/* Configuration: HAS_STDIO + Define to 1 if the platform has stdio.h. +*/ +#ifndef HAS_STDIO +#define HAS_STDIO 1 +#endif +/* Configuration: HAS_PRINTF + Define to 1 if the platform has stdio.h and implements the printf function. +*/ +#ifndef HAS_PRINTF +#define HAS_PRINTF 1 +#endif + +/* Configuration: CORE_TICKS + Define type of return from the timing functions. + */ +#if defined(_MSC_VER) +#include +typedef size_t CORE_TICKS; +#elif HAS_TIME_H +#include +typedef clock_t CORE_TICKS; +#else +#error "Please define type of CORE_TICKS and implement start_time, end_time get_time and time_in_secs functions!" +#endif + +/* Definitions: COMPILER_VERSION, COMPILER_FLAGS, MEM_LOCATION + Initialize these strings per platform +*/ +#ifndef COMPILER_VERSION + #ifdef __GNUC__ + #define COMPILER_VERSION "GCC"__VERSION__ + #else + #define COMPILER_VERSION "Please put compiler version here (e.g. gcc 4.1)" + #endif +#endif +#ifndef COMPILER_FLAGS + #define COMPILER_FLAGS FLAGS_STR /* "Please put compiler flags here (e.g. -o3)" */ +#endif +#ifndef MEM_LOCATION + #define MEM_LOCATION "Please put data memory location here\n\t\t\t(e.g. code in flash, data on heap etc)" + #define MEM_LOCATION_UNSPEC 1 +#endif + +/* Data Types: + To avoid compiler issues, define the data types that need ot be used for 8b, 16b and 32b in . + + *Imprtant*: + ee_ptr_int needs to be the data type used to hold pointers, otherwise coremark may fail!!! +*/ +typedef signed short ee_s16; +typedef unsigned short ee_u16; +typedef signed int ee_s32; +typedef double ee_f32; +typedef unsigned char ee_u8; +typedef unsigned int ee_u32; +typedef ee_u32 ee_ptr_int; +typedef size_t ee_size_t; +/* align_mem: + This macro is used to align an offset to point to a 32b value. It is used in the Matrix algorithm to initialize the input memory blocks. +*/ +#define align_mem(x) (void *)(4 + (((ee_ptr_int)(x) - 1) & ~3)) + +/* Configuration: SEED_METHOD + Defines method to get seed values that cannot be computed at compile time. + + Valid values: + SEED_ARG - from command line. + SEED_FUNC - from a system function. + SEED_VOLATILE - from volatile variables. +*/ +#ifndef SEED_METHOD +#define SEED_METHOD SEED_ARG +#endif + +/* Configuration: MEM_METHOD + Defines method to get a block of memry. + + Valid values: + MEM_MALLOC - for platforms that implement malloc and have malloc.h. + MEM_STATIC - to use a static memory array. + MEM_STACK - to allocate the data block on the stack (NYI). +*/ +#ifndef MEM_METHOD +#define MEM_METHOD MEM_MALLOC +#endif + +/* Configuration: MULTITHREAD + Define for parallel execution + + Valid values: + 1 - only one context (default). + N>1 - will execute N copies in parallel. + + Note: + If this flag is defined to more then 1, an implementation for launching parallel contexts must be defined. + + Two sample implementations are provided. Use or to enable them. + + It is valid to have a different implementation of and in , + to fit a particular architecture. +*/ +#ifndef MULTITHREAD +#define MULTITHREAD 1 +#endif + +/* Configuration: USE_PTHREAD + Sample implementation for launching parallel contexts + This implementation uses pthread_thread_create and pthread_join. + + Valid values: + 0 - Do not use pthreads API. + 1 - Use pthreads API + + Note: + This flag only matters if MULTITHREAD has been defined to a value greater then 1. +*/ +#ifndef USE_PTHREAD +#define USE_PTHREAD 0 +#endif + +/* Configuration: USE_FORK + Sample implementation for launching parallel contexts + This implementation uses fork, waitpid, shmget,shmat and shmdt. + + Valid values: + 0 - Do not use fork API. + 1 - Use fork API + + Note: + This flag only matters if MULTITHREAD has been defined to a value greater then 1. +*/ +#ifndef USE_FORK +#define USE_FORK 0 +#endif + +/* Configuration: USE_SOCKET + Sample implementation for launching parallel contexts + This implementation uses fork, socket, sendto and recvfrom + + Valid values: + 0 - Do not use fork and sockets API. + 1 - Use fork and sockets API + + Note: + This flag only matters if MULTITHREAD has been defined to a value greater then 1. +*/ +#ifndef USE_SOCKET +#define USE_SOCKET 0 +#endif + +/* Configuration: MAIN_HAS_NOARGC + Needed if platform does not support getting arguments to main. + + Valid values: + 0 - argc/argv to main is supported + 1 - argc/argv to main is not supported +*/ +#ifndef MAIN_HAS_NOARGC +#define MAIN_HAS_NOARGC 0 +#endif + +/* Configuration: MAIN_HAS_NORETURN + Needed if platform does not support returning a value from main. + + Valid values: + 0 - main returns an int, and return value will be 0. + 1 - platform does not support returning a value from main +*/ +#ifndef MAIN_HAS_NORETURN +#define MAIN_HAS_NORETURN 0 +#endif + +/* Variable: default_num_contexts + Number of contexts to spawn in multicore context. + Override this global value to change number of contexts used. + + Note: + This value may not be set higher then the define. + + To experiment, you can set the define to the highest value expected, and use argc/argv in the to set this value from the command line. +*/ +extern ee_u32 default_num_contexts; + +#if (MULTITHREAD>1) +#if USE_PTHREAD + #include + #define PARALLEL_METHOD "PThreads" +#elif USE_FORK + #include + #include + #include + #include + #include /* for memcpy */ + #define PARALLEL_METHOD "Fork" +#elif USE_SOCKET + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #define PARALLEL_METHOD "Sockets" +#else + #define PARALLEL_METHOD "Proprietary" + #error "Please implement multicore functionality in core_portme.c to use multiple contexts." +#endif /* Method for multithreading */ +#endif /* MULTITHREAD > 1 */ + +typedef struct CORE_PORTABLE_S { +#if (MULTITHREAD>1) + #if USE_PTHREAD + pthread_t thread; + #elif USE_FORK + pid_t pid; + int shmid; + void *shm; + #elif USE_SOCKET + pid_t pid; + int sock; + struct sockaddr_in sa; + #endif /* Method for multithreading */ +#endif /* MULTITHREAD>1 */ + ee_u8 portable_id; +} core_portable; + +/* target specific init/fini */ +void portable_init(core_portable *p, int *argc, char *argv[]); +void portable_fini(core_portable *p); + +#if (SEED_METHOD==SEED_VOLATILE) + #if (VALIDATION_RUN || PERFORMANCE_RUN || PROFILE_RUN) + #define RUN_TYPE_FLAG 1 + #else + #if (TOTAL_DATA_SIZE==1200) + #define PROFILE_RUN 1 + #else + #define PERFORMANCE_RUN 1 + #endif + #endif +#endif /* SEED_METHOD==SEED_VOLATILE */ + +#endif /* CORE_PORTME_H */ diff --git a/tests/riscv-coremark/coremark/linux/core_portme.mak b/tests/riscv-coremark/coremark/linux/core_portme.mak new file mode 100644 index 000000000..97b6d6ace --- /dev/null +++ b/tests/riscv-coremark/coremark/linux/core_portme.mak @@ -0,0 +1,17 @@ +# Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Original Author: Shay Gal-on + +include posix/core_portme.mak diff --git a/tests/riscv-coremark/coremark/linux64/core_portme.c b/tests/riscv-coremark/coremark/linux64/core_portme.c new file mode 100755 index 000000000..fe8d29983 --- /dev/null +++ b/tests/riscv-coremark/coremark/linux64/core_portme.c @@ -0,0 +1,336 @@ +/* +Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +Original Author: Shay Gal-on +*/ + +#include +#include +#include "coremark.h" +#if CALLGRIND_RUN +#include +#endif + +#if (MEM_METHOD==MEM_MALLOC) +#include +/* Function: portable_malloc + Provide malloc() functionality in a platform specific way. +*/ +void *portable_malloc(size_t size) { + return malloc(size); +} +/* Function: portable_free + Provide free() functionality in a platform specific way. +*/ +void portable_free(void *p) { + free(p); +} +#else +void *portable_malloc(size_t size) { + return NULL; +} +void portable_free(void *p) { + p=NULL; +} +#endif + +#if (SEED_METHOD==SEED_VOLATILE) +#if VALIDATION_RUN + volatile ee_s32 seed1_volatile=0x3415; + volatile ee_s32 seed2_volatile=0x3415; + volatile ee_s32 seed3_volatile=0x66; +#endif +#if PERFORMANCE_RUN + volatile ee_s32 seed1_volatile=0x0; + volatile ee_s32 seed2_volatile=0x0; + volatile ee_s32 seed3_volatile=0x66; +#endif +#if PROFILE_RUN + volatile ee_s32 seed1_volatile=0x8; + volatile ee_s32 seed2_volatile=0x8; + volatile ee_s32 seed3_volatile=0x8; +#endif + volatile ee_s32 seed4_volatile=ITERATIONS; + volatile ee_s32 seed5_volatile=0; +#endif +/* Porting: Timing functions + How to capture time and convert to seconds must be ported to whatever is supported by the platform. + e.g. Read value from on board RTC, read value from cpu clock cycles performance counter etc. + Sample implementation for standard time.h and windows.h definitions included. +*/ +/* Define: TIMER_RES_DIVIDER + Divider to trade off timer resolution and total time that can be measured. + + Use lower values to increase resolution, but make sure that overflow does not occur. + If there are issues with the return value overflowing, increase this value. + */ +#if USE_CLOCK + #define NSECS_PER_SEC CLOCKS_PER_SEC + #define EE_TIMER_TICKER_RATE 1000 + #define CORETIMETYPE clock_t + #define GETMYTIME(_t) (*_t=clock()) + #define MYTIMEDIFF(fin,ini) ((fin)-(ini)) + #define TIMER_RES_DIVIDER 1 + #define SAMPLE_TIME_IMPLEMENTATION 1 +#elif defined(_MSC_VER) + #define NSECS_PER_SEC 10000000 + #define EE_TIMER_TICKER_RATE 1000 + #define CORETIMETYPE FILETIME + #define GETMYTIME(_t) GetSystemTimeAsFileTime(_t) + #define MYTIMEDIFF(fin,ini) (((*(__int64*)&fin)-(*(__int64*)&ini))/TIMER_RES_DIVIDER) + /* setting to millisces resolution by default with MSDEV */ + #ifndef TIMER_RES_DIVIDER + #define TIMER_RES_DIVIDER 1000 + #endif + #define SAMPLE_TIME_IMPLEMENTATION 1 +#elif HAS_TIME_H + #define NSECS_PER_SEC 1000000000 + #define EE_TIMER_TICKER_RATE 1000 + #define CORETIMETYPE struct timespec + #define GETMYTIME(_t) clock_gettime(CLOCK_REALTIME,_t) + #define MYTIMEDIFF(fin,ini) ((fin.tv_sec-ini.tv_sec)*(NSECS_PER_SEC/TIMER_RES_DIVIDER)+(fin.tv_nsec-ini.tv_nsec)/TIMER_RES_DIVIDER) + /* setting to 1/1000 of a second resolution by default with linux */ + #ifndef TIMER_RES_DIVIDER + #define TIMER_RES_DIVIDER 1000000 + #endif + #define SAMPLE_TIME_IMPLEMENTATION 1 +#else + #define SAMPLE_TIME_IMPLEMENTATION 0 +#endif +#define EE_TICKS_PER_SEC (NSECS_PER_SEC / TIMER_RES_DIVIDER) + +#if SAMPLE_TIME_IMPLEMENTATION +/** Define Host specific (POSIX), or target specific global time variables. */ +static CORETIMETYPE start_time_val, stop_time_val; + +/* Function: start_time + This function will be called right before starting the timed portion of the benchmark. + + Implementation may be capturing a system timer (as implemented in the example code) + or zeroing some system parameters - e.g. setting the cpu clocks cycles to 0. +*/ +void start_time(void) { + GETMYTIME(&start_time_val ); +#if CALLGRIND_RUN + CALLGRIND_START_INSTRUMENTATION +#endif +#if MICA + asm volatile("int3");/*1 */ +#endif +} +/* Function: stop_time + This function will be called right after ending the timed portion of the benchmark. + + Implementation may be capturing a system timer (as implemented in the example code) + or other system parameters - e.g. reading the current value of cpu cycles counter. +*/ +void stop_time(void) { +#if CALLGRIND_RUN + CALLGRIND_STOP_INSTRUMENTATION +#endif +#if MICA + asm volatile("int3");/*1 */ +#endif + GETMYTIME(&stop_time_val ); +} +/* Function: get_time + Return an abstract "ticks" number that signifies time on the system. + + Actual value returned may be cpu cycles, milliseconds or any other value, + as long as it can be converted to seconds by . + This methodology is taken to accomodate any hardware or simulated platform. + The sample implementation returns millisecs by default, + and the resolution is controlled by +*/ +CORE_TICKS get_time(void) { + CORE_TICKS elapsed=(CORE_TICKS)(MYTIMEDIFF(stop_time_val, start_time_val)); + return elapsed; +} +/* Function: time_in_secs + Convert the value returned by get_time to seconds. + + The type is used to accomodate systems with no support for floating point. + Default implementation implemented by the EE_TICKS_PER_SEC macro above. +*/ +secs_ret time_in_secs(CORE_TICKS ticks) { + secs_ret retval=((secs_ret)ticks) / (secs_ret)EE_TICKS_PER_SEC; + return retval; +} +#else +#error "Please implement timing functionality in core_portme.c" +#endif /* SAMPLE_TIME_IMPLEMENTATION */ + +ee_u32 default_num_contexts=MULTITHREAD; + +/* Function: portable_init + Target specific initialization code + Test for some common mistakes. +*/ +void portable_init(core_portable *p, int *argc, char *argv[]) +{ +#if PRINT_ARGS + int i; + for (i=0; i<*argc; i++) { + ee_printf("Arg[%d]=%s\n",i,argv[i]); + } +#endif + if (sizeof(ee_ptr_int) != sizeof(ee_u8 *)) { + ee_printf("ERROR! Please define ee_ptr_int to a type that holds a pointer!\n"); + } + if (sizeof(ee_u32) != 4) { + ee_printf("ERROR! Please define ee_u32 to a 32b unsigned type!\n"); + } +#if (MAIN_HAS_NOARGC && (SEED_METHOD==SEED_ARG)) + ee_printf("ERROR! Main has no argc, but SEED_METHOD defined to SEED_ARG!\n"); +#endif + +#if (MULTITHREAD>1) && (SEED_METHOD==SEED_ARG) + int nargs=*argc,i; + if ((nargs>1) && (*argv[1]=='M')) { + default_num_contexts=parseval(argv[1]+1); + if (default_num_contexts>MULTITHREAD) + default_num_contexts=MULTITHREAD; + /* Shift args since first arg is directed to the portable part and not to coremark main */ + --nargs; + for (i=1; i*/ + p->portable_id=1; +} +/* Function: portable_fini + Target specific final code +*/ +void portable_fini(core_portable *p) +{ + p->portable_id=0; +} + +#if (MULTITHREAD>1) + +/* Function: core_start_parallel + Start benchmarking in a parallel context. + + Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets. + Other implementations using MCAPI or other standards can easily be devised. +*/ +/* Function: core_stop_parallel + Stop a parallel context execution of coremark, and gather the results. + + Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets. + Other implementations using MCAPI or other standards can easily be devised. +*/ +#if USE_PTHREAD +ee_u8 core_start_parallel(core_results *res) { + return (ee_u8)pthread_create(&(res->port.thread),NULL,iterate,(void *)res); +} +ee_u8 core_stop_parallel(core_results *res) { + void *retval; + return (ee_u8)pthread_join(res->port.thread,&retval); +} +#elif USE_FORK +static int key_id=0; +ee_u8 core_start_parallel(core_results *res) { + key_t key=4321+key_id; + key_id++; + res->port.pid=fork(); + res->port.shmid=shmget(key, 8, IPC_CREAT | 0666); + if (res->port.shmid<0) { + ee_printf("ERROR in shmget!\n"); + } + if (res->port.pid==0) { + iterate(res); + res->port.shm=shmat(res->port.shmid, NULL, 0); + /* copy the validation values to the shared memory area and quit*/ + if (res->port.shm == (char *) -1) { + ee_printf("ERROR in child shmat!\n"); + } else { + memcpy(res->port.shm,&(res->crc),8); + shmdt(res->port.shm); + } + exit(0); + } + return 1; +} +ee_u8 core_stop_parallel(core_results *res) { + int status; + pid_t wpid = waitpid(res->port.pid,&status,WUNTRACED); + if (wpid != res->port.pid) { + ee_printf("ERROR waiting for child.\n"); + if (errno == ECHILD) ee_printf("errno=No such child %d\n",res->port.pid); + if (errno == EINTR) ee_printf("errno=Interrupted\n"); + return 0; + } + /* after process is done, get the values from the shared memory area */ + res->port.shm=shmat(res->port.shmid, NULL, 0); + if (res->port.shm == (char *) -1) { + ee_printf("ERROR in parent shmat!\n"); + return 0; + } + memcpy(&(res->crc),res->port.shm,8); + shmdt(res->port.shm); + return 1; +} +#elif USE_SOCKET +static int key_id=0; +ee_u8 core_start_parallel(core_results *res) { + int bound, buffer_length=8; + res->port.sa.sin_family = AF_INET; + res->port.sa.sin_addr.s_addr = htonl(0x7F000001); + res->port.sa.sin_port = htons(7654+key_id); + key_id++; + res->port.pid=fork(); + if (res->port.pid==0) { /* benchmark child */ + iterate(res); + res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); + if (-1 == res->port.sock) /* if socket failed to initialize, exit */ { + ee_printf("Error Creating Socket"); + } else { + int bytes_sent = sendto(res->port.sock, &(res->crc), buffer_length, 0,(struct sockaddr*)&(res->port.sa), sizeof (struct sockaddr_in)); + if (bytes_sent < 0) + ee_printf("Error sending packet: %s\n", strerror(errno)); + close(res->port.sock); /* close the socket */ + } + exit(0); + } + /* parent process, open the socket */ + res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); + bound = bind(res->port.sock,(struct sockaddr*)&(res->port.sa), sizeof(struct sockaddr)); + if (bound < 0) + ee_printf("bind(): %s\n",strerror(errno)); + return 1; +} +ee_u8 core_stop_parallel(core_results *res) { + int status; + int fromlen=sizeof(struct sockaddr); + int recsize = recvfrom(res->port.sock, &(res->crc), 8, 0, (struct sockaddr*)&(res->port.sa), &fromlen); + if (recsize < 0) { + ee_printf("Error in receive: %s\n", strerror(errno)); + return 0; + } + pid_t wpid = waitpid(res->port.pid,&status,WUNTRACED); + if (wpid != res->port.pid) { + ee_printf("ERROR waiting for child.\n"); + if (errno == ECHILD) ee_printf("errno=No such child %d\n",res->port.pid); + if (errno == EINTR) ee_printf("errno=Interrupted\n"); + return 0; + } + return 1; +} +#else /* no standard multicore implementation */ +#error "Please implement multicore functionality in core_portme.c to use multiple contexts." +#endif /* multithread implementations */ +#endif diff --git a/tests/riscv-coremark/coremark/linux64/core_portme.h b/tests/riscv-coremark/coremark/linux64/core_portme.h new file mode 100755 index 000000000..1228a679b --- /dev/null +++ b/tests/riscv-coremark/coremark/linux64/core_portme.h @@ -0,0 +1,291 @@ +/* +Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +Original Author: Shay Gal-on +*/ + +/* Topic: Description + This file contains configuration constants required to execute on different platforms +*/ +#ifndef CORE_PORTME_H +#define CORE_PORTME_H +/************************/ +/* Data types and settings */ +/************************/ +/* Configuration: HAS_FLOAT + Define to 1 if the platform supports floating point. +*/ +#ifndef HAS_FLOAT +#define HAS_FLOAT 1 +#endif +/* Configuration: HAS_TIME_H + Define to 1 if platform has the time.h header file, + and implementation of functions thereof. +*/ +#ifndef HAS_TIME_H +#define HAS_TIME_H 1 +#endif +/* Configuration: USE_CLOCK + Define to 1 if platform has the time.h header file, + and implementation of functions thereof. +*/ +#ifndef USE_CLOCK +#define USE_CLOCK 0 +#endif +/* Configuration: HAS_STDIO + Define to 1 if the platform has stdio.h. +*/ +#ifndef HAS_STDIO +#define HAS_STDIO 1 +#endif +/* Configuration: HAS_PRINTF + Define to 1 if the platform has stdio.h and implements the printf function. +*/ +#ifndef HAS_PRINTF +#define HAS_PRINTF 1 +#endif + +/* Configuration: CORE_TICKS + Define type of return from the timing functions. + */ +#if defined(_MSC_VER) +#include +typedef size_t CORE_TICKS; +#elif HAS_TIME_H +#include +typedef clock_t CORE_TICKS; +#else +#error "Please define type of CORE_TICKS and implement start_time, end_time get_time and time_in_secs functions!" +#endif + +/* Definitions: COMPILER_VERSION, COMPILER_FLAGS, MEM_LOCATION + Initialize these strings per platform +*/ +#ifndef COMPILER_VERSION + #ifdef __GNUC__ + #define COMPILER_VERSION "GCC"__VERSION__ + #else + #define COMPILER_VERSION "Please put compiler version here (e.g. gcc 4.1)" + #endif +#endif +#ifndef COMPILER_FLAGS + #define COMPILER_FLAGS FLAGS_STR /* "Please put compiler flags here (e.g. -o3)" */ +#endif +#ifndef MEM_LOCATION + #define MEM_LOCATION "Please put data memory location here\n\t\t\t(e.g. code in flash, data on heap etc)" + #define MEM_LOCATION_UNSPEC 1 +#endif + +/* Data Types: + To avoid compiler issues, define the data types that need ot be used for 8b, 16b and 32b in . + + *Imprtant*: + ee_ptr_int needs to be the data type used to hold pointers, otherwise coremark may fail!!! +*/ +typedef signed short ee_s16; +typedef unsigned short ee_u16; +typedef signed int ee_s32; +typedef double ee_f32; +typedef unsigned char ee_u8; +typedef unsigned int ee_u32; +typedef unsigned long long ee_ptr_int; +typedef size_t ee_size_t; +/* align an offset to point to a 32b value */ +#define align_mem(x) (void *)(4 + (((ee_ptr_int)(x) - 1) & ~3)) + +/* Configuration: SEED_METHOD + Defines method to get seed values that cannot be computed at compile time. + + Valid values: + SEED_ARG - from command line. + SEED_FUNC - from a system function. + SEED_VOLATILE - from volatile variables. +*/ +#ifndef SEED_METHOD +#define SEED_METHOD SEED_ARG +#endif + +/* Configuration: MEM_METHOD + Defines method to get a block of memry. + + Valid values: + MEM_MALLOC - for platforms that implement malloc and have malloc.h. + MEM_STATIC - to use a static memory array. + MEM_STACK - to allocate the data block on the stack (NYI). +*/ +#ifndef MEM_METHOD +#define MEM_METHOD MEM_MALLOC +#endif + +/* Configuration: MULTITHREAD + Define for parallel execution + + Valid values: + 1 - only one context (default). + N>1 - will execute N copies in parallel. + + Note: + If this flag is defined to more then 1, an implementation for launching parallel contexts must be defined. + + Two sample implementations are provided. Use or to enable them. + + It is valid to have a different implementation of and in , + to fit a particular architecture. +*/ +#ifndef MULTITHREAD +#define MULTITHREAD 1 +#endif + +/* Configuration: USE_PTHREAD + Sample implementation for launching parallel contexts + This implementation uses pthread_thread_create and pthread_join. + + Valid values: + 0 - Do not use pthreads API. + 1 - Use pthreads API + + Note: + This flag only matters if MULTITHREAD has been defined to a value greater then 1. +*/ +#ifndef USE_PTHREAD +#define USE_PTHREAD 0 +#endif + +/* Configuration: USE_FORK + Sample implementation for launching parallel contexts + This implementation uses fork, waitpid, shmget,shmat and shmdt. + + Valid values: + 0 - Do not use fork API. + 1 - Use fork API + + Note: + This flag only matters if MULTITHREAD has been defined to a value greater then 1. +*/ +#ifndef USE_FORK +#define USE_FORK 0 +#endif + +/* Configuration: USE_SOCKET + Sample implementation for launching parallel contexts + This implementation uses fork, socket, sendto and recvfrom + + Valid values: + 0 - Do not use fork and sockets API. + 1 - Use fork and sockets API + + Note: + This flag only matters if MULTITHREAD has been defined to a value greater then 1. +*/ +#ifndef USE_SOCKET +#define USE_SOCKET 0 +#endif + +/* Configuration: MAIN_HAS_NOARGC + Needed if platform does not support getting arguments to main. + + Valid values: + 0 - argc/argv to main is supported + 1 - argc/argv to main is not supported +*/ +#ifndef MAIN_HAS_NOARGC +#define MAIN_HAS_NOARGC 0 +#endif + +/* Configuration: MAIN_HAS_NORETURN + Needed if platform does not support returning a value from main. + + Valid values: + 0 - main returns an int, and return value will be 0. + 1 - platform does not support returning a value from main +*/ +#ifndef MAIN_HAS_NORETURN +#define MAIN_HAS_NORETURN 0 +#endif + +/* Variable: default_num_contexts + Number of contexts to spawn in multicore context. + Override this global value to change number of contexts used. + + Note: + This value may not be set higher then the define. + + To experiment, you can set the define to the highest value expected, and use argc/argv in the to set this value from the command line. +*/ +extern ee_u32 default_num_contexts; + +#if (MULTITHREAD>1) +#if USE_PTHREAD + #include + #define PARALLEL_METHOD "PThreads" +#elif USE_FORK + #include + #include + #include + #include + #include /* for memcpy */ + #define PARALLEL_METHOD "Fork" +#elif USE_SOCKET + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #define PARALLEL_METHOD "Sockets" +#else + #define PARALLEL_METHOD "Proprietary" + #error "Please implement multicore functionality in core_portme.c to use multiple contexts." +#endif /* Method for multithreading */ +#endif /* MULTITHREAD > 1 */ + +typedef struct CORE_PORTABLE_S { +#if (MULTITHREAD>1) + #if USE_PTHREAD + pthread_t thread; + #elif USE_FORK + pid_t pid; + int shmid; + void *shm; + #elif USE_SOCKET + pid_t pid; + int sock; + struct sockaddr_in sa; + #endif /* Method for multithreading */ +#endif /* MULTITHREAD>1 */ + ee_u8 portable_id; +} core_portable; + +/* target specific init/fini */ +void portable_init(core_portable *p, int *argc, char *argv[]); +void portable_fini(core_portable *p); + +#if (SEED_METHOD==SEED_VOLATILE) + #if (VALIDATION_RUN || PERFORMANCE_RUN || PROFILE_RUN) + #define RUN_TYPE_FLAG 1 + #else + #if (TOTAL_DATA_SIZE==1200) + #define PROFILE_RUN 1 + #else + #define PERFORMANCE_RUN 1 + #endif + #endif +#endif /* SEED_METHOD==SEED_VOLATILE */ + +#endif /* CORE_PORTME_H */ diff --git a/tests/riscv-coremark/coremark/linux64/core_portme.mak b/tests/riscv-coremark/coremark/linux64/core_portme.mak new file mode 100755 index 000000000..5cfabee32 --- /dev/null +++ b/tests/riscv-coremark/coremark/linux64/core_portme.mak @@ -0,0 +1,140 @@ +# Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Original Author: Shay Gal-on + +#File: core_portme.mak + +# Flag: OUTFLAG +# Use this flag to define how to to get an executable (e.g -o) +OUTFLAG= -o +# Flag: CC +# Use this flag to define compiler to use +CC = gcc +# Flag: CFLAGS +# Use this flag to define compiler options. Note, you can add compiler options from the command line using XCFLAGS="other flags" +PORT_CFLAGS = -O2 +FLAGS_STR = "$(PORT_CFLAGS) $(XCFLAGS) $(XLFLAGS) $(LFLAGS_END)" +CFLAGS = $(PORT_CFLAGS) -I$(PORT_DIR) -I. -DFLAGS_STR=\"$(FLAGS_STR)\" +#Flag: LFLAGS_END +# Define any libraries needed for linking or other flags that should come at the end of the link line (e.g. linker scripts). +# Note: On certain platforms, the default clock_gettime implementation is supported but requires linking of librt. +LFLAGS_END += -lrt +# Flag: PORT_SRCS +# Port specific source files can be added here +PORT_SRCS = $(PORT_DIR)/core_portme.c +# Flag: LOAD +# Define this flag if you need to load to a target, as in a cross compile environment. + +# Flag: RUN +# Define this flag if running does not consist of simple invocation of the binary. +# In a cross compile environment, you need to define this. + +#For flashing and using a tera term macro, you could use +#LOAD = flash ADDR +#RUN = ttpmacro coremark.ttl + +#For copying to target and executing via SSH connection, you could use +#LOAD = scp $(OUTFILE) user@target:~ +#RUN = ssh user@target -c + +#For native compilation and execution +LOAD = echo Loading done +RUN = + +OEXT = .o +EXE = .exe + +# Flag: SEPARATE_COMPILE +# Define if you need to separate compilation from link stage. +# In this case, you also need to define below how to create an object file, and how to link. +ifdef SEPARATE_COMPILE + +LD = gcc +OBJOUT = -o +LFLAGS = +OFLAG = -o +COUT = -c +# Flag: PORT_OBJS +# Port specific object files can be added here +PORT_OBJS = $(PORT_DIR)/core_portme$(OEXT) +PORT_CLEAN = *$(OEXT) + +$(OPATH)%$(OEXT) : %.c + $(CC) $(CFLAGS) $(XCFLAGS) $(COUT) $< $(OBJOUT) $@ + +endif + +# Target: port_prebuild +# Generate any files that are needed before actual build starts. +# E.g. generate profile guidance files. Sample PGO generation for gcc enabled with PGO=1 +# - First, check if PGO was defined on the command line, if so, need to add -fprofile-use to compile line. +# - Second, if PGO reference has not yet been generated, add a step to the prebuild that will build a profile-generate version and run it. +# Note - Using REBUILD=1 +# +# Use make PGO=1 to invoke this sample processing. + +ifdef PGO + ifeq (,$(findstring $(PGO),gen)) + PGO_STAGE=build_pgo_gcc + CFLAGS+=-fprofile-use + endif + PORT_CLEAN+=*.gcda *.gcno gmon.out +endif + +.PHONY: port_prebuild +port_prebuild: $(PGO_STAGE) + +.PHONY: build_pgo_gcc +build_pgo_gcc: + $(MAKE) PGO=gen XCFLAGS="$(XCFLAGS) -fprofile-generate -DTOTAL_DATA_SIZE=1200" ITERATIONS=10 gen_pgo_data REBUILD=1 + +# Target: port_postbuild +# Generate any files that are needed after actual build end. +# E.g. change format to srec, bin, zip in order to be able to load into flash +.PHONY: port_postbuild +port_postbuild: + +# Target: port_postrun +# Do platform specific after run stuff. +# E.g. reset the board, backup the logfiles etc. +.PHONY: port_postrun +port_postrun: + +# Target: port_prerun +# Do platform specific after run stuff. +# E.g. reset the board, backup the logfiles etc. +.PHONY: port_prerun +port_prerun: + +# Target: port_postload +# Do platform specific after load stuff. +# E.g. reset the reset power to the flash eraser +.PHONY: port_postload +port_postload: + +# Target: port_preload +# Do platform specific before load stuff. +# E.g. reset the reset power to the flash eraser +.PHONY: port_preload +port_preload: + +# FLAG: OPATH +# Path to the output folder. Default - current folder. +OPATH = ./ +MKDIR = mkdir -p + +# FLAG: PERL +# Define perl executable to calculate the geomean if running separate. +PERL=/usr/bin/perl diff --git a/tests/riscv-coremark/coremark/macos/core_portme.mak b/tests/riscv-coremark/coremark/macos/core_portme.mak new file mode 100644 index 000000000..6b27c3c41 --- /dev/null +++ b/tests/riscv-coremark/coremark/macos/core_portme.mak @@ -0,0 +1,18 @@ +# Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Original Author: Shay Gal-on + +NO_LIBRT = 1 +include posix/core_portme.mak diff --git a/tests/riscv-coremark/coremark/posix/core_portme.c b/tests/riscv-coremark/coremark/posix/core_portme.c new file mode 100644 index 000000000..f5a7f5b3d --- /dev/null +++ b/tests/riscv-coremark/coremark/posix/core_portme.c @@ -0,0 +1,419 @@ +/* +Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +Original Author: Shay Gal-on +*/ + +#include +#include +#include "coremark.h" +#if CALLGRIND_RUN +#include +#endif + +#if (MEM_METHOD == MEM_MALLOC) +/* Function: portable_malloc + Provide malloc() functionality in a platform specific way. +*/ +void * +portable_malloc(size_t size) +{ + return malloc(size); +} +/* Function: portable_free + Provide free() functionality in a platform specific way. +*/ +void +portable_free(void *p) +{ + free(p); +} +#else +void * +portable_malloc(size_t size) +{ + return NULL; +} +void +portable_free(void *p) +{ + p = NULL; +} +#endif + +#if (SEED_METHOD == SEED_VOLATILE) +#if VALIDATION_RUN +volatile ee_s32 seed1_volatile = 0x3415; +volatile ee_s32 seed2_volatile = 0x3415; +volatile ee_s32 seed3_volatile = 0x66; +#endif +#if PERFORMANCE_RUN +volatile ee_s32 seed1_volatile = 0x0; +volatile ee_s32 seed2_volatile = 0x0; +volatile ee_s32 seed3_volatile = 0x66; +#endif +#if PROFILE_RUN +volatile ee_s32 seed1_volatile = 0x8; +volatile ee_s32 seed2_volatile = 0x8; +volatile ee_s32 seed3_volatile = 0x8; +#endif +volatile ee_s32 seed4_volatile = ITERATIONS; +volatile ee_s32 seed5_volatile = 0; +#endif +/* Porting: Timing functions + How to capture time and convert to seconds must be ported to whatever is + supported by the platform. e.g. Read value from on board RTC, read value from + cpu clock cycles performance counter etc. Sample implementation for standard + time.h and windows.h definitions included. +*/ +/* Define: TIMER_RES_DIVIDER + Divider to trade off timer resolution and total time that can be + measured. + + Use lower values to increase resolution, but make sure that overflow + does not occur. If there are issues with the return value overflowing, + increase this value. + */ +#if USE_CLOCK +#define NSECS_PER_SEC CLOCKS_PER_SEC +#define EE_TIMER_TICKER_RATE 1000 +#define CORETIMETYPE clock_t +#define GETMYTIME(_t) (*_t = clock()) +#define MYTIMEDIFF(fin, ini) ((fin) - (ini)) +#define TIMER_RES_DIVIDER 1 +#define SAMPLE_TIME_IMPLEMENTATION 1 +#elif defined(_MSC_VER) +#define NSECS_PER_SEC 10000000 +#define EE_TIMER_TICKER_RATE 1000 +#define CORETIMETYPE FILETIME +#define GETMYTIME(_t) GetSystemTimeAsFileTime(_t) +#define MYTIMEDIFF(fin, ini) \ + (((*(__int64 *)&fin) - (*(__int64 *)&ini)) / TIMER_RES_DIVIDER) +/* setting to millisces resolution by default with MSDEV */ +#ifndef TIMER_RES_DIVIDER +#define TIMER_RES_DIVIDER 1000 +#endif +#define SAMPLE_TIME_IMPLEMENTATION 1 +#elif HAS_TIME_H +#define NSECS_PER_SEC 1000000000 +#define EE_TIMER_TICKER_RATE 1000 +#define CORETIMETYPE struct timespec +#define GETMYTIME(_t) clock_gettime(CLOCK_REALTIME, _t) +#define MYTIMEDIFF(fin, ini) \ + ((fin.tv_sec - ini.tv_sec) * (NSECS_PER_SEC / TIMER_RES_DIVIDER) \ + + (fin.tv_nsec - ini.tv_nsec) / TIMER_RES_DIVIDER) +/* setting to 1/1000 of a second resolution by default with linux */ +#ifndef TIMER_RES_DIVIDER +#define TIMER_RES_DIVIDER 1000000 +#endif +#define SAMPLE_TIME_IMPLEMENTATION 1 +#else +#define SAMPLE_TIME_IMPLEMENTATION 0 +#endif +#define EE_TICKS_PER_SEC (NSECS_PER_SEC / TIMER_RES_DIVIDER) + +#if SAMPLE_TIME_IMPLEMENTATION +/** Define Host specific (POSIX), or target specific global time variables. */ +static CORETIMETYPE start_time_val, stop_time_val; + +/* Function: start_time + This function will be called right before starting the timed portion of + the benchmark. + + Implementation may be capturing a system timer (as implemented in the + example code) or zeroing some system parameters - e.g. setting the cpu clocks + cycles to 0. +*/ +void +start_time(void) +{ + GETMYTIME(&start_time_val); +#if CALLGRIND_RUN + CALLGRIND_START_INSTRUMENTATION +#endif +#if MICA + asm volatile("int3"); /*1 */ +#endif +} +/* Function: stop_time + This function will be called right after ending the timed portion of the + benchmark. + + Implementation may be capturing a system timer (as implemented in the + example code) or other system parameters - e.g. reading the current value of + cpu cycles counter. +*/ +void +stop_time(void) +{ +#if CALLGRIND_RUN + CALLGRIND_STOP_INSTRUMENTATION +#endif +#if MICA + asm volatile("int3"); /*1 */ +#endif + GETMYTIME(&stop_time_val); +} +/* Function: get_time + Return an abstract "ticks" number that signifies time on the system. + + Actual value returned may be cpu cycles, milliseconds or any other + value, as long as it can be converted to seconds by . This + methodology is taken to accomodate any hardware or simulated platform. The + sample implementation returns millisecs by default, and the resolution is + controlled by +*/ +CORE_TICKS +get_time(void) +{ + CORE_TICKS elapsed + = (CORE_TICKS)(MYTIMEDIFF(stop_time_val, start_time_val)); + return elapsed; +} +/* Function: time_in_secs + Convert the value returned by get_time to seconds. + + The type is used to accomodate systems with no support for + floating point. Default implementation implemented by the EE_TICKS_PER_SEC + macro above. +*/ +secs_ret +time_in_secs(CORE_TICKS ticks) +{ + secs_ret retval = ((secs_ret)ticks) / (secs_ret)EE_TICKS_PER_SEC; + return retval; +} +#else +#error "Please implement timing functionality in core_portme.c" +#endif /* SAMPLE_TIME_IMPLEMENTATION */ + +ee_u32 default_num_contexts = MULTITHREAD; + +/* Function: portable_init + Target specific initialization code + Test for some common mistakes. +*/ +void +portable_init(core_portable *p, int *argc, char *argv[]) +{ +#if PRINT_ARGS + int i; + for (i = 0; i < *argc; i++) + { + ee_printf("Arg[%d]=%s\n", i, argv[i]); + } +#endif + if (sizeof(ee_ptr_int) != sizeof(ee_u8 *)) + { + ee_printf( + "ERROR! Please define ee_ptr_int to a type that holds a " + "pointer!\n"); + } + if (sizeof(ee_u32) != 4) + { + ee_printf("ERROR! Please define ee_u32 to a 32b unsigned type!\n"); + } +#if (MAIN_HAS_NOARGC && (SEED_METHOD == SEED_ARG)) + ee_printf( + "ERROR! Main has no argc, but SEED_METHOD defined to SEED_ARG!\n"); +#endif + +#if (MULTITHREAD > 1) && (SEED_METHOD == SEED_ARG) + int nargs = *argc, i; + if ((nargs > 1) && (*argv[1] == 'M')) + { + default_num_contexts = parseval(argv[1] + 1); + if (default_num_contexts > MULTITHREAD) + default_num_contexts = MULTITHREAD; + /* Shift args since first arg is directed to the portable part and not + * to coremark main */ + --nargs; + for (i = 1; i < nargs; i++) + argv[i] = argv[i + 1]; + *argc = nargs; + } +#endif /* sample of potential platform specific init via command line, reset \ + the number of contexts being used if first argument is M*/ + p->portable_id = 1; +} +/* Function: portable_fini + Target specific final code +*/ +void +portable_fini(core_portable *p) +{ + p->portable_id = 0; +} + +#if (MULTITHREAD > 1) + +/* Function: core_start_parallel + Start benchmarking in a parallel context. + + Three implementations are provided, one using pthreads, one using fork + and shared mem, and one using fork and sockets. Other implementations using + MCAPI or other standards can easily be devised. +*/ +/* Function: core_stop_parallel + Stop a parallel context execution of coremark, and gather the results. + + Three implementations are provided, one using pthreads, one using fork + and shared mem, and one using fork and sockets. Other implementations using + MCAPI or other standards can easily be devised. +*/ +#if USE_PTHREAD +ee_u8 +core_start_parallel(core_results *res) +{ + return (ee_u8)pthread_create( + &(res->port.thread), NULL, iterate, (void *)res); +} +ee_u8 +core_stop_parallel(core_results *res) +{ + void *retval; + return (ee_u8)pthread_join(res->port.thread, &retval); +} +#elif USE_FORK +static int key_id = 0; +ee_u8 +core_start_parallel(core_results *res) +{ + key_t key = 4321 + key_id; + key_id++; + res->port.pid = fork(); + res->port.shmid = shmget(key, 8, IPC_CREAT | 0666); + if (res->port.shmid < 0) + { + ee_printf("ERROR in shmget!\n"); + } + if (res->port.pid == 0) + { + iterate(res); + res->port.shm = shmat(res->port.shmid, NULL, 0); + /* copy the validation values to the shared memory area and quit*/ + if (res->port.shm == (char *)-1) + { + ee_printf("ERROR in child shmat!\n"); + } + else + { + memcpy(res->port.shm, &(res->crc), 8); + shmdt(res->port.shm); + } + exit(0); + } + return 1; +} +ee_u8 +core_stop_parallel(core_results *res) +{ + int status; + pid_t wpid = waitpid(res->port.pid, &status, WUNTRACED); + if (wpid != res->port.pid) + { + ee_printf("ERROR waiting for child.\n"); + if (errno == ECHILD) + ee_printf("errno=No such child %d\n", res->port.pid); + if (errno == EINTR) + ee_printf("errno=Interrupted\n"); + return 0; + } + /* after process is done, get the values from the shared memory area */ + res->port.shm = shmat(res->port.shmid, NULL, 0); + if (res->port.shm == (char *)-1) + { + ee_printf("ERROR in parent shmat!\n"); + return 0; + } + memcpy(&(res->crc), res->port.shm, 8); + shmdt(res->port.shm); + return 1; +} +#elif USE_SOCKET +static int key_id = 0; +ee_u8 +core_start_parallel(core_results *res) +{ + int bound, buffer_length = 8; + res->port.sa.sin_family = AF_INET; + res->port.sa.sin_addr.s_addr = htonl(0x7F000001); + res->port.sa.sin_port = htons(7654 + key_id); + key_id++; + res->port.pid = fork(); + if (res->port.pid == 0) + { /* benchmark child */ + iterate(res); + res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); + if (-1 == res->port.sock) /* if socket failed to initialize, exit */ + { + ee_printf("Error Creating Socket"); + } + else + { + int bytes_sent = sendto(res->port.sock, + &(res->crc), + buffer_length, + 0, + (struct sockaddr *)&(res->port.sa), + sizeof(struct sockaddr_in)); + if (bytes_sent < 0) + ee_printf("Error sending packet: %s\n", strerror(errno)); + close(res->port.sock); /* close the socket */ + } + exit(0); + } + /* parent process, open the socket */ + res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); + bound = bind(res->port.sock, + (struct sockaddr *)&(res->port.sa), + sizeof(struct sockaddr)); + if (bound < 0) + ee_printf("bind(): %s\n", strerror(errno)); + return 1; +} +ee_u8 +core_stop_parallel(core_results *res) +{ + int status; + int fromlen = sizeof(struct sockaddr); + int recsize = recvfrom(res->port.sock, + &(res->crc), + 8, + 0, + (struct sockaddr *)&(res->port.sa), + &fromlen); + if (recsize < 0) + { + ee_printf("Error in receive: %s\n", strerror(errno)); + return 0; + } + pid_t wpid = waitpid(res->port.pid, &status, WUNTRACED); + if (wpid != res->port.pid) + { + ee_printf("ERROR waiting for child.\n"); + if (errno == ECHILD) + ee_printf("errno=No such child %d\n", res->port.pid); + if (errno == EINTR) + ee_printf("errno=Interrupted\n"); + return 0; + } + return 1; +} +#else /* no standard multicore implementation */ +#error \ + "Please implement multicore functionality in core_portme.c to use multiple contexts." +#endif /* multithread implementations */ +#endif diff --git a/tests/riscv-coremark/coremark/posix/core_portme.h b/tests/riscv-coremark/coremark/posix/core_portme.h new file mode 100644 index 000000000..e49e474b1 --- /dev/null +++ b/tests/riscv-coremark/coremark/posix/core_portme.h @@ -0,0 +1,314 @@ +/* +Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +Original Author: Shay Gal-on +*/ + +/* Topic: Description + This file contains configuration constants required to execute on + different platforms +*/ +#ifndef CORE_PORTME_H +#define CORE_PORTME_H + +#include "core_portme_posix_overrides.h" + +/************************/ +/* Data types and settings */ +/************************/ +/* Configuration: HAS_FLOAT + Define to 1 if the platform supports floating point. +*/ +#ifndef HAS_FLOAT +#define HAS_FLOAT 1 +#endif +/* Configuration: HAS_TIME_H + Define to 1 if platform has the time.h header file, + and implementation of functions thereof. +*/ +#ifndef HAS_TIME_H +#define HAS_TIME_H 1 +#endif +/* Configuration: USE_CLOCK + Define to 1 if platform has the time.h header file, + and implementation of functions thereof. +*/ +#ifndef USE_CLOCK +#define USE_CLOCK 0 +#endif +/* Configuration: HAS_STDIO + Define to 1 if the platform has stdio.h. +*/ +#ifndef HAS_STDIO +#define HAS_STDIO 1 +#endif +/* Configuration: HAS_PRINTF + Define to 1 if the platform has stdio.h and implements the printf + function. +*/ +#ifndef HAS_PRINTF +#define HAS_PRINTF 1 +#endif + +/* Configuration: CORE_TICKS + Define type of return from the timing functions. + */ +#if defined(_MSC_VER) +#include +typedef size_t CORE_TICKS; +#elif HAS_TIME_H +#include +typedef clock_t CORE_TICKS; +#else +#error \ + "Please define type of CORE_TICKS and implement start_time, end_time get_time and time_in_secs functions!" +#endif + +/* Definitions: COMPILER_VERSION, COMPILER_FLAGS, MEM_LOCATION + Initialize these strings per platform +*/ +#ifndef COMPILER_VERSION +#ifdef __GNUC__ +#define COMPILER_VERSION "GCC"__VERSION__ +#else +#define COMPILER_VERSION "Please put compiler version here (e.g. gcc 4.1)" +#endif +#endif +#ifndef COMPILER_FLAGS +#define COMPILER_FLAGS \ + FLAGS_STR /* "Please put compiler flags here (e.g. -o3)" */ +#endif +#ifndef MEM_LOCATION +#define MEM_LOCATION \ + "Please put data memory location here\n\t\t\t(e.g. code in flash, data " \ + "on heap etc)" +#define MEM_LOCATION_UNSPEC 1 +#endif + +#include + +/* Data Types: + To avoid compiler issues, define the data types that need ot be used for + 8b, 16b and 32b in . + + *Imprtant*: + ee_ptr_int needs to be the data type used to hold pointers, otherwise + coremark may fail!!! +*/ +typedef signed short ee_s16; +typedef unsigned short ee_u16; +typedef signed int ee_s32; +typedef double ee_f32; +typedef unsigned char ee_u8; +typedef unsigned int ee_u32; +typedef uintptr_t ee_ptr_int; +typedef size_t ee_size_t; +/* align an offset to point to a 32b value */ +#define align_mem(x) (void *)(4 + (((ee_ptr_int)(x)-1) & ~3)) + +/* Configuration: SEED_METHOD + Defines method to get seed values that cannot be computed at compile + time. + + Valid values: + SEED_ARG - from command line. + SEED_FUNC - from a system function. + SEED_VOLATILE - from volatile variables. +*/ +#ifndef SEED_METHOD +#define SEED_METHOD SEED_ARG +#endif + +/* Configuration: MEM_METHOD + Defines method to get a block of memry. + + Valid values: + MEM_MALLOC - for platforms that implement malloc and have malloc.h. + MEM_STATIC - to use a static memory array. + MEM_STACK - to allocate the data block on the stack (NYI). +*/ +#ifndef MEM_METHOD +#define MEM_METHOD MEM_MALLOC +#endif + +/* Configuration: MULTITHREAD + Define for parallel execution + + Valid values: + 1 - only one context (default). + N>1 - will execute N copies in parallel. + + Note: + If this flag is defined to more then 1, an implementation for launching + parallel contexts must be defined. + + Two sample implementations are provided. Use or + to enable them. + + It is valid to have a different implementation of + and in , to fit a particular architecture. +*/ +#ifndef MULTITHREAD +#define MULTITHREAD 1 +#endif + +/* Configuration: USE_PTHREAD + Sample implementation for launching parallel contexts + This implementation uses pthread_thread_create and pthread_join. + + Valid values: + 0 - Do not use pthreads API. + 1 - Use pthreads API + + Note: + This flag only matters if MULTITHREAD has been defined to a value + greater then 1. +*/ +#ifndef USE_PTHREAD +#define USE_PTHREAD 0 +#endif + +/* Configuration: USE_FORK + Sample implementation for launching parallel contexts + This implementation uses fork, waitpid, shmget,shmat and shmdt. + + Valid values: + 0 - Do not use fork API. + 1 - Use fork API + + Note: + This flag only matters if MULTITHREAD has been defined to a value + greater then 1. +*/ +#ifndef USE_FORK +#define USE_FORK 0 +#endif + +/* Configuration: USE_SOCKET + Sample implementation for launching parallel contexts + This implementation uses fork, socket, sendto and recvfrom + + Valid values: + 0 - Do not use fork and sockets API. + 1 - Use fork and sockets API + + Note: + This flag only matters if MULTITHREAD has been defined to a value + greater then 1. +*/ +#ifndef USE_SOCKET +#define USE_SOCKET 0 +#endif + +/* Configuration: MAIN_HAS_NOARGC + Needed if platform does not support getting arguments to main. + + Valid values: + 0 - argc/argv to main is supported + 1 - argc/argv to main is not supported +*/ +#ifndef MAIN_HAS_NOARGC +#define MAIN_HAS_NOARGC 0 +#endif + +/* Configuration: MAIN_HAS_NORETURN + Needed if platform does not support returning a value from main. + + Valid values: + 0 - main returns an int, and return value will be 0. + 1 - platform does not support returning a value from main +*/ +#ifndef MAIN_HAS_NORETURN +#define MAIN_HAS_NORETURN 0 +#endif + +/* Variable: default_num_contexts + Number of contexts to spawn in multicore context. + Override this global value to change number of contexts used. + + Note: + This value may not be set higher then the define. + + To experiment, you can set the define to the highest value + expected, and use argc/argv in the to set this value from the + command line. +*/ +extern ee_u32 default_num_contexts; + +#if (MULTITHREAD > 1) +#if USE_PTHREAD +#include +#define PARALLEL_METHOD "PThreads" +#elif USE_FORK +#include +#include +#include +#include +#include /* for memcpy */ +#define PARALLEL_METHOD "Fork" +#elif USE_SOCKET +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#define PARALLEL_METHOD "Sockets" +#else +#define PARALLEL_METHOD "Proprietary" +#error \ + "Please implement multicore functionality in core_portme.c to use multiple contexts." +#endif /* Method for multithreading */ +#endif /* MULTITHREAD > 1 */ + +typedef struct CORE_PORTABLE_S +{ +#if (MULTITHREAD > 1) +#if USE_PTHREAD + pthread_t thread; +#elif USE_FORK + pid_t pid; + int shmid; + void *shm; +#elif USE_SOCKET + pid_t pid; + int sock; + struct sockaddr_in sa; +#endif /* Method for multithreading */ +#endif /* MULTITHREAD>1 */ + ee_u8 portable_id; +} core_portable; + +/* target specific init/fini */ +void portable_init(core_portable *p, int *argc, char *argv[]); +void portable_fini(core_portable *p); + +#if (SEED_METHOD == SEED_VOLATILE) +#if (VALIDATION_RUN || PERFORMANCE_RUN || PROFILE_RUN) +#define RUN_TYPE_FLAG 1 +#else +#if (TOTAL_DATA_SIZE == 1200) +#define PROFILE_RUN 1 +#else +#define PERFORMANCE_RUN 1 +#endif +#endif +#endif /* SEED_METHOD==SEED_VOLATILE */ + +#endif /* CORE_PORTME_H */ diff --git a/tests/riscv-coremark/coremark/posix/core_portme.mak b/tests/riscv-coremark/coremark/posix/core_portme.mak new file mode 100755 index 000000000..e6be71a7e --- /dev/null +++ b/tests/riscv-coremark/coremark/posix/core_portme.mak @@ -0,0 +1,151 @@ +# Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Original Author: Shay Gal-on + +#File: core_portme.mak + +# Flag: OUTFLAG +# Use this flag to define how to to get an executable (e.g -o) +OUTFLAG= -o +# Flag: CC +# Use this flag to define compiler to use +CC?= cc +# Flag: CFLAGS +# Use this flag to define compiler options. Note, you can add compiler options from the command line using XCFLAGS="other flags" +PORT_CFLAGS = -O2 +FLAGS_STR = "$(PORT_CFLAGS) $(XCFLAGS) $(XLFLAGS) $(LFLAGS_END)" +CFLAGS = $(PORT_CFLAGS) -I$(PORT_DIR) -Iposix -I. -DFLAGS_STR=\"$(FLAGS_STR)\" +# Flag: NO_LIBRT +# Define if the platform does not provide a librt +ifndef NO_LIBRT +#Flag: LFLAGS_END +# Define any libraries needed for linking or other flags that should come at the end of the link line (e.g. linker scripts). +# Note: On certain platforms, the default clock_gettime implementation is supported but requires linking of librt. +LFLAGS_END += -lrt +endif +# Flag: PORT_SRCS +# Port specific source files can be added here +PORT_SRCS = posix/core_portme.c +vpath %.c posix +vpath %.h posix +vpath %.mak posix +# Flag: EXTRA_DEPENDS +# Port specific extra build dependencies. +# Some ports inherit from us, so ensure this Makefile is always a dependency. +EXTRA_DEPENDS += posix/core_portme.mak +# Flag: LOAD +# Define this flag if you need to load to a target, as in a cross compile environment. + +# Flag: RUN +# Define this flag if running does not consist of simple invocation of the binary. +# In a cross compile environment, you need to define this. + +#For flashing and using a tera term macro, you could use +#LOAD = flash ADDR +#RUN = ttpmacro coremark.ttl + +#For copying to target and executing via SSH connection, you could use +#LOAD = scp $(OUTFILE) user@target:~ +#RUN = ssh user@target -c + +#For native compilation and execution +LOAD = echo Loading done +RUN = + +OEXT = .o +EXE = .exe + +# Flag: SEPARATE_COMPILE +# Define if you need to separate compilation from link stage. +# In this case, you also need to define below how to create an object file, and how to link. +ifdef SEPARATE_COMPILE + +LD = gcc +OBJOUT = -o +LFLAGS = +OFLAG = -o +COUT = -c +# Flag: PORT_OBJS +# Port specific object files can be added here +PORT_OBJS = $(PORT_DIR)/core_portme$(OEXT) +PORT_CLEAN = *$(OEXT) + +$(OPATH)%$(OEXT) : %.c + $(CC) $(CFLAGS) $(XCFLAGS) $(COUT) $< $(OBJOUT) $@ + +endif + +# Target: port_prebuild +# Generate any files that are needed before actual build starts. +# E.g. generate profile guidance files. Sample PGO generation for gcc enabled with PGO=1 +# - First, check if PGO was defined on the command line, if so, need to add -fprofile-use to compile line. +# - Second, if PGO reference has not yet been generated, add a step to the prebuild that will build a profile-generate version and run it. +# Note - Using REBUILD=1 +# +# Use make PGO=1 to invoke this sample processing. + +ifdef PGO + ifeq (,$(findstring $(PGO),gen)) + PGO_STAGE=build_pgo_gcc + CFLAGS+=-fprofile-use + endif + PORT_CLEAN+=*.gcda *.gcno gmon.out +endif + +.PHONY: port_prebuild +port_prebuild: $(PGO_STAGE) + +.PHONY: build_pgo_gcc +build_pgo_gcc: + $(MAKE) PGO=gen XCFLAGS="$(XCFLAGS) -fprofile-generate -DTOTAL_DATA_SIZE=1200" ITERATIONS=10 gen_pgo_data REBUILD=1 + +# Target: port_postbuild +# Generate any files that are needed after actual build end. +# E.g. change format to srec, bin, zip in order to be able to load into flash +.PHONY: port_postbuild +port_postbuild: + +# Target: port_postrun +# Do platform specific after run stuff. +# E.g. reset the board, backup the logfiles etc. +.PHONY: port_postrun +port_postrun: + +# Target: port_prerun +# Do platform specific after run stuff. +# E.g. reset the board, backup the logfiles etc. +.PHONY: port_prerun +port_prerun: + +# Target: port_postload +# Do platform specific after load stuff. +# E.g. reset the reset power to the flash eraser +.PHONY: port_postload +port_postload: + +# Target: port_preload +# Do platform specific before load stuff. +# E.g. reset the reset power to the flash eraser +.PHONY: port_preload +port_preload: + +# FLAG: OPATH +# Path to the output folder. Default - current folder. +OPATH = ./ +MKDIR = mkdir -p + +# FLAG: PERL +# Define perl executable to calculate the geomean if running separate. +PERL=/usr/bin/perl diff --git a/tests/riscv-coremark/coremark/posix/core_portme_posix_overrides.h b/tests/riscv-coremark/coremark/posix/core_portme_posix_overrides.h new file mode 100644 index 000000000..c0e998adf --- /dev/null +++ b/tests/riscv-coremark/coremark/posix/core_portme_posix_overrides.h @@ -0,0 +1,28 @@ +/* +Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +Original Author: Shay Gal-on +*/ + +/* Topic: Description + This file contains additional configuration constants required to execute on + different platforms over and above the POSIX defaults +*/ +#ifndef CORE_PORTME_POSIX_OVERRIDES_H +#define CORE_PORTME_POSIX_OVERRIDES_H + +/* None by default */ + +#endif diff --git a/tests/riscv-coremark/coremark/rtems/core_portme.mak b/tests/riscv-coremark/coremark/rtems/core_portme.mak new file mode 100644 index 000000000..6b27c3c41 --- /dev/null +++ b/tests/riscv-coremark/coremark/rtems/core_portme.mak @@ -0,0 +1,18 @@ +# Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Original Author: Shay Gal-on + +NO_LIBRT = 1 +include posix/core_portme.mak diff --git a/tests/riscv-coremark/coremark/rtems/init.c b/tests/riscv-coremark/coremark/rtems/init.c new file mode 100644 index 000000000..64d3e59ae --- /dev/null +++ b/tests/riscv-coremark/coremark/rtems/init.c @@ -0,0 +1,63 @@ +/*- + * SPDX-License-Identifier: BSD-2-Clause + * + * Copyright (c) 2021 Hesham Almatary + * + * This software was developed by SRI International and the University of + * Cambridge Computer Laboratory (Department of Computer Science and + * Technology) under DARPA contract HR0011-18-C-0016 ("ECATS"), as part of the + * DARPA SSITH research programme. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include + +int main( + int argc, + void **args +); + +rtems_task Init( + rtems_task_argument ignored +); + +rtems_task Init( + rtems_task_argument ignored +) +{ + int ret = main(0, NULL); + exit(ret); +} + +/* configuration information */ +#define CONFIGURE_APPLICATION_NEEDS_SIMPLE_CONSOLE_DRIVER +#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER + +#define CONFIGURE_MAXIMUM_TASKS 20 + +#define CONFIGURE_RTEMS_INIT_TASKS_TABLE + +#define CONFIGURE_INIT + +#include diff --git a/tests/riscv-coremark/coremark/simple/core_portme.c b/tests/riscv-coremark/coremark/simple/core_portme.c new file mode 100644 index 000000000..b95e3b21e --- /dev/null +++ b/tests/riscv-coremark/coremark/simple/core_portme.c @@ -0,0 +1,149 @@ +/* +Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +Original Author: Shay Gal-on +*/ + +#include +#include +#include "coremark.h" + +#if VALIDATION_RUN +volatile ee_s32 seed1_volatile = 0x3415; +volatile ee_s32 seed2_volatile = 0x3415; +volatile ee_s32 seed3_volatile = 0x66; +#endif +#if PERFORMANCE_RUN +volatile ee_s32 seed1_volatile = 0x0; +volatile ee_s32 seed2_volatile = 0x0; +volatile ee_s32 seed3_volatile = 0x66; +#endif +#if PROFILE_RUN +volatile ee_s32 seed1_volatile = 0x8; +volatile ee_s32 seed2_volatile = 0x8; +volatile ee_s32 seed3_volatile = 0x8; +#endif +volatile ee_s32 seed4_volatile = ITERATIONS; +volatile ee_s32 seed5_volatile = 0; +/* Porting : Timing functions + How to capture time and convert to seconds must be ported to whatever is + supported by the platform. e.g. Read value from on board RTC, read value from + cpu clock cycles performance counter etc. Sample implementation for standard + time.h and windows.h definitions included. +*/ +/* Define : TIMER_RES_DIVIDER + Divider to trade off timer resolution and total time that can be + measured. + + Use lower values to increase resolution, but make sure that overflow + does not occur. If there are issues with the return value overflowing, + increase this value. + */ +#define NSECS_PER_SEC CLOCKS_PER_SEC +#define CORETIMETYPE clock_t +#define GETMYTIME(_t) (*_t = clock()) +#define MYTIMEDIFF(fin, ini) ((fin) - (ini)) +#define TIMER_RES_DIVIDER 1 +#define SAMPLE_TIME_IMPLEMENTATION 1 +#define EE_TICKS_PER_SEC (NSECS_PER_SEC / TIMER_RES_DIVIDER) + +/** Define Host specific (POSIX), or target specific global time variables. */ +static CORETIMETYPE start_time_val, stop_time_val; + +/* Function : start_time + This function will be called right before starting the timed portion of + the benchmark. + + Implementation may be capturing a system timer (as implemented in the + example code) or zeroing some system parameters - e.g. setting the cpu clocks + cycles to 0. +*/ +void +start_time(void) +{ + GETMYTIME(&start_time_val); +} +/* Function : stop_time + This function will be called right after ending the timed portion of the + benchmark. + + Implementation may be capturing a system timer (as implemented in the + example code) or other system parameters - e.g. reading the current value of + cpu cycles counter. +*/ +void +stop_time(void) +{ + GETMYTIME(&stop_time_val); +} +/* Function : get_time + Return an abstract "ticks" number that signifies time on the system. + + Actual value returned may be cpu cycles, milliseconds or any other + value, as long as it can be converted to seconds by . This + methodology is taken to accomodate any hardware or simulated platform. The + sample implementation returns millisecs by default, and the resolution is + controlled by +*/ +CORE_TICKS +get_time(void) +{ + CORE_TICKS elapsed + = (CORE_TICKS)(MYTIMEDIFF(stop_time_val, start_time_val)); + return elapsed; +} +/* Function : time_in_secs + Convert the value returned by get_time to seconds. + + The type is used to accomodate systems with no support for + floating point. Default implementation implemented by the EE_TICKS_PER_SEC + macro above. +*/ +secs_ret +time_in_secs(CORE_TICKS ticks) +{ + secs_ret retval = ((secs_ret)ticks) / (secs_ret)EE_TICKS_PER_SEC; + return retval; +} + +ee_u32 default_num_contexts = 1; + +/* Function : portable_init + Target specific initialization code + Test for some common mistakes. +*/ +void +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 " + "pointer!\n"); + } + if (sizeof(ee_u32) != 4) + { + ee_printf("ERROR! Please define ee_u32 to a 32b unsigned type!\n"); + } + p->portable_id = 1; +} +/* Function : portable_fini + Target specific final code +*/ +void +portable_fini(core_portable *p) +{ + p->portable_id = 0; +} diff --git a/tests/riscv-coremark/coremark/simple/core_portme.h b/tests/riscv-coremark/coremark/simple/core_portme.h new file mode 100644 index 000000000..dfd94cbfc --- /dev/null +++ b/tests/riscv-coremark/coremark/simple/core_portme.h @@ -0,0 +1,208 @@ +/* +Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +Original Author: Shay Gal-on +*/ + +/* Topic : Description + This file contains configuration constants required to execute on + different platforms +*/ +#ifndef CORE_PORTME_H +#define CORE_PORTME_H +/************************/ +/* Data types and settings */ +/************************/ +/* Configuration : HAS_FLOAT + Define to 1 if the platform supports floating point. +*/ +#ifndef HAS_FLOAT +#define HAS_FLOAT 1 +#endif +/* Configuration : HAS_TIME_H + Define to 1 if platform has the time.h header file, + and implementation of functions thereof. +*/ +#ifndef HAS_TIME_H +#define HAS_TIME_H 1 +#endif +/* Configuration : USE_CLOCK + Define to 1 if platform has the time.h header file, + and implementation of functions thereof. +*/ +#ifndef USE_CLOCK +#define USE_CLOCK 1 +#endif +/* Configuration : HAS_STDIO + Define to 1 if the platform has stdio.h. +*/ +#ifndef HAS_STDIO +#define HAS_STDIO 1 +#endif +/* Configuration : HAS_PRINTF + Define to 1 if the platform has stdio.h and implements the printf + function. +*/ +#ifndef HAS_PRINTF +#define HAS_PRINTF 1 +#endif + +/* Configuration : CORE_TICKS + Define type of return from the timing functions. + */ +#include +typedef clock_t CORE_TICKS; + +/* Definitions : COMPILER_VERSION, COMPILER_FLAGS, MEM_LOCATION + Initialize these strings per platform +*/ +#ifndef COMPILER_VERSION +#ifdef __GNUC__ +#define COMPILER_VERSION "GCC"__VERSION__ +#else +#define COMPILER_VERSION "Please put compiler version here (e.g. gcc 4.1)" +#endif +#endif +#ifndef COMPILER_FLAGS +#define COMPILER_FLAGS \ + FLAGS_STR /* "Please put compiler flags here (e.g. -o3)" */ +#endif +#ifndef MEM_LOCATION +#define MEM_LOCATION "STACK" +#endif + +/* Data Types : + To avoid compiler issues, define the data types that need ot be used for + 8b, 16b and 32b in . + + *Imprtant* : + ee_ptr_int needs to be the data type used to hold pointers, otherwise + coremark may fail!!! +*/ +typedef signed short ee_s16; +typedef unsigned short ee_u16; +typedef signed int ee_s32; +typedef double ee_f32; +typedef unsigned char ee_u8; +typedef unsigned int ee_u32; +typedef ee_u32 ee_ptr_int; +typedef size_t ee_size_t; +/* align_mem : + This macro is used to align an offset to point to a 32b value. It is + used in the Matrix algorithm to initialize the input memory blocks. +*/ +#define align_mem(x) (void *)(4 + (((ee_ptr_int)(x)-1) & ~3)) + +/* Configuration : SEED_METHOD + Defines method to get seed values that cannot be computed at compile + time. + + Valid values : + SEED_ARG - from command line. + SEED_FUNC - from a system function. + SEED_VOLATILE - from volatile variables. +*/ +#ifndef SEED_METHOD +#define SEED_METHOD SEED_VOLATILE +#endif + +/* Configuration : MEM_METHOD + Defines method to get a block of memry. + + Valid values : + MEM_MALLOC - for platforms that implement malloc and have malloc.h. + MEM_STATIC - to use a static memory array. + MEM_STACK - to allocate the data block on the stack (NYI). +*/ +#ifndef MEM_METHOD +#define MEM_METHOD MEM_STACK +#endif + +/* Configuration : MULTITHREAD + Define for parallel execution + + Valid values : + 1 - only one context (default). + N>1 - will execute N copies in parallel. + + Note : + If this flag is defined to more then 1, an implementation for launching + parallel contexts must be defined. + + Two sample implementations are provided. Use or + to enable them. + + It is valid to have a different implementation of + and in , to fit a particular architecture. +*/ +#ifndef MULTITHREAD +#define MULTITHREAD 1 +#define USE_PTHREAD 0 +#define USE_FORK 0 +#define USE_SOCKET 0 +#endif + +/* Configuration : MAIN_HAS_NOARGC + Needed if platform does not support getting arguments to main. + + Valid values : + 0 - argc/argv to main is supported + 1 - argc/argv to main is not supported + + Note : + This flag only matters if MULTITHREAD has been defined to a value + greater then 1. +*/ +#ifndef MAIN_HAS_NOARGC +#define MAIN_HAS_NOARGC 0 +#endif + +/* Configuration : MAIN_HAS_NORETURN + Needed if platform does not support returning a value from main. + + Valid values : + 0 - main returns an int, and return value will be 0. + 1 - platform does not support returning a value from main +*/ +#ifndef MAIN_HAS_NORETURN +#define MAIN_HAS_NORETURN 0 +#endif + +/* Variable : default_num_contexts + Not used for this simple port, must cintain the value 1. +*/ +extern ee_u32 default_num_contexts; + +typedef struct CORE_PORTABLE_S +{ + ee_u8 portable_id; +} core_portable; + +/* target specific init/fini */ +void portable_init(core_portable *p, int *argc, char *argv[]); +void portable_fini(core_portable *p); + +#if !defined(PROFILE_RUN) && !defined(PERFORMANCE_RUN) \ + && !defined(VALIDATION_RUN) +#if (TOTAL_DATA_SIZE == 1200) +#define PROFILE_RUN 1 +#elif (TOTAL_DATA_SIZE == 2000) +#define PERFORMANCE_RUN 1 +#else +#define VALIDATION_RUN 1 +#endif +#endif + +#endif /* CORE_PORTME_H */ diff --git a/tests/riscv-coremark/coremark/simple/core_portme.mak b/tests/riscv-coremark/coremark/simple/core_portme.mak new file mode 100755 index 000000000..61c3db683 --- /dev/null +++ b/tests/riscv-coremark/coremark/simple/core_portme.mak @@ -0,0 +1,60 @@ +# Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Original Author: Shay Gal-on + +#File : core_portme.mak + +# Flag : OUTFLAG +# Use this flag to define how to to get an executable (e.g -o) +OUTFLAG= -o +# Flag : CC +# Use this flag to define compiler to use +CC = gcc +# Flag : CFLAGS +# Use this flag to define compiler options. Note, you can add compiler options from the command line using XCFLAGS="other flags" +PORT_CFLAGS = -O2 +FLAGS_STR = "$(PORT_CFLAGS) $(XCFLAGS) $(XLFLAGS) $(LFLAGS_END)" +CFLAGS = $(PORT_CFLAGS) -I$(PORT_DIR) -I. -DFLAGS_STR=\"$(FLAGS_STR)\" +#Flag : LFLAGS_END +# Define any libraries needed for linking or other flags that should come at the end of the link line (e.g. linker scripts). +# Note : On certain platforms, the default clock_gettime implementation is supported but requires linking of librt. +LFLAGS_END = +# Flag : PORT_SRCS +# Port specific source files can be added here +PORT_SRCS = $(PORT_DIR)/core_portme.c +# Flag : LOAD +# For a simple port, we assume self hosted compile and run, no load needed. + +# Flag : RUN +# For a simple port, we assume self hosted compile and run, simple invocation of the executable + +#For native compilation and execution +LOAD = echo Loading done +RUN = + +OEXT = .o +EXE = .exe + +# Target : port_pre% and port_post% +# For the purpose of this simple port, no pre or post steps needed. + +.PHONY : port_prebuild port_postbuild port_prerun port_postrun port_preload port_postload +port_pre% port_post% : + +# FLAG : OPATH +# Path to the output folder. Default - current folder. +OPATH = ./ +MKDIR = mkdir -p + diff --git a/tests/riscv-coremark/extraPortmes/README.md b/tests/riscv-coremark/extraPortmes/README.md new file mode 100644 index 000000000..681fc4d8b --- /dev/null +++ b/tests/riscv-coremark/extraPortmes/README.md @@ -0,0 +1,7 @@ +This directory is a backup for the portme files associated with cygwin, linux, and linux64 + +This backup is needed in the event that a user replaces the coremark directory with a clean version +from EEMBC's github page (the clean version does not have the cygwin, linux, +and linux64 files that our version does). + +Please do not delete this directory under any circumstance. \ No newline at end of file diff --git a/tests/riscv-coremark/extraPortmes/cygwin/core_portme.c b/tests/riscv-coremark/extraPortmes/cygwin/core_portme.c new file mode 100755 index 000000000..fe8d29983 --- /dev/null +++ b/tests/riscv-coremark/extraPortmes/cygwin/core_portme.c @@ -0,0 +1,336 @@ +/* +Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +Original Author: Shay Gal-on +*/ + +#include +#include +#include "coremark.h" +#if CALLGRIND_RUN +#include +#endif + +#if (MEM_METHOD==MEM_MALLOC) +#include +/* Function: portable_malloc + Provide malloc() functionality in a platform specific way. +*/ +void *portable_malloc(size_t size) { + return malloc(size); +} +/* Function: portable_free + Provide free() functionality in a platform specific way. +*/ +void portable_free(void *p) { + free(p); +} +#else +void *portable_malloc(size_t size) { + return NULL; +} +void portable_free(void *p) { + p=NULL; +} +#endif + +#if (SEED_METHOD==SEED_VOLATILE) +#if VALIDATION_RUN + volatile ee_s32 seed1_volatile=0x3415; + volatile ee_s32 seed2_volatile=0x3415; + volatile ee_s32 seed3_volatile=0x66; +#endif +#if PERFORMANCE_RUN + volatile ee_s32 seed1_volatile=0x0; + volatile ee_s32 seed2_volatile=0x0; + volatile ee_s32 seed3_volatile=0x66; +#endif +#if PROFILE_RUN + volatile ee_s32 seed1_volatile=0x8; + volatile ee_s32 seed2_volatile=0x8; + volatile ee_s32 seed3_volatile=0x8; +#endif + volatile ee_s32 seed4_volatile=ITERATIONS; + volatile ee_s32 seed5_volatile=0; +#endif +/* Porting: Timing functions + How to capture time and convert to seconds must be ported to whatever is supported by the platform. + e.g. Read value from on board RTC, read value from cpu clock cycles performance counter etc. + Sample implementation for standard time.h and windows.h definitions included. +*/ +/* Define: TIMER_RES_DIVIDER + Divider to trade off timer resolution and total time that can be measured. + + Use lower values to increase resolution, but make sure that overflow does not occur. + If there are issues with the return value overflowing, increase this value. + */ +#if USE_CLOCK + #define NSECS_PER_SEC CLOCKS_PER_SEC + #define EE_TIMER_TICKER_RATE 1000 + #define CORETIMETYPE clock_t + #define GETMYTIME(_t) (*_t=clock()) + #define MYTIMEDIFF(fin,ini) ((fin)-(ini)) + #define TIMER_RES_DIVIDER 1 + #define SAMPLE_TIME_IMPLEMENTATION 1 +#elif defined(_MSC_VER) + #define NSECS_PER_SEC 10000000 + #define EE_TIMER_TICKER_RATE 1000 + #define CORETIMETYPE FILETIME + #define GETMYTIME(_t) GetSystemTimeAsFileTime(_t) + #define MYTIMEDIFF(fin,ini) (((*(__int64*)&fin)-(*(__int64*)&ini))/TIMER_RES_DIVIDER) + /* setting to millisces resolution by default with MSDEV */ + #ifndef TIMER_RES_DIVIDER + #define TIMER_RES_DIVIDER 1000 + #endif + #define SAMPLE_TIME_IMPLEMENTATION 1 +#elif HAS_TIME_H + #define NSECS_PER_SEC 1000000000 + #define EE_TIMER_TICKER_RATE 1000 + #define CORETIMETYPE struct timespec + #define GETMYTIME(_t) clock_gettime(CLOCK_REALTIME,_t) + #define MYTIMEDIFF(fin,ini) ((fin.tv_sec-ini.tv_sec)*(NSECS_PER_SEC/TIMER_RES_DIVIDER)+(fin.tv_nsec-ini.tv_nsec)/TIMER_RES_DIVIDER) + /* setting to 1/1000 of a second resolution by default with linux */ + #ifndef TIMER_RES_DIVIDER + #define TIMER_RES_DIVIDER 1000000 + #endif + #define SAMPLE_TIME_IMPLEMENTATION 1 +#else + #define SAMPLE_TIME_IMPLEMENTATION 0 +#endif +#define EE_TICKS_PER_SEC (NSECS_PER_SEC / TIMER_RES_DIVIDER) + +#if SAMPLE_TIME_IMPLEMENTATION +/** Define Host specific (POSIX), or target specific global time variables. */ +static CORETIMETYPE start_time_val, stop_time_val; + +/* Function: start_time + This function will be called right before starting the timed portion of the benchmark. + + Implementation may be capturing a system timer (as implemented in the example code) + or zeroing some system parameters - e.g. setting the cpu clocks cycles to 0. +*/ +void start_time(void) { + GETMYTIME(&start_time_val ); +#if CALLGRIND_RUN + CALLGRIND_START_INSTRUMENTATION +#endif +#if MICA + asm volatile("int3");/*1 */ +#endif +} +/* Function: stop_time + This function will be called right after ending the timed portion of the benchmark. + + Implementation may be capturing a system timer (as implemented in the example code) + or other system parameters - e.g. reading the current value of cpu cycles counter. +*/ +void stop_time(void) { +#if CALLGRIND_RUN + CALLGRIND_STOP_INSTRUMENTATION +#endif +#if MICA + asm volatile("int3");/*1 */ +#endif + GETMYTIME(&stop_time_val ); +} +/* Function: get_time + Return an abstract "ticks" number that signifies time on the system. + + Actual value returned may be cpu cycles, milliseconds or any other value, + as long as it can be converted to seconds by . + This methodology is taken to accomodate any hardware or simulated platform. + The sample implementation returns millisecs by default, + and the resolution is controlled by +*/ +CORE_TICKS get_time(void) { + CORE_TICKS elapsed=(CORE_TICKS)(MYTIMEDIFF(stop_time_val, start_time_val)); + return elapsed; +} +/* Function: time_in_secs + Convert the value returned by get_time to seconds. + + The type is used to accomodate systems with no support for floating point. + Default implementation implemented by the EE_TICKS_PER_SEC macro above. +*/ +secs_ret time_in_secs(CORE_TICKS ticks) { + secs_ret retval=((secs_ret)ticks) / (secs_ret)EE_TICKS_PER_SEC; + return retval; +} +#else +#error "Please implement timing functionality in core_portme.c" +#endif /* SAMPLE_TIME_IMPLEMENTATION */ + +ee_u32 default_num_contexts=MULTITHREAD; + +/* Function: portable_init + Target specific initialization code + Test for some common mistakes. +*/ +void portable_init(core_portable *p, int *argc, char *argv[]) +{ +#if PRINT_ARGS + int i; + for (i=0; i<*argc; i++) { + ee_printf("Arg[%d]=%s\n",i,argv[i]); + } +#endif + if (sizeof(ee_ptr_int) != sizeof(ee_u8 *)) { + ee_printf("ERROR! Please define ee_ptr_int to a type that holds a pointer!\n"); + } + if (sizeof(ee_u32) != 4) { + ee_printf("ERROR! Please define ee_u32 to a 32b unsigned type!\n"); + } +#if (MAIN_HAS_NOARGC && (SEED_METHOD==SEED_ARG)) + ee_printf("ERROR! Main has no argc, but SEED_METHOD defined to SEED_ARG!\n"); +#endif + +#if (MULTITHREAD>1) && (SEED_METHOD==SEED_ARG) + int nargs=*argc,i; + if ((nargs>1) && (*argv[1]=='M')) { + default_num_contexts=parseval(argv[1]+1); + if (default_num_contexts>MULTITHREAD) + default_num_contexts=MULTITHREAD; + /* Shift args since first arg is directed to the portable part and not to coremark main */ + --nargs; + for (i=1; i*/ + p->portable_id=1; +} +/* Function: portable_fini + Target specific final code +*/ +void portable_fini(core_portable *p) +{ + p->portable_id=0; +} + +#if (MULTITHREAD>1) + +/* Function: core_start_parallel + Start benchmarking in a parallel context. + + Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets. + Other implementations using MCAPI or other standards can easily be devised. +*/ +/* Function: core_stop_parallel + Stop a parallel context execution of coremark, and gather the results. + + Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets. + Other implementations using MCAPI or other standards can easily be devised. +*/ +#if USE_PTHREAD +ee_u8 core_start_parallel(core_results *res) { + return (ee_u8)pthread_create(&(res->port.thread),NULL,iterate,(void *)res); +} +ee_u8 core_stop_parallel(core_results *res) { + void *retval; + return (ee_u8)pthread_join(res->port.thread,&retval); +} +#elif USE_FORK +static int key_id=0; +ee_u8 core_start_parallel(core_results *res) { + key_t key=4321+key_id; + key_id++; + res->port.pid=fork(); + res->port.shmid=shmget(key, 8, IPC_CREAT | 0666); + if (res->port.shmid<0) { + ee_printf("ERROR in shmget!\n"); + } + if (res->port.pid==0) { + iterate(res); + res->port.shm=shmat(res->port.shmid, NULL, 0); + /* copy the validation values to the shared memory area and quit*/ + if (res->port.shm == (char *) -1) { + ee_printf("ERROR in child shmat!\n"); + } else { + memcpy(res->port.shm,&(res->crc),8); + shmdt(res->port.shm); + } + exit(0); + } + return 1; +} +ee_u8 core_stop_parallel(core_results *res) { + int status; + pid_t wpid = waitpid(res->port.pid,&status,WUNTRACED); + if (wpid != res->port.pid) { + ee_printf("ERROR waiting for child.\n"); + if (errno == ECHILD) ee_printf("errno=No such child %d\n",res->port.pid); + if (errno == EINTR) ee_printf("errno=Interrupted\n"); + return 0; + } + /* after process is done, get the values from the shared memory area */ + res->port.shm=shmat(res->port.shmid, NULL, 0); + if (res->port.shm == (char *) -1) { + ee_printf("ERROR in parent shmat!\n"); + return 0; + } + memcpy(&(res->crc),res->port.shm,8); + shmdt(res->port.shm); + return 1; +} +#elif USE_SOCKET +static int key_id=0; +ee_u8 core_start_parallel(core_results *res) { + int bound, buffer_length=8; + res->port.sa.sin_family = AF_INET; + res->port.sa.sin_addr.s_addr = htonl(0x7F000001); + res->port.sa.sin_port = htons(7654+key_id); + key_id++; + res->port.pid=fork(); + if (res->port.pid==0) { /* benchmark child */ + iterate(res); + res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); + if (-1 == res->port.sock) /* if socket failed to initialize, exit */ { + ee_printf("Error Creating Socket"); + } else { + int bytes_sent = sendto(res->port.sock, &(res->crc), buffer_length, 0,(struct sockaddr*)&(res->port.sa), sizeof (struct sockaddr_in)); + if (bytes_sent < 0) + ee_printf("Error sending packet: %s\n", strerror(errno)); + close(res->port.sock); /* close the socket */ + } + exit(0); + } + /* parent process, open the socket */ + res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); + bound = bind(res->port.sock,(struct sockaddr*)&(res->port.sa), sizeof(struct sockaddr)); + if (bound < 0) + ee_printf("bind(): %s\n",strerror(errno)); + return 1; +} +ee_u8 core_stop_parallel(core_results *res) { + int status; + int fromlen=sizeof(struct sockaddr); + int recsize = recvfrom(res->port.sock, &(res->crc), 8, 0, (struct sockaddr*)&(res->port.sa), &fromlen); + if (recsize < 0) { + ee_printf("Error in receive: %s\n", strerror(errno)); + return 0; + } + pid_t wpid = waitpid(res->port.pid,&status,WUNTRACED); + if (wpid != res->port.pid) { + ee_printf("ERROR waiting for child.\n"); + if (errno == ECHILD) ee_printf("errno=No such child %d\n",res->port.pid); + if (errno == EINTR) ee_printf("errno=Interrupted\n"); + return 0; + } + return 1; +} +#else /* no standard multicore implementation */ +#error "Please implement multicore functionality in core_portme.c to use multiple contexts." +#endif /* multithread implementations */ +#endif diff --git a/tests/riscv-coremark/extraPortmes/cygwin/core_portme.h b/tests/riscv-coremark/extraPortmes/cygwin/core_portme.h new file mode 100755 index 000000000..9471b12ec --- /dev/null +++ b/tests/riscv-coremark/extraPortmes/cygwin/core_portme.h @@ -0,0 +1,293 @@ +/* +Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +Original Author: Shay Gal-on +*/ + +/* Topic: Description + This file contains configuration constants required to execute on different platforms +*/ +#ifndef CORE_PORTME_H +#define CORE_PORTME_H +/************************/ +/* Data types and settings */ +/************************/ +/* Configuration: HAS_FLOAT + Define to 1 if the platform supports floating point. +*/ +#ifndef HAS_FLOAT +#define HAS_FLOAT 1 +#endif +/* Configuration: HAS_TIME_H + Define to 1 if platform has the time.h header file, + and implementation of functions thereof. +*/ +#ifndef HAS_TIME_H +#define HAS_TIME_H 1 +#endif +/* Configuration: USE_CLOCK + Define to 1 if platform has the time.h header file, + and implementation of functions thereof. +*/ +#ifndef USE_CLOCK +#define USE_CLOCK 0 +#endif +/* Configuration: HAS_STDIO + Define to 1 if the platform has stdio.h. +*/ +#ifndef HAS_STDIO +#define HAS_STDIO 1 +#endif +/* Configuration: HAS_PRINTF + Define to 1 if the platform has stdio.h and implements the printf function. +*/ +#ifndef HAS_PRINTF +#define HAS_PRINTF 1 +#endif + +/* Configuration: CORE_TICKS + Define type of return from the timing functions. + */ +#if defined(_MSC_VER) +#include +typedef size_t CORE_TICKS; +#elif HAS_TIME_H +#include +typedef clock_t CORE_TICKS; +#else +#error "Please define type of CORE_TICKS and implement start_time, end_time get_time and time_in_secs functions!" +#endif + +/* Definitions: COMPILER_VERSION, COMPILER_FLAGS, MEM_LOCATION + Initialize these strings per platform +*/ +#ifndef COMPILER_VERSION + #ifdef __GNUC__ + #define COMPILER_VERSION "GCC"__VERSION__ + #else + #define COMPILER_VERSION "Please put compiler version here (e.g. gcc 4.1)" + #endif +#endif +#ifndef COMPILER_FLAGS + #define COMPILER_FLAGS FLAGS_STR /* "Please put compiler flags here (e.g. -o3)" */ +#endif +#ifndef MEM_LOCATION + #define MEM_LOCATION "Please put data memory location here\n\t\t\t(e.g. code in flash, data on heap etc)" + #define MEM_LOCATION_UNSPEC 1 +#endif + +/* Data Types: + To avoid compiler issues, define the data types that need ot be used for 8b, 16b and 32b in . + + *Imprtant*: + ee_ptr_int needs to be the data type used to hold pointers, otherwise coremark may fail!!! +*/ +typedef signed short ee_s16; +typedef unsigned short ee_u16; +typedef signed int ee_s32; +typedef double ee_f32; +typedef unsigned char ee_u8; +typedef unsigned int ee_u32; +typedef ee_u32 ee_ptr_int; +typedef size_t ee_size_t; +/* align_mem: + This macro is used to align an offset to point to a 32b value. It is used in the Matrix algorithm to initialize the input memory blocks. +*/ +#define align_mem(x) (void *)(4 + (((ee_ptr_int)(x) - 1) & ~3)) + +/* Configuration: SEED_METHOD + Defines method to get seed values that cannot be computed at compile time. + + Valid values: + SEED_ARG - from command line. + SEED_FUNC - from a system function. + SEED_VOLATILE - from volatile variables. +*/ +#ifndef SEED_METHOD +#define SEED_METHOD SEED_ARG +#endif + +/* Configuration: MEM_METHOD + Defines method to get a block of memry. + + Valid values: + MEM_MALLOC - for platforms that implement malloc and have malloc.h. + MEM_STATIC - to use a static memory array. + MEM_STACK - to allocate the data block on the stack (NYI). +*/ +#ifndef MEM_METHOD +#define MEM_METHOD MEM_MALLOC +#endif + +/* Configuration: MULTITHREAD + Define for parallel execution + + Valid values: + 1 - only one context (default). + N>1 - will execute N copies in parallel. + + Note: + If this flag is defined to more then 1, an implementation for launching parallel contexts must be defined. + + Two sample implementations are provided. Use or to enable them. + + It is valid to have a different implementation of and in , + to fit a particular architecture. +*/ +#ifndef MULTITHREAD +#define MULTITHREAD 1 +#endif + +/* Configuration: USE_PTHREAD + Sample implementation for launching parallel contexts + This implementation uses pthread_thread_create and pthread_join. + + Valid values: + 0 - Do not use pthreads API. + 1 - Use pthreads API + + Note: + This flag only matters if MULTITHREAD has been defined to a value greater then 1. +*/ +#ifndef USE_PTHREAD +#define USE_PTHREAD 0 +#endif + +/* Configuration: USE_FORK + Sample implementation for launching parallel contexts + This implementation uses fork, waitpid, shmget,shmat and shmdt. + + Valid values: + 0 - Do not use fork API. + 1 - Use fork API + + Note: + This flag only matters if MULTITHREAD has been defined to a value greater then 1. +*/ +#ifndef USE_FORK +#define USE_FORK 0 +#endif + +/* Configuration: USE_SOCKET + Sample implementation for launching parallel contexts + This implementation uses fork, socket, sendto and recvfrom + + Valid values: + 0 - Do not use fork and sockets API. + 1 - Use fork and sockets API + + Note: + This flag only matters if MULTITHREAD has been defined to a value greater then 1. +*/ +#ifndef USE_SOCKET +#define USE_SOCKET 0 +#endif + +/* Configuration: MAIN_HAS_NOARGC + Needed if platform does not support getting arguments to main. + + Valid values: + 0 - argc/argv to main is supported + 1 - argc/argv to main is not supported +*/ +#ifndef MAIN_HAS_NOARGC +#define MAIN_HAS_NOARGC 0 +#endif + +/* Configuration: MAIN_HAS_NORETURN + Needed if platform does not support returning a value from main. + + Valid values: + 0 - main returns an int, and return value will be 0. + 1 - platform does not support returning a value from main +*/ +#ifndef MAIN_HAS_NORETURN +#define MAIN_HAS_NORETURN 0 +#endif + +/* Variable: default_num_contexts + Number of contexts to spawn in multicore context. + Override this global value to change number of contexts used. + + Note: + This value may not be set higher then the define. + + To experiment, you can set the define to the highest value expected, and use argc/argv in the to set this value from the command line. +*/ +extern ee_u32 default_num_contexts; + +#if (MULTITHREAD>1) +#if USE_PTHREAD + #include + #define PARALLEL_METHOD "PThreads" +#elif USE_FORK + #include + #include + #include + #include + #include /* for memcpy */ + #define PARALLEL_METHOD "Fork" +#elif USE_SOCKET + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #define PARALLEL_METHOD "Sockets" +#else + #define PARALLEL_METHOD "Proprietary" + #error "Please implement multicore functionality in core_portme.c to use multiple contexts." +#endif /* Method for multithreading */ +#endif /* MULTITHREAD > 1 */ + +typedef struct CORE_PORTABLE_S { +#if (MULTITHREAD>1) + #if USE_PTHREAD + pthread_t thread; + #elif USE_FORK + pid_t pid; + int shmid; + void *shm; + #elif USE_SOCKET + pid_t pid; + int sock; + struct sockaddr_in sa; + #endif /* Method for multithreading */ +#endif /* MULTITHREAD>1 */ + ee_u8 portable_id; +} core_portable; + +/* target specific init/fini */ +void portable_init(core_portable *p, int *argc, char *argv[]); +void portable_fini(core_portable *p); + +#if (SEED_METHOD==SEED_VOLATILE) + #if (VALIDATION_RUN || PERFORMANCE_RUN || PROFILE_RUN) + #define RUN_TYPE_FLAG 1 + #else + #if (TOTAL_DATA_SIZE==1200) + #define PROFILE_RUN 1 + #else + #define PERFORMANCE_RUN 1 + #endif + #endif +#endif /* SEED_METHOD==SEED_VOLATILE */ + +#endif /* CORE_PORTME_H */ diff --git a/tests/riscv-coremark/extraPortmes/cygwin/core_portme.mak b/tests/riscv-coremark/extraPortmes/cygwin/core_portme.mak new file mode 100644 index 000000000..97b6d6ace --- /dev/null +++ b/tests/riscv-coremark/extraPortmes/cygwin/core_portme.mak @@ -0,0 +1,17 @@ +# Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Original Author: Shay Gal-on + +include posix/core_portme.mak diff --git a/tests/riscv-coremark/extraPortmes/linux/core_portme.c b/tests/riscv-coremark/extraPortmes/linux/core_portme.c new file mode 100755 index 000000000..6b63610d1 --- /dev/null +++ b/tests/riscv-coremark/extraPortmes/linux/core_portme.c @@ -0,0 +1,338 @@ +/* +Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +Original Author: Shay Gal-on +*/ + +#include +#include +#include "coremark.h" +#if CALLGRIND_RUN +#include +#endif + +#if (MEM_METHOD==MEM_MALLOC) +#include +/* Function: portable_malloc + Provide malloc() functionality in a platform specific way. +*/ +void *portable_malloc(size_t size) { + return malloc(size); +} +/* Function: portable_free + Provide free() functionality in a platform specific way. +*/ +void portable_free(void *p) { + free(p); +} +#else +void *portable_malloc(size_t size) { + return NULL; +} +void portable_free(void *p) { + p=NULL; +} +#endif + +#if (SEED_METHOD==SEED_VOLATILE) +#if VALIDATION_RUN + volatile ee_s32 seed1_volatile=0x3415; + volatile ee_s32 seed2_volatile=0x3415; + volatile ee_s32 seed3_volatile=0x66; +#endif +#if PERFORMANCE_RUN + volatile ee_s32 seed1_volatile=0x0; + volatile ee_s32 seed2_volatile=0x0; + volatile ee_s32 seed3_volatile=0x66; +#endif +#if PROFILE_RUN + volatile ee_s32 seed1_volatile=0x8; + volatile ee_s32 seed2_volatile=0x8; + volatile ee_s32 seed3_volatile=0x8; +#endif + volatile ee_s32 seed4_volatile=ITERATIONS; + volatile ee_s32 seed5_volatile=0; +#endif +/* Porting: Timing functions + How to capture time and convert to seconds must be ported to whatever is supported by the platform. + e.g. Read value from on board RTC, read value from cpu clock cycles performance counter etc. + Sample implementation for standard time.h and windows.h definitions included. +*/ +/* Define: TIMER_RES_DIVIDER + Divider to trade off timer resolution and total time that can be measured. + + Use lower values to increase resolution, but make sure that overflow does not occur. + If there are issues with the return value overflowing, increase this value. + */ +#if USE_CLOCK + #define NSECS_PER_SEC CLOCKS_PER_SEC + #define EE_TIMER_TICKER_RATE 1000 + #define CORETIMETYPE clock_t + #define GETMYTIME(_t) (*_t=clock()) + #define MYTIMEDIFF(fin,ini) ((fin)-(ini)) + #define TIMER_RES_DIVIDER 1 + #define SAMPLE_TIME_IMPLEMENTATION 1 +#elif defined(_MSC_VER) + #define NSECS_PER_SEC 10000000 + #define EE_TIMER_TICKER_RATE 1000 + #define CORETIMETYPE FILETIME + #define GETMYTIME(_t) GetSystemTimeAsFileTime(_t) + #define MYTIMEDIFF(fin,ini) (((*(__int64*)&fin)-(*(__int64*)&ini))/TIMER_RES_DIVIDER) + /* setting to millisces resolution by default with MSDEV */ + #ifndef TIMER_RES_DIVIDER + #define TIMER_RES_DIVIDER 1000 + #endif + #define SAMPLE_TIME_IMPLEMENTATION 1 +#elif HAS_TIME_H + #define NSECS_PER_SEC 1000000000 + #define EE_TIMER_TICKER_RATE 1000 + #define CORETIMETYPE struct timespec + #define GETMYTIME(_t) clock_gettime(CLOCK_REALTIME,_t) + #define MYTIMEDIFF(fin,ini) ((fin.tv_sec-ini.tv_sec)*(NSECS_PER_SEC/TIMER_RES_DIVIDER)+(fin.tv_nsec-ini.tv_nsec)/TIMER_RES_DIVIDER) + /* setting to 1/1000 of a second resolution by default with linux */ + #ifndef TIMER_RES_DIVIDER + #define TIMER_RES_DIVIDER 1000000 + #endif + #define SAMPLE_TIME_IMPLEMENTATION 1 +#else + #define SAMPLE_TIME_IMPLEMENTATION 0 +#endif +#define EE_TICKS_PER_SEC (NSECS_PER_SEC / TIMER_RES_DIVIDER) + +#if SAMPLE_TIME_IMPLEMENTATION +/** Define Host specific (POSIX), or target specific global time variables. */ +static CORETIMETYPE start_time_val, stop_time_val; + +/* Function: start_time + This function will be called right before starting the timed portion of the benchmark. + + Implementation may be capturing a system timer (as implemented in the example code) + or zeroing some system parameters - e.g. setting the cpu clocks cycles to 0. +*/ +void start_time(void) { + GETMYTIME(&start_time_val ); +#if CALLGRIND_RUN + CALLGRIND_START_INSTRUMENTATION +#endif +#if MICA + asm volatile("int3");/*1 */ +#endif +} +/* Function: stop_time + This function will be called right after ending the timed portion of the benchmark. + + Implementation may be capturing a system timer (as implemented in the example code) + or other system parameters - e.g. reading the current value of cpu cycles counter. +*/ +void stop_time(void) { +#if CALLGRIND_RUN + CALLGRIND_STOP_INSTRUMENTATION +#endif +#if MICA + asm volatile("int3");/*1 */ +#endif + GETMYTIME(&stop_time_val ); +} +/* Function: get_time + Return an abstract "ticks" number that signifies time on the system. + + Actual value returned may be cpu cycles, milliseconds or any other value, + as long as it can be converted to seconds by . + This methodology is taken to accomodate any hardware or simulated platform. + The sample implementation returns millisecs by default, + and the resolution is controlled by +*/ +CORE_TICKS get_time(void) { + CORE_TICKS elapsed=(CORE_TICKS)(MYTIMEDIFF(stop_time_val, start_time_val)); + return elapsed; +} +/* Function: time_in_secs + Convert the value returned by get_time to seconds. + + The type is used to accomodate systems with no support for floating point. + Default implementation implemented by the EE_TICKS_PER_SEC macro above. +*/ +secs_ret time_in_secs(CORE_TICKS ticks) { + secs_ret retval=((secs_ret)ticks) / (secs_ret)EE_TICKS_PER_SEC; + return retval; +} +#else +#error "Please implement timing functionality in core_portme.c" +#endif /* SAMPLE_TIME_IMPLEMENTATION */ + +ee_u32 default_num_contexts=MULTITHREAD; + +/* Function: portable_init + Target specific initialization code + Test for some common mistakes. +*/ +void portable_init(core_portable *p, int *argc, char *argv[]) +{ +#if PRINT_ARGS + int i; + for (i=0; i<*argc; i++) { + ee_printf("Arg[%d]=%s\n",i,argv[i]); + } +#endif + if (sizeof(ee_ptr_int) != sizeof(ee_u8 *)) { + ee_printf("ERROR! Please define ee_ptr_int to a type that holds a pointer!\n"); + } + if (sizeof(ee_u32) != 4) { + ee_printf("ERROR! Please define ee_u32 to a 32b unsigned type!\n"); + } +#if (MAIN_HAS_NOARGC && (SEED_METHOD==SEED_ARG)) + ee_printf("ERROR! Main has no argc, but SEED_METHOD defined to SEED_ARG!\n"); +#endif + +#if (MULTITHREAD>1) && (SEED_METHOD==SEED_ARG) + { + int nargs=*argc,i; + if ((nargs>1) && (*argv[1]=='M')) { + default_num_contexts=parseval(argv[1]+1); + if (default_num_contexts>MULTITHREAD) + default_num_contexts=MULTITHREAD; + /* Shift args since first arg is directed to the portable part and not to coremark main */ + --nargs; + for (i=1; i*/ + p->portable_id=1; +} +/* Function: portable_fini + Target specific final code +*/ +void portable_fini(core_portable *p) +{ + p->portable_id=0; +} + +#if (MULTITHREAD>1) + +/* Function: core_start_parallel + Start benchmarking in a parallel context. + + Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets. + Other implementations using MCAPI or other standards can easily be devised. +*/ +/* Function: core_stop_parallel + Stop a parallel context execution of coremark, and gather the results. + + Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets. + Other implementations using MCAPI or other standards can easily be devised. +*/ +#if USE_PTHREAD +ee_u8 core_start_parallel(core_results *res) { + return (ee_u8)pthread_create(&(res->port.thread),NULL,iterate,(void *)res); +} +ee_u8 core_stop_parallel(core_results *res) { + void *retval; + return (ee_u8)pthread_join(res->port.thread,&retval); +} +#elif USE_FORK +static int key_id=0; +ee_u8 core_start_parallel(core_results *res) { + key_t key=4321+key_id; + key_id++; + res->port.pid=fork(); + res->port.shmid=shmget(key, 8, IPC_CREAT | 0666); + if (res->port.shmid<0) { + ee_printf("ERROR in shmget!\n"); + } + if (res->port.pid==0) { + iterate(res); + res->port.shm=shmat(res->port.shmid, NULL, 0); + /* copy the validation values to the shared memory area and quit*/ + if (res->port.shm == (char *) -1) { + ee_printf("ERROR in child shmat!\n"); + } else { + memcpy(res->port.shm,&(res->crc),8); + shmdt(res->port.shm); + } + exit(0); + } + return 1; +} +ee_u8 core_stop_parallel(core_results *res) { + int status; + pid_t wpid = waitpid(res->port.pid,&status,WUNTRACED); + if (wpid != res->port.pid) { + ee_printf("ERROR waiting for child.\n"); + if (errno == ECHILD) ee_printf("errno=No such child %d\n",res->port.pid); + if (errno == EINTR) ee_printf("errno=Interrupted\n"); + return 0; + } + /* after process is done, get the values from the shared memory area */ + res->port.shm=shmat(res->port.shmid, NULL, 0); + if (res->port.shm == (char *) -1) { + ee_printf("ERROR in parent shmat!\n"); + return 0; + } + memcpy(&(res->crc),res->port.shm,8); + shmdt(res->port.shm); + return 1; +} +#elif USE_SOCKET +static int key_id=0; +ee_u8 core_start_parallel(core_results *res) { + int bound, buffer_length=8; + res->port.sa.sin_family = AF_INET; + res->port.sa.sin_addr.s_addr = htonl(0x7F000001); + res->port.sa.sin_port = htons(7654+key_id); + key_id++; + res->port.pid=fork(); + if (res->port.pid==0) { /* benchmark child */ + iterate(res); + res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); + if (-1 == res->port.sock) /* if socket failed to initialize, exit */ { + ee_printf("Error Creating Socket"); + } else { + int bytes_sent = sendto(res->port.sock, &(res->crc), buffer_length, 0,(struct sockaddr*)&(res->port.sa), sizeof (struct sockaddr_in)); + if (bytes_sent < 0) + ee_printf("Error sending packet: %s\n", strerror(errno)); + close(res->port.sock); /* close the socket */ + } + exit(0); + } + /* parent process, open the socket */ + res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); + bound = bind(res->port.sock,(struct sockaddr*)&(res->port.sa), sizeof(struct sockaddr)); + if (bound < 0) + ee_printf("bind(): %s\n",strerror(errno)); + return 1; +} +ee_u8 core_stop_parallel(core_results *res) { + int status; + int fromlen=sizeof(struct sockaddr); + int recsize = recvfrom(res->port.sock, &(res->crc), 8, 0, (struct sockaddr*)&(res->port.sa), &fromlen); + if (recsize < 0) { + ee_printf("Error in receive: %s\n", strerror(errno)); + return 0; + } + pid_t wpid = waitpid(res->port.pid,&status,WUNTRACED); + if (wpid != res->port.pid) { + ee_printf("ERROR waiting for child.\n"); + if (errno == ECHILD) ee_printf("errno=No such child %d\n",res->port.pid); + if (errno == EINTR) ee_printf("errno=Interrupted\n"); + return 0; + } + return 1; +} +#else /* no standard multicore implementation */ +#error "Please implement multicore functionality in core_portme.c to use multiple contexts." +#endif /* multithread implementations */ +#endif diff --git a/tests/riscv-coremark/extraPortmes/linux/core_portme.h b/tests/riscv-coremark/extraPortmes/linux/core_portme.h new file mode 100755 index 000000000..2cf4659a4 --- /dev/null +++ b/tests/riscv-coremark/extraPortmes/linux/core_portme.h @@ -0,0 +1,290 @@ +/* +Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +Original Author: Shay Gal-on +*/ + +#ifndef CORE_PORTME_H +#define CORE_PORTME_H +/************************/ +/* Data types and settings */ +/************************/ +/* Configuration: HAS_FLOAT + Define to 1 if the platform supports floating point. +*/ +#ifndef HAS_FLOAT +#define HAS_FLOAT 1 +#endif +/* Configuration: HAS_TIME_H + Define to 1 if platform has the time.h header file, + and implementation of functions thereof. +*/ +#ifndef HAS_TIME_H +#define HAS_TIME_H 1 +#endif +/* Configuration: USE_CLOCK + Define to 1 if platform has the time.h header file, + and implementation of functions thereof. +*/ +#ifndef USE_CLOCK +#define USE_CLOCK 0 +#endif +/* Configuration: HAS_STDIO + Define to 1 if the platform has stdio.h. +*/ +#ifndef HAS_STDIO +#define HAS_STDIO 1 +#endif +/* Configuration: HAS_PRINTF + Define to 1 if the platform has stdio.h and implements the printf function. +*/ +#ifndef HAS_PRINTF +#define HAS_PRINTF 1 +#endif + +/* Configuration: CORE_TICKS + Define type of return from the timing functions. + */ +#if defined(_MSC_VER) +#include +typedef size_t CORE_TICKS; +#elif HAS_TIME_H +#include +typedef clock_t CORE_TICKS; +#else +#error "Please define type of CORE_TICKS and implement start_time, end_time get_time and time_in_secs functions!" +#endif + +/* Definitions: COMPILER_VERSION, COMPILER_FLAGS, MEM_LOCATION + Initialize these strings per platform +*/ +#ifndef COMPILER_VERSION + #ifdef __GNUC__ + #define COMPILER_VERSION "GCC"__VERSION__ + #else + #define COMPILER_VERSION "Please put compiler version here (e.g. gcc 4.1)" + #endif +#endif +#ifndef COMPILER_FLAGS + #define COMPILER_FLAGS FLAGS_STR /* "Please put compiler flags here (e.g. -o3)" */ +#endif +#ifndef MEM_LOCATION + #define MEM_LOCATION "Please put data memory location here\n\t\t\t(e.g. code in flash, data on heap etc)" + #define MEM_LOCATION_UNSPEC 1 +#endif + +/* Data Types: + To avoid compiler issues, define the data types that need ot be used for 8b, 16b and 32b in . + + *Imprtant*: + ee_ptr_int needs to be the data type used to hold pointers, otherwise coremark may fail!!! +*/ +typedef signed short ee_s16; +typedef unsigned short ee_u16; +typedef signed int ee_s32; +typedef double ee_f32; +typedef unsigned char ee_u8; +typedef unsigned int ee_u32; +typedef ee_u32 ee_ptr_int; +typedef size_t ee_size_t; +/* align_mem: + This macro is used to align an offset to point to a 32b value. It is used in the Matrix algorithm to initialize the input memory blocks. +*/ +#define align_mem(x) (void *)(4 + (((ee_ptr_int)(x) - 1) & ~3)) + +/* Configuration: SEED_METHOD + Defines method to get seed values that cannot be computed at compile time. + + Valid values: + SEED_ARG - from command line. + SEED_FUNC - from a system function. + SEED_VOLATILE - from volatile variables. +*/ +#ifndef SEED_METHOD +#define SEED_METHOD SEED_ARG +#endif + +/* Configuration: MEM_METHOD + Defines method to get a block of memry. + + Valid values: + MEM_MALLOC - for platforms that implement malloc and have malloc.h. + MEM_STATIC - to use a static memory array. + MEM_STACK - to allocate the data block on the stack (NYI). +*/ +#ifndef MEM_METHOD +#define MEM_METHOD MEM_MALLOC +#endif + +/* Configuration: MULTITHREAD + Define for parallel execution + + Valid values: + 1 - only one context (default). + N>1 - will execute N copies in parallel. + + Note: + If this flag is defined to more then 1, an implementation for launching parallel contexts must be defined. + + Two sample implementations are provided. Use or to enable them. + + It is valid to have a different implementation of and in , + to fit a particular architecture. +*/ +#ifndef MULTITHREAD +#define MULTITHREAD 1 +#endif + +/* Configuration: USE_PTHREAD + Sample implementation for launching parallel contexts + This implementation uses pthread_thread_create and pthread_join. + + Valid values: + 0 - Do not use pthreads API. + 1 - Use pthreads API + + Note: + This flag only matters if MULTITHREAD has been defined to a value greater then 1. +*/ +#ifndef USE_PTHREAD +#define USE_PTHREAD 0 +#endif + +/* Configuration: USE_FORK + Sample implementation for launching parallel contexts + This implementation uses fork, waitpid, shmget,shmat and shmdt. + + Valid values: + 0 - Do not use fork API. + 1 - Use fork API + + Note: + This flag only matters if MULTITHREAD has been defined to a value greater then 1. +*/ +#ifndef USE_FORK +#define USE_FORK 0 +#endif + +/* Configuration: USE_SOCKET + Sample implementation for launching parallel contexts + This implementation uses fork, socket, sendto and recvfrom + + Valid values: + 0 - Do not use fork and sockets API. + 1 - Use fork and sockets API + + Note: + This flag only matters if MULTITHREAD has been defined to a value greater then 1. +*/ +#ifndef USE_SOCKET +#define USE_SOCKET 0 +#endif + +/* Configuration: MAIN_HAS_NOARGC + Needed if platform does not support getting arguments to main. + + Valid values: + 0 - argc/argv to main is supported + 1 - argc/argv to main is not supported +*/ +#ifndef MAIN_HAS_NOARGC +#define MAIN_HAS_NOARGC 0 +#endif + +/* Configuration: MAIN_HAS_NORETURN + Needed if platform does not support returning a value from main. + + Valid values: + 0 - main returns an int, and return value will be 0. + 1 - platform does not support returning a value from main +*/ +#ifndef MAIN_HAS_NORETURN +#define MAIN_HAS_NORETURN 0 +#endif + +/* Variable: default_num_contexts + Number of contexts to spawn in multicore context. + Override this global value to change number of contexts used. + + Note: + This value may not be set higher then the define. + + To experiment, you can set the define to the highest value expected, and use argc/argv in the to set this value from the command line. +*/ +extern ee_u32 default_num_contexts; + +#if (MULTITHREAD>1) +#if USE_PTHREAD + #include + #define PARALLEL_METHOD "PThreads" +#elif USE_FORK + #include + #include + #include + #include + #include /* for memcpy */ + #define PARALLEL_METHOD "Fork" +#elif USE_SOCKET + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #define PARALLEL_METHOD "Sockets" +#else + #define PARALLEL_METHOD "Proprietary" + #error "Please implement multicore functionality in core_portme.c to use multiple contexts." +#endif /* Method for multithreading */ +#endif /* MULTITHREAD > 1 */ + +typedef struct CORE_PORTABLE_S { +#if (MULTITHREAD>1) + #if USE_PTHREAD + pthread_t thread; + #elif USE_FORK + pid_t pid; + int shmid; + void *shm; + #elif USE_SOCKET + pid_t pid; + int sock; + struct sockaddr_in sa; + #endif /* Method for multithreading */ +#endif /* MULTITHREAD>1 */ + ee_u8 portable_id; +} core_portable; + +/* target specific init/fini */ +void portable_init(core_portable *p, int *argc, char *argv[]); +void portable_fini(core_portable *p); + +#if (SEED_METHOD==SEED_VOLATILE) + #if (VALIDATION_RUN || PERFORMANCE_RUN || PROFILE_RUN) + #define RUN_TYPE_FLAG 1 + #else + #if (TOTAL_DATA_SIZE==1200) + #define PROFILE_RUN 1 + #else + #define PERFORMANCE_RUN 1 + #endif + #endif +#endif /* SEED_METHOD==SEED_VOLATILE */ + +#endif /* CORE_PORTME_H */ diff --git a/tests/riscv-coremark/extraPortmes/linux/core_portme.mak b/tests/riscv-coremark/extraPortmes/linux/core_portme.mak new file mode 100644 index 000000000..97b6d6ace --- /dev/null +++ b/tests/riscv-coremark/extraPortmes/linux/core_portme.mak @@ -0,0 +1,17 @@ +# Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Original Author: Shay Gal-on + +include posix/core_portme.mak diff --git a/tests/riscv-coremark/extraPortmes/linux64/core_portme.c b/tests/riscv-coremark/extraPortmes/linux64/core_portme.c new file mode 100755 index 000000000..fe8d29983 --- /dev/null +++ b/tests/riscv-coremark/extraPortmes/linux64/core_portme.c @@ -0,0 +1,336 @@ +/* +Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +Original Author: Shay Gal-on +*/ + +#include +#include +#include "coremark.h" +#if CALLGRIND_RUN +#include +#endif + +#if (MEM_METHOD==MEM_MALLOC) +#include +/* Function: portable_malloc + Provide malloc() functionality in a platform specific way. +*/ +void *portable_malloc(size_t size) { + return malloc(size); +} +/* Function: portable_free + Provide free() functionality in a platform specific way. +*/ +void portable_free(void *p) { + free(p); +} +#else +void *portable_malloc(size_t size) { + return NULL; +} +void portable_free(void *p) { + p=NULL; +} +#endif + +#if (SEED_METHOD==SEED_VOLATILE) +#if VALIDATION_RUN + volatile ee_s32 seed1_volatile=0x3415; + volatile ee_s32 seed2_volatile=0x3415; + volatile ee_s32 seed3_volatile=0x66; +#endif +#if PERFORMANCE_RUN + volatile ee_s32 seed1_volatile=0x0; + volatile ee_s32 seed2_volatile=0x0; + volatile ee_s32 seed3_volatile=0x66; +#endif +#if PROFILE_RUN + volatile ee_s32 seed1_volatile=0x8; + volatile ee_s32 seed2_volatile=0x8; + volatile ee_s32 seed3_volatile=0x8; +#endif + volatile ee_s32 seed4_volatile=ITERATIONS; + volatile ee_s32 seed5_volatile=0; +#endif +/* Porting: Timing functions + How to capture time and convert to seconds must be ported to whatever is supported by the platform. + e.g. Read value from on board RTC, read value from cpu clock cycles performance counter etc. + Sample implementation for standard time.h and windows.h definitions included. +*/ +/* Define: TIMER_RES_DIVIDER + Divider to trade off timer resolution and total time that can be measured. + + Use lower values to increase resolution, but make sure that overflow does not occur. + If there are issues with the return value overflowing, increase this value. + */ +#if USE_CLOCK + #define NSECS_PER_SEC CLOCKS_PER_SEC + #define EE_TIMER_TICKER_RATE 1000 + #define CORETIMETYPE clock_t + #define GETMYTIME(_t) (*_t=clock()) + #define MYTIMEDIFF(fin,ini) ((fin)-(ini)) + #define TIMER_RES_DIVIDER 1 + #define SAMPLE_TIME_IMPLEMENTATION 1 +#elif defined(_MSC_VER) + #define NSECS_PER_SEC 10000000 + #define EE_TIMER_TICKER_RATE 1000 + #define CORETIMETYPE FILETIME + #define GETMYTIME(_t) GetSystemTimeAsFileTime(_t) + #define MYTIMEDIFF(fin,ini) (((*(__int64*)&fin)-(*(__int64*)&ini))/TIMER_RES_DIVIDER) + /* setting to millisces resolution by default with MSDEV */ + #ifndef TIMER_RES_DIVIDER + #define TIMER_RES_DIVIDER 1000 + #endif + #define SAMPLE_TIME_IMPLEMENTATION 1 +#elif HAS_TIME_H + #define NSECS_PER_SEC 1000000000 + #define EE_TIMER_TICKER_RATE 1000 + #define CORETIMETYPE struct timespec + #define GETMYTIME(_t) clock_gettime(CLOCK_REALTIME,_t) + #define MYTIMEDIFF(fin,ini) ((fin.tv_sec-ini.tv_sec)*(NSECS_PER_SEC/TIMER_RES_DIVIDER)+(fin.tv_nsec-ini.tv_nsec)/TIMER_RES_DIVIDER) + /* setting to 1/1000 of a second resolution by default with linux */ + #ifndef TIMER_RES_DIVIDER + #define TIMER_RES_DIVIDER 1000000 + #endif + #define SAMPLE_TIME_IMPLEMENTATION 1 +#else + #define SAMPLE_TIME_IMPLEMENTATION 0 +#endif +#define EE_TICKS_PER_SEC (NSECS_PER_SEC / TIMER_RES_DIVIDER) + +#if SAMPLE_TIME_IMPLEMENTATION +/** Define Host specific (POSIX), or target specific global time variables. */ +static CORETIMETYPE start_time_val, stop_time_val; + +/* Function: start_time + This function will be called right before starting the timed portion of the benchmark. + + Implementation may be capturing a system timer (as implemented in the example code) + or zeroing some system parameters - e.g. setting the cpu clocks cycles to 0. +*/ +void start_time(void) { + GETMYTIME(&start_time_val ); +#if CALLGRIND_RUN + CALLGRIND_START_INSTRUMENTATION +#endif +#if MICA + asm volatile("int3");/*1 */ +#endif +} +/* Function: stop_time + This function will be called right after ending the timed portion of the benchmark. + + Implementation may be capturing a system timer (as implemented in the example code) + or other system parameters - e.g. reading the current value of cpu cycles counter. +*/ +void stop_time(void) { +#if CALLGRIND_RUN + CALLGRIND_STOP_INSTRUMENTATION +#endif +#if MICA + asm volatile("int3");/*1 */ +#endif + GETMYTIME(&stop_time_val ); +} +/* Function: get_time + Return an abstract "ticks" number that signifies time on the system. + + Actual value returned may be cpu cycles, milliseconds or any other value, + as long as it can be converted to seconds by . + This methodology is taken to accomodate any hardware or simulated platform. + The sample implementation returns millisecs by default, + and the resolution is controlled by +*/ +CORE_TICKS get_time(void) { + CORE_TICKS elapsed=(CORE_TICKS)(MYTIMEDIFF(stop_time_val, start_time_val)); + return elapsed; +} +/* Function: time_in_secs + Convert the value returned by get_time to seconds. + + The type is used to accomodate systems with no support for floating point. + Default implementation implemented by the EE_TICKS_PER_SEC macro above. +*/ +secs_ret time_in_secs(CORE_TICKS ticks) { + secs_ret retval=((secs_ret)ticks) / (secs_ret)EE_TICKS_PER_SEC; + return retval; +} +#else +#error "Please implement timing functionality in core_portme.c" +#endif /* SAMPLE_TIME_IMPLEMENTATION */ + +ee_u32 default_num_contexts=MULTITHREAD; + +/* Function: portable_init + Target specific initialization code + Test for some common mistakes. +*/ +void portable_init(core_portable *p, int *argc, char *argv[]) +{ +#if PRINT_ARGS + int i; + for (i=0; i<*argc; i++) { + ee_printf("Arg[%d]=%s\n",i,argv[i]); + } +#endif + if (sizeof(ee_ptr_int) != sizeof(ee_u8 *)) { + ee_printf("ERROR! Please define ee_ptr_int to a type that holds a pointer!\n"); + } + if (sizeof(ee_u32) != 4) { + ee_printf("ERROR! Please define ee_u32 to a 32b unsigned type!\n"); + } +#if (MAIN_HAS_NOARGC && (SEED_METHOD==SEED_ARG)) + ee_printf("ERROR! Main has no argc, but SEED_METHOD defined to SEED_ARG!\n"); +#endif + +#if (MULTITHREAD>1) && (SEED_METHOD==SEED_ARG) + int nargs=*argc,i; + if ((nargs>1) && (*argv[1]=='M')) { + default_num_contexts=parseval(argv[1]+1); + if (default_num_contexts>MULTITHREAD) + default_num_contexts=MULTITHREAD; + /* Shift args since first arg is directed to the portable part and not to coremark main */ + --nargs; + for (i=1; i*/ + p->portable_id=1; +} +/* Function: portable_fini + Target specific final code +*/ +void portable_fini(core_portable *p) +{ + p->portable_id=0; +} + +#if (MULTITHREAD>1) + +/* Function: core_start_parallel + Start benchmarking in a parallel context. + + Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets. + Other implementations using MCAPI or other standards can easily be devised. +*/ +/* Function: core_stop_parallel + Stop a parallel context execution of coremark, and gather the results. + + Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets. + Other implementations using MCAPI or other standards can easily be devised. +*/ +#if USE_PTHREAD +ee_u8 core_start_parallel(core_results *res) { + return (ee_u8)pthread_create(&(res->port.thread),NULL,iterate,(void *)res); +} +ee_u8 core_stop_parallel(core_results *res) { + void *retval; + return (ee_u8)pthread_join(res->port.thread,&retval); +} +#elif USE_FORK +static int key_id=0; +ee_u8 core_start_parallel(core_results *res) { + key_t key=4321+key_id; + key_id++; + res->port.pid=fork(); + res->port.shmid=shmget(key, 8, IPC_CREAT | 0666); + if (res->port.shmid<0) { + ee_printf("ERROR in shmget!\n"); + } + if (res->port.pid==0) { + iterate(res); + res->port.shm=shmat(res->port.shmid, NULL, 0); + /* copy the validation values to the shared memory area and quit*/ + if (res->port.shm == (char *) -1) { + ee_printf("ERROR in child shmat!\n"); + } else { + memcpy(res->port.shm,&(res->crc),8); + shmdt(res->port.shm); + } + exit(0); + } + return 1; +} +ee_u8 core_stop_parallel(core_results *res) { + int status; + pid_t wpid = waitpid(res->port.pid,&status,WUNTRACED); + if (wpid != res->port.pid) { + ee_printf("ERROR waiting for child.\n"); + if (errno == ECHILD) ee_printf("errno=No such child %d\n",res->port.pid); + if (errno == EINTR) ee_printf("errno=Interrupted\n"); + return 0; + } + /* after process is done, get the values from the shared memory area */ + res->port.shm=shmat(res->port.shmid, NULL, 0); + if (res->port.shm == (char *) -1) { + ee_printf("ERROR in parent shmat!\n"); + return 0; + } + memcpy(&(res->crc),res->port.shm,8); + shmdt(res->port.shm); + return 1; +} +#elif USE_SOCKET +static int key_id=0; +ee_u8 core_start_parallel(core_results *res) { + int bound, buffer_length=8; + res->port.sa.sin_family = AF_INET; + res->port.sa.sin_addr.s_addr = htonl(0x7F000001); + res->port.sa.sin_port = htons(7654+key_id); + key_id++; + res->port.pid=fork(); + if (res->port.pid==0) { /* benchmark child */ + iterate(res); + res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); + if (-1 == res->port.sock) /* if socket failed to initialize, exit */ { + ee_printf("Error Creating Socket"); + } else { + int bytes_sent = sendto(res->port.sock, &(res->crc), buffer_length, 0,(struct sockaddr*)&(res->port.sa), sizeof (struct sockaddr_in)); + if (bytes_sent < 0) + ee_printf("Error sending packet: %s\n", strerror(errno)); + close(res->port.sock); /* close the socket */ + } + exit(0); + } + /* parent process, open the socket */ + res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); + bound = bind(res->port.sock,(struct sockaddr*)&(res->port.sa), sizeof(struct sockaddr)); + if (bound < 0) + ee_printf("bind(): %s\n",strerror(errno)); + return 1; +} +ee_u8 core_stop_parallel(core_results *res) { + int status; + int fromlen=sizeof(struct sockaddr); + int recsize = recvfrom(res->port.sock, &(res->crc), 8, 0, (struct sockaddr*)&(res->port.sa), &fromlen); + if (recsize < 0) { + ee_printf("Error in receive: %s\n", strerror(errno)); + return 0; + } + pid_t wpid = waitpid(res->port.pid,&status,WUNTRACED); + if (wpid != res->port.pid) { + ee_printf("ERROR waiting for child.\n"); + if (errno == ECHILD) ee_printf("errno=No such child %d\n",res->port.pid); + if (errno == EINTR) ee_printf("errno=Interrupted\n"); + return 0; + } + return 1; +} +#else /* no standard multicore implementation */ +#error "Please implement multicore functionality in core_portme.c to use multiple contexts." +#endif /* multithread implementations */ +#endif diff --git a/tests/riscv-coremark/extraPortmes/linux64/core_portme.h b/tests/riscv-coremark/extraPortmes/linux64/core_portme.h new file mode 100755 index 000000000..1228a679b --- /dev/null +++ b/tests/riscv-coremark/extraPortmes/linux64/core_portme.h @@ -0,0 +1,291 @@ +/* +Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +Original Author: Shay Gal-on +*/ + +/* Topic: Description + This file contains configuration constants required to execute on different platforms +*/ +#ifndef CORE_PORTME_H +#define CORE_PORTME_H +/************************/ +/* Data types and settings */ +/************************/ +/* Configuration: HAS_FLOAT + Define to 1 if the platform supports floating point. +*/ +#ifndef HAS_FLOAT +#define HAS_FLOAT 1 +#endif +/* Configuration: HAS_TIME_H + Define to 1 if platform has the time.h header file, + and implementation of functions thereof. +*/ +#ifndef HAS_TIME_H +#define HAS_TIME_H 1 +#endif +/* Configuration: USE_CLOCK + Define to 1 if platform has the time.h header file, + and implementation of functions thereof. +*/ +#ifndef USE_CLOCK +#define USE_CLOCK 0 +#endif +/* Configuration: HAS_STDIO + Define to 1 if the platform has stdio.h. +*/ +#ifndef HAS_STDIO +#define HAS_STDIO 1 +#endif +/* Configuration: HAS_PRINTF + Define to 1 if the platform has stdio.h and implements the printf function. +*/ +#ifndef HAS_PRINTF +#define HAS_PRINTF 1 +#endif + +/* Configuration: CORE_TICKS + Define type of return from the timing functions. + */ +#if defined(_MSC_VER) +#include +typedef size_t CORE_TICKS; +#elif HAS_TIME_H +#include +typedef clock_t CORE_TICKS; +#else +#error "Please define type of CORE_TICKS and implement start_time, end_time get_time and time_in_secs functions!" +#endif + +/* Definitions: COMPILER_VERSION, COMPILER_FLAGS, MEM_LOCATION + Initialize these strings per platform +*/ +#ifndef COMPILER_VERSION + #ifdef __GNUC__ + #define COMPILER_VERSION "GCC"__VERSION__ + #else + #define COMPILER_VERSION "Please put compiler version here (e.g. gcc 4.1)" + #endif +#endif +#ifndef COMPILER_FLAGS + #define COMPILER_FLAGS FLAGS_STR /* "Please put compiler flags here (e.g. -o3)" */ +#endif +#ifndef MEM_LOCATION + #define MEM_LOCATION "Please put data memory location here\n\t\t\t(e.g. code in flash, data on heap etc)" + #define MEM_LOCATION_UNSPEC 1 +#endif + +/* Data Types: + To avoid compiler issues, define the data types that need ot be used for 8b, 16b and 32b in . + + *Imprtant*: + ee_ptr_int needs to be the data type used to hold pointers, otherwise coremark may fail!!! +*/ +typedef signed short ee_s16; +typedef unsigned short ee_u16; +typedef signed int ee_s32; +typedef double ee_f32; +typedef unsigned char ee_u8; +typedef unsigned int ee_u32; +typedef unsigned long long ee_ptr_int; +typedef size_t ee_size_t; +/* align an offset to point to a 32b value */ +#define align_mem(x) (void *)(4 + (((ee_ptr_int)(x) - 1) & ~3)) + +/* Configuration: SEED_METHOD + Defines method to get seed values that cannot be computed at compile time. + + Valid values: + SEED_ARG - from command line. + SEED_FUNC - from a system function. + SEED_VOLATILE - from volatile variables. +*/ +#ifndef SEED_METHOD +#define SEED_METHOD SEED_ARG +#endif + +/* Configuration: MEM_METHOD + Defines method to get a block of memry. + + Valid values: + MEM_MALLOC - for platforms that implement malloc and have malloc.h. + MEM_STATIC - to use a static memory array. + MEM_STACK - to allocate the data block on the stack (NYI). +*/ +#ifndef MEM_METHOD +#define MEM_METHOD MEM_MALLOC +#endif + +/* Configuration: MULTITHREAD + Define for parallel execution + + Valid values: + 1 - only one context (default). + N>1 - will execute N copies in parallel. + + Note: + If this flag is defined to more then 1, an implementation for launching parallel contexts must be defined. + + Two sample implementations are provided. Use or to enable them. + + It is valid to have a different implementation of and in , + to fit a particular architecture. +*/ +#ifndef MULTITHREAD +#define MULTITHREAD 1 +#endif + +/* Configuration: USE_PTHREAD + Sample implementation for launching parallel contexts + This implementation uses pthread_thread_create and pthread_join. + + Valid values: + 0 - Do not use pthreads API. + 1 - Use pthreads API + + Note: + This flag only matters if MULTITHREAD has been defined to a value greater then 1. +*/ +#ifndef USE_PTHREAD +#define USE_PTHREAD 0 +#endif + +/* Configuration: USE_FORK + Sample implementation for launching parallel contexts + This implementation uses fork, waitpid, shmget,shmat and shmdt. + + Valid values: + 0 - Do not use fork API. + 1 - Use fork API + + Note: + This flag only matters if MULTITHREAD has been defined to a value greater then 1. +*/ +#ifndef USE_FORK +#define USE_FORK 0 +#endif + +/* Configuration: USE_SOCKET + Sample implementation for launching parallel contexts + This implementation uses fork, socket, sendto and recvfrom + + Valid values: + 0 - Do not use fork and sockets API. + 1 - Use fork and sockets API + + Note: + This flag only matters if MULTITHREAD has been defined to a value greater then 1. +*/ +#ifndef USE_SOCKET +#define USE_SOCKET 0 +#endif + +/* Configuration: MAIN_HAS_NOARGC + Needed if platform does not support getting arguments to main. + + Valid values: + 0 - argc/argv to main is supported + 1 - argc/argv to main is not supported +*/ +#ifndef MAIN_HAS_NOARGC +#define MAIN_HAS_NOARGC 0 +#endif + +/* Configuration: MAIN_HAS_NORETURN + Needed if platform does not support returning a value from main. + + Valid values: + 0 - main returns an int, and return value will be 0. + 1 - platform does not support returning a value from main +*/ +#ifndef MAIN_HAS_NORETURN +#define MAIN_HAS_NORETURN 0 +#endif + +/* Variable: default_num_contexts + Number of contexts to spawn in multicore context. + Override this global value to change number of contexts used. + + Note: + This value may not be set higher then the define. + + To experiment, you can set the define to the highest value expected, and use argc/argv in the to set this value from the command line. +*/ +extern ee_u32 default_num_contexts; + +#if (MULTITHREAD>1) +#if USE_PTHREAD + #include + #define PARALLEL_METHOD "PThreads" +#elif USE_FORK + #include + #include + #include + #include + #include /* for memcpy */ + #define PARALLEL_METHOD "Fork" +#elif USE_SOCKET + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #define PARALLEL_METHOD "Sockets" +#else + #define PARALLEL_METHOD "Proprietary" + #error "Please implement multicore functionality in core_portme.c to use multiple contexts." +#endif /* Method for multithreading */ +#endif /* MULTITHREAD > 1 */ + +typedef struct CORE_PORTABLE_S { +#if (MULTITHREAD>1) + #if USE_PTHREAD + pthread_t thread; + #elif USE_FORK + pid_t pid; + int shmid; + void *shm; + #elif USE_SOCKET + pid_t pid; + int sock; + struct sockaddr_in sa; + #endif /* Method for multithreading */ +#endif /* MULTITHREAD>1 */ + ee_u8 portable_id; +} core_portable; + +/* target specific init/fini */ +void portable_init(core_portable *p, int *argc, char *argv[]); +void portable_fini(core_portable *p); + +#if (SEED_METHOD==SEED_VOLATILE) + #if (VALIDATION_RUN || PERFORMANCE_RUN || PROFILE_RUN) + #define RUN_TYPE_FLAG 1 + #else + #if (TOTAL_DATA_SIZE==1200) + #define PROFILE_RUN 1 + #else + #define PERFORMANCE_RUN 1 + #endif + #endif +#endif /* SEED_METHOD==SEED_VOLATILE */ + +#endif /* CORE_PORTME_H */ diff --git a/tests/riscv-coremark/extraPortmes/linux64/core_portme.mak b/tests/riscv-coremark/extraPortmes/linux64/core_portme.mak new file mode 100755 index 000000000..5cfabee32 --- /dev/null +++ b/tests/riscv-coremark/extraPortmes/linux64/core_portme.mak @@ -0,0 +1,140 @@ +# Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Original Author: Shay Gal-on + +#File: core_portme.mak + +# Flag: OUTFLAG +# Use this flag to define how to to get an executable (e.g -o) +OUTFLAG= -o +# Flag: CC +# Use this flag to define compiler to use +CC = gcc +# Flag: CFLAGS +# Use this flag to define compiler options. Note, you can add compiler options from the command line using XCFLAGS="other flags" +PORT_CFLAGS = -O2 +FLAGS_STR = "$(PORT_CFLAGS) $(XCFLAGS) $(XLFLAGS) $(LFLAGS_END)" +CFLAGS = $(PORT_CFLAGS) -I$(PORT_DIR) -I. -DFLAGS_STR=\"$(FLAGS_STR)\" +#Flag: LFLAGS_END +# Define any libraries needed for linking or other flags that should come at the end of the link line (e.g. linker scripts). +# Note: On certain platforms, the default clock_gettime implementation is supported but requires linking of librt. +LFLAGS_END += -lrt +# Flag: PORT_SRCS +# Port specific source files can be added here +PORT_SRCS = $(PORT_DIR)/core_portme.c +# Flag: LOAD +# Define this flag if you need to load to a target, as in a cross compile environment. + +# Flag: RUN +# Define this flag if running does not consist of simple invocation of the binary. +# In a cross compile environment, you need to define this. + +#For flashing and using a tera term macro, you could use +#LOAD = flash ADDR +#RUN = ttpmacro coremark.ttl + +#For copying to target and executing via SSH connection, you could use +#LOAD = scp $(OUTFILE) user@target:~ +#RUN = ssh user@target -c + +#For native compilation and execution +LOAD = echo Loading done +RUN = + +OEXT = .o +EXE = .exe + +# Flag: SEPARATE_COMPILE +# Define if you need to separate compilation from link stage. +# In this case, you also need to define below how to create an object file, and how to link. +ifdef SEPARATE_COMPILE + +LD = gcc +OBJOUT = -o +LFLAGS = +OFLAG = -o +COUT = -c +# Flag: PORT_OBJS +# Port specific object files can be added here +PORT_OBJS = $(PORT_DIR)/core_portme$(OEXT) +PORT_CLEAN = *$(OEXT) + +$(OPATH)%$(OEXT) : %.c + $(CC) $(CFLAGS) $(XCFLAGS) $(COUT) $< $(OBJOUT) $@ + +endif + +# Target: port_prebuild +# Generate any files that are needed before actual build starts. +# E.g. generate profile guidance files. Sample PGO generation for gcc enabled with PGO=1 +# - First, check if PGO was defined on the command line, if so, need to add -fprofile-use to compile line. +# - Second, if PGO reference has not yet been generated, add a step to the prebuild that will build a profile-generate version and run it. +# Note - Using REBUILD=1 +# +# Use make PGO=1 to invoke this sample processing. + +ifdef PGO + ifeq (,$(findstring $(PGO),gen)) + PGO_STAGE=build_pgo_gcc + CFLAGS+=-fprofile-use + endif + PORT_CLEAN+=*.gcda *.gcno gmon.out +endif + +.PHONY: port_prebuild +port_prebuild: $(PGO_STAGE) + +.PHONY: build_pgo_gcc +build_pgo_gcc: + $(MAKE) PGO=gen XCFLAGS="$(XCFLAGS) -fprofile-generate -DTOTAL_DATA_SIZE=1200" ITERATIONS=10 gen_pgo_data REBUILD=1 + +# Target: port_postbuild +# Generate any files that are needed after actual build end. +# E.g. change format to srec, bin, zip in order to be able to load into flash +.PHONY: port_postbuild +port_postbuild: + +# Target: port_postrun +# Do platform specific after run stuff. +# E.g. reset the board, backup the logfiles etc. +.PHONY: port_postrun +port_postrun: + +# Target: port_prerun +# Do platform specific after run stuff. +# E.g. reset the board, backup the logfiles etc. +.PHONY: port_prerun +port_prerun: + +# Target: port_postload +# Do platform specific after load stuff. +# E.g. reset the reset power to the flash eraser +.PHONY: port_postload +port_postload: + +# Target: port_preload +# Do platform specific before load stuff. +# E.g. reset the reset power to the flash eraser +.PHONY: port_preload +port_preload: + +# FLAG: OPATH +# Path to the output folder. Default - current folder. +OPATH = ./ +MKDIR = mkdir -p + +# FLAG: PERL +# Define perl executable to calculate the geomean if running separate. +PERL=/usr/bin/perl diff --git a/tests/riscv-coremark/riscv64-baremetal/core_portme.c b/tests/riscv-coremark/riscv64-baremetal/core_portme.c new file mode 100755 index 000000000..c3b30c492 --- /dev/null +++ b/tests/riscv-coremark/riscv64-baremetal/core_portme.c @@ -0,0 +1,382 @@ +/* +Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +Original Author: Shay Gal-on +*/ + +#include +#include +#include "coremark.h" +#if CALLGRIND_RUN +#include +#endif + +#if (MEM_METHOD==MEM_MALLOC) +#include +/* Function: portable_malloc + Provide malloc() functionality in a platform specific way. +*/ +void *portable_malloc(size_t size) { + return malloc(size); +} +/* Function: portable_free + Provide free() functionality in a platform specific way. +*/ +void portable_free(void *p) { + free(p); +} +#else +void *portable_malloc(size_t size) { + return NULL; +} +void portable_free(void *p) { + p=NULL; +} +#endif + +#if (SEED_METHOD==SEED_VOLATILE) +#if VALIDATION_RUN + volatile ee_s32 seed1_volatile=0x3415; + volatile ee_s32 seed2_volatile=0x3415; + volatile ee_s32 seed3_volatile=0x66; +#endif +#if PERFORMANCE_RUN + volatile ee_s32 seed1_volatile=0x0; + volatile ee_s32 seed2_volatile=0x0; + volatile ee_s32 seed3_volatile=0x66; +#endif +#if PROFILE_RUN + volatile ee_s32 seed1_volatile=0x8; + volatile ee_s32 seed2_volatile=0x8; + volatile ee_s32 seed3_volatile=0x8; +#endif + volatile ee_s32 seed4_volatile=ITERATIONS; + volatile ee_s32 seed5_volatile=0; +#endif +/* Porting: Timing functions + How to capture time and convert to seconds must be ported to whatever is supported by the platform. + e.g. Read value from on board RTC, read value from cpu clock cycles performance counter etc. + Sample implementation for standard time.h and windows.h definitions included. +*/ +/* Define: TIMER_RES_DIVIDER + Divider to trade off timer resolution and total time that can be measured. + + Use lower values to increase resolution, but make sure that overflow does not occur. + If there are issues with the return value overflowing, increase this value. + */ +#if USE_CLOCK + #define NSECS_PER_SEC CLOCKS_PER_SEC + #define EE_TIMER_TICKER_RATE 1000 + #define CORETIMETYPE clock_t + #define GETMYTIME(_t) (*_t=clock()) + #define MYTIMEDIFF(fin,ini) ((fin)-(ini)) + #define TIMER_RES_DIVIDER 1 + #define SAMPLE_TIME_IMPLEMENTATION 1 +#elif defined(_MSC_VER) + #define NSECS_PER_SEC 10000000 + #define EE_TIMER_TICKER_RATE 1000 + #define CORETIMETYPE FILETIME + #define GETMYTIME(_t) GetSystemTimeAsFileTime(_t) + #define MYTIMEDIFF(fin,ini) (((*(__int64*)&fin)-(*(__int64*)&ini))/TIMER_RES_DIVIDER) + /* setting to millisces resolution by default with MSDEV */ + #ifndef TIMER_RES_DIVIDER + #define TIMER_RES_DIVIDER 1000 + #endif + #define SAMPLE_TIME_IMPLEMENTATION 1 +#elif HAS_TIME_H + #define NSECS_PER_SEC 1000000000 + #define EE_TIMER_TICKER_RATE 1000 + #define CORETIMETYPE struct timespec + #define GETMYTIME(_t) clock_gettime(CLOCK_REALTIME,_t) + #define MYTIMEDIFF(fin,ini) ((fin.tv_sec-ini.tv_sec)*(NSECS_PER_SEC/TIMER_RES_DIVIDER)+(fin.tv_nsec-ini.tv_nsec)/TIMER_RES_DIVIDER) + /* setting to 1/1000 of a second resolution by default with linux */ + #ifndef TIMER_RES_DIVIDER + #define TIMER_RES_DIVIDER 1000000 + #endif + #define SAMPLE_TIME_IMPLEMENTATION 1 +#else + // Defined for RISCV + #define NSECS_PER_SEC 1000000000 // TODO: What freq are we assuming? + #define EE_TIMER_TICKER_RATE 1000 // TODO: What is this? + #define CORETIMETYPE clock_t + #define read_csr(reg) ({ unsigned long __tmp; \ + asm volatile ("csrr %0, " #reg : "=r"(__tmp)); \ + __tmp; }) + #define GETMYTIME(_t) (_t = *(volatile unsigned long long*)0x0200BFF8) + #define MYTIMEDIFF(fin,ini) ((fin)-(ini)) + // Changing TIMER_RES_DIVIDER to 1000000 sets EE_TICKS_PER_SEC to 1000 (now counting ticks per ms) + #define TIMER_RES_DIVIDER 10000 + #define SAMPLE_TIME_IMPLEMENTATION 1 +#endif +#define EE_TICKS_PER_SEC (NSECS_PER_SEC / TIMER_RES_DIVIDER) + +#if SAMPLE_TIME_IMPLEMENTATION +/** Define Host specific (POSIX), or target specific global time variables. */ +static CORETIMETYPE start_time_val, stop_time_val; +static unsigned long start_instr_val, stop_instr_val; + +/* Function: minstretFunc + This function will count the number of instructions. +*/ +unsigned long minstretFunc(void) +{ + unsigned long minstretRead = read_csr(minstret); + //ee_printf("Minstret is %lu\n", minstretRead); + return minstretRead; +} + +/* Function: minstretDiff + This function will take the difference between the first and second reads from the + MINSTRET csr to determine the number of machine instructions retired between two points + of time +*/ +unsigned long minstretDiff(void) +{ + unsigned long minstretDifference = MYTIMEDIFF(stop_instr_val, start_instr_val); + return minstretDifference; +} + +/* Function: start_time + This function will be called right before starting the timed portion of the benchmark. + + Implementation may be capturing a system timer (as implemented in the example code) + or zeroing some system parameters - e.g. setting the cpu clocks cycles to 0. +*/ +void start_time(void) { + start_instr_val = minstretFunc(); + GETMYTIME(start_time_val); + //ee_printf("Timer started\n"); + //ee_printf(" MTIME: %u\n", start_time_val); +#if CALLGRIND_RUN + CALLGRIND_START_INSTRUMENTATION +#endif +#if MICA + asm volatile("int3");/*1 */ +#endif +} +/* Function: stop_time + This function will be called right after ending the timed portion of the benchmark. + + Implementation may be capturing a system timer (as implemented in the example code) + or other system parameters - e.g. reading the current value of cpu cycles counter. +*/ +void stop_time(void) { +#if CALLGRIND_RUN + CALLGRIND_STOP_INSTRUMENTATION +#endif +#if MICA + asm volatile("int3");/*1 */ +#endif + GETMYTIME(stop_time_val); + stop_instr_val = minstretFunc(); + //ee_printf("Timer stopped\n"); + //ee_printf(" MTIME: %u\n", stop_time_val); +} +/* Function: get_time + Return an abstract "ticks" number that signifies time on the system. + + Actual value returned may be cpu cycles, milliseconds or any other value, + as long as it can be converted to seconds by . + This methodology is taken to accomodate any hardware or simulated platform. + The sample implementation returns millisecs by default, + and the resolution is controlled by +*/ +CORE_TICKS get_time(void) { + CORE_TICKS elapsed=(CORE_TICKS)(MYTIMEDIFF(stop_time_val, start_time_val)); + unsigned long instructions = minstretDiff(); + double CPI = elapsed / instructions; + ee_printf(" Elapsed MTIME: %u\n", elapsed); + ee_printf(" Elapsed MINSTRET: %lu\n", instructions); + ee_printf(" CPI: %lf", CPI); + return elapsed; +} +/* Function: time_in_secs + Convert the value returned by get_time to seconds. + + The type is used to accomodate systems with no support for floating point. + Default implementation implemented by the EE_TICKS_PER_SEC macro above. +*/ +secs_ret time_in_secs(CORE_TICKS ticks) { + secs_ret retval=((secs_ret)ticks) / (secs_ret)EE_TICKS_PER_SEC; + int retvalint = (int)retval; + //ee_printf("RETURN VALUE FROM TIME IN SECS FUNCTION: %d\n", retvalint); + return retval; +} +#else +#error "Please implement timing functionality in core_portme.c" +#endif /* SAMPLE_TIME_IMPLEMENTATION */ + +ee_u32 default_num_contexts = MULTITHREAD; + +/* Function: portable_init + Target specific initialization code + Test for some common mistakes. +*/ +void portable_init(core_portable *p, int *argc, char *argv[]) +{ +#if PRINT_ARGS + int i; + for (i=0; i<*argc; i++) { + ee_printf("Arg[%d]=%s\n",i,argv[i]); + } +#endif + if (sizeof(ee_ptr_int) != sizeof(ee_u8 *)) { + ee_printf("ERROR! Please define ee_ptr_int to a type that holds a pointer!\n"); + } + if (sizeof(ee_u32) != 4) { + ee_printf("ERROR! Please define ee_u32 to a 32b unsigned type!\n"); + } +#if (MAIN_HAS_NOARGC && (SEED_METHOD==SEED_ARG)) + ee_printf("ERROR! Main has no argc, but SEED_METHOD defined to SEED_ARG!\n"); +#endif + +#if (MULTITHREAD>1) && (SEED_METHOD==SEED_ARG) + int nargs=*argc,i; + if ((nargs>1) && (*argv[1]=='M')) { + default_num_contexts=parseval(argv[1]+1); + if (default_num_contexts>MULTITHREAD) + default_num_contexts=MULTITHREAD; + /* Shift args since first arg is directed to the portable part and not to coremark main */ + --nargs; + for (i=1; i*/ + p->portable_id=1; +} +/* Function: portable_fini + Target specific final code +*/ +void portable_fini(core_portable *p) +{ + p->portable_id=0; +} + +#if (MULTITHREAD>1) + +/* Function: core_start_parallel + Start benchmarking in a parallel context. + + Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets. + Other implementations using MCAPI or other standards can easily be devised. +*/ +/* Function: core_stop_parallel + Stop a parallel context execution of coremark, and gather the results. + + Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets. + Other implementations using MCAPI or other standards can easily be devised. +*/ +#if USE_PTHREAD +ee_u8 core_start_parallel(core_results *res) { + return (ee_u8)pthread_create(&(res->port.thread),NULL,iterate,(void *)res); +} +ee_u8 core_stop_parallel(core_results *res) { + void *retval; + return (ee_u8)pthread_join(res->port.thread,&retval); +} +#elif USE_FORK +static int key_id=0; +ee_u8 core_start_parallel(core_results *res) { + key_t key=4321+key_id; + key_id++; + res->port.pid=fork(); + res->port.shmid=shmget(key, 8, IPC_CREAT | 0666); + if (res->port.shmid<0) { + ee_printf("ERROR in shmget!\n"); + } + if (res->port.pid==0) { + iterate(res); + res->port.shm=shmat(res->port.shmid, NULL, 0); + /* copy the validation values to the shared memory area and quit*/ + if (res->port.shm == (char *) -1) { + ee_printf("ERROR in child shmat!\n"); + } else { + memcpy(res->port.shm,&(res->crc),8); + shmdt(res->port.shm); + } + exit(0); + } + return 1; +} +ee_u8 core_stop_parallel(core_results *res) { + int status; + pid_t wpid = waitpid(res->port.pid,&status,WUNTRACED); + if (wpid != res->port.pid) { + ee_printf("ERROR waiting for child.\n"); + if (errno == ECHILD) ee_printf("errno=No such child %d\n",res->port.pid); + if (errno == EINTR) ee_printf("errno=Interrupted\n"); + return 0; + } + /* after process is done, get the values from the shared memory area */ + res->port.shm=shmat(res->port.shmid, NULL, 0); + if (res->port.shm == (char *) -1) { + ee_printf("ERROR in parent shmat!\n"); + return 0; + } + memcpy(&(res->crc),res->port.shm,8); + shmdt(res->port.shm); + return 1; +} +#elif USE_SOCKET +static int key_id=0; +ee_u8 core_start_parallel(core_results *res) { + int bound, buffer_length=8; + res->port.sa.sin_family = AF_INET; + res->port.sa.sin_addr.s_addr = htonl(0x7F000001); + res->port.sa.sin_port = htons(7654+key_id); + key_id++; + res->port.pid=fork(); + if (res->port.pid==0) { /* benchmark child */ + iterate(res); + res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); + if (-1 == res->port.sock) /* if socket failed to initialize, exit */ { + ee_printf("Error Creating Socket"); + } else { + int bytes_sent = sendto(res->port.sock, &(res->crc), buffer_length, 0,(struct sockaddr*)&(res->port.sa), sizeof (struct sockaddr_in)); + if (bytes_sent < 0) + ee_printf("Error sending packet: %s\n", strerror(errno)); + close(res->port.sock); /* close the socket */ + } + exit(0); + } + /* parent process, open the socket */ + res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); + bound = bind(res->port.sock,(struct sockaddr*)&(res->port.sa), sizeof(struct sockaddr)); + if (bound < 0) + ee_printf("bind(): %s\n",strerror(errno)); + return 1; +} +ee_u8 core_stop_parallel(core_results *res) { + int status; + int fromlen=sizeof(struct sockaddr); + int recsize = recvfrom(res->port.sock, &(res->crc), 8, 0, (struct sockaddr*)&(res->port.sa), &fromlen); + if (recsize < 0) { + ee_printf("Error in receive: %s\n", strerror(errno)); + return 0; + } + pid_t wpid = waitpid(res->port.pid,&status,WUNTRACED); + if (wpid != res->port.pid) { + ee_printf("ERROR waiting for child.\n"); + if (errno == ECHILD) ee_printf("errno=No such child %d\n",res->port.pid); + if (errno == EINTR) ee_printf("errno=Interrupted\n"); + return 0; + } + return 1; +} +#else /* no standard multicore implementation */ +#error "Please implement multicore functionality in core_portme.c to use multiple contexts." +#endif /* multithread implementations */ +#endif diff --git a/tests/riscv-coremark/riscv64-baremetal/core_portme.h b/tests/riscv-coremark/riscv64-baremetal/core_portme.h new file mode 100755 index 000000000..ef26e88ad --- /dev/null +++ b/tests/riscv-coremark/riscv64-baremetal/core_portme.h @@ -0,0 +1,296 @@ +/* +Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +Original Author: Shay Gal-on +*/ + +/* Topic: Description + This file contains configuration constants required to execute on different platforms +*/ +#ifndef CORE_PORTME_H +#define CORE_PORTME_H +/************************/ +/* Data types and settings */ +/************************/ +/* Configuration: HAS_FLOAT + Define to 1 if the platform supports floating point. +*/ +#ifndef HAS_FLOAT +#define HAS_FLOAT 1 +#endif +/* Configuration: HAS_TIME_H + Define to 1 if platform has the time.h header file, + and implementation of functions thereof. +*/ +#ifndef HAS_TIME_H +#define HAS_TIME_H 0 +#endif +/* Configuration: USE_CLOCK + Define to 1 if platform has the time.h header file, + and implementation of functions thereof. +*/ +#ifndef USE_CLOCK +#define USE_CLOCK 0 +#endif +/* Configuration: HAS_STDIO + Define to 1 if the platform has stdio.h. +*/ +#ifndef HAS_STDIO +#define HAS_STDIO 1 +#endif +/* Configuration: HAS_PRINTF + Define to 1 if the platform has stdio.h and implements the printf function. +*/ +#ifndef HAS_PRINTF +#define HAS_PRINTF 1 +#endif + +/* Configuration: CORE_TICKS + Define type of return from the timing functions. + */ +#if defined(_MSC_VER) +#include +typedef size_t CORE_TICKS; +#elif HAS_TIME_H +#include +typedef clock_t CORE_TICKS; +#else +/* Configuration: size_t and clock_t + Note these need to match the size of the clock output and the xLen the processor supports + */ +typedef unsigned long int size_t; +typedef unsigned long int clock_t; +typedef clock_t CORE_TICKS; +#endif + +/* Definitions: COMPILER_VERSION, COMPILER_FLAGS, MEM_LOCATION + Initialize these strings per platform +*/ +#ifndef COMPILER_VERSION + #ifdef __GNUC__ + #define COMPILER_VERSION "GCC"__VERSION__ + #else + #define COMPILER_VERSION "Please put compiler version here (e.g. gcc 4.1)" + #endif +#endif +#ifndef COMPILER_FLAGS + #define COMPILER_FLAGS FLAGS_STR /* "Please put compiler flags here (e.g. -o3)" */ +#endif +#ifndef MEM_LOCATION + #define MEM_LOCATION "Please put data memory location here\n\t\t\t(e.g. code in flash, data on heap etc)" + #define MEM_LOCATION_UNSPEC 1 +#endif + +/* Data Types: + To avoid compiler issues, define the data types that need ot be used for 8b, 16b and 32b in . + + *Imprtant*: + ee_ptr_int needs to be the data type used to hold pointers, otherwise coremark may fail!!! +*/ +typedef signed short ee_s16; +typedef unsigned short ee_u16; +typedef signed int ee_s32; +typedef double ee_f32; +typedef unsigned char ee_u8; +typedef unsigned int ee_u32; +typedef unsigned long long ee_ptr_int; +typedef size_t ee_size_t; +/* align an offset to point to a 32b value */ +#define align_mem(x) (void *)(4 + (((ee_ptr_int)(x) - 1) & ~3)) + +/* Configuration: SEED_METHOD + Defines method to get seed values that cannot be computed at compile time. + + Valid values: + SEED_ARG - from command line. + SEED_FUNC - from a system function. + SEED_VOLATILE - from volatile variables. +*/ +#ifndef SEED_METHOD +#define SEED_METHOD SEED_VOLATILE +#endif + +/* Configuration: MEM_METHOD + Defines method to get a block of memry. + + Valid values: + MEM_MALLOC - for platforms that implement malloc and have malloc.h. + MEM_STATIC - to use a static memory array. + MEM_STACK - to allocate the data block on the stack (NYI). +*/ +#ifndef MEM_METHOD +#define MEM_METHOD MEM_STATIC +#endif + +/* Configuration: MULTITHREAD + Define for parallel execution + + Valid values: + 1 - only one context (default). + N>1 - will execute N copies in parallel. + + Note: + If this flag is defined to more then 1, an implementation for launching parallel contexts must be defined. + + Two sample implementations are provided. Use or to enable them. + + It is valid to have a different implementation of and in , + to fit a particular architecture. +*/ +#ifndef MULTITHREAD +#define MULTITHREAD 1 +#endif + +/* Configuration: USE_PTHREAD + Sample implementation for launching parallel contexts + This implementation uses pthread_thread_create and pthread_join. + + Valid values: + 0 - Do not use pthreads API. + 1 - Use pthreads API + + Note: + This flag only matters if MULTITHREAD has been defined to a value greater then 1. +*/ +#ifndef USE_PTHREAD +#define USE_PTHREAD 0 +#endif + +/* Configuration: USE_FORK + Sample implementation for launching parallel contexts + This implementation uses fork, waitpid, shmget,shmat and shmdt. + + Valid values: + 0 - Do not use fork API. + 1 - Use fork API + + Note: + This flag only matters if MULTITHREAD has been defined to a value greater then 1. +*/ +#ifndef USE_FORK +#define USE_FORK 0 +#endif + +/* Configuration: USE_SOCKET + Sample implementation for launching parallel contexts + This implementation uses fork, socket, sendto and recvfrom + + Valid values: + 0 - Do not use fork and sockets API. + 1 - Use fork and sockets API + + Note: + This flag only matters if MULTITHREAD has been defined to a value greater then 1. +*/ +#ifndef USE_SOCKET +#define USE_SOCKET 0 +#endif + +/* Configuration: MAIN_HAS_NOARGC + Needed if platform does not support getting arguments to main. + + Valid values: + 0 - argc/argv to main is supported + 1 - argc/argv to main is not supported +*/ +#ifndef MAIN_HAS_NOARGC +#define MAIN_HAS_NOARGC 1 +#endif + +/* Configuration: MAIN_HAS_NORETURN + Needed if platform does not support returning a value from main. + + Valid values: + 0 - main returns an int, and return value will be 0. + 1 - platform does not support returning a value from main +*/ +#ifndef MAIN_HAS_NORETURN +#define MAIN_HAS_NORETURN 0 +#endif + +/* Variable: default_num_contexts + Number of contexts to spawn in multicore context. + Override this global value to change number of contexts used. + + Note: + This value may not be set higher then the define. + + To experiment, you can set the define to the highest value expected, and use argc/argv in the to set this value from the command line. +*/ +extern ee_u32 default_num_contexts; + +#if (MULTITHREAD>1) +#if USE_PTHREAD + #include + #define PARALLEL_METHOD "PThreads" +#elif USE_FORK + #include + #include + #include + #include + #include /* for memcpy */ + #define PARALLEL_METHOD "Fork" +#elif USE_SOCKET + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #define PARALLEL_METHOD "Sockets" +#else + #define PARALLEL_METHOD "Proprietary" + #error "Please implement multicore functionality in core_portme.c to use multiple contexts." +#endif /* Method for multithreading */ +#endif /* MULTITHREAD > 1 */ + +typedef struct CORE_PORTABLE_S { +#if (MULTITHREAD>1) + #if USE_PTHREAD + pthread_t thread; + #elif USE_FORK + pid_t pid; + int shmid; + void *shm; + #elif USE_SOCKET + pid_t pid; + int sock; + struct sockaddr_in sa; + #endif /* Method for multithreading */ +#endif /* MULTITHREAD>1 */ + ee_u8 portable_id; +} core_portable; + +/* target specific init/fini */ +void portable_init(core_portable *p, int *argc, char *argv[]); +void portable_fini(core_portable *p); + +#if (SEED_METHOD==SEED_VOLATILE) + #if (VALIDATION_RUN || PERFORMANCE_RUN || PROFILE_RUN) + #define RUN_TYPE_FLAG 1 + #else + #if (TOTAL_DATA_SIZE==1200) + #define PROFILE_RUN 1 + #else + #define PERFORMANCE_RUN 1 + #endif + #endif +#endif /* SEED_METHOD==SEED_VOLATILE */ + +#endif /* CORE_PORTME_H */ diff --git a/tests/riscv-coremark/riscv64-baremetal/core_portme.mak b/tests/riscv-coremark/riscv64-baremetal/core_portme.mak new file mode 100755 index 000000000..8600ce0a0 --- /dev/null +++ b/tests/riscv-coremark/riscv64-baremetal/core_portme.mak @@ -0,0 +1,147 @@ +# Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Original Author: Shay Gal-on + +#File: core_portme.mak + +# Flag: RISCVTOOLS +# Use this flag to point to your RISCV tools +RISCVTOOLS=$(RISCV) +# Flag: RISCVTYPE +# Type of toolchain to use +RISCVTYPE=riscv64-unknown-elf +# Flag: OUTFLAG +# Use this flag to define how to to get an executable (e.g -o) +OUTFLAG= -o +# Flag: CC +# Use this flag to define compiler to use +CC = $(RISCVTOOLS)/bin/$(RISCVTYPE)-gcc +# Flag: CFLAGS +# Use this flag to define compiler options. Note, you can add compiler options from the command line using XCFLAGS="other flags" +#PORT_CFLAGS = -O2 -static -std=gnu99 +PORT_CFLAGS = -O2 -mcmodel=medany -static -fno-tree-loop-distribute-patterns -std=gnu99 -fno-common -nostartfiles -lm -lgcc -T $(PORT_DIR)/link.ld +FLAGS_STR = "$(PORT_CFLAGS) $(XCFLAGS) $(XLFLAGS) $(LFLAGS_END)" +CFLAGS = $(PORT_CFLAGS) -I$(PORT_DIR) -I. -DFLAGS_STR=\"$(FLAGS_STR)\" +#Flag: LFLAGS_END +# Define any libraries needed for linking or other flags that should come at the end of the link line (e.g. linker scripts). +# Note: On certain platforms, the default clock_gettime implementation is supported but requires linking of librt. +LFLAGS_END += +# Flag: PORT_SRCS +# Port specific source files can be added here +PORT_SRCS = $(PORT_DIR)/core_portme.c $(PORT_DIR)/syscalls.c $(PORT_DIR)/crt.S +# Flag: LOAD +# Define this flag if you need to load to a target, as in a cross compile environment. + +# Flag: RUN +# Define this flag if running does not consist of simple invocation of the binary. +# In a cross compile environment, you need to define this. + +#For flashing and using a tera term macro, you could use +#LOAD = flash ADDR +#RUN = ttpmacro coremark.ttl + +#For copying to target and executing via SSH connection, you could use +#LOAD = scp $(OUTFILE) user@target:~ +#RUN = ssh user@target -c + +#For native compilation and execution +LOAD = echo Loading done +RUN = spike pk + +OEXT = .o +EXE = .bare.riscv + +# Flag: SEPARATE_COMPILE +# Define if you need to separate compilation from link stage. +# In this case, you also need to define below how to create an object file, and how to link. +ifdef SEPARATE_COMPILE + +LD = $(RISCVTOOLS)/bin/$(RISCVTYPE)-gcc +OBJOUT = -o +LFLAGS = +OFLAG = -o +COUT = -c +# Flag: PORT_OBJS +# Port specific object files can be added here +PORT_OBJS = $(PORT_DIR)/core_portme$(OEXT) +PORT_CLEAN = *$(OEXT) + +$(OPATH)%$(OEXT) : %.c + $(CC) $(CFLAGS) $(XCFLAGS) $(COUT) $< $(OBJOUT) $@ + +endif + +# Target: port_prebuild +# Generate any files that are needed before actual build starts. +# E.g. generate profile guidance files. Sample PGO generation for gcc enabled with PGO=1 +# - First, check if PGO was defined on the command line, if so, need to add -fprofile-use to compile line. +# - Second, if PGO reference has not yet been generated, add a step to the prebuild that will build a profile-generate version and run it. +# Note - Using REBUILD=1 +# +# Use make PGO=1 to invoke this sample processing. + +ifdef PGO + ifeq (,$(findstring $(PGO),gen)) + PGO_STAGE=build_pgo_gcc + CFLAGS+=-fprofile-use + endif + PORT_CLEAN+=*.gcda *.gcno gmon.out +endif + +.PHONY: port_prebuild +port_prebuild: $(PGO_STAGE) + +.PHONY: build_pgo_gcc +build_pgo_gcc: + $(MAKE) PGO=gen XCFLAGS="$(XCFLAGS) -fprofile-generate -DTOTAL_DATA_SIZE=1200" ITERATIONS=10 gen_pgo_data REBUILD=1 + +# Target: port_postbuild +# Generate any files that are needed after actual build end. +# E.g. change format to srec, bin, zip in order to be able to load into flash +.PHONY: port_postbuild +port_postbuild: + +# Target: port_postrun +# Do platform specific after run stuff. +# E.g. reset the board, backup the logfiles etc. +.PHONY: port_postrun +port_postrun: + +# Target: port_prerun +# Do platform specific after run stuff. +# E.g. reset the board, backup the logfiles etc. +.PHONY: port_prerun +port_prerun: + +# Target: port_postload +# Do platform specific after load stuff. +# E.g. reset the reset power to the flash eraser +.PHONY: port_postload +port_postload: + +# Target: port_preload +# Do platform specific before load stuff. +# E.g. reset the reset power to the flash eraser +.PHONY: port_preload +port_preload: + +# FLAG: OPATH +# Path to the output folder. Default - current folder. +OPATH = ./ +MKDIR = mkdir -p + +# FLAG: PERL +# Define perl executable to calculate the geomean if running separate. +PERL=/usr/bin/perl diff --git a/tests/riscv-coremark/riscv64-baremetal/crt.S b/tests/riscv-coremark/riscv64-baremetal/crt.S new file mode 100644 index 000000000..d75e81e06 --- /dev/null +++ b/tests/riscv-coremark/riscv64-baremetal/crt.S @@ -0,0 +1,237 @@ +# See LICENSE for license details. + +#include "encoding.h" + +#if __riscv_xlen == 64 +# define LREG ld +# define SREG sd +# define REGBYTES 8 +#else +# define LREG lw +# define SREG sw +# define REGBYTES 4 +#endif + + .section ".text.init" + .globl _start +_start: + li x1, 0 + li x2, 0 + li x3, 0 + li x4, 0 + li x5, 0 + li x6, 0 + li x7, 0 + li x8, 0 + li x9, 0 + li x10,0 + li x11,0 + li x12,0 + li x13,0 + li x14,0 + li x15,0 + li x16,0 + li x17,0 + li x18,0 + li x19,0 + li x20,0 + li x21,0 + li x22,0 + li x23,0 + li x24,0 + li x25,0 + li x26,0 + li x27,0 + li x28,0 + li x29,0 + li x30,0 + li x31,0 + + # enable FPU and accelerator if present + li t0, MSTATUS_FS | MSTATUS_XS + csrs mstatus, t0 + + # make sure XLEN agrees with compilation choice + li t0, 1 + slli t0, t0, 31 +#if __riscv_xlen == 64 + bgez t0, 1f +#else + bltz t0, 1f +#endif +2: + li a0, 1 + sw a0, tohost, t0 + j 2b +1: + +#ifdef __riscv_flen + # initialize FPU if we have one + la t0, 1f + csrw mtvec, t0 + + fssr x0 + fmv.s.x f0, x0 + fmv.s.x f1, x0 + fmv.s.x f2, x0 + fmv.s.x f3, x0 + fmv.s.x f4, x0 + fmv.s.x f5, x0 + fmv.s.x f6, x0 + fmv.s.x f7, x0 + fmv.s.x f8, x0 + fmv.s.x f9, x0 + fmv.s.x f10,x0 + fmv.s.x f11,x0 + fmv.s.x f12,x0 + fmv.s.x f13,x0 + fmv.s.x f14,x0 + fmv.s.x f15,x0 + fmv.s.x f16,x0 + fmv.s.x f17,x0 + fmv.s.x f18,x0 + fmv.s.x f19,x0 + fmv.s.x f20,x0 + fmv.s.x f21,x0 + fmv.s.x f22,x0 + fmv.s.x f23,x0 + fmv.s.x f24,x0 + fmv.s.x f25,x0 + fmv.s.x f26,x0 + fmv.s.x f27,x0 + fmv.s.x f28,x0 + fmv.s.x f29,x0 + fmv.s.x f30,x0 + fmv.s.x f31,x0 +1: +#endif + + # initialize trap vector + la t0, trap_entry + csrw mtvec, t0 + + # initialize global pointer +.option push +.option norelax + la gp, __global_pointer$ +.option pop + + la tp, _end + 63 + and tp, tp, -64 + + # get core id + csrr a0, mhartid + # for now, assume only 1 core + li a1, 1 +1:bgeu a0, a1, 1b + + # give each core 128KB of stack + TLS +#define STKSHIFT 17 + sll a2, a0, STKSHIFT + add tp, tp, a2 + add sp, a0, 1 + sll sp, sp, STKSHIFT + add sp, sp, tp + + j _init + + .align 2 +trap_entry: + addi sp, sp, -272 + + SREG x1, 1*REGBYTES(sp) + SREG x2, 2*REGBYTES(sp) + SREG x3, 3*REGBYTES(sp) + SREG x4, 4*REGBYTES(sp) + SREG x5, 5*REGBYTES(sp) + SREG x6, 6*REGBYTES(sp) + SREG x7, 7*REGBYTES(sp) + SREG x8, 8*REGBYTES(sp) + SREG x9, 9*REGBYTES(sp) + SREG x10, 10*REGBYTES(sp) + SREG x11, 11*REGBYTES(sp) + SREG x12, 12*REGBYTES(sp) + SREG x13, 13*REGBYTES(sp) + SREG x14, 14*REGBYTES(sp) + SREG x15, 15*REGBYTES(sp) + SREG x16, 16*REGBYTES(sp) + SREG x17, 17*REGBYTES(sp) + SREG x18, 18*REGBYTES(sp) + SREG x19, 19*REGBYTES(sp) + SREG x20, 20*REGBYTES(sp) + SREG x21, 21*REGBYTES(sp) + SREG x22, 22*REGBYTES(sp) + SREG x23, 23*REGBYTES(sp) + SREG x24, 24*REGBYTES(sp) + SREG x25, 25*REGBYTES(sp) + SREG x26, 26*REGBYTES(sp) + SREG x27, 27*REGBYTES(sp) + SREG x28, 28*REGBYTES(sp) + SREG x29, 29*REGBYTES(sp) + SREG x30, 30*REGBYTES(sp) + SREG x31, 31*REGBYTES(sp) + + csrr a0, mcause + csrr a1, mepc + mv a2, sp + jal handle_trap + csrw mepc, a0 + + # Remain in M-mode after eret + li t0, MSTATUS_MPP + csrs mstatus, t0 + + LREG x1, 1*REGBYTES(sp) + LREG x2, 2*REGBYTES(sp) + LREG x3, 3*REGBYTES(sp) + LREG x4, 4*REGBYTES(sp) + LREG x5, 5*REGBYTES(sp) + LREG x6, 6*REGBYTES(sp) + LREG x7, 7*REGBYTES(sp) + LREG x8, 8*REGBYTES(sp) + LREG x9, 9*REGBYTES(sp) + LREG x10, 10*REGBYTES(sp) + LREG x11, 11*REGBYTES(sp) + LREG x12, 12*REGBYTES(sp) + LREG x13, 13*REGBYTES(sp) + LREG x14, 14*REGBYTES(sp) + LREG x15, 15*REGBYTES(sp) + LREG x16, 16*REGBYTES(sp) + LREG x17, 17*REGBYTES(sp) + LREG x18, 18*REGBYTES(sp) + LREG x19, 19*REGBYTES(sp) + LREG x20, 20*REGBYTES(sp) + LREG x21, 21*REGBYTES(sp) + LREG x22, 22*REGBYTES(sp) + LREG x23, 23*REGBYTES(sp) + LREG x24, 24*REGBYTES(sp) + LREG x25, 25*REGBYTES(sp) + LREG x26, 26*REGBYTES(sp) + LREG x27, 27*REGBYTES(sp) + LREG x28, 28*REGBYTES(sp) + LREG x29, 29*REGBYTES(sp) + LREG x30, 30*REGBYTES(sp) + LREG x31, 31*REGBYTES(sp) + + addi sp, sp, 272 + mret + +.section ".tdata.begin" +.globl _tdata_begin +_tdata_begin: + +.section ".tdata.end" +.globl _tdata_end +_tdata_end: + +.section ".tbss.end" +.globl _tbss_end +_tbss_end: + +.section ".tohost","aw",@progbits +.align 6 +.globl tohost +tohost: .dword 0 +.align 6 +.globl fromhost +fromhost: .dword 0 diff --git a/tests/riscv-coremark/riscv64-baremetal/encoding.h b/tests/riscv-coremark/riscv64-baremetal/encoding.h new file mode 100644 index 000000000..c109ce189 --- /dev/null +++ b/tests/riscv-coremark/riscv64-baremetal/encoding.h @@ -0,0 +1,1471 @@ +// See LICENSE for license details. + +#ifndef RISCV_CSR_ENCODING_H +#define RISCV_CSR_ENCODING_H + +#define MSTATUS_UIE 0x00000001 +#define MSTATUS_SIE 0x00000002 +#define MSTATUS_HIE 0x00000004 +#define MSTATUS_MIE 0x00000008 +#define MSTATUS_UPIE 0x00000010 +#define MSTATUS_SPIE 0x00000020 +#define MSTATUS_HPIE 0x00000040 +#define MSTATUS_MPIE 0x00000080 +#define MSTATUS_SPP 0x00000100 +#define MSTATUS_HPP 0x00000600 +#define MSTATUS_MPP 0x00001800 +#define MSTATUS_FS 0x00006000 +#define MSTATUS_XS 0x00018000 +#define MSTATUS_MPRV 0x00020000 +#define MSTATUS_SUM 0x00040000 +#define MSTATUS_MXR 0x00080000 +#define MSTATUS_TVM 0x00100000 +#define MSTATUS_TW 0x00200000 +#define MSTATUS_TSR 0x00400000 +#define MSTATUS32_SD 0x80000000 +#define MSTATUS_UXL 0x0000000300000000 +#define MSTATUS_SXL 0x0000000C00000000 +#define MSTATUS64_SD 0x8000000000000000 + +#define SSTATUS_UIE 0x00000001 +#define SSTATUS_SIE 0x00000002 +#define SSTATUS_UPIE 0x00000010 +#define SSTATUS_SPIE 0x00000020 +#define SSTATUS_SPP 0x00000100 +#define SSTATUS_FS 0x00006000 +#define SSTATUS_XS 0x00018000 +#define SSTATUS_SUM 0x00040000 +#define SSTATUS_MXR 0x00080000 +#define SSTATUS32_SD 0x80000000 +#define SSTATUS_UXL 0x0000000300000000 +#define SSTATUS64_SD 0x8000000000000000 + +#define DCSR_XDEBUGVER (3U<<30) +#define DCSR_NDRESET (1<<29) +#define DCSR_FULLRESET (1<<28) +#define DCSR_EBREAKM (1<<15) +#define DCSR_EBREAKH (1<<14) +#define DCSR_EBREAKS (1<<13) +#define DCSR_EBREAKU (1<<12) +#define DCSR_STOPCYCLE (1<<10) +#define DCSR_STOPTIME (1<<9) +#define DCSR_CAUSE (7<<6) +#define DCSR_DEBUGINT (1<<5) +#define DCSR_HALT (1<<3) +#define DCSR_STEP (1<<2) +#define DCSR_PRV (3<<0) + +#define DCSR_CAUSE_NONE 0 +#define DCSR_CAUSE_SWBP 1 +#define DCSR_CAUSE_HWBP 2 +#define DCSR_CAUSE_DEBUGINT 3 +#define DCSR_CAUSE_STEP 4 +#define DCSR_CAUSE_HALT 5 + +#define MCONTROL_TYPE(xlen) (0xfULL<<((xlen)-4)) +#define MCONTROL_DMODE(xlen) (1ULL<<((xlen)-5)) +#define MCONTROL_MASKMAX(xlen) (0x3fULL<<((xlen)-11)) + +#define MCONTROL_SELECT (1<<19) +#define MCONTROL_TIMING (1<<18) +#define MCONTROL_ACTION (0x3f<<12) +#define MCONTROL_CHAIN (1<<11) +#define MCONTROL_MATCH (0xf<<7) +#define MCONTROL_M (1<<6) +#define MCONTROL_H (1<<5) +#define MCONTROL_S (1<<4) +#define MCONTROL_U (1<<3) +#define MCONTROL_EXECUTE (1<<2) +#define MCONTROL_STORE (1<<1) +#define MCONTROL_LOAD (1<<0) + +#define MCONTROL_TYPE_NONE 0 +#define MCONTROL_TYPE_MATCH 2 + +#define MCONTROL_ACTION_DEBUG_EXCEPTION 0 +#define MCONTROL_ACTION_DEBUG_MODE 1 +#define MCONTROL_ACTION_TRACE_START 2 +#define MCONTROL_ACTION_TRACE_STOP 3 +#define MCONTROL_ACTION_TRACE_EMIT 4 + +#define MCONTROL_MATCH_EQUAL 0 +#define MCONTROL_MATCH_NAPOT 1 +#define MCONTROL_MATCH_GE 2 +#define MCONTROL_MATCH_LT 3 +#define MCONTROL_MATCH_MASK_LOW 4 +#define MCONTROL_MATCH_MASK_HIGH 5 + +#define MIP_SSIP (1 << IRQ_S_SOFT) +#define MIP_HSIP (1 << IRQ_H_SOFT) +#define MIP_MSIP (1 << IRQ_M_SOFT) +#define MIP_STIP (1 << IRQ_S_TIMER) +#define MIP_HTIP (1 << IRQ_H_TIMER) +#define MIP_MTIP (1 << IRQ_M_TIMER) +#define MIP_SEIP (1 << IRQ_S_EXT) +#define MIP_HEIP (1 << IRQ_H_EXT) +#define MIP_MEIP (1 << IRQ_M_EXT) + +#define SIP_SSIP MIP_SSIP +#define SIP_STIP MIP_STIP + +#define PRV_U 0 +#define PRV_S 1 +#define PRV_H 2 +#define PRV_M 3 + +#define SATP32_MODE 0x80000000 +#define SATP32_ASID 0x7FC00000 +#define SATP32_PPN 0x003FFFFF +#define SATP64_MODE 0xF000000000000000 +#define SATP64_ASID 0x0FFFF00000000000 +#define SATP64_PPN 0x00000FFFFFFFFFFF + +#define SATP_MODE_OFF 0 +#define SATP_MODE_SV32 1 +#define SATP_MODE_SV39 8 +#define SATP_MODE_SV48 9 +#define SATP_MODE_SV57 10 +#define SATP_MODE_SV64 11 + +#define PMP_R 0x01 +#define PMP_W 0x02 +#define PMP_X 0x04 +#define PMP_A 0x18 +#define PMP_L 0x80 +#define PMP_SHIFT 2 + +#define PMP_TOR 0x08 +#define PMP_NA4 0x10 +#define PMP_NAPOT 0x18 + +#define IRQ_S_SOFT 1 +#define IRQ_H_SOFT 2 +#define IRQ_M_SOFT 3 +#define IRQ_S_TIMER 5 +#define IRQ_H_TIMER 6 +#define IRQ_M_TIMER 7 +#define IRQ_S_EXT 9 +#define IRQ_H_EXT 10 +#define IRQ_M_EXT 11 +#define IRQ_COP 12 +#define IRQ_HOST 13 + +#define DEFAULT_RSTVEC 0x00001000 +#define CLINT_BASE 0x02000000 +#define CLINT_SIZE 0x000c0000 +#define EXT_IO_BASE 0x40000000 +#define DRAM_BASE 0x80000000 + +// page table entry (PTE) fields +#define PTE_V 0x001 // Valid +#define PTE_R 0x002 // Read +#define PTE_W 0x004 // Write +#define PTE_X 0x008 // Execute +#define PTE_U 0x010 // User +#define PTE_G 0x020 // Global +#define PTE_A 0x040 // Accessed +#define PTE_D 0x080 // Dirty +#define PTE_SOFT 0x300 // Reserved for Software + +#define PTE_PPN_SHIFT 10 + +#define PTE_TABLE(PTE) (((PTE) & (PTE_V | PTE_R | PTE_W | PTE_X)) == PTE_V) + +#ifdef __riscv + +#if __riscv_xlen == 64 +# define MSTATUS_SD MSTATUS64_SD +# define SSTATUS_SD SSTATUS64_SD +# define RISCV_PGLEVEL_BITS 9 +# define SATP_MODE SATP64_MODE +#else +# define MSTATUS_SD MSTATUS32_SD +# define SSTATUS_SD SSTATUS32_SD +# define RISCV_PGLEVEL_BITS 10 +# define SATP_MODE SATP32_MODE +#endif +#define RISCV_PGSHIFT 12 +#define RISCV_PGSIZE (1 << RISCV_PGSHIFT) + +#ifndef __ASSEMBLER__ + +#ifdef __GNUC__ + +#define read_csr(reg) ({ unsigned long __tmp; \ + asm volatile ("csrr %0, " #reg : "=r"(__tmp)); \ + __tmp; }) + +#define write_csr(reg, val) ({ \ + asm volatile ("csrw " #reg ", %0" :: "rK"(val)); }) + +#define swap_csr(reg, val) ({ unsigned long __tmp; \ + asm volatile ("csrrw %0, " #reg ", %1" : "=r"(__tmp) : "rK"(val)); \ + __tmp; }) + +#define set_csr(reg, bit) ({ unsigned long __tmp; \ + asm volatile ("csrrs %0, " #reg ", %1" : "=r"(__tmp) : "rK"(bit)); \ + __tmp; }) + +#define clear_csr(reg, bit) ({ unsigned long __tmp; \ + asm volatile ("csrrc %0, " #reg ", %1" : "=r"(__tmp) : "rK"(bit)); \ + __tmp; }) + +#define rdtime() read_csr(time) +#define rdcycle() read_csr(cycle) +#define rdinstret() read_csr(instret) + +#endif + +#endif + +#endif + +#endif +/* Automatically generated by parse-opcodes. */ +#ifndef RISCV_ENCODING_H +#define RISCV_ENCODING_H +#define MATCH_BEQ 0x63 +#define MASK_BEQ 0x707f +#define MATCH_BNE 0x1063 +#define MASK_BNE 0x707f +#define MATCH_BLT 0x4063 +#define MASK_BLT 0x707f +#define MATCH_BGE 0x5063 +#define MASK_BGE 0x707f +#define MATCH_BLTU 0x6063 +#define MASK_BLTU 0x707f +#define MATCH_BGEU 0x7063 +#define MASK_BGEU 0x707f +#define MATCH_JALR 0x67 +#define MASK_JALR 0x707f +#define MATCH_JAL 0x6f +#define MASK_JAL 0x7f +#define MATCH_LUI 0x37 +#define MASK_LUI 0x7f +#define MATCH_AUIPC 0x17 +#define MASK_AUIPC 0x7f +#define MATCH_ADDI 0x13 +#define MASK_ADDI 0x707f +#define MATCH_SLLI 0x1013 +#define MASK_SLLI 0xfc00707f +#define MATCH_SLTI 0x2013 +#define MASK_SLTI 0x707f +#define MATCH_SLTIU 0x3013 +#define MASK_SLTIU 0x707f +#define MATCH_XORI 0x4013 +#define MASK_XORI 0x707f +#define MATCH_SRLI 0x5013 +#define MASK_SRLI 0xfc00707f +#define MATCH_SRAI 0x40005013 +#define MASK_SRAI 0xfc00707f +#define MATCH_ORI 0x6013 +#define MASK_ORI 0x707f +#define MATCH_ANDI 0x7013 +#define MASK_ANDI 0x707f +#define MATCH_ADD 0x33 +#define MASK_ADD 0xfe00707f +#define MATCH_SUB 0x40000033 +#define MASK_SUB 0xfe00707f +#define MATCH_SLL 0x1033 +#define MASK_SLL 0xfe00707f +#define MATCH_SLT 0x2033 +#define MASK_SLT 0xfe00707f +#define MATCH_SLTU 0x3033 +#define MASK_SLTU 0xfe00707f +#define MATCH_XOR 0x4033 +#define MASK_XOR 0xfe00707f +#define MATCH_SRL 0x5033 +#define MASK_SRL 0xfe00707f +#define MATCH_SRA 0x40005033 +#define MASK_SRA 0xfe00707f +#define MATCH_OR 0x6033 +#define MASK_OR 0xfe00707f +#define MATCH_AND 0x7033 +#define MASK_AND 0xfe00707f +#define MATCH_ADDIW 0x1b +#define MASK_ADDIW 0x707f +#define MATCH_SLLIW 0x101b +#define MASK_SLLIW 0xfe00707f +#define MATCH_SRLIW 0x501b +#define MASK_SRLIW 0xfe00707f +#define MATCH_SRAIW 0x4000501b +#define MASK_SRAIW 0xfe00707f +#define MATCH_ADDW 0x3b +#define MASK_ADDW 0xfe00707f +#define MATCH_SUBW 0x4000003b +#define MASK_SUBW 0xfe00707f +#define MATCH_SLLW 0x103b +#define MASK_SLLW 0xfe00707f +#define MATCH_SRLW 0x503b +#define MASK_SRLW 0xfe00707f +#define MATCH_SRAW 0x4000503b +#define MASK_SRAW 0xfe00707f +#define MATCH_LB 0x3 +#define MASK_LB 0x707f +#define MATCH_LH 0x1003 +#define MASK_LH 0x707f +#define MATCH_LW 0x2003 +#define MASK_LW 0x707f +#define MATCH_LD 0x3003 +#define MASK_LD 0x707f +#define MATCH_LBU 0x4003 +#define MASK_LBU 0x707f +#define MATCH_LHU 0x5003 +#define MASK_LHU 0x707f +#define MATCH_LWU 0x6003 +#define MASK_LWU 0x707f +#define MATCH_SB 0x23 +#define MASK_SB 0x707f +#define MATCH_SH 0x1023 +#define MASK_SH 0x707f +#define MATCH_SW 0x2023 +#define MASK_SW 0x707f +#define MATCH_SD 0x3023 +#define MASK_SD 0x707f +#define MATCH_FENCE 0xf +#define MASK_FENCE 0x707f +#define MATCH_FENCE_I 0x100f +#define MASK_FENCE_I 0x707f +#define MATCH_MUL 0x2000033 +#define MASK_MUL 0xfe00707f +#define MATCH_MULH 0x2001033 +#define MASK_MULH 0xfe00707f +#define MATCH_MULHSU 0x2002033 +#define MASK_MULHSU 0xfe00707f +#define MATCH_MULHU 0x2003033 +#define MASK_MULHU 0xfe00707f +#define MATCH_DIV 0x2004033 +#define MASK_DIV 0xfe00707f +#define MATCH_DIVU 0x2005033 +#define MASK_DIVU 0xfe00707f +#define MATCH_REM 0x2006033 +#define MASK_REM 0xfe00707f +#define MATCH_REMU 0x2007033 +#define MASK_REMU 0xfe00707f +#define MATCH_MULW 0x200003b +#define MASK_MULW 0xfe00707f +#define MATCH_DIVW 0x200403b +#define MASK_DIVW 0xfe00707f +#define MATCH_DIVUW 0x200503b +#define MASK_DIVUW 0xfe00707f +#define MATCH_REMW 0x200603b +#define MASK_REMW 0xfe00707f +#define MATCH_REMUW 0x200703b +#define MASK_REMUW 0xfe00707f +#define MATCH_AMOADD_W 0x202f +#define MASK_AMOADD_W 0xf800707f +#define MATCH_AMOXOR_W 0x2000202f +#define MASK_AMOXOR_W 0xf800707f +#define MATCH_AMOOR_W 0x4000202f +#define MASK_AMOOR_W 0xf800707f +#define MATCH_AMOAND_W 0x6000202f +#define MASK_AMOAND_W 0xf800707f +#define MATCH_AMOMIN_W 0x8000202f +#define MASK_AMOMIN_W 0xf800707f +#define MATCH_AMOMAX_W 0xa000202f +#define MASK_AMOMAX_W 0xf800707f +#define MATCH_AMOMINU_W 0xc000202f +#define MASK_AMOMINU_W 0xf800707f +#define MATCH_AMOMAXU_W 0xe000202f +#define MASK_AMOMAXU_W 0xf800707f +#define MATCH_AMOSWAP_W 0x800202f +#define MASK_AMOSWAP_W 0xf800707f +#define MATCH_LR_W 0x1000202f +#define MASK_LR_W 0xf9f0707f +#define MATCH_SC_W 0x1800202f +#define MASK_SC_W 0xf800707f +#define MATCH_AMOADD_D 0x302f +#define MASK_AMOADD_D 0xf800707f +#define MATCH_AMOXOR_D 0x2000302f +#define MASK_AMOXOR_D 0xf800707f +#define MATCH_AMOOR_D 0x4000302f +#define MASK_AMOOR_D 0xf800707f +#define MATCH_AMOAND_D 0x6000302f +#define MASK_AMOAND_D 0xf800707f +#define MATCH_AMOMIN_D 0x8000302f +#define MASK_AMOMIN_D 0xf800707f +#define MATCH_AMOMAX_D 0xa000302f +#define MASK_AMOMAX_D 0xf800707f +#define MATCH_AMOMINU_D 0xc000302f +#define MASK_AMOMINU_D 0xf800707f +#define MATCH_AMOMAXU_D 0xe000302f +#define MASK_AMOMAXU_D 0xf800707f +#define MATCH_AMOSWAP_D 0x800302f +#define MASK_AMOSWAP_D 0xf800707f +#define MATCH_LR_D 0x1000302f +#define MASK_LR_D 0xf9f0707f +#define MATCH_SC_D 0x1800302f +#define MASK_SC_D 0xf800707f +#define MATCH_ECALL 0x73 +#define MASK_ECALL 0xffffffff +#define MATCH_EBREAK 0x100073 +#define MASK_EBREAK 0xffffffff +#define MATCH_URET 0x200073 +#define MASK_URET 0xffffffff +#define MATCH_SRET 0x10200073 +#define MASK_SRET 0xffffffff +#define MATCH_MRET 0x30200073 +#define MASK_MRET 0xffffffff +#define MATCH_DRET 0x7b200073 +#define MASK_DRET 0xffffffff +#define MATCH_SFENCE_VMA 0x12000073 +#define MASK_SFENCE_VMA 0xfe007fff +#define MATCH_WFI 0x10500073 +#define MASK_WFI 0xffffffff +#define MATCH_CSRRW 0x1073 +#define MASK_CSRRW 0x707f +#define MATCH_CSRRS 0x2073 +#define MASK_CSRRS 0x707f +#define MATCH_CSRRC 0x3073 +#define MASK_CSRRC 0x707f +#define MATCH_CSRRWI 0x5073 +#define MASK_CSRRWI 0x707f +#define MATCH_CSRRSI 0x6073 +#define MASK_CSRRSI 0x707f +#define MATCH_CSRRCI 0x7073 +#define MASK_CSRRCI 0x707f +#define MATCH_FADD_S 0x53 +#define MASK_FADD_S 0xfe00007f +#define MATCH_FSUB_S 0x8000053 +#define MASK_FSUB_S 0xfe00007f +#define MATCH_FMUL_S 0x10000053 +#define MASK_FMUL_S 0xfe00007f +#define MATCH_FDIV_S 0x18000053 +#define MASK_FDIV_S 0xfe00007f +#define MATCH_FSGNJ_S 0x20000053 +#define MASK_FSGNJ_S 0xfe00707f +#define MATCH_FSGNJN_S 0x20001053 +#define MASK_FSGNJN_S 0xfe00707f +#define MATCH_FSGNJX_S 0x20002053 +#define MASK_FSGNJX_S 0xfe00707f +#define MATCH_FMIN_S 0x28000053 +#define MASK_FMIN_S 0xfe00707f +#define MATCH_FMAX_S 0x28001053 +#define MASK_FMAX_S 0xfe00707f +#define MATCH_FSQRT_S 0x58000053 +#define MASK_FSQRT_S 0xfff0007f +#define MATCH_FADD_D 0x2000053 +#define MASK_FADD_D 0xfe00007f +#define MATCH_FSUB_D 0xa000053 +#define MASK_FSUB_D 0xfe00007f +#define MATCH_FMUL_D 0x12000053 +#define MASK_FMUL_D 0xfe00007f +#define MATCH_FDIV_D 0x1a000053 +#define MASK_FDIV_D 0xfe00007f +#define MATCH_FSGNJ_D 0x22000053 +#define MASK_FSGNJ_D 0xfe00707f +#define MATCH_FSGNJN_D 0x22001053 +#define MASK_FSGNJN_D 0xfe00707f +#define MATCH_FSGNJX_D 0x22002053 +#define MASK_FSGNJX_D 0xfe00707f +#define MATCH_FMIN_D 0x2a000053 +#define MASK_FMIN_D 0xfe00707f +#define MATCH_FMAX_D 0x2a001053 +#define MASK_FMAX_D 0xfe00707f +#define MATCH_FCVT_S_D 0x40100053 +#define MASK_FCVT_S_D 0xfff0007f +#define MATCH_FCVT_D_S 0x42000053 +#define MASK_FCVT_D_S 0xfff0007f +#define MATCH_FSQRT_D 0x5a000053 +#define MASK_FSQRT_D 0xfff0007f +#define MATCH_FADD_Q 0x6000053 +#define MASK_FADD_Q 0xfe00007f +#define MATCH_FSUB_Q 0xe000053 +#define MASK_FSUB_Q 0xfe00007f +#define MATCH_FMUL_Q 0x16000053 +#define MASK_FMUL_Q 0xfe00007f +#define MATCH_FDIV_Q 0x1e000053 +#define MASK_FDIV_Q 0xfe00007f +#define MATCH_FSGNJ_Q 0x26000053 +#define MASK_FSGNJ_Q 0xfe00707f +#define MATCH_FSGNJN_Q 0x26001053 +#define MASK_FSGNJN_Q 0xfe00707f +#define MATCH_FSGNJX_Q 0x26002053 +#define MASK_FSGNJX_Q 0xfe00707f +#define MATCH_FMIN_Q 0x2e000053 +#define MASK_FMIN_Q 0xfe00707f +#define MATCH_FMAX_Q 0x2e001053 +#define MASK_FMAX_Q 0xfe00707f +#define MATCH_FCVT_S_Q 0x40300053 +#define MASK_FCVT_S_Q 0xfff0007f +#define MATCH_FCVT_Q_S 0x46000053 +#define MASK_FCVT_Q_S 0xfff0007f +#define MATCH_FCVT_D_Q 0x42300053 +#define MASK_FCVT_D_Q 0xfff0007f +#define MATCH_FCVT_Q_D 0x46100053 +#define MASK_FCVT_Q_D 0xfff0007f +#define MATCH_FSQRT_Q 0x5e000053 +#define MASK_FSQRT_Q 0xfff0007f +#define MATCH_FLE_S 0xa0000053 +#define MASK_FLE_S 0xfe00707f +#define MATCH_FLT_S 0xa0001053 +#define MASK_FLT_S 0xfe00707f +#define MATCH_FEQ_S 0xa0002053 +#define MASK_FEQ_S 0xfe00707f +#define MATCH_FLE_D 0xa2000053 +#define MASK_FLE_D 0xfe00707f +#define MATCH_FLT_D 0xa2001053 +#define MASK_FLT_D 0xfe00707f +#define MATCH_FEQ_D 0xa2002053 +#define MASK_FEQ_D 0xfe00707f +#define MATCH_FLE_Q 0xa6000053 +#define MASK_FLE_Q 0xfe00707f +#define MATCH_FLT_Q 0xa6001053 +#define MASK_FLT_Q 0xfe00707f +#define MATCH_FEQ_Q 0xa6002053 +#define MASK_FEQ_Q 0xfe00707f +#define MATCH_FCVT_W_S 0xc0000053 +#define MASK_FCVT_W_S 0xfff0007f +#define MATCH_FCVT_WU_S 0xc0100053 +#define MASK_FCVT_WU_S 0xfff0007f +#define MATCH_FCVT_L_S 0xc0200053 +#define MASK_FCVT_L_S 0xfff0007f +#define MATCH_FCVT_LU_S 0xc0300053 +#define MASK_FCVT_LU_S 0xfff0007f +#define MATCH_FMV_X_W 0xe0000053 +#define MASK_FMV_X_W 0xfff0707f +#define MATCH_FCLASS_S 0xe0001053 +#define MASK_FCLASS_S 0xfff0707f +#define MATCH_FCVT_W_D 0xc2000053 +#define MASK_FCVT_W_D 0xfff0007f +#define MATCH_FCVT_WU_D 0xc2100053 +#define MASK_FCVT_WU_D 0xfff0007f +#define MATCH_FCVT_L_D 0xc2200053 +#define MASK_FCVT_L_D 0xfff0007f +#define MATCH_FCVT_LU_D 0xc2300053 +#define MASK_FCVT_LU_D 0xfff0007f +#define MATCH_FMV_X_D 0xe2000053 +#define MASK_FMV_X_D 0xfff0707f +#define MATCH_FCLASS_D 0xe2001053 +#define MASK_FCLASS_D 0xfff0707f +#define MATCH_FCVT_W_Q 0xc6000053 +#define MASK_FCVT_W_Q 0xfff0007f +#define MATCH_FCVT_WU_Q 0xc6100053 +#define MASK_FCVT_WU_Q 0xfff0007f +#define MATCH_FCVT_L_Q 0xc6200053 +#define MASK_FCVT_L_Q 0xfff0007f +#define MATCH_FCVT_LU_Q 0xc6300053 +#define MASK_FCVT_LU_Q 0xfff0007f +#define MATCH_FMV_X_Q 0xe6000053 +#define MASK_FMV_X_Q 0xfff0707f +#define MATCH_FCLASS_Q 0xe6001053 +#define MASK_FCLASS_Q 0xfff0707f +#define MATCH_FCVT_S_W 0xd0000053 +#define MASK_FCVT_S_W 0xfff0007f +#define MATCH_FCVT_S_WU 0xd0100053 +#define MASK_FCVT_S_WU 0xfff0007f +#define MATCH_FCVT_S_L 0xd0200053 +#define MASK_FCVT_S_L 0xfff0007f +#define MATCH_FCVT_S_LU 0xd0300053 +#define MASK_FCVT_S_LU 0xfff0007f +#define MATCH_FMV_W_X 0xf0000053 +#define MASK_FMV_W_X 0xfff0707f +#define MATCH_FCVT_D_W 0xd2000053 +#define MASK_FCVT_D_W 0xfff0007f +#define MATCH_FCVT_D_WU 0xd2100053 +#define MASK_FCVT_D_WU 0xfff0007f +#define MATCH_FCVT_D_L 0xd2200053 +#define MASK_FCVT_D_L 0xfff0007f +#define MATCH_FCVT_D_LU 0xd2300053 +#define MASK_FCVT_D_LU 0xfff0007f +#define MATCH_FMV_D_X 0xf2000053 +#define MASK_FMV_D_X 0xfff0707f +#define MATCH_FCVT_Q_W 0xd6000053 +#define MASK_FCVT_Q_W 0xfff0007f +#define MATCH_FCVT_Q_WU 0xd6100053 +#define MASK_FCVT_Q_WU 0xfff0007f +#define MATCH_FCVT_Q_L 0xd6200053 +#define MASK_FCVT_Q_L 0xfff0007f +#define MATCH_FCVT_Q_LU 0xd6300053 +#define MASK_FCVT_Q_LU 0xfff0007f +#define MATCH_FMV_Q_X 0xf6000053 +#define MASK_FMV_Q_X 0xfff0707f +#define MATCH_FLW 0x2007 +#define MASK_FLW 0x707f +#define MATCH_FLD 0x3007 +#define MASK_FLD 0x707f +#define MATCH_FLQ 0x4007 +#define MASK_FLQ 0x707f +#define MATCH_FSW 0x2027 +#define MASK_FSW 0x707f +#define MATCH_FSD 0x3027 +#define MASK_FSD 0x707f +#define MATCH_FSQ 0x4027 +#define MASK_FSQ 0x707f +#define MATCH_FMADD_S 0x43 +#define MASK_FMADD_S 0x600007f +#define MATCH_FMSUB_S 0x47 +#define MASK_FMSUB_S 0x600007f +#define MATCH_FNMSUB_S 0x4b +#define MASK_FNMSUB_S 0x600007f +#define MATCH_FNMADD_S 0x4f +#define MASK_FNMADD_S 0x600007f +#define MATCH_FMADD_D 0x2000043 +#define MASK_FMADD_D 0x600007f +#define MATCH_FMSUB_D 0x2000047 +#define MASK_FMSUB_D 0x600007f +#define MATCH_FNMSUB_D 0x200004b +#define MASK_FNMSUB_D 0x600007f +#define MATCH_FNMADD_D 0x200004f +#define MASK_FNMADD_D 0x600007f +#define MATCH_FMADD_Q 0x6000043 +#define MASK_FMADD_Q 0x600007f +#define MATCH_FMSUB_Q 0x6000047 +#define MASK_FMSUB_Q 0x600007f +#define MATCH_FNMSUB_Q 0x600004b +#define MASK_FNMSUB_Q 0x600007f +#define MATCH_FNMADD_Q 0x600004f +#define MASK_FNMADD_Q 0x600007f +#define MATCH_C_NOP 0x1 +#define MASK_C_NOP 0xffff +#define MATCH_C_ADDI16SP 0x6101 +#define MASK_C_ADDI16SP 0xef83 +#define MATCH_C_JR 0x8002 +#define MASK_C_JR 0xf07f +#define MATCH_C_JALR 0x9002 +#define MASK_C_JALR 0xf07f +#define MATCH_C_EBREAK 0x9002 +#define MASK_C_EBREAK 0xffff +#define MATCH_C_LD 0x6000 +#define MASK_C_LD 0xe003 +#define MATCH_C_SD 0xe000 +#define MASK_C_SD 0xe003 +#define MATCH_C_ADDIW 0x2001 +#define MASK_C_ADDIW 0xe003 +#define MATCH_C_LDSP 0x6002 +#define MASK_C_LDSP 0xe003 +#define MATCH_C_SDSP 0xe002 +#define MASK_C_SDSP 0xe003 +#define MATCH_C_ADDI4SPN 0x0 +#define MASK_C_ADDI4SPN 0xe003 +#define MATCH_C_FLD 0x2000 +#define MASK_C_FLD 0xe003 +#define MATCH_C_LW 0x4000 +#define MASK_C_LW 0xe003 +#define MATCH_C_FLW 0x6000 +#define MASK_C_FLW 0xe003 +#define MATCH_C_FSD 0xa000 +#define MASK_C_FSD 0xe003 +#define MATCH_C_SW 0xc000 +#define MASK_C_SW 0xe003 +#define MATCH_C_FSW 0xe000 +#define MASK_C_FSW 0xe003 +#define MATCH_C_ADDI 0x1 +#define MASK_C_ADDI 0xe003 +#define MATCH_C_JAL 0x2001 +#define MASK_C_JAL 0xe003 +#define MATCH_C_LI 0x4001 +#define MASK_C_LI 0xe003 +#define MATCH_C_LUI 0x6001 +#define MASK_C_LUI 0xe003 +#define MATCH_C_SRLI 0x8001 +#define MASK_C_SRLI 0xec03 +#define MATCH_C_SRAI 0x8401 +#define MASK_C_SRAI 0xec03 +#define MATCH_C_ANDI 0x8801 +#define MASK_C_ANDI 0xec03 +#define MATCH_C_SUB 0x8c01 +#define MASK_C_SUB 0xfc63 +#define MATCH_C_XOR 0x8c21 +#define MASK_C_XOR 0xfc63 +#define MATCH_C_OR 0x8c41 +#define MASK_C_OR 0xfc63 +#define MATCH_C_AND 0x8c61 +#define MASK_C_AND 0xfc63 +#define MATCH_C_SUBW 0x9c01 +#define MASK_C_SUBW 0xfc63 +#define MATCH_C_ADDW 0x9c21 +#define MASK_C_ADDW 0xfc63 +#define MATCH_C_J 0xa001 +#define MASK_C_J 0xe003 +#define MATCH_C_BEQZ 0xc001 +#define MASK_C_BEQZ 0xe003 +#define MATCH_C_BNEZ 0xe001 +#define MASK_C_BNEZ 0xe003 +#define MATCH_C_SLLI 0x2 +#define MASK_C_SLLI 0xe003 +#define MATCH_C_FLDSP 0x2002 +#define MASK_C_FLDSP 0xe003 +#define MATCH_C_LWSP 0x4002 +#define MASK_C_LWSP 0xe003 +#define MATCH_C_FLWSP 0x6002 +#define MASK_C_FLWSP 0xe003 +#define MATCH_C_MV 0x8002 +#define MASK_C_MV 0xf003 +#define MATCH_C_ADD 0x9002 +#define MASK_C_ADD 0xf003 +#define MATCH_C_FSDSP 0xa002 +#define MASK_C_FSDSP 0xe003 +#define MATCH_C_SWSP 0xc002 +#define MASK_C_SWSP 0xe003 +#define MATCH_C_FSWSP 0xe002 +#define MASK_C_FSWSP 0xe003 +#define MATCH_CUSTOM0 0xb +#define MASK_CUSTOM0 0x707f +#define MATCH_CUSTOM0_RS1 0x200b +#define MASK_CUSTOM0_RS1 0x707f +#define MATCH_CUSTOM0_RS1_RS2 0x300b +#define MASK_CUSTOM0_RS1_RS2 0x707f +#define MATCH_CUSTOM0_RD 0x400b +#define MASK_CUSTOM0_RD 0x707f +#define MATCH_CUSTOM0_RD_RS1 0x600b +#define MASK_CUSTOM0_RD_RS1 0x707f +#define MATCH_CUSTOM0_RD_RS1_RS2 0x700b +#define MASK_CUSTOM0_RD_RS1_RS2 0x707f +#define MATCH_CUSTOM1 0x2b +#define MASK_CUSTOM1 0x707f +#define MATCH_CUSTOM1_RS1 0x202b +#define MASK_CUSTOM1_RS1 0x707f +#define MATCH_CUSTOM1_RS1_RS2 0x302b +#define MASK_CUSTOM1_RS1_RS2 0x707f +#define MATCH_CUSTOM1_RD 0x402b +#define MASK_CUSTOM1_RD 0x707f +#define MATCH_CUSTOM1_RD_RS1 0x602b +#define MASK_CUSTOM1_RD_RS1 0x707f +#define MATCH_CUSTOM1_RD_RS1_RS2 0x702b +#define MASK_CUSTOM1_RD_RS1_RS2 0x707f +#define MATCH_CUSTOM2 0x5b +#define MASK_CUSTOM2 0x707f +#define MATCH_CUSTOM2_RS1 0x205b +#define MASK_CUSTOM2_RS1 0x707f +#define MATCH_CUSTOM2_RS1_RS2 0x305b +#define MASK_CUSTOM2_RS1_RS2 0x707f +#define MATCH_CUSTOM2_RD 0x405b +#define MASK_CUSTOM2_RD 0x707f +#define MATCH_CUSTOM2_RD_RS1 0x605b +#define MASK_CUSTOM2_RD_RS1 0x707f +#define MATCH_CUSTOM2_RD_RS1_RS2 0x705b +#define MASK_CUSTOM2_RD_RS1_RS2 0x707f +#define MATCH_CUSTOM3 0x7b +#define MASK_CUSTOM3 0x707f +#define MATCH_CUSTOM3_RS1 0x207b +#define MASK_CUSTOM3_RS1 0x707f +#define MATCH_CUSTOM3_RS1_RS2 0x307b +#define MASK_CUSTOM3_RS1_RS2 0x707f +#define MATCH_CUSTOM3_RD 0x407b +#define MASK_CUSTOM3_RD 0x707f +#define MATCH_CUSTOM3_RD_RS1 0x607b +#define MASK_CUSTOM3_RD_RS1 0x707f +#define MATCH_CUSTOM3_RD_RS1_RS2 0x707b +#define MASK_CUSTOM3_RD_RS1_RS2 0x707f +#define CSR_FFLAGS 0x1 +#define CSR_FRM 0x2 +#define CSR_FCSR 0x3 +#define CSR_CYCLE 0xc00 +#define CSR_TIME 0xc01 +#define CSR_INSTRET 0xc02 +#define CSR_HPMCOUNTER3 0xc03 +#define CSR_HPMCOUNTER4 0xc04 +#define CSR_HPMCOUNTER5 0xc05 +#define CSR_HPMCOUNTER6 0xc06 +#define CSR_HPMCOUNTER7 0xc07 +#define CSR_HPMCOUNTER8 0xc08 +#define CSR_HPMCOUNTER9 0xc09 +#define CSR_HPMCOUNTER10 0xc0a +#define CSR_HPMCOUNTER11 0xc0b +#define CSR_HPMCOUNTER12 0xc0c +#define CSR_HPMCOUNTER13 0xc0d +#define CSR_HPMCOUNTER14 0xc0e +#define CSR_HPMCOUNTER15 0xc0f +#define CSR_HPMCOUNTER16 0xc10 +#define CSR_HPMCOUNTER17 0xc11 +#define CSR_HPMCOUNTER18 0xc12 +#define CSR_HPMCOUNTER19 0xc13 +#define CSR_HPMCOUNTER20 0xc14 +#define CSR_HPMCOUNTER21 0xc15 +#define CSR_HPMCOUNTER22 0xc16 +#define CSR_HPMCOUNTER23 0xc17 +#define CSR_HPMCOUNTER24 0xc18 +#define CSR_HPMCOUNTER25 0xc19 +#define CSR_HPMCOUNTER26 0xc1a +#define CSR_HPMCOUNTER27 0xc1b +#define CSR_HPMCOUNTER28 0xc1c +#define CSR_HPMCOUNTER29 0xc1d +#define CSR_HPMCOUNTER30 0xc1e +#define CSR_HPMCOUNTER31 0xc1f +#define CSR_SSTATUS 0x100 +#define CSR_SIE 0x104 +#define CSR_STVEC 0x105 +#define CSR_SCOUNTEREN 0x106 +#define CSR_SSCRATCH 0x140 +#define CSR_SEPC 0x141 +#define CSR_SCAUSE 0x142 +#define CSR_STVAL 0x143 +#define CSR_SIP 0x144 +#define CSR_SATP 0x180 +#define CSR_MSTATUS 0x300 +#define CSR_MISA 0x301 +#define CSR_MEDELEG 0x302 +#define CSR_MIDELEG 0x303 +#define CSR_MIE 0x304 +#define CSR_MTVEC 0x305 +#define CSR_MCOUNTEREN 0x306 +#define CSR_MSCRATCH 0x340 +#define CSR_MEPC 0x341 +#define CSR_MCAUSE 0x342 +#define CSR_MTVAL 0x343 +#define CSR_MIP 0x344 +#define CSR_PMPCFG0 0x3a0 +#define CSR_PMPCFG1 0x3a1 +#define CSR_PMPCFG2 0x3a2 +#define CSR_PMPCFG3 0x3a3 +#define CSR_PMPADDR0 0x3b0 +#define CSR_PMPADDR1 0x3b1 +#define CSR_PMPADDR2 0x3b2 +#define CSR_PMPADDR3 0x3b3 +#define CSR_PMPADDR4 0x3b4 +#define CSR_PMPADDR5 0x3b5 +#define CSR_PMPADDR6 0x3b6 +#define CSR_PMPADDR7 0x3b7 +#define CSR_PMPADDR8 0x3b8 +#define CSR_PMPADDR9 0x3b9 +#define CSR_PMPADDR10 0x3ba +#define CSR_PMPADDR11 0x3bb +#define CSR_PMPADDR12 0x3bc +#define CSR_PMPADDR13 0x3bd +#define CSR_PMPADDR14 0x3be +#define CSR_PMPADDR15 0x3bf +#define CSR_TSELECT 0x7a0 +#define CSR_TDATA1 0x7a1 +#define CSR_TDATA2 0x7a2 +#define CSR_TDATA3 0x7a3 +#define CSR_DCSR 0x7b0 +#define CSR_DPC 0x7b1 +#define CSR_DSCRATCH 0x7b2 +#define CSR_MCYCLE 0xb00 +#define CSR_MINSTRET 0xb02 +#define CSR_MHPMCOUNTER3 0xb03 +#define CSR_MHPMCOUNTER4 0xb04 +#define CSR_MHPMCOUNTER5 0xb05 +#define CSR_MHPMCOUNTER6 0xb06 +#define CSR_MHPMCOUNTER7 0xb07 +#define CSR_MHPMCOUNTER8 0xb08 +#define CSR_MHPMCOUNTER9 0xb09 +#define CSR_MHPMCOUNTER10 0xb0a +#define CSR_MHPMCOUNTER11 0xb0b +#define CSR_MHPMCOUNTER12 0xb0c +#define CSR_MHPMCOUNTER13 0xb0d +#define CSR_MHPMCOUNTER14 0xb0e +#define CSR_MHPMCOUNTER15 0xb0f +#define CSR_MHPMCOUNTER16 0xb10 +#define CSR_MHPMCOUNTER17 0xb11 +#define CSR_MHPMCOUNTER18 0xb12 +#define CSR_MHPMCOUNTER19 0xb13 +#define CSR_MHPMCOUNTER20 0xb14 +#define CSR_MHPMCOUNTER21 0xb15 +#define CSR_MHPMCOUNTER22 0xb16 +#define CSR_MHPMCOUNTER23 0xb17 +#define CSR_MHPMCOUNTER24 0xb18 +#define CSR_MHPMCOUNTER25 0xb19 +#define CSR_MHPMCOUNTER26 0xb1a +#define CSR_MHPMCOUNTER27 0xb1b +#define CSR_MHPMCOUNTER28 0xb1c +#define CSR_MHPMCOUNTER29 0xb1d +#define CSR_MHPMCOUNTER30 0xb1e +#define CSR_MHPMCOUNTER31 0xb1f +#define CSR_MHPMEVENT3 0x323 +#define CSR_MHPMEVENT4 0x324 +#define CSR_MHPMEVENT5 0x325 +#define CSR_MHPMEVENT6 0x326 +#define CSR_MHPMEVENT7 0x327 +#define CSR_MHPMEVENT8 0x328 +#define CSR_MHPMEVENT9 0x329 +#define CSR_MHPMEVENT10 0x32a +#define CSR_MHPMEVENT11 0x32b +#define CSR_MHPMEVENT12 0x32c +#define CSR_MHPMEVENT13 0x32d +#define CSR_MHPMEVENT14 0x32e +#define CSR_MHPMEVENT15 0x32f +#define CSR_MHPMEVENT16 0x330 +#define CSR_MHPMEVENT17 0x331 +#define CSR_MHPMEVENT18 0x332 +#define CSR_MHPMEVENT19 0x333 +#define CSR_MHPMEVENT20 0x334 +#define CSR_MHPMEVENT21 0x335 +#define CSR_MHPMEVENT22 0x336 +#define CSR_MHPMEVENT23 0x337 +#define CSR_MHPMEVENT24 0x338 +#define CSR_MHPMEVENT25 0x339 +#define CSR_MHPMEVENT26 0x33a +#define CSR_MHPMEVENT27 0x33b +#define CSR_MHPMEVENT28 0x33c +#define CSR_MHPMEVENT29 0x33d +#define CSR_MHPMEVENT30 0x33e +#define CSR_MHPMEVENT31 0x33f +#define CSR_MVENDORID 0xf11 +#define CSR_MARCHID 0xf12 +#define CSR_MIMPID 0xf13 +#define CSR_MHARTID 0xf14 +#define CSR_CYCLEH 0xc80 +#define CSR_TIMEH 0xc81 +#define CSR_INSTRETH 0xc82 +#define CSR_HPMCOUNTER3H 0xc83 +#define CSR_HPMCOUNTER4H 0xc84 +#define CSR_HPMCOUNTER5H 0xc85 +#define CSR_HPMCOUNTER6H 0xc86 +#define CSR_HPMCOUNTER7H 0xc87 +#define CSR_HPMCOUNTER8H 0xc88 +#define CSR_HPMCOUNTER9H 0xc89 +#define CSR_HPMCOUNTER10H 0xc8a +#define CSR_HPMCOUNTER11H 0xc8b +#define CSR_HPMCOUNTER12H 0xc8c +#define CSR_HPMCOUNTER13H 0xc8d +#define CSR_HPMCOUNTER14H 0xc8e +#define CSR_HPMCOUNTER15H 0xc8f +#define CSR_HPMCOUNTER16H 0xc90 +#define CSR_HPMCOUNTER17H 0xc91 +#define CSR_HPMCOUNTER18H 0xc92 +#define CSR_HPMCOUNTER19H 0xc93 +#define CSR_HPMCOUNTER20H 0xc94 +#define CSR_HPMCOUNTER21H 0xc95 +#define CSR_HPMCOUNTER22H 0xc96 +#define CSR_HPMCOUNTER23H 0xc97 +#define CSR_HPMCOUNTER24H 0xc98 +#define CSR_HPMCOUNTER25H 0xc99 +#define CSR_HPMCOUNTER26H 0xc9a +#define CSR_HPMCOUNTER27H 0xc9b +#define CSR_HPMCOUNTER28H 0xc9c +#define CSR_HPMCOUNTER29H 0xc9d +#define CSR_HPMCOUNTER30H 0xc9e +#define CSR_HPMCOUNTER31H 0xc9f +#define CSR_MCYCLEH 0xb80 +#define CSR_MINSTRETH 0xb82 +#define CSR_MHPMCOUNTER3H 0xb83 +#define CSR_MHPMCOUNTER4H 0xb84 +#define CSR_MHPMCOUNTER5H 0xb85 +#define CSR_MHPMCOUNTER6H 0xb86 +#define CSR_MHPMCOUNTER7H 0xb87 +#define CSR_MHPMCOUNTER8H 0xb88 +#define CSR_MHPMCOUNTER9H 0xb89 +#define CSR_MHPMCOUNTER10H 0xb8a +#define CSR_MHPMCOUNTER11H 0xb8b +#define CSR_MHPMCOUNTER12H 0xb8c +#define CSR_MHPMCOUNTER13H 0xb8d +#define CSR_MHPMCOUNTER14H 0xb8e +#define CSR_MHPMCOUNTER15H 0xb8f +#define CSR_MHPMCOUNTER16H 0xb90 +#define CSR_MHPMCOUNTER17H 0xb91 +#define CSR_MHPMCOUNTER18H 0xb92 +#define CSR_MHPMCOUNTER19H 0xb93 +#define CSR_MHPMCOUNTER20H 0xb94 +#define CSR_MHPMCOUNTER21H 0xb95 +#define CSR_MHPMCOUNTER22H 0xb96 +#define CSR_MHPMCOUNTER23H 0xb97 +#define CSR_MHPMCOUNTER24H 0xb98 +#define CSR_MHPMCOUNTER25H 0xb99 +#define CSR_MHPMCOUNTER26H 0xb9a +#define CSR_MHPMCOUNTER27H 0xb9b +#define CSR_MHPMCOUNTER28H 0xb9c +#define CSR_MHPMCOUNTER29H 0xb9d +#define CSR_MHPMCOUNTER30H 0xb9e +#define CSR_MHPMCOUNTER31H 0xb9f +#define CAUSE_MISALIGNED_FETCH 0x0 +#define CAUSE_FETCH_ACCESS 0x1 +#define CAUSE_ILLEGAL_INSTRUCTION 0x2 +#define CAUSE_BREAKPOINT 0x3 +#define CAUSE_MISALIGNED_LOAD 0x4 +#define CAUSE_LOAD_ACCESS 0x5 +#define CAUSE_MISALIGNED_STORE 0x6 +#define CAUSE_STORE_ACCESS 0x7 +#define CAUSE_USER_ECALL 0x8 +#define CAUSE_SUPERVISOR_ECALL 0x9 +#define CAUSE_HYPERVISOR_ECALL 0xa +#define CAUSE_MACHINE_ECALL 0xb +#define CAUSE_FETCH_PAGE_FAULT 0xc +#define CAUSE_LOAD_PAGE_FAULT 0xd +#define CAUSE_STORE_PAGE_FAULT 0xf +#endif +#ifdef DECLARE_INSN +DECLARE_INSN(beq, MATCH_BEQ, MASK_BEQ) +DECLARE_INSN(bne, MATCH_BNE, MASK_BNE) +DECLARE_INSN(blt, MATCH_BLT, MASK_BLT) +DECLARE_INSN(bge, MATCH_BGE, MASK_BGE) +DECLARE_INSN(bltu, MATCH_BLTU, MASK_BLTU) +DECLARE_INSN(bgeu, MATCH_BGEU, MASK_BGEU) +DECLARE_INSN(jalr, MATCH_JALR, MASK_JALR) +DECLARE_INSN(jal, MATCH_JAL, MASK_JAL) +DECLARE_INSN(lui, MATCH_LUI, MASK_LUI) +DECLARE_INSN(auipc, MATCH_AUIPC, MASK_AUIPC) +DECLARE_INSN(addi, MATCH_ADDI, MASK_ADDI) +DECLARE_INSN(slli, MATCH_SLLI, MASK_SLLI) +DECLARE_INSN(slti, MATCH_SLTI, MASK_SLTI) +DECLARE_INSN(sltiu, MATCH_SLTIU, MASK_SLTIU) +DECLARE_INSN(xori, MATCH_XORI, MASK_XORI) +DECLARE_INSN(srli, MATCH_SRLI, MASK_SRLI) +DECLARE_INSN(srai, MATCH_SRAI, MASK_SRAI) +DECLARE_INSN(ori, MATCH_ORI, MASK_ORI) +DECLARE_INSN(andi, MATCH_ANDI, MASK_ANDI) +DECLARE_INSN(add, MATCH_ADD, MASK_ADD) +DECLARE_INSN(sub, MATCH_SUB, MASK_SUB) +DECLARE_INSN(sll, MATCH_SLL, MASK_SLL) +DECLARE_INSN(slt, MATCH_SLT, MASK_SLT) +DECLARE_INSN(sltu, MATCH_SLTU, MASK_SLTU) +DECLARE_INSN(xor, MATCH_XOR, MASK_XOR) +DECLARE_INSN(srl, MATCH_SRL, MASK_SRL) +DECLARE_INSN(sra, MATCH_SRA, MASK_SRA) +DECLARE_INSN(or, MATCH_OR, MASK_OR) +DECLARE_INSN(and, MATCH_AND, MASK_AND) +DECLARE_INSN(addiw, MATCH_ADDIW, MASK_ADDIW) +DECLARE_INSN(slliw, MATCH_SLLIW, MASK_SLLIW) +DECLARE_INSN(srliw, MATCH_SRLIW, MASK_SRLIW) +DECLARE_INSN(sraiw, MATCH_SRAIW, MASK_SRAIW) +DECLARE_INSN(addw, MATCH_ADDW, MASK_ADDW) +DECLARE_INSN(subw, MATCH_SUBW, MASK_SUBW) +DECLARE_INSN(sllw, MATCH_SLLW, MASK_SLLW) +DECLARE_INSN(srlw, MATCH_SRLW, MASK_SRLW) +DECLARE_INSN(sraw, MATCH_SRAW, MASK_SRAW) +DECLARE_INSN(lb, MATCH_LB, MASK_LB) +DECLARE_INSN(lh, MATCH_LH, MASK_LH) +DECLARE_INSN(lw, MATCH_LW, MASK_LW) +DECLARE_INSN(ld, MATCH_LD, MASK_LD) +DECLARE_INSN(lbu, MATCH_LBU, MASK_LBU) +DECLARE_INSN(lhu, MATCH_LHU, MASK_LHU) +DECLARE_INSN(lwu, MATCH_LWU, MASK_LWU) +DECLARE_INSN(sb, MATCH_SB, MASK_SB) +DECLARE_INSN(sh, MATCH_SH, MASK_SH) +DECLARE_INSN(sw, MATCH_SW, MASK_SW) +DECLARE_INSN(sd, MATCH_SD, MASK_SD) +DECLARE_INSN(fence, MATCH_FENCE, MASK_FENCE) +DECLARE_INSN(fence_i, MATCH_FENCE_I, MASK_FENCE_I) +DECLARE_INSN(mul, MATCH_MUL, MASK_MUL) +DECLARE_INSN(mulh, MATCH_MULH, MASK_MULH) +DECLARE_INSN(mulhsu, MATCH_MULHSU, MASK_MULHSU) +DECLARE_INSN(mulhu, MATCH_MULHU, MASK_MULHU) +DECLARE_INSN(div, MATCH_DIV, MASK_DIV) +DECLARE_INSN(divu, MATCH_DIVU, MASK_DIVU) +DECLARE_INSN(rem, MATCH_REM, MASK_REM) +DECLARE_INSN(remu, MATCH_REMU, MASK_REMU) +DECLARE_INSN(mulw, MATCH_MULW, MASK_MULW) +DECLARE_INSN(divw, MATCH_DIVW, MASK_DIVW) +DECLARE_INSN(divuw, MATCH_DIVUW, MASK_DIVUW) +DECLARE_INSN(remw, MATCH_REMW, MASK_REMW) +DECLARE_INSN(remuw, MATCH_REMUW, MASK_REMUW) +DECLARE_INSN(amoadd_w, MATCH_AMOADD_W, MASK_AMOADD_W) +DECLARE_INSN(amoxor_w, MATCH_AMOXOR_W, MASK_AMOXOR_W) +DECLARE_INSN(amoor_w, MATCH_AMOOR_W, MASK_AMOOR_W) +DECLARE_INSN(amoand_w, MATCH_AMOAND_W, MASK_AMOAND_W) +DECLARE_INSN(amomin_w, MATCH_AMOMIN_W, MASK_AMOMIN_W) +DECLARE_INSN(amomax_w, MATCH_AMOMAX_W, MASK_AMOMAX_W) +DECLARE_INSN(amominu_w, MATCH_AMOMINU_W, MASK_AMOMINU_W) +DECLARE_INSN(amomaxu_w, MATCH_AMOMAXU_W, MASK_AMOMAXU_W) +DECLARE_INSN(amoswap_w, MATCH_AMOSWAP_W, MASK_AMOSWAP_W) +DECLARE_INSN(lr_w, MATCH_LR_W, MASK_LR_W) +DECLARE_INSN(sc_w, MATCH_SC_W, MASK_SC_W) +DECLARE_INSN(amoadd_d, MATCH_AMOADD_D, MASK_AMOADD_D) +DECLARE_INSN(amoxor_d, MATCH_AMOXOR_D, MASK_AMOXOR_D) +DECLARE_INSN(amoor_d, MATCH_AMOOR_D, MASK_AMOOR_D) +DECLARE_INSN(amoand_d, MATCH_AMOAND_D, MASK_AMOAND_D) +DECLARE_INSN(amomin_d, MATCH_AMOMIN_D, MASK_AMOMIN_D) +DECLARE_INSN(amomax_d, MATCH_AMOMAX_D, MASK_AMOMAX_D) +DECLARE_INSN(amominu_d, MATCH_AMOMINU_D, MASK_AMOMINU_D) +DECLARE_INSN(amomaxu_d, MATCH_AMOMAXU_D, MASK_AMOMAXU_D) +DECLARE_INSN(amoswap_d, MATCH_AMOSWAP_D, MASK_AMOSWAP_D) +DECLARE_INSN(lr_d, MATCH_LR_D, MASK_LR_D) +DECLARE_INSN(sc_d, MATCH_SC_D, MASK_SC_D) +DECLARE_INSN(ecall, MATCH_ECALL, MASK_ECALL) +DECLARE_INSN(ebreak, MATCH_EBREAK, MASK_EBREAK) +DECLARE_INSN(uret, MATCH_URET, MASK_URET) +DECLARE_INSN(sret, MATCH_SRET, MASK_SRET) +DECLARE_INSN(mret, MATCH_MRET, MASK_MRET) +DECLARE_INSN(dret, MATCH_DRET, MASK_DRET) +DECLARE_INSN(sfence_vma, MATCH_SFENCE_VMA, MASK_SFENCE_VMA) +DECLARE_INSN(wfi, MATCH_WFI, MASK_WFI) +DECLARE_INSN(csrrw, MATCH_CSRRW, MASK_CSRRW) +DECLARE_INSN(csrrs, MATCH_CSRRS, MASK_CSRRS) +DECLARE_INSN(csrrc, MATCH_CSRRC, MASK_CSRRC) +DECLARE_INSN(csrrwi, MATCH_CSRRWI, MASK_CSRRWI) +DECLARE_INSN(csrrsi, MATCH_CSRRSI, MASK_CSRRSI) +DECLARE_INSN(csrrci, MATCH_CSRRCI, MASK_CSRRCI) +DECLARE_INSN(fadd_s, MATCH_FADD_S, MASK_FADD_S) +DECLARE_INSN(fsub_s, MATCH_FSUB_S, MASK_FSUB_S) +DECLARE_INSN(fmul_s, MATCH_FMUL_S, MASK_FMUL_S) +DECLARE_INSN(fdiv_s, MATCH_FDIV_S, MASK_FDIV_S) +DECLARE_INSN(fsgnj_s, MATCH_FSGNJ_S, MASK_FSGNJ_S) +DECLARE_INSN(fsgnjn_s, MATCH_FSGNJN_S, MASK_FSGNJN_S) +DECLARE_INSN(fsgnjx_s, MATCH_FSGNJX_S, MASK_FSGNJX_S) +DECLARE_INSN(fmin_s, MATCH_FMIN_S, MASK_FMIN_S) +DECLARE_INSN(fmax_s, MATCH_FMAX_S, MASK_FMAX_S) +DECLARE_INSN(fsqrt_s, MATCH_FSQRT_S, MASK_FSQRT_S) +DECLARE_INSN(fadd_d, MATCH_FADD_D, MASK_FADD_D) +DECLARE_INSN(fsub_d, MATCH_FSUB_D, MASK_FSUB_D) +DECLARE_INSN(fmul_d, MATCH_FMUL_D, MASK_FMUL_D) +DECLARE_INSN(fdiv_d, MATCH_FDIV_D, MASK_FDIV_D) +DECLARE_INSN(fsgnj_d, MATCH_FSGNJ_D, MASK_FSGNJ_D) +DECLARE_INSN(fsgnjn_d, MATCH_FSGNJN_D, MASK_FSGNJN_D) +DECLARE_INSN(fsgnjx_d, MATCH_FSGNJX_D, MASK_FSGNJX_D) +DECLARE_INSN(fmin_d, MATCH_FMIN_D, MASK_FMIN_D) +DECLARE_INSN(fmax_d, MATCH_FMAX_D, MASK_FMAX_D) +DECLARE_INSN(fcvt_s_d, MATCH_FCVT_S_D, MASK_FCVT_S_D) +DECLARE_INSN(fcvt_d_s, MATCH_FCVT_D_S, MASK_FCVT_D_S) +DECLARE_INSN(fsqrt_d, MATCH_FSQRT_D, MASK_FSQRT_D) +DECLARE_INSN(fadd_q, MATCH_FADD_Q, MASK_FADD_Q) +DECLARE_INSN(fsub_q, MATCH_FSUB_Q, MASK_FSUB_Q) +DECLARE_INSN(fmul_q, MATCH_FMUL_Q, MASK_FMUL_Q) +DECLARE_INSN(fdiv_q, MATCH_FDIV_Q, MASK_FDIV_Q) +DECLARE_INSN(fsgnj_q, MATCH_FSGNJ_Q, MASK_FSGNJ_Q) +DECLARE_INSN(fsgnjn_q, MATCH_FSGNJN_Q, MASK_FSGNJN_Q) +DECLARE_INSN(fsgnjx_q, MATCH_FSGNJX_Q, MASK_FSGNJX_Q) +DECLARE_INSN(fmin_q, MATCH_FMIN_Q, MASK_FMIN_Q) +DECLARE_INSN(fmax_q, MATCH_FMAX_Q, MASK_FMAX_Q) +DECLARE_INSN(fcvt_s_q, MATCH_FCVT_S_Q, MASK_FCVT_S_Q) +DECLARE_INSN(fcvt_q_s, MATCH_FCVT_Q_S, MASK_FCVT_Q_S) +DECLARE_INSN(fcvt_d_q, MATCH_FCVT_D_Q, MASK_FCVT_D_Q) +DECLARE_INSN(fcvt_q_d, MATCH_FCVT_Q_D, MASK_FCVT_Q_D) +DECLARE_INSN(fsqrt_q, MATCH_FSQRT_Q, MASK_FSQRT_Q) +DECLARE_INSN(fle_s, MATCH_FLE_S, MASK_FLE_S) +DECLARE_INSN(flt_s, MATCH_FLT_S, MASK_FLT_S) +DECLARE_INSN(feq_s, MATCH_FEQ_S, MASK_FEQ_S) +DECLARE_INSN(fle_d, MATCH_FLE_D, MASK_FLE_D) +DECLARE_INSN(flt_d, MATCH_FLT_D, MASK_FLT_D) +DECLARE_INSN(feq_d, MATCH_FEQ_D, MASK_FEQ_D) +DECLARE_INSN(fle_q, MATCH_FLE_Q, MASK_FLE_Q) +DECLARE_INSN(flt_q, MATCH_FLT_Q, MASK_FLT_Q) +DECLARE_INSN(feq_q, MATCH_FEQ_Q, MASK_FEQ_Q) +DECLARE_INSN(fcvt_w_s, MATCH_FCVT_W_S, MASK_FCVT_W_S) +DECLARE_INSN(fcvt_wu_s, MATCH_FCVT_WU_S, MASK_FCVT_WU_S) +DECLARE_INSN(fcvt_l_s, MATCH_FCVT_L_S, MASK_FCVT_L_S) +DECLARE_INSN(fcvt_lu_s, MATCH_FCVT_LU_S, MASK_FCVT_LU_S) +DECLARE_INSN(fmv_x_w, MATCH_FMV_X_W, MASK_FMV_X_W) +DECLARE_INSN(fclass_s, MATCH_FCLASS_S, MASK_FCLASS_S) +DECLARE_INSN(fcvt_w_d, MATCH_FCVT_W_D, MASK_FCVT_W_D) +DECLARE_INSN(fcvt_wu_d, MATCH_FCVT_WU_D, MASK_FCVT_WU_D) +DECLARE_INSN(fcvt_l_d, MATCH_FCVT_L_D, MASK_FCVT_L_D) +DECLARE_INSN(fcvt_lu_d, MATCH_FCVT_LU_D, MASK_FCVT_LU_D) +DECLARE_INSN(fmv_x_d, MATCH_FMV_X_D, MASK_FMV_X_D) +DECLARE_INSN(fclass_d, MATCH_FCLASS_D, MASK_FCLASS_D) +DECLARE_INSN(fcvt_w_q, MATCH_FCVT_W_Q, MASK_FCVT_W_Q) +DECLARE_INSN(fcvt_wu_q, MATCH_FCVT_WU_Q, MASK_FCVT_WU_Q) +DECLARE_INSN(fcvt_l_q, MATCH_FCVT_L_Q, MASK_FCVT_L_Q) +DECLARE_INSN(fcvt_lu_q, MATCH_FCVT_LU_Q, MASK_FCVT_LU_Q) +DECLARE_INSN(fmv_x_q, MATCH_FMV_X_Q, MASK_FMV_X_Q) +DECLARE_INSN(fclass_q, MATCH_FCLASS_Q, MASK_FCLASS_Q) +DECLARE_INSN(fcvt_s_w, MATCH_FCVT_S_W, MASK_FCVT_S_W) +DECLARE_INSN(fcvt_s_wu, MATCH_FCVT_S_WU, MASK_FCVT_S_WU) +DECLARE_INSN(fcvt_s_l, MATCH_FCVT_S_L, MASK_FCVT_S_L) +DECLARE_INSN(fcvt_s_lu, MATCH_FCVT_S_LU, MASK_FCVT_S_LU) +DECLARE_INSN(fmv_w_x, MATCH_FMV_W_X, MASK_FMV_W_X) +DECLARE_INSN(fcvt_d_w, MATCH_FCVT_D_W, MASK_FCVT_D_W) +DECLARE_INSN(fcvt_d_wu, MATCH_FCVT_D_WU, MASK_FCVT_D_WU) +DECLARE_INSN(fcvt_d_l, MATCH_FCVT_D_L, MASK_FCVT_D_L) +DECLARE_INSN(fcvt_d_lu, MATCH_FCVT_D_LU, MASK_FCVT_D_LU) +DECLARE_INSN(fmv_d_x, MATCH_FMV_D_X, MASK_FMV_D_X) +DECLARE_INSN(fcvt_q_w, MATCH_FCVT_Q_W, MASK_FCVT_Q_W) +DECLARE_INSN(fcvt_q_wu, MATCH_FCVT_Q_WU, MASK_FCVT_Q_WU) +DECLARE_INSN(fcvt_q_l, MATCH_FCVT_Q_L, MASK_FCVT_Q_L) +DECLARE_INSN(fcvt_q_lu, MATCH_FCVT_Q_LU, MASK_FCVT_Q_LU) +DECLARE_INSN(fmv_q_x, MATCH_FMV_Q_X, MASK_FMV_Q_X) +DECLARE_INSN(flw, MATCH_FLW, MASK_FLW) +DECLARE_INSN(fld, MATCH_FLD, MASK_FLD) +DECLARE_INSN(flq, MATCH_FLQ, MASK_FLQ) +DECLARE_INSN(fsw, MATCH_FSW, MASK_FSW) +DECLARE_INSN(fsd, MATCH_FSD, MASK_FSD) +DECLARE_INSN(fsq, MATCH_FSQ, MASK_FSQ) +DECLARE_INSN(fmadd_s, MATCH_FMADD_S, MASK_FMADD_S) +DECLARE_INSN(fmsub_s, MATCH_FMSUB_S, MASK_FMSUB_S) +DECLARE_INSN(fnmsub_s, MATCH_FNMSUB_S, MASK_FNMSUB_S) +DECLARE_INSN(fnmadd_s, MATCH_FNMADD_S, MASK_FNMADD_S) +DECLARE_INSN(fmadd_d, MATCH_FMADD_D, MASK_FMADD_D) +DECLARE_INSN(fmsub_d, MATCH_FMSUB_D, MASK_FMSUB_D) +DECLARE_INSN(fnmsub_d, MATCH_FNMSUB_D, MASK_FNMSUB_D) +DECLARE_INSN(fnmadd_d, MATCH_FNMADD_D, MASK_FNMADD_D) +DECLARE_INSN(fmadd_q, MATCH_FMADD_Q, MASK_FMADD_Q) +DECLARE_INSN(fmsub_q, MATCH_FMSUB_Q, MASK_FMSUB_Q) +DECLARE_INSN(fnmsub_q, MATCH_FNMSUB_Q, MASK_FNMSUB_Q) +DECLARE_INSN(fnmadd_q, MATCH_FNMADD_Q, MASK_FNMADD_Q) +DECLARE_INSN(c_nop, MATCH_C_NOP, MASK_C_NOP) +DECLARE_INSN(c_addi16sp, MATCH_C_ADDI16SP, MASK_C_ADDI16SP) +DECLARE_INSN(c_jr, MATCH_C_JR, MASK_C_JR) +DECLARE_INSN(c_jalr, MATCH_C_JALR, MASK_C_JALR) +DECLARE_INSN(c_ebreak, MATCH_C_EBREAK, MASK_C_EBREAK) +DECLARE_INSN(c_ld, MATCH_C_LD, MASK_C_LD) +DECLARE_INSN(c_sd, MATCH_C_SD, MASK_C_SD) +DECLARE_INSN(c_addiw, MATCH_C_ADDIW, MASK_C_ADDIW) +DECLARE_INSN(c_ldsp, MATCH_C_LDSP, MASK_C_LDSP) +DECLARE_INSN(c_sdsp, MATCH_C_SDSP, MASK_C_SDSP) +DECLARE_INSN(c_addi4spn, MATCH_C_ADDI4SPN, MASK_C_ADDI4SPN) +DECLARE_INSN(c_fld, MATCH_C_FLD, MASK_C_FLD) +DECLARE_INSN(c_lw, MATCH_C_LW, MASK_C_LW) +DECLARE_INSN(c_flw, MATCH_C_FLW, MASK_C_FLW) +DECLARE_INSN(c_fsd, MATCH_C_FSD, MASK_C_FSD) +DECLARE_INSN(c_sw, MATCH_C_SW, MASK_C_SW) +DECLARE_INSN(c_fsw, MATCH_C_FSW, MASK_C_FSW) +DECLARE_INSN(c_addi, MATCH_C_ADDI, MASK_C_ADDI) +DECLARE_INSN(c_jal, MATCH_C_JAL, MASK_C_JAL) +DECLARE_INSN(c_li, MATCH_C_LI, MASK_C_LI) +DECLARE_INSN(c_lui, MATCH_C_LUI, MASK_C_LUI) +DECLARE_INSN(c_srli, MATCH_C_SRLI, MASK_C_SRLI) +DECLARE_INSN(c_srai, MATCH_C_SRAI, MASK_C_SRAI) +DECLARE_INSN(c_andi, MATCH_C_ANDI, MASK_C_ANDI) +DECLARE_INSN(c_sub, MATCH_C_SUB, MASK_C_SUB) +DECLARE_INSN(c_xor, MATCH_C_XOR, MASK_C_XOR) +DECLARE_INSN(c_or, MATCH_C_OR, MASK_C_OR) +DECLARE_INSN(c_and, MATCH_C_AND, MASK_C_AND) +DECLARE_INSN(c_subw, MATCH_C_SUBW, MASK_C_SUBW) +DECLARE_INSN(c_addw, MATCH_C_ADDW, MASK_C_ADDW) +DECLARE_INSN(c_j, MATCH_C_J, MASK_C_J) +DECLARE_INSN(c_beqz, MATCH_C_BEQZ, MASK_C_BEQZ) +DECLARE_INSN(c_bnez, MATCH_C_BNEZ, MASK_C_BNEZ) +DECLARE_INSN(c_slli, MATCH_C_SLLI, MASK_C_SLLI) +DECLARE_INSN(c_fldsp, MATCH_C_FLDSP, MASK_C_FLDSP) +DECLARE_INSN(c_lwsp, MATCH_C_LWSP, MASK_C_LWSP) +DECLARE_INSN(c_flwsp, MATCH_C_FLWSP, MASK_C_FLWSP) +DECLARE_INSN(c_mv, MATCH_C_MV, MASK_C_MV) +DECLARE_INSN(c_add, MATCH_C_ADD, MASK_C_ADD) +DECLARE_INSN(c_fsdsp, MATCH_C_FSDSP, MASK_C_FSDSP) +DECLARE_INSN(c_swsp, MATCH_C_SWSP, MASK_C_SWSP) +DECLARE_INSN(c_fswsp, MATCH_C_FSWSP, MASK_C_FSWSP) +DECLARE_INSN(custom0, MATCH_CUSTOM0, MASK_CUSTOM0) +DECLARE_INSN(custom0_rs1, MATCH_CUSTOM0_RS1, MASK_CUSTOM0_RS1) +DECLARE_INSN(custom0_rs1_rs2, MATCH_CUSTOM0_RS1_RS2, MASK_CUSTOM0_RS1_RS2) +DECLARE_INSN(custom0_rd, MATCH_CUSTOM0_RD, MASK_CUSTOM0_RD) +DECLARE_INSN(custom0_rd_rs1, MATCH_CUSTOM0_RD_RS1, MASK_CUSTOM0_RD_RS1) +DECLARE_INSN(custom0_rd_rs1_rs2, MATCH_CUSTOM0_RD_RS1_RS2, MASK_CUSTOM0_RD_RS1_RS2) +DECLARE_INSN(custom1, MATCH_CUSTOM1, MASK_CUSTOM1) +DECLARE_INSN(custom1_rs1, MATCH_CUSTOM1_RS1, MASK_CUSTOM1_RS1) +DECLARE_INSN(custom1_rs1_rs2, MATCH_CUSTOM1_RS1_RS2, MASK_CUSTOM1_RS1_RS2) +DECLARE_INSN(custom1_rd, MATCH_CUSTOM1_RD, MASK_CUSTOM1_RD) +DECLARE_INSN(custom1_rd_rs1, MATCH_CUSTOM1_RD_RS1, MASK_CUSTOM1_RD_RS1) +DECLARE_INSN(custom1_rd_rs1_rs2, MATCH_CUSTOM1_RD_RS1_RS2, MASK_CUSTOM1_RD_RS1_RS2) +DECLARE_INSN(custom2, MATCH_CUSTOM2, MASK_CUSTOM2) +DECLARE_INSN(custom2_rs1, MATCH_CUSTOM2_RS1, MASK_CUSTOM2_RS1) +DECLARE_INSN(custom2_rs1_rs2, MATCH_CUSTOM2_RS1_RS2, MASK_CUSTOM2_RS1_RS2) +DECLARE_INSN(custom2_rd, MATCH_CUSTOM2_RD, MASK_CUSTOM2_RD) +DECLARE_INSN(custom2_rd_rs1, MATCH_CUSTOM2_RD_RS1, MASK_CUSTOM2_RD_RS1) +DECLARE_INSN(custom2_rd_rs1_rs2, MATCH_CUSTOM2_RD_RS1_RS2, MASK_CUSTOM2_RD_RS1_RS2) +DECLARE_INSN(custom3, MATCH_CUSTOM3, MASK_CUSTOM3) +DECLARE_INSN(custom3_rs1, MATCH_CUSTOM3_RS1, MASK_CUSTOM3_RS1) +DECLARE_INSN(custom3_rs1_rs2, MATCH_CUSTOM3_RS1_RS2, MASK_CUSTOM3_RS1_RS2) +DECLARE_INSN(custom3_rd, MATCH_CUSTOM3_RD, MASK_CUSTOM3_RD) +DECLARE_INSN(custom3_rd_rs1, MATCH_CUSTOM3_RD_RS1, MASK_CUSTOM3_RD_RS1) +DECLARE_INSN(custom3_rd_rs1_rs2, MATCH_CUSTOM3_RD_RS1_RS2, MASK_CUSTOM3_RD_RS1_RS2) +#endif +#ifdef DECLARE_CSR +DECLARE_CSR(fflags, CSR_FFLAGS) +DECLARE_CSR(frm, CSR_FRM) +DECLARE_CSR(fcsr, CSR_FCSR) +DECLARE_CSR(cycle, CSR_CYCLE) +DECLARE_CSR(time, CSR_TIME) +DECLARE_CSR(instret, CSR_INSTRET) +DECLARE_CSR(hpmcounter3, CSR_HPMCOUNTER3) +DECLARE_CSR(hpmcounter4, CSR_HPMCOUNTER4) +DECLARE_CSR(hpmcounter5, CSR_HPMCOUNTER5) +DECLARE_CSR(hpmcounter6, CSR_HPMCOUNTER6) +DECLARE_CSR(hpmcounter7, CSR_HPMCOUNTER7) +DECLARE_CSR(hpmcounter8, CSR_HPMCOUNTER8) +DECLARE_CSR(hpmcounter9, CSR_HPMCOUNTER9) +DECLARE_CSR(hpmcounter10, CSR_HPMCOUNTER10) +DECLARE_CSR(hpmcounter11, CSR_HPMCOUNTER11) +DECLARE_CSR(hpmcounter12, CSR_HPMCOUNTER12) +DECLARE_CSR(hpmcounter13, CSR_HPMCOUNTER13) +DECLARE_CSR(hpmcounter14, CSR_HPMCOUNTER14) +DECLARE_CSR(hpmcounter15, CSR_HPMCOUNTER15) +DECLARE_CSR(hpmcounter16, CSR_HPMCOUNTER16) +DECLARE_CSR(hpmcounter17, CSR_HPMCOUNTER17) +DECLARE_CSR(hpmcounter18, CSR_HPMCOUNTER18) +DECLARE_CSR(hpmcounter19, CSR_HPMCOUNTER19) +DECLARE_CSR(hpmcounter20, CSR_HPMCOUNTER20) +DECLARE_CSR(hpmcounter21, CSR_HPMCOUNTER21) +DECLARE_CSR(hpmcounter22, CSR_HPMCOUNTER22) +DECLARE_CSR(hpmcounter23, CSR_HPMCOUNTER23) +DECLARE_CSR(hpmcounter24, CSR_HPMCOUNTER24) +DECLARE_CSR(hpmcounter25, CSR_HPMCOUNTER25) +DECLARE_CSR(hpmcounter26, CSR_HPMCOUNTER26) +DECLARE_CSR(hpmcounter27, CSR_HPMCOUNTER27) +DECLARE_CSR(hpmcounter28, CSR_HPMCOUNTER28) +DECLARE_CSR(hpmcounter29, CSR_HPMCOUNTER29) +DECLARE_CSR(hpmcounter30, CSR_HPMCOUNTER30) +DECLARE_CSR(hpmcounter31, CSR_HPMCOUNTER31) +DECLARE_CSR(sstatus, CSR_SSTATUS) +DECLARE_CSR(sie, CSR_SIE) +DECLARE_CSR(stvec, CSR_STVEC) +DECLARE_CSR(scounteren, CSR_SCOUNTEREN) +DECLARE_CSR(sscratch, CSR_SSCRATCH) +DECLARE_CSR(sepc, CSR_SEPC) +DECLARE_CSR(scause, CSR_SCAUSE) +DECLARE_CSR(stval, CSR_STVAL) +DECLARE_CSR(sip, CSR_SIP) +DECLARE_CSR(satp, CSR_SATP) +DECLARE_CSR(mstatus, CSR_MSTATUS) +DECLARE_CSR(misa, CSR_MISA) +DECLARE_CSR(medeleg, CSR_MEDELEG) +DECLARE_CSR(mideleg, CSR_MIDELEG) +DECLARE_CSR(mie, CSR_MIE) +DECLARE_CSR(mtvec, CSR_MTVEC) +DECLARE_CSR(mcounteren, CSR_MCOUNTEREN) +DECLARE_CSR(mscratch, CSR_MSCRATCH) +DECLARE_CSR(mepc, CSR_MEPC) +DECLARE_CSR(mcause, CSR_MCAUSE) +DECLARE_CSR(mtval, CSR_MTVAL) +DECLARE_CSR(mip, CSR_MIP) +DECLARE_CSR(pmpcfg0, CSR_PMPCFG0) +DECLARE_CSR(pmpcfg1, CSR_PMPCFG1) +DECLARE_CSR(pmpcfg2, CSR_PMPCFG2) +DECLARE_CSR(pmpcfg3, CSR_PMPCFG3) +DECLARE_CSR(pmpaddr0, CSR_PMPADDR0) +DECLARE_CSR(pmpaddr1, CSR_PMPADDR1) +DECLARE_CSR(pmpaddr2, CSR_PMPADDR2) +DECLARE_CSR(pmpaddr3, CSR_PMPADDR3) +DECLARE_CSR(pmpaddr4, CSR_PMPADDR4) +DECLARE_CSR(pmpaddr5, CSR_PMPADDR5) +DECLARE_CSR(pmpaddr6, CSR_PMPADDR6) +DECLARE_CSR(pmpaddr7, CSR_PMPADDR7) +DECLARE_CSR(pmpaddr8, CSR_PMPADDR8) +DECLARE_CSR(pmpaddr9, CSR_PMPADDR9) +DECLARE_CSR(pmpaddr10, CSR_PMPADDR10) +DECLARE_CSR(pmpaddr11, CSR_PMPADDR11) +DECLARE_CSR(pmpaddr12, CSR_PMPADDR12) +DECLARE_CSR(pmpaddr13, CSR_PMPADDR13) +DECLARE_CSR(pmpaddr14, CSR_PMPADDR14) +DECLARE_CSR(pmpaddr15, CSR_PMPADDR15) +DECLARE_CSR(tselect, CSR_TSELECT) +DECLARE_CSR(tdata1, CSR_TDATA1) +DECLARE_CSR(tdata2, CSR_TDATA2) +DECLARE_CSR(tdata3, CSR_TDATA3) +DECLARE_CSR(dcsr, CSR_DCSR) +DECLARE_CSR(dpc, CSR_DPC) +DECLARE_CSR(dscratch, CSR_DSCRATCH) +DECLARE_CSR(mcycle, CSR_MCYCLE) +DECLARE_CSR(minstret, CSR_MINSTRET) +DECLARE_CSR(mhpmcounter3, CSR_MHPMCOUNTER3) +DECLARE_CSR(mhpmcounter4, CSR_MHPMCOUNTER4) +DECLARE_CSR(mhpmcounter5, CSR_MHPMCOUNTER5) +DECLARE_CSR(mhpmcounter6, CSR_MHPMCOUNTER6) +DECLARE_CSR(mhpmcounter7, CSR_MHPMCOUNTER7) +DECLARE_CSR(mhpmcounter8, CSR_MHPMCOUNTER8) +DECLARE_CSR(mhpmcounter9, CSR_MHPMCOUNTER9) +DECLARE_CSR(mhpmcounter10, CSR_MHPMCOUNTER10) +DECLARE_CSR(mhpmcounter11, CSR_MHPMCOUNTER11) +DECLARE_CSR(mhpmcounter12, CSR_MHPMCOUNTER12) +DECLARE_CSR(mhpmcounter13, CSR_MHPMCOUNTER13) +DECLARE_CSR(mhpmcounter14, CSR_MHPMCOUNTER14) +DECLARE_CSR(mhpmcounter15, CSR_MHPMCOUNTER15) +DECLARE_CSR(mhpmcounter16, CSR_MHPMCOUNTER16) +DECLARE_CSR(mhpmcounter17, CSR_MHPMCOUNTER17) +DECLARE_CSR(mhpmcounter18, CSR_MHPMCOUNTER18) +DECLARE_CSR(mhpmcounter19, CSR_MHPMCOUNTER19) +DECLARE_CSR(mhpmcounter20, CSR_MHPMCOUNTER20) +DECLARE_CSR(mhpmcounter21, CSR_MHPMCOUNTER21) +DECLARE_CSR(mhpmcounter22, CSR_MHPMCOUNTER22) +DECLARE_CSR(mhpmcounter23, CSR_MHPMCOUNTER23) +DECLARE_CSR(mhpmcounter24, CSR_MHPMCOUNTER24) +DECLARE_CSR(mhpmcounter25, CSR_MHPMCOUNTER25) +DECLARE_CSR(mhpmcounter26, CSR_MHPMCOUNTER26) +DECLARE_CSR(mhpmcounter27, CSR_MHPMCOUNTER27) +DECLARE_CSR(mhpmcounter28, CSR_MHPMCOUNTER28) +DECLARE_CSR(mhpmcounter29, CSR_MHPMCOUNTER29) +DECLARE_CSR(mhpmcounter30, CSR_MHPMCOUNTER30) +DECLARE_CSR(mhpmcounter31, CSR_MHPMCOUNTER31) +DECLARE_CSR(mhpmevent3, CSR_MHPMEVENT3) +DECLARE_CSR(mhpmevent4, CSR_MHPMEVENT4) +DECLARE_CSR(mhpmevent5, CSR_MHPMEVENT5) +DECLARE_CSR(mhpmevent6, CSR_MHPMEVENT6) +DECLARE_CSR(mhpmevent7, CSR_MHPMEVENT7) +DECLARE_CSR(mhpmevent8, CSR_MHPMEVENT8) +DECLARE_CSR(mhpmevent9, CSR_MHPMEVENT9) +DECLARE_CSR(mhpmevent10, CSR_MHPMEVENT10) +DECLARE_CSR(mhpmevent11, CSR_MHPMEVENT11) +DECLARE_CSR(mhpmevent12, CSR_MHPMEVENT12) +DECLARE_CSR(mhpmevent13, CSR_MHPMEVENT13) +DECLARE_CSR(mhpmevent14, CSR_MHPMEVENT14) +DECLARE_CSR(mhpmevent15, CSR_MHPMEVENT15) +DECLARE_CSR(mhpmevent16, CSR_MHPMEVENT16) +DECLARE_CSR(mhpmevent17, CSR_MHPMEVENT17) +DECLARE_CSR(mhpmevent18, CSR_MHPMEVENT18) +DECLARE_CSR(mhpmevent19, CSR_MHPMEVENT19) +DECLARE_CSR(mhpmevent20, CSR_MHPMEVENT20) +DECLARE_CSR(mhpmevent21, CSR_MHPMEVENT21) +DECLARE_CSR(mhpmevent22, CSR_MHPMEVENT22) +DECLARE_CSR(mhpmevent23, CSR_MHPMEVENT23) +DECLARE_CSR(mhpmevent24, CSR_MHPMEVENT24) +DECLARE_CSR(mhpmevent25, CSR_MHPMEVENT25) +DECLARE_CSR(mhpmevent26, CSR_MHPMEVENT26) +DECLARE_CSR(mhpmevent27, CSR_MHPMEVENT27) +DECLARE_CSR(mhpmevent28, CSR_MHPMEVENT28) +DECLARE_CSR(mhpmevent29, CSR_MHPMEVENT29) +DECLARE_CSR(mhpmevent30, CSR_MHPMEVENT30) +DECLARE_CSR(mhpmevent31, CSR_MHPMEVENT31) +DECLARE_CSR(mvendorid, CSR_MVENDORID) +DECLARE_CSR(marchid, CSR_MARCHID) +DECLARE_CSR(mimpid, CSR_MIMPID) +DECLARE_CSR(mhartid, CSR_MHARTID) +DECLARE_CSR(cycleh, CSR_CYCLEH) +DECLARE_CSR(timeh, CSR_TIMEH) +DECLARE_CSR(instreth, CSR_INSTRETH) +DECLARE_CSR(hpmcounter3h, CSR_HPMCOUNTER3H) +DECLARE_CSR(hpmcounter4h, CSR_HPMCOUNTER4H) +DECLARE_CSR(hpmcounter5h, CSR_HPMCOUNTER5H) +DECLARE_CSR(hpmcounter6h, CSR_HPMCOUNTER6H) +DECLARE_CSR(hpmcounter7h, CSR_HPMCOUNTER7H) +DECLARE_CSR(hpmcounter8h, CSR_HPMCOUNTER8H) +DECLARE_CSR(hpmcounter9h, CSR_HPMCOUNTER9H) +DECLARE_CSR(hpmcounter10h, CSR_HPMCOUNTER10H) +DECLARE_CSR(hpmcounter11h, CSR_HPMCOUNTER11H) +DECLARE_CSR(hpmcounter12h, CSR_HPMCOUNTER12H) +DECLARE_CSR(hpmcounter13h, CSR_HPMCOUNTER13H) +DECLARE_CSR(hpmcounter14h, CSR_HPMCOUNTER14H) +DECLARE_CSR(hpmcounter15h, CSR_HPMCOUNTER15H) +DECLARE_CSR(hpmcounter16h, CSR_HPMCOUNTER16H) +DECLARE_CSR(hpmcounter17h, CSR_HPMCOUNTER17H) +DECLARE_CSR(hpmcounter18h, CSR_HPMCOUNTER18H) +DECLARE_CSR(hpmcounter19h, CSR_HPMCOUNTER19H) +DECLARE_CSR(hpmcounter20h, CSR_HPMCOUNTER20H) +DECLARE_CSR(hpmcounter21h, CSR_HPMCOUNTER21H) +DECLARE_CSR(hpmcounter22h, CSR_HPMCOUNTER22H) +DECLARE_CSR(hpmcounter23h, CSR_HPMCOUNTER23H) +DECLARE_CSR(hpmcounter24h, CSR_HPMCOUNTER24H) +DECLARE_CSR(hpmcounter25h, CSR_HPMCOUNTER25H) +DECLARE_CSR(hpmcounter26h, CSR_HPMCOUNTER26H) +DECLARE_CSR(hpmcounter27h, CSR_HPMCOUNTER27H) +DECLARE_CSR(hpmcounter28h, CSR_HPMCOUNTER28H) +DECLARE_CSR(hpmcounter29h, CSR_HPMCOUNTER29H) +DECLARE_CSR(hpmcounter30h, CSR_HPMCOUNTER30H) +DECLARE_CSR(hpmcounter31h, CSR_HPMCOUNTER31H) +DECLARE_CSR(mcycleh, CSR_MCYCLEH) +DECLARE_CSR(minstreth, CSR_MINSTRETH) +DECLARE_CSR(mhpmcounter3h, CSR_MHPMCOUNTER3H) +DECLARE_CSR(mhpmcounter4h, CSR_MHPMCOUNTER4H) +DECLARE_CSR(mhpmcounter5h, CSR_MHPMCOUNTER5H) +DECLARE_CSR(mhpmcounter6h, CSR_MHPMCOUNTER6H) +DECLARE_CSR(mhpmcounter7h, CSR_MHPMCOUNTER7H) +DECLARE_CSR(mhpmcounter8h, CSR_MHPMCOUNTER8H) +DECLARE_CSR(mhpmcounter9h, CSR_MHPMCOUNTER9H) +DECLARE_CSR(mhpmcounter10h, CSR_MHPMCOUNTER10H) +DECLARE_CSR(mhpmcounter11h, CSR_MHPMCOUNTER11H) +DECLARE_CSR(mhpmcounter12h, CSR_MHPMCOUNTER12H) +DECLARE_CSR(mhpmcounter13h, CSR_MHPMCOUNTER13H) +DECLARE_CSR(mhpmcounter14h, CSR_MHPMCOUNTER14H) +DECLARE_CSR(mhpmcounter15h, CSR_MHPMCOUNTER15H) +DECLARE_CSR(mhpmcounter16h, CSR_MHPMCOUNTER16H) +DECLARE_CSR(mhpmcounter17h, CSR_MHPMCOUNTER17H) +DECLARE_CSR(mhpmcounter18h, CSR_MHPMCOUNTER18H) +DECLARE_CSR(mhpmcounter19h, CSR_MHPMCOUNTER19H) +DECLARE_CSR(mhpmcounter20h, CSR_MHPMCOUNTER20H) +DECLARE_CSR(mhpmcounter21h, CSR_MHPMCOUNTER21H) +DECLARE_CSR(mhpmcounter22h, CSR_MHPMCOUNTER22H) +DECLARE_CSR(mhpmcounter23h, CSR_MHPMCOUNTER23H) +DECLARE_CSR(mhpmcounter24h, CSR_MHPMCOUNTER24H) +DECLARE_CSR(mhpmcounter25h, CSR_MHPMCOUNTER25H) +DECLARE_CSR(mhpmcounter26h, CSR_MHPMCOUNTER26H) +DECLARE_CSR(mhpmcounter27h, CSR_MHPMCOUNTER27H) +DECLARE_CSR(mhpmcounter28h, CSR_MHPMCOUNTER28H) +DECLARE_CSR(mhpmcounter29h, CSR_MHPMCOUNTER29H) +DECLARE_CSR(mhpmcounter30h, CSR_MHPMCOUNTER30H) +DECLARE_CSR(mhpmcounter31h, CSR_MHPMCOUNTER31H) +#endif +#ifdef DECLARE_CAUSE +DECLARE_CAUSE("misaligned fetch", CAUSE_MISALIGNED_FETCH) +DECLARE_CAUSE("fetch access", CAUSE_FETCH_ACCESS) +DECLARE_CAUSE("illegal instruction", CAUSE_ILLEGAL_INSTRUCTION) +DECLARE_CAUSE("breakpoint", CAUSE_BREAKPOINT) +DECLARE_CAUSE("misaligned load", CAUSE_MISALIGNED_LOAD) +DECLARE_CAUSE("load access", CAUSE_LOAD_ACCESS) +DECLARE_CAUSE("misaligned store", CAUSE_MISALIGNED_STORE) +DECLARE_CAUSE("store access", CAUSE_STORE_ACCESS) +DECLARE_CAUSE("user_ecall", CAUSE_USER_ECALL) +DECLARE_CAUSE("supervisor_ecall", CAUSE_SUPERVISOR_ECALL) +DECLARE_CAUSE("hypervisor_ecall", CAUSE_HYPERVISOR_ECALL) +DECLARE_CAUSE("machine_ecall", CAUSE_MACHINE_ECALL) +DECLARE_CAUSE("fetch page fault", CAUSE_FETCH_PAGE_FAULT) +DECLARE_CAUSE("load page fault", CAUSE_LOAD_PAGE_FAULT) +DECLARE_CAUSE("store page fault", CAUSE_STORE_PAGE_FAULT) +#endif diff --git a/tests/riscv-coremark/riscv64-baremetal/link.ld b/tests/riscv-coremark/riscv64-baremetal/link.ld new file mode 100644 index 000000000..4f8892ee2 --- /dev/null +++ b/tests/riscv-coremark/riscv64-baremetal/link.ld @@ -0,0 +1,66 @@ +/*======================================================================*/ +/* Proxy kernel linker script */ +/*======================================================================*/ +/* This is the linker script used when building the proxy kernel. */ + +/*----------------------------------------------------------------------*/ +/* Setup */ +/*----------------------------------------------------------------------*/ + +/* The OUTPUT_ARCH command specifies the machine architecture where the + argument is one of the names used in the BFD library. More + specifically one of the entires in bfd/cpu-mips.c */ + +OUTPUT_ARCH( "riscv" ) +ENTRY(_start) + +/*----------------------------------------------------------------------*/ +/* Sections */ +/*----------------------------------------------------------------------*/ + +SECTIONS +{ + + /* text: test code section */ + . = 0x80000000; + .text.init : { *(.text.init) } + + . = ALIGN(0x1000); + .tohost : { *(.tohost) } + + .text : { *(.text) } + + /* data segment */ + .data : { *(.data) } + + .sdata : { + __global_pointer$ = . + 0x800; + *(.srodata.cst16) *(.srodata.cst8) *(.srodata.cst4) *(.srodata.cst2) *(.srodata*) + *(.sdata .sdata.* .gnu.linkonce.s.*) + } + + /* bss segment */ + .sbss : { + *(.sbss .sbss.* .gnu.linkonce.sb.*) + *(.scommon) + } + .bss : { *(.bss) } + + /* thread-local data segment */ + .tdata : + { + _tls_data = .; + *(.tdata.begin) + *(.tdata) + *(.tdata.end) + } + .tbss : + { + *(.tbss) + *(.tbss.end) + } + + /* End of uninitalized data segement */ + _end = .; +} + diff --git a/tests/riscv-coremark/riscv64-baremetal/syscallbackup.c b/tests/riscv-coremark/riscv64-baremetal/syscallbackup.c new file mode 100644 index 000000000..e4322563c --- /dev/null +++ b/tests/riscv-coremark/riscv64-baremetal/syscallbackup.c @@ -0,0 +1,1072 @@ +// See LICENSE for license details. + +#include +#include +#include +#include +#include +#include +#include "util.h" +#undef printf +#define SYS_write 64 +#define ZEROPAD (1<<0) /* Pad with zero */ +#define SIGN (1<<1) /* Unsigned/signed long */ +#define PLUS (1<<2) /* Show plus */ +#define SPACE (1<<3) /* Spacer */ +#define LEFT (1<<4) /* Left justified */ +#define HEX_PREP (1<<5) /* 0x */ +#define UPPERCASE (1<<6) /* 'ABCDEF' */ +typedef size_t ee_size_t; +#define is_digit(c) ((c) >= '0' && (c) <= '9') +/*static ee_size_t strnlen(const char *s, ee_size_t count);*/ +#undef strcmp +static char *digits = "0123456789abcdefghijklmnopqrstuvwxyz"; +static char *upper_digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; +char *ecvtbuf(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); +extern volatile uint64_t tohost; +extern volatile uint64_t fromhost; +ee_size_t strnlen(const char *s, ee_size_t count) +{ + const char *sc; + for (sc = s; *sc != '\0' && count--; ++sc); + return sc - s; +} +static char *number(char *str, long num, int base, int size, int precision, int type) +{ + char c, sign, tmp[66]; + char *dig = digits; + int i; + + if (type & UPPERCASE) dig = upper_digits; + if (type & LEFT) type &= ~ZEROPAD; + if (base < 2 || base > 36) return 0; + + c = (type & ZEROPAD) ? '0' : ' '; + sign = 0; + if (type & SIGN) + { + if (num < 0) + { + sign = '-'; + num = -num; + size--; + } + else if (type & PLUS) + { + sign = '+'; + size--; + } + else if (type & SPACE) + { + sign = ' '; + size--; + } + } + + if (type & HEX_PREP) + { + if (base == 16) + size -= 2; + else if (base == 8) + size--; + } + + i = 0; + + if (num == 0) + tmp[i++] = '0'; + else + { + while (num != 0) + { + tmp[i++] = dig[((unsigned long) num) % (unsigned) base]; + num = ((unsigned long) num) / (unsigned) base; + } + } + + if (i > precision) precision = i; + size -= precision; + if (!(type & (ZEROPAD | LEFT))) while (size-- > 0) *str++ = ' '; + if (sign) *str++ = sign; + + if (type & HEX_PREP) + { + if (base == 8) + *str++ = '0'; + else if (base == 16) + { + *str++ = '0'; + *str++ = digits[33]; + } + } + + if (!(type & LEFT)) while (size-- > 0) *str++ = c; + while (i < precision--) *str++ = '0'; + while (i-- > 0) *str++ = tmp[i]; + while (size-- > 0) *str++ = ' '; + + return str; +} + +static char *eaddr(char *str, unsigned char *addr, int size, int precision, int type) +{ + char tmp[24]; + char *dig = digits; + int i, len; + + if (type & UPPERCASE) dig = upper_digits; + len = 0; + for (i = 0; i < 6; i++) + { + if (i != 0) tmp[len++] = ':'; + tmp[len++] = dig[addr[i] >> 4]; + tmp[len++] = dig[addr[i] & 0x0F]; + } + + if (!(type & LEFT)) while (len < size--) *str++ = ' '; + for (i = 0; i < len; ++i) *str++ = tmp[i]; + while (len < size--) *str++ = ' '; + + return str; +} +static int skip_atoi(const char **s) +{ + int i = 0; + while (is_digit(**s)) i = i*10 + *((*s)++) - '0'; + return i; +} +static char *iaddr(char *str, unsigned char *addr, int size, int precision, int type) +{ + char tmp[24]; + int i, n, len; + + len = 0; + for (i = 0; i < 4; i++) + { + if (i != 0) tmp[len++] = '.'; + n = addr[i]; + + if (n == 0) + tmp[len++] = digits[0]; + else + { + if (n >= 100) + { + tmp[len++] = digits[n / 100]; + n = n % 100; + tmp[len++] = digits[n / 10]; + n = n % 10; + } + else if (n >= 10) + { + tmp[len++] = digits[n / 10]; + n = n % 10; + } + + tmp[len++] = digits[n]; + } + } + + if (!(type & LEFT)) while (len < size--) *str++ = ' '; + for (i = 0; i < len; ++i) *str++ = tmp[i]; + while (len < size--) *str++ = ' '; + + return str; +} + +void ee_bufcpy(char *pd, char *ps, int count) { + char *pe=ps+count; + while (ps!=pe) + *pd++=*ps++; +} + +#if HAS_FLOAT + + + +static void parse_float(double value, char *buffer, char fmt, int precision) +{ + int decpt, sign, exp, pos; + char *digits = NULL; + char cvtbuf[80]; + int capexp = 0; + int magnitude; + + if (fmt == 'G' || fmt == 'E') + { + capexp = 1; + fmt += 'a' - 'A'; + } + + if (fmt == 'g') + { + digits = ecvtbuf(value, precision, &decpt, &sign, cvtbuf); + magnitude = decpt - 1; + if (magnitude < -4 || magnitude > precision - 1) + { + fmt = 'e'; + precision -= 1; + } + else + { + fmt = 'f'; + precision -= decpt; + } + } + + if (fmt == 'e') + { + digits = ecvtbuf(value, precision + 1, &decpt, &sign, cvtbuf); + + if (sign) *buffer++ = '-'; + *buffer++ = *digits; + if (precision > 0) *buffer++ = '.'; + ee_bufcpy(buffer, digits + 1, precision); + buffer += precision; + *buffer++ = capexp ? 'E' : 'e'; + + if (decpt == 0) + { + if (value == 0.0) + exp = 0; + else + exp = -1; + } + else + exp = decpt - 1; + + if (exp < 0) + { + *buffer++ = '-'; + exp = -exp; + } + else + *buffer++ = '+'; + + buffer[2] = (exp % 10) + '0'; + exp = exp / 10; + buffer[1] = (exp % 10) + '0'; + exp = exp / 10; + buffer[0] = (exp % 10) + '0'; + buffer += 3; + } + else if (fmt == 'f') + { + digits = fcvtbuf(value, precision, &decpt, &sign, cvtbuf); + if (sign) *buffer++ = '-'; + if (*digits) + { + if (decpt <= 0) + { + *buffer++ = '0'; + *buffer++ = '.'; + for (pos = 0; pos < -decpt; pos++) *buffer++ = '0'; + while (*digits) *buffer++ = *digits++; + } + else + { + pos = 0; + while (*digits) + { + if (pos++ == decpt) *buffer++ = '.'; + *buffer++ = *digits++; + } + } + } + else + { + *buffer++ = '0'; + if (precision > 0) + { + *buffer++ = '.'; + for (pos = 0; pos < precision; pos++) *buffer++ = '0'; + } + } + } + + *buffer = '\0'; +} + + +static char *flt(char *str, double num, int size, int precision, char fmt, int flags) +{ + char tmp[80]; + char c, sign; + int n, i; + + // Left align means no zero padding + if (flags & LEFT) flags &= ~ZEROPAD; + + // Determine padding and sign char + c = (flags & ZEROPAD) ? '0' : ' '; + sign = 0; + if (flags & SIGN) + { + if (num < 0.0) + { + sign = '-'; + num = -num; + size--; + } + else if (flags & PLUS) + { + sign = '+'; + size--; + } + else if (flags & SPACE) + { + sign = ' '; + size--; + } + } + + // Compute the precision value + if (precision < 0) + precision = 6; // Default precision: 6 + + // Convert floating point number to text + parse_float(num, tmp, fmt, precision); + + if ((flags & HEX_PREP) && precision == 0) decimal_point(tmp); + if (fmt == 'g' && !(flags & HEX_PREP)) cropzeros(tmp); + + n = strnlen(tmp,256); + + // Output number with alignment and padding + size -= n; + if (!(flags & (ZEROPAD | LEFT))) while (size-- > 0) *str++ = ' '; + if (sign) *str++ = sign; + if (!(flags & LEFT)) while (size-- > 0) *str++ = c; + for (i = 0; i < n; i++) *str++ = tmp[i]; + while (size-- > 0) *str++ = ' '; + + return str; +} + + +#endif +static void decimal_point(char *buffer) +{ + while (*buffer) + { + if (*buffer == '.') return; + if (*buffer == 'e' || *buffer == 'E') break; + buffer++; + } + + if (*buffer) + { + int n = strnlen(buffer,256); + while (n > 0) + { + buffer[n + 1] = buffer[n]; + n--; + } + + *buffer = '.'; + } + else + { + *buffer++ = '.'; + *buffer = '\0'; + } +} + +static void cropzeros(char *buffer) +{ + char *stop; + + while (*buffer && *buffer != '.') buffer++; + if (*buffer++) + { + while (*buffer && *buffer != 'e' && *buffer != 'E') buffer++; + stop = buffer--; + while (*buffer == '0') buffer--; + if (*buffer == '.') buffer--; + while (buffer!=stop) + *++buffer=0; + } +} + +static int ee_vsprintf(char *buf, const char *fmt, va_list args) +{ + int len; + unsigned long num; + int i, base; + char *str; + char *s; + + int flags; // Flags to number() + + int field_width; // Width of output field + int precision; // Min. # of digits for integers; max number of chars for from string + int qualifier; // 'h', 'l', or 'L' for integer fields + + for (str = buf; *fmt; fmt++) + { + if (*fmt != '%') + { + *str++ = *fmt; + continue; + } + + // Process flags + flags = 0; +repeat: + fmt++; // This also skips first '%' + switch (*fmt) + { + case '-': flags |= LEFT; goto repeat; + case '+': flags |= PLUS; goto repeat; + case ' ': flags |= SPACE; goto repeat; + case '#': flags |= HEX_PREP; goto repeat; + case '0': flags |= ZEROPAD; goto repeat; + } + + // Get field width + field_width = -1; + if (is_digit(*fmt)) + field_width = skip_atoi(&fmt); + else if (*fmt == '*') + { + fmt++; + field_width = va_arg(args, int); + if (field_width < 0) + { + field_width = -field_width; + flags |= LEFT; + } + } + + // Get the precision + precision = -1; + if (*fmt == '.') + { + ++fmt; + if (is_digit(*fmt)) + precision = skip_atoi(&fmt); + else if (*fmt == '*') + { + ++fmt; + precision = va_arg(args, int); + } + if (precision < 0) precision = 0; + } + + // Get the conversion qualifier + qualifier = -1; + if (*fmt == 'l' || *fmt == 'L') + { + qualifier = *fmt; + fmt++; + } + + // Default base + base = 10; + + switch (*fmt) + { + case 'c': + if (!(flags & LEFT)) while (--field_width > 0) *str++ = ' '; + *str++ = (unsigned char) va_arg(args, int); + while (--field_width > 0) *str++ = ' '; + continue; + + case 's': + s = va_arg(args, char *); + if (!s) s = ""; + len = strnlen(s, precision); + if (!(flags & LEFT)) while (len < field_width--) *str++ = ' '; + for (i = 0; i < len; ++i) *str++ = *s++; + while (len < field_width--) *str++ = ' '; + continue; + + case 'p': + if (field_width == -1) + { + field_width = 2 * sizeof(void *); + flags |= ZEROPAD; + } + str = number(str, (unsigned long) va_arg(args, void *), 16, field_width, precision, flags); + continue; + + case 'A': + flags |= UPPERCASE; + + case 'a': + if (qualifier == 'l') + str = eaddr(str, va_arg(args, unsigned char *), field_width, precision, flags); + else + str = iaddr(str, va_arg(args, unsigned char *), field_width, precision, flags); + continue; + + // Integer number formats - set up the flags and "break" + case 'o': + base = 8; + break; + + case 'X': + flags |= UPPERCASE; + + case 'x': + base = 16; + break; + + case 'd': + case 'i': + flags |= SIGN; + + case 'u': + break; + +#if HAS_FLOAT + + case 'f': + str = flt(str, va_arg(args, double), field_width, precision, *fmt, flags | SIGN); + continue; + +#endif + + default: + if (*fmt != '%') *str++ = '%'; + if (*fmt) + *str++ = *fmt; + else + --fmt; + continue; + } + + if (qualifier == 'l') + num = va_arg(args, unsigned long); + else if (flags & SIGN) + num = va_arg(args, int); + else + num = va_arg(args, unsigned int); + + str = number(str, num, base, field_width, precision, flags); + } + + *str = '\0'; + return str - buf; +} + +static uintptr_t syscall(uintptr_t which, uint64_t arg0, uint64_t arg1, uint64_t arg2) +{ + volatile uint64_t magic_mem[8] __attribute__((aligned(64))); + magic_mem[0] = which; + magic_mem[1] = arg0; + magic_mem[2] = arg1; + magic_mem[3] = arg2; + __sync_synchronize(); + + tohost = (uintptr_t)magic_mem; + while (fromhost == 0) + ; + fromhost = 0; + + __sync_synchronize(); + return magic_mem[0]; +} + +#define NUM_COUNTERS 2 +static uintptr_t counters[NUM_COUNTERS]; +static char* counter_names[NUM_COUNTERS]; + +void setStats(int enable) +{ + int i = 0; +#define READ_CTR(name) do { \ + while (i >= NUM_COUNTERS) ; \ + uintptr_t csr = read_csr(name); \ + if (!enable) { csr -= counters[i]; counter_names[i] = #name; } \ + counters[i++] = csr; \ + } while (0) + + READ_CTR(mcycle); + READ_CTR(minstret); + +#undef READ_CTR +} + +/*void __attribute__((noreturn)) tohost_exit(uintptr_t code) +{ + tohost = (code << 1) | 1; + while (1); +}*/ +void __attribute__((noreturn))tohost_exit(uintptr_t code){ + tohost=(code<<1)|1; + asm ("ecall"); + } + + +uintptr_t __attribute__((weak)) handle_trap(uintptr_t cause, uintptr_t epc, uintptr_t regs[32]) +{ + tohost_exit(1337); +} + +void exit(int code) +{ + tohost_exit(code); +} + +void abort() +{ + exit(128 + SIGABRT); +} + +void printstr(const char* s) +{ + syscall(SYS_write, 1, (uintptr_t)s, strlen(s)); +} + +void __attribute__((weak)) thread_entry(int cid, int nc) +{ + // multi-threaded programs override this function. + // for the case of single-threaded programs, only let core 0 proceed. + while (cid != 0); +} + +int __attribute__((weak)) main(int argc, char** argv) +{ + // single-threaded programs override this function. + printstr("Implement main(), foo!\n"); + return -1; +} + +static void init_tls() +{ + register void* thread_pointer asm("tp"); + extern char _tls_data; + extern __thread char _tdata_begin, _tdata_end, _tbss_end; + size_t tdata_size = &_tdata_end - &_tdata_begin; + memcpy(thread_pointer, &_tls_data, tdata_size); + size_t tbss_size = &_tbss_end - &_tdata_end; + memset(thread_pointer + tdata_size, 0, tbss_size); +} + +void _init(int cid, int nc) +{ + init_tls(); + thread_entry(cid, nc); + + // only single-threaded programs should ever get here. + int ret = main(0, 0); + + char buf[NUM_COUNTERS * 32] __attribute__((aligned(64))); + char* pbuf = buf; + for (int i = 0; i < NUM_COUNTERS; i++) + if (counters[i]) + pbuf += sprintf(pbuf, "%s = %d\n", counter_names[i], counters[i]); + if (pbuf != buf) + printstr(buf); + + exit(ret); +} + +#undef putchar +int putchar(int ch) +{ + static __thread char buf[64] __attribute__((aligned(64))); + static __thread int buflen = 0; + + buf[buflen++] = ch; + + if (ch == '\n' || buflen == sizeof(buf)) + { + syscall(SYS_write, 1, (uintptr_t)buf, buflen); + buflen = 0; + } + + return 0; +} + +void printhex(uint64_t x) +{ + char str[17]; + int i; + for (i = 0; i < 16; i++) + { + str[15-i] = (x & 0xF) + ((x & 0xF) < 10 ? '0' : 'a'-10); + x >>= 4; + } + str[16] = 0; + + printstr(str); +} + +static inline void printnum(void (*putch)(int, void**), void **putdat, + unsigned long long num, unsigned base, int width, int padc) +{ + unsigned digs[sizeof(num)*CHAR_BIT]; + int pos = 0; + + while (1) + { + digs[pos++] = num % base; + if (num < base) + break; + num /= base; + } + + while (width-- > pos) + putch(padc, putdat); + + while (pos-- > 0) + putch(digs[pos] + (digs[pos] >= 10 ? 'a' - 10 : '0'), putdat); +} + +static unsigned long long getuint(va_list *ap, int lflag) +{ + if (lflag >= 2) + return va_arg(*ap, unsigned long long); + else if (lflag) + return va_arg(*ap, unsigned long); + else + return va_arg(*ap, unsigned int); +} + +static long long getint(va_list *ap, int lflag) +{ + if (lflag >= 2) + return va_arg(*ap, long long); + else if (lflag) + return va_arg(*ap, long); + else + return va_arg(*ap, int); +} + +static void vprintfmt(void (*putch)(int, void**), void **putdat, const char *fmt, va_list ap) +{ + register const char* p; + const char* last_fmt; + register int ch, err; + unsigned long long num; + int base, lflag, width, precision, altflag; + char padc; + + while (1) { + while ((ch = *(unsigned char *) fmt) != '%') { + if (ch == '\0') + return; + fmt++; + putch(ch, putdat); + } + fmt++; + + // Process a %-escape sequence + last_fmt = fmt; + padc = ' '; + width = -1; + precision = -1; + lflag = 0; + altflag = 0; + reswitch: + switch (ch = *(unsigned char *) fmt++) { + + // flag to pad on the right + case '-': + padc = '-'; + goto reswitch; + + // flag to pad with 0's instead of spaces + case '0': + padc = '0'; + goto reswitch; + + // width field + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + for (precision = 0; ; ++fmt) { + precision = precision * 10 + ch - '0'; + ch = *fmt; + if (ch < '0' || ch > '9') + break; + } + goto process_precision; + + case '*': + precision = va_arg(ap, int); + goto process_precision; + + case '.': + if (width < 0) + width = 0; + goto reswitch; + + case '#': + altflag = 1; + goto reswitch; + + process_precision: + if (width < 0) + width = precision, precision = -1; + goto reswitch; + + // long flag (doubled for long long) + case 'l': + lflag++; + goto reswitch; + + // character + case 'c': + putch(va_arg(ap, int), putdat); + break; + + // string + case 's': + if ((p = va_arg(ap, char *)) == NULL) + p = "(null)"; + if (width > 0 && padc != '-') + for (width -= strnlen(p, precision); width > 0; width--) + putch(padc, putdat); + for (; (ch = *p) != '\0' && (precision < 0 || --precision >= 0); width--) { + putch(ch, putdat); + p++; + } + for (; width > 0; width--) + putch(' ', putdat); + break; + + // (signed) decimal + case 'd': + num = getint(&ap, lflag); + if ((long long) num < 0) { + putch('-', putdat); + num = -(long long) num; + } + base = 10; + goto signed_number; + + // unsigned decimal + case 'u': + base = 10; + goto unsigned_number; + + // (unsigned) octal + case 'o': + // should do something with padding so it's always 3 octits + base = 8; + goto unsigned_number; + + // pointer + case 'p': + static_assert(sizeof(long) == sizeof(void*)); + lflag = 1; + putch('0', putdat); + putch('x', putdat); + /* fall through to 'x' */ + + // (unsigned) hexadecimal + case 'X': + case 'x': + base = 16; + unsigned_number: + num = getuint(&ap, lflag); + signed_number: + printnum(putch, putdat, num, base, width, padc); + break; + + // escaped '%' character + case '%': + putch(ch, putdat); + break; + + // unrecognized escape sequence - just print it literally + default: + putch('%', putdat); + fmt = last_fmt; + break; + } + } +} +/* +int printf(const char* fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + + vprintfmt((void*)putchar, 0, fmt, ap); + + va_end(ap); + return 0; // incorrect return value, but who cares, anyway? +}*/ + + +void _send_char(char c) { +/*#error "You must implement the method _send_char to use this file!\n"; +*/ +volatile unsigned char *THR=(unsigned char *)0x10000000; +volatile unsigned char *LSR=(unsigned char *)0x10000005; + +while(!(*LSR&0b100000)); +*THR=c; +while(!(*LSR&0b100000)); +} + + +int sprintf(char* str, const char* fmt, ...) +{ + va_list ap; + char* str0 = str; + va_start(ap, fmt); + + void sprintf_putch(int ch, void** data) + { + char** pstr = (char**)data; + **pstr = ch; + (*pstr)++; + } + + vprintfmt(sprintf_putch, (void**)&str, fmt, ap); + *str = 0; + + va_end(ap); + return str - str0; +} + +void* memcpy(void* dest, const void* src, size_t len) +{ + if ((((uintptr_t)dest | (uintptr_t)src | len) & (sizeof(uintptr_t)-1)) == 0) { + const uintptr_t* s = src; + uintptr_t *d = dest; + while (d < (uintptr_t*)(dest + len)) + *d++ = *s++; + } else { + const char* s = src; + char *d = dest; + while (d < (char*)(dest + len)) + *d++ = *s++; + } + return dest; +} + +void* memset(void* dest, int byte, size_t len) +{ + if ((((uintptr_t)dest | len) & (sizeof(uintptr_t)-1)) == 0) { + uintptr_t word = byte & 0xFF; + word |= word << 8; + word |= word << 16; + word |= word << 16 << 16; + + uintptr_t *d = dest; + while (d < (uintptr_t*)(dest + len)){ + *d = word; + d++;} + } else { + char *d = dest; + while (d < (char*)(dest + len)){ + *d = byte; + d++;} + } + return dest; +} +//recompile pls +size_t strlen(const char *s) +{ + const char *p = s; + while (*p) + p++; + return p - s; +} + +/*size_t strnlen(const char *s, size_t n) +{ + const char *p = s; + while (n-- && *p) + p++; + return p - s; +}*/ + +int strcmp(const char* s1, const char* s2) +{ + unsigned char c1, c2; + + do { + c1 = *s1++; + c2 = *s2++; + } while (c1 != 0 && c1 == c2); + + return c1 - c2; +} + +char* strcpy(char* dest, const char* src) +{ + char* d = dest; + while ((*d++ = *src++)) + ; + return dest; +} + +long atol(const char* str) +{ + long res = 0; + int sign = 0; + + while (*str == ' ') + str++; + + if (*str == '-' || *str == '+') { + sign = *str == '-'; + str++; + } + + while (*str) { + res *= 10; + res += *str++ - '0'; + } + + return sign ? -res : res; +} + +int sendstring(const char *p){ + int n=0; + while (*p) { + _send_char(*p); + n++; + p++; + } + + return n; +} +int gg_printf(const char *fmt, ...) +{ + char buf[256],*p; + va_list args; + int n=0; + + va_start(args, fmt); + ee_vsprintf(buf, fmt, args); + va_end(args); + p=buf; + /* while (*p) { + _send_char(*p); + n++; + p++; + } +*/ +n=sendstring(p); + return n; +} + + +int puts(const char* s) +{ + gg_printf(s); + gg_printf("\n"); + return 0; // incorrect return value, but who cares, anyway? +} + +unsigned long getTimer(void){ + unsigned long *MTIME = (unsigned long*)0x0200BFF8; + return *MTIME; + +} diff --git a/tests/riscv-coremark/riscv64-baremetal/syscalls.c b/tests/riscv-coremark/riscv64-baremetal/syscalls.c new file mode 100644 index 000000000..c1824954f --- /dev/null +++ b/tests/riscv-coremark/riscv64-baremetal/syscalls.c @@ -0,0 +1,505 @@ +// See LICENSE for license details. + +#include +#include +#include +#include +#include +#include +#include "util.h" + +#define SYS_write 64 + +#undef strcmp + +extern volatile uint64_t tohost; +extern volatile uint64_t fromhost; + + +void _send_char(char c) { +/*#error "You must implement the method _send_char to use this file!\n"; +*/ +volatile unsigned char *THR=(unsigned char *)0x10000000; +volatile unsigned char *LSR=(unsigned char *)0x10000005; + +while(!(*LSR&0b100000)); +*THR=c; +while(!(*LSR&0b100000)); +} + +int sendstring(const char *p){ + int n=0; + while (*p) { + _send_char(*p); + n++; + p++; + } + + return n; +} + +static uintptr_t syscall(uintptr_t which, uint64_t arg0, uint64_t arg1, uint64_t arg2) +{ + volatile uint64_t magic_mem[8] __attribute__((aligned(64))); + magic_mem[0] = which; + magic_mem[1] = arg0; + magic_mem[2] = arg1; + magic_mem[3] = arg2; + __sync_synchronize(); + + tohost = (uintptr_t)magic_mem; + while (fromhost == 0) + ; + fromhost = 0; + + __sync_synchronize(); + return magic_mem[0]; +} + +#define NUM_COUNTERS 2 +static uintptr_t counters[NUM_COUNTERS]; +static char* counter_names[NUM_COUNTERS]; + +void setStats(int enable) +{ + int i = 0; +#define READ_CTR(name) do { \ + while (i >= NUM_COUNTERS) ; \ + uintptr_t csr = read_csr(name); \ + if (!enable) { csr -= counters[i]; counter_names[i] = #name; } \ + counters[i++] = csr; \ + } while (0) + + READ_CTR(mcycle); + READ_CTR(minstret); + +#undef READ_CTR +} + +void __attribute__((noreturn)) tohost_exit(uintptr_t code) +{ + tohost = (code << 1) | 1; + asm ("ecall"); +} + +uintptr_t __attribute__((weak)) handle_trap(uintptr_t cause, uintptr_t epc, uintptr_t regs[32]) +{ + tohost_exit(1337); +} + +void exit(int code) +{ + tohost_exit(code); +} + +void abort() +{ + exit(128 + SIGABRT); +} + +void printstr(const char* s) +{ + syscall(SYS_write, 1, (uintptr_t)s, strlen(s)); +} + +void __attribute__((weak)) thread_entry(int cid, int nc) +{ + // multi-threaded programs override this function. + // for the case of single-threaded programs, only let core 0 proceed. + while (cid != 0); +} + +int __attribute__((weak)) main(int argc, char** argv) +{ + // single-threaded programs override this function. + printstr("Implement main(), foo!\n"); + return -1; +} + +static void init_tls() +{ + register void* thread_pointer asm("tp"); + extern char _tls_data; + extern __thread char _tdata_begin, _tdata_end, _tbss_end; + size_t tdata_size = &_tdata_end - &_tdata_begin; + memcpy(thread_pointer, &_tls_data, tdata_size); + size_t tbss_size = &_tbss_end - &_tdata_end; + memset(thread_pointer + tdata_size, 0, tbss_size); +} + +void _init(int cid, int nc) +{ + init_tls(); + thread_entry(cid, nc); + + // only single-threaded programs should ever get here. + int ret = main(0, 0); + + char buf[NUM_COUNTERS * 32] __attribute__((aligned(64))); + char* pbuf = buf; + for (int i = 0; i < NUM_COUNTERS; i++) + if (counters[i]) + pbuf += sprintf(pbuf, "%s = %d\n", counter_names[i], counters[i]); + if (pbuf != buf) + printstr(buf); + + exit(ret); +} + +#undef putchar +int putchar(int ch) +{ + /*static __thread char buf[64] __attribute__((aligned(64))); + static __thread int buflen = 0; + + buf[buflen++] = ch; + + if (ch == '\n' || buflen == sizeof(buf)) + { + syscall(SYS_write, 1, (uintptr_t)buf, buflen); + buflen = 0; + } + + return 0;*/ + _send_char(ch); + return 0; + +} + +void printhex(uint64_t x) +{ + char str[17]; + int i; + for (i = 0; i < 16; i++) + { + str[15-i] = (x & 0xF) + ((x & 0xF) < 10 ? '0' : 'a'-10); + x >>= 4; + } + str[16] = 0; + + printstr(str); +} + +static inline void printnum(void (*putch)(int, void**), void **putdat, + unsigned long long num, unsigned base, int width, int padc) +{ + unsigned digs[sizeof(num)*CHAR_BIT]; + int pos = 0; + + while (1) + { + digs[pos++] = num % base; + if (num < base) + break; + num /= base; + } + + while (width-- > pos) + putch(padc, putdat); + + while (pos-- > 0) + putch(digs[pos] + (digs[pos] >= 10 ? 'a' - 10 : '0'), putdat); +} + +static unsigned long long getuint(va_list *ap, int lflag) +{ + if (lflag >= 2) + return va_arg(*ap, unsigned long long); + else if (lflag) + return va_arg(*ap, unsigned long); + else + return va_arg(*ap, unsigned int); +} + +static long long getint(va_list *ap, int lflag) +{ + if (lflag >= 2) + return va_arg(*ap, long long); + else if (lflag) + return va_arg(*ap, long); + else + return va_arg(*ap, int); +} + +static void vprintfmt(void (*putch)(int, void**), void **putdat, const char *fmt, va_list ap) +{ + register const char* p; + const char* last_fmt; + register int ch, err; + unsigned long long num; + int base, lflag, width, precision, altflag; + char padc; + + while (1) { + while ((ch = *(unsigned char *) fmt) != '%') { + if (ch == '\0') + return; + fmt++; + putch(ch, putdat); + } + fmt++; + + // Process a %-escape sequence + last_fmt = fmt; + padc = ' '; + width = -1; + precision = -1; + lflag = 0; + altflag = 0; + reswitch: + switch (ch = *(unsigned char *) fmt++) { + + // flag to pad on the right + case '-': + padc = '-'; + goto reswitch; + + // flag to pad with 0's instead of spaces + case '0': + padc = '0'; + goto reswitch; + + // width field + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + for (precision = 0; ; ++fmt) { + precision = precision * 10 + ch - '0'; + ch = *fmt; + if (ch < '0' || ch > '9') + break; + } + goto process_precision; + + case '*': + precision = va_arg(ap, int); + goto process_precision; + + case '.': + if (width < 0) + width = 0; + goto reswitch; + + case '#': + altflag = 1; + goto reswitch; + + process_precision: + if (width < 0) + width = precision, precision = -1; + goto reswitch; + + // long flag (doubled for long long) + case 'l': + lflag++; + goto reswitch; + + // character + case 'c': + putch(va_arg(ap, int), putdat); + break; + + // string + case 's': + if ((p = va_arg(ap, char *)) == NULL) + p = "(null)"; + if (width > 0 && padc != '-') + for (width -= strnlen(p, precision); width > 0; width--) + putch(padc, putdat); + for (; (ch = *p) != '\0' && (precision < 0 || --precision >= 0); width--) { + putch(ch, putdat); + p++; + } + for (; width > 0; width--) + putch(' ', putdat); + break; + + // (signed) decimal + case 'd': + num = getint(&ap, lflag); + if ((long long) num < 0) { + putch('-', putdat); + num = -(long long) num; + } + base = 10; + goto signed_number; + + // unsigned decimal + case 'u': + base = 10; + goto unsigned_number; + + // (unsigned) octal + case 'o': + // should do something with padding so it's always 3 octits + base = 8; + goto unsigned_number; + + // pointer + case 'p': + static_assert(sizeof(long) == sizeof(void*)); + lflag = 1; + putch('0', putdat); + putch('x', putdat); + /* fall through to 'x' */ + + // (unsigned) hexadecimal + case 'X': + case 'x': + base = 16; + unsigned_number: + num = getuint(&ap, lflag); + signed_number: + printnum(putch, putdat, num, base, width, padc); + break; + + // escaped '%' character + case '%': + putch(ch, putdat); + break; + + // unrecognized escape sequence - just print it literally + default: + putch('%', putdat); + fmt = last_fmt; + break; + } + } +} + +int printf(const char* fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + + vprintfmt((void*)putchar, 0, fmt, ap); + + va_end(ap); + return 0; // incorrect return value, but who cares, anyway? +} + +int puts(const char* s) +{ + printf(s); + printf("\n"); + return 0; // incorrect return value, but who cares, anyway? +} + +int sprintf(char* str, const char* fmt, ...) +{ + va_list ap; + char* str0 = str; + va_start(ap, fmt); + + void sprintf_putch(int ch, void** data) + { + char** pstr = (char**)data; + **pstr = ch; + (*pstr)++; + } + + vprintfmt(sprintf_putch, (void**)&str, fmt, ap); + *str = 0; + + va_end(ap); + return str - str0; +} + +void* memcpy(void* dest, const void* src, size_t len) +{ + if ((((uintptr_t)dest | (uintptr_t)src | len) & (sizeof(uintptr_t)-1)) == 0) { + const uintptr_t* s = src; + uintptr_t *d = dest; + while (d < (uintptr_t*)(dest + len)) + *d++ = *s++; + } else { + const char* s = src; + char *d = dest; + while (d < (char*)(dest + len)) + *d++ = *s++; + } + return dest; +} +void* memset(void* dest, int byte, size_t len) +{ + if ((((uintptr_t)dest | len) & (sizeof(uintptr_t)-1)) == 0) { + uintptr_t word = byte & 0xFF; + word |= word << 8; + word |= word << 16; + word |= word << 16 << 16; + + uintptr_t *d = dest; + while (d < (uintptr_t*)(dest + len)){ + *d = word; + d++;} + } else { + char *d = dest; + while (d < (char*)(dest + len)){ + *d = byte; + d++;} + } + return dest; +} + +size_t strlen(const char *s) +{ + const char *p = s; + while (*p) + p++; + return p - s; +} + +size_t strnlen(const char *s, size_t n) +{ + const char *p = s; + while (n-- && *p) + p++; + return p - s; +} + +int strcmp(const char* s1, const char* s2) +{ + unsigned char c1, c2; + + do { + c1 = *s1++; + c2 = *s2++; + } while (c1 != 0 && c1 == c2); + + return c1 - c2; +} + +char* strcpy(char* dest, const char* src) +{ + char* d = dest; + while ((*d++ = *src++)) + ; + return dest; +} + +long atol(const char* str) +{ + long res = 0; + int sign = 0; + + while (*str == ' ') + str++; + + if (*str == '-' || *str == '+') { + sign = *str == '-'; + str++; + } + + while (*str) { + res *= 10; + res += *str++ - '0'; + } + + return sign ? -res : res; +} diff --git a/tests/riscv-coremark/riscv64-baremetal/util.h b/tests/riscv-coremark/riscv64-baremetal/util.h new file mode 100644 index 000000000..081cfd634 --- /dev/null +++ b/tests/riscv-coremark/riscv64-baremetal/util.h @@ -0,0 +1,90 @@ +// See LICENSE for license details. + +#ifndef __UTIL_H +#define __UTIL_H + +extern void setStats(int enable); + +#include + +#define static_assert(cond) switch(0) { case 0: case !!(long)(cond): ; } + +static int verify(int n, const volatile int* test, const int* verify) +{ + int i; + // Unrolled for faster verification + for (i = 0; i < n/2*2; i+=2) + { + int t0 = test[i], t1 = test[i+1]; + int v0 = verify[i], v1 = verify[i+1]; + if (t0 != v0) return i+1; + if (t1 != v1) return i+2; + } + if (n % 2 != 0 && test[n-1] != verify[n-1]) + return n; + return 0; +} + +static int verifyDouble(int n, const volatile double* test, const double* verify) +{ + int i; + // Unrolled for faster verification + for (i = 0; i < n/2*2; i+=2) + { + double t0 = test[i], t1 = test[i+1]; + double v0 = verify[i], v1 = verify[i+1]; + int eq1 = t0 == v0, eq2 = t1 == v1; + if (!(eq1 & eq2)) return i+1+eq1; + } + if (n % 2 != 0 && test[n-1] != verify[n-1]) + return n; + return 0; +} + +static void __attribute__((noinline)) barrier(int ncores) +{ + static volatile int sense; + static volatile int count; + static __thread int threadsense; + + __sync_synchronize(); + + threadsense = !threadsense; + if (__sync_fetch_and_add(&count, 1) == ncores-1) + { + count = 0; + sense = threadsense; + } + else while(sense != threadsense) + ; + + __sync_synchronize(); +} + +static uint64_t lfsr(uint64_t x) +{ + uint64_t bit = (x ^ (x >> 1)) & 1; + return (x >> 1) | (bit << 62); +} + +static uintptr_t insn_len(uintptr_t pc) +{ + return (*(unsigned short*)pc & 3) ? 4 : 2; +} + +#ifdef __riscv +#include "encoding.h" +#endif + +#define stringify_1(s) #s +#define stringify(s) stringify_1(s) +#define stats(code, iter) do { \ + unsigned long _c = -read_csr(mcycle), _i = -read_csr(minstret); \ + code; \ + _c += read_csr(mcycle), _i += read_csr(minstret); \ + if (cid == 0) \ + printf("\n%s: %ld cycles, %ld.%ld cycles/iter, %ld.%ld CPI\n", \ + stringify(code), _c, _c/iter, 10*_c/iter%10, _c/_i, 10*_c/_i%10); \ + } while(0) + +#endif //__UTIL_H diff --git a/tests/riscv-coremark/riscv64/core_portme.c b/tests/riscv-coremark/riscv64/core_portme.c new file mode 100755 index 000000000..8f17cb8bd --- /dev/null +++ b/tests/riscv-coremark/riscv64/core_portme.c @@ -0,0 +1,346 @@ +/* +Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +Original Author: Shay Gal-on +*/ + +#include +#include +#include "coremark.h" +#if CALLGRIND_RUN +#include +#endif + +#if (MEM_METHOD==MEM_MALLOC) +#include +/* Function: portable_malloc + Provide malloc() functionality in a platform specific way. +*/ +void *portable_malloc(size_t size) { + return malloc(size); +} +/* Function: portable_free + Provide free() functionality in a platform specific way. +*/ +void portable_free(void *p) { + free(p); +} +#else +void *portable_malloc(size_t size) { + return NULL; +} +void portable_free(void *p) { + p=NULL; +} +#endif + +#if (SEED_METHOD==SEED_VOLATILE) +#if VALIDATION_RUN + volatile ee_s32 seed1_volatile=0x3415; + volatile ee_s32 seed2_volatile=0x3415; + volatile ee_s32 seed3_volatile=0x66; +#endif +#if PERFORMANCE_RUN + volatile ee_s32 seed1_volatile=0x0; + volatile ee_s32 seed2_volatile=0x0; + volatile ee_s32 seed3_volatile=0x66; +#endif +#if PROFILE_RUN + volatile ee_s32 seed1_volatile=0x8; + volatile ee_s32 seed2_volatile=0x8; + volatile ee_s32 seed3_volatile=0x8; +#endif + volatile ee_s32 seed4_volatile=ITERATIONS; + volatile ee_s32 seed5_volatile=0; +#endif +/* Porting: Timing functions + How to capture time and convert to seconds must be ported to whatever is supported by the platform. + e.g. Read value from on board RTC, read value from cpu clock cycles performance counter etc. + Sample implementation for standard time.h and windows.h definitions included. +*/ +/* Define: TIMER_RES_DIVIDER + Divider to trade off timer resolution and total time that can be measured. + + Use lower values to increase resolution, but make sure that overflow does not occur. + If there are issues with the return value overflowing, increase this value. + */ +#if USE_CLOCK + #define NSECS_PER_SEC CLOCKS_PER_SEC + #define EE_TIMER_TICKER_RATE 1000 + #define CORETIMETYPE clock_t + #define GETMYTIME(_t) (*_t=clock()) + #define MYTIMEDIFF(fin,ini) ((fin)-(ini)) + #define TIMER_RES_DIVIDER 1 + #define SAMPLE_TIME_IMPLEMENTATION 1 +#elif defined(_MSC_VER) + #define NSECS_PER_SEC 10000000 + #define EE_TIMER_TICKER_RATE 1000 + #define CORETIMETYPE FILETIME + #define GETMYTIME(_t) GetSystemTimeAsFileTime(_t) + #define MYTIMEDIFF(fin,ini) (((*(__int64*)&fin)-(*(__int64*)&ini))/TIMER_RES_DIVIDER) + /* setting to millisces resolution by default with MSDEV */ + #ifndef TIMER_RES_DIVIDER + #define TIMER_RES_DIVIDER 1000 + #endif + #define SAMPLE_TIME_IMPLEMENTATION 1 +#elif HAS_TIME_H + #define NSECS_PER_SEC 1000000000 + #define EE_TIMER_TICKER_RATE 1000 + #define CORETIMETYPE struct timespec + #define GETMYTIME(_t) clock_gettime(CLOCK_REALTIME,_t) + #define MYTIMEDIFF(fin,ini) ((fin.tv_sec-ini.tv_sec)*(NSECS_PER_SEC/TIMER_RES_DIVIDER)+(fin.tv_nsec-ini.tv_nsec)/TIMER_RES_DIVIDER) + /* setting to 1/1000 of a second resolution by default with linux */ + #ifndef TIMER_RES_DIVIDER + #define TIMER_RES_DIVIDER 1000000 + #endif + #define SAMPLE_TIME_IMPLEMENTATION 1 +#else + // Defined for RISCV + #define NSECS_PER_SEC 1000000000 // TODO: What freq are we assuming? + #define EE_TIMER_TICKER_RATE 1000 // TODO: What is this? + #define CORETIMETYPE clock_t + #define read_csr(reg) ({ unsigned long __tmp; \ + asm volatile ("csrr %0, " #reg : "=r"(__tmp)); \ + __tmp; }) + #define GETMYTIME(_t) (*_t=read_csr(cycle)) + #define MYTIMEDIFF(fin,ini) ((fin)-(ini)) + #define TIMER_RES_DIVIDER 1 + #define SAMPLE_TIME_IMPLEMENTATION 1 +#endif +#define EE_TICKS_PER_SEC (NSECS_PER_SEC / TIMER_RES_DIVIDER) + +#if SAMPLE_TIME_IMPLEMENTATION +/** Define Host specific (POSIX), or target specific global time variables. */ +static CORETIMETYPE start_time_val, stop_time_val; + +/* Function: start_time + This function will be called right before starting the timed portion of the benchmark. + + Implementation may be capturing a system timer (as implemented in the example code) + or zeroing some system parameters - e.g. setting the cpu clocks cycles to 0. +*/ +void start_time(void) { + GETMYTIME(&start_time_val ); +#if CALLGRIND_RUN + CALLGRIND_START_INSTRUMENTATION +#endif +#if MICA + asm volatile("int3");/*1 */ +#endif +} +/* Function: stop_time + This function will be called right after ending the timed portion of the benchmark. + + Implementation may be capturing a system timer (as implemented in the example code) + or other system parameters - e.g. reading the current value of cpu cycles counter. +*/ +void stop_time(void) { +#if CALLGRIND_RUN + CALLGRIND_STOP_INSTRUMENTATION +#endif +#if MICA + asm volatile("int3");/*1 */ +#endif + GETMYTIME(&stop_time_val ); +} +/* Function: get_time + Return an abstract "ticks" number that signifies time on the system. + + Actual value returned may be cpu cycles, milliseconds or any other value, + as long as it can be converted to seconds by . + This methodology is taken to accomodate any hardware or simulated platform. + The sample implementation returns millisecs by default, + and the resolution is controlled by +*/ +CORE_TICKS get_time(void) { + CORE_TICKS elapsed=(CORE_TICKS)(MYTIMEDIFF(stop_time_val, start_time_val)); + return elapsed; +} +/* Function: time_in_secs + Convert the value returned by get_time to seconds. + + The type is used to accomodate systems with no support for floating point. + Default implementation implemented by the EE_TICKS_PER_SEC macro above. +*/ +secs_ret time_in_secs(CORE_TICKS ticks) { + secs_ret retval=((secs_ret)ticks) / (secs_ret)EE_TICKS_PER_SEC; + return retval; +} +#else +#error "Please implement timing functionality in core_portme.c" +#endif /* SAMPLE_TIME_IMPLEMENTATION */ + +ee_u32 default_num_contexts=MULTITHREAD; + +/* Function: portable_init + Target specific initialization code + Test for some common mistakes. +*/ +void portable_init(core_portable *p, int *argc, char *argv[]) +{ +#if PRINT_ARGS + int i; + for (i=0; i<*argc; i++) { + ee_printf("Arg[%d]=%s\n",i,argv[i]); + } +#endif + if (sizeof(ee_ptr_int) != sizeof(ee_u8 *)) { + ee_printf("ERROR! Please define ee_ptr_int to a type that holds a pointer!\n"); + } + if (sizeof(ee_u32) != 4) { + ee_printf("ERROR! Please define ee_u32 to a 32b unsigned type!\n"); + } +#if (MAIN_HAS_NOARGC && (SEED_METHOD==SEED_ARG)) + ee_printf("ERROR! Main has no argc, but SEED_METHOD defined to SEED_ARG!\n"); +#endif + +#if (MULTITHREAD>1) && (SEED_METHOD==SEED_ARG) + int nargs=*argc,i; + if ((nargs>1) && (*argv[1]=='M')) { + default_num_contexts=parseval(argv[1]+1); + if (default_num_contexts>MULTITHREAD) + default_num_contexts=MULTITHREAD; + /* Shift args since first arg is directed to the portable part and not to coremark main */ + --nargs; + for (i=1; i*/ + p->portable_id=1; +} +/* Function: portable_fini + Target specific final code +*/ +void portable_fini(core_portable *p) +{ + p->portable_id=0; +} + +#if (MULTITHREAD>1) + +/* Function: core_start_parallel + Start benchmarking in a parallel context. + + Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets. + Other implementations using MCAPI or other standards can easily be devised. +*/ +/* Function: core_stop_parallel + Stop a parallel context execution of coremark, and gather the results. + + Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets. + Other implementations using MCAPI or other standards can easily be devised. +*/ +#if USE_PTHREAD +ee_u8 core_start_parallel(core_results *res) { + return (ee_u8)pthread_create(&(res->port.thread),NULL,iterate,(void *)res); +} +ee_u8 core_stop_parallel(core_results *res) { + void *retval; + return (ee_u8)pthread_join(res->port.thread,&retval); +} +#elif USE_FORK +static int key_id=0; +ee_u8 core_start_parallel(core_results *res) { + key_t key=4321+key_id; + key_id++; + res->port.pid=fork(); + res->port.shmid=shmget(key, 8, IPC_CREAT | 0666); + if (res->port.shmid<0) { + ee_printf("ERROR in shmget!\n"); + } + if (res->port.pid==0) { + iterate(res); + res->port.shm=shmat(res->port.shmid, NULL, 0); + /* copy the validation values to the shared memory area and quit*/ + if (res->port.shm == (char *) -1) { + ee_printf("ERROR in child shmat!\n"); + } else { + memcpy(res->port.shm,&(res->crc),8); + shmdt(res->port.shm); + } + exit(0); + } + return 1; +} +ee_u8 core_stop_parallel(core_results *res) { + int status; + pid_t wpid = waitpid(res->port.pid,&status,WUNTRACED); + if (wpid != res->port.pid) { + ee_printf("ERROR waiting for child.\n"); + if (errno == ECHILD) ee_printf("errno=No such child %d\n",res->port.pid); + if (errno == EINTR) ee_printf("errno=Interrupted\n"); + return 0; + } + /* after process is done, get the values from the shared memory area */ + res->port.shm=shmat(res->port.shmid, NULL, 0); + if (res->port.shm == (char *) -1) { + ee_printf("ERROR in parent shmat!\n"); + return 0; + } + memcpy(&(res->crc),res->port.shm,8); + shmdt(res->port.shm); + return 1; +} +#elif USE_SOCKET +static int key_id=0; +ee_u8 core_start_parallel(core_results *res) { + int bound, buffer_length=8; + res->port.sa.sin_family = AF_INET; + res->port.sa.sin_addr.s_addr = htonl(0x7F000001); + res->port.sa.sin_port = htons(7654+key_id); + key_id++; + res->port.pid=fork(); + if (res->port.pid==0) { /* benchmark child */ + iterate(res); + res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); + if (-1 == res->port.sock) /* if socket failed to initialize, exit */ { + ee_printf("Error Creating Socket"); + } else { + int bytes_sent = sendto(res->port.sock, &(res->crc), buffer_length, 0,(struct sockaddr*)&(res->port.sa), sizeof (struct sockaddr_in)); + if (bytes_sent < 0) + ee_printf("Error sending packet: %s\n", strerror(errno)); + close(res->port.sock); /* close the socket */ + } + exit(0); + } + /* parent process, open the socket */ + res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); + bound = bind(res->port.sock,(struct sockaddr*)&(res->port.sa), sizeof(struct sockaddr)); + if (bound < 0) + ee_printf("bind(): %s\n",strerror(errno)); + return 1; +} +ee_u8 core_stop_parallel(core_results *res) { + int status; + int fromlen=sizeof(struct sockaddr); + int recsize = recvfrom(res->port.sock, &(res->crc), 8, 0, (struct sockaddr*)&(res->port.sa), &fromlen); + if (recsize < 0) { + ee_printf("Error in receive: %s\n", strerror(errno)); + return 0; + } + pid_t wpid = waitpid(res->port.pid,&status,WUNTRACED); + if (wpid != res->port.pid) { + ee_printf("ERROR waiting for child.\n"); + if (errno == ECHILD) ee_printf("errno=No such child %d\n",res->port.pid); + if (errno == EINTR) ee_printf("errno=Interrupted\n"); + return 0; + } + return 1; +} +#else /* no standard multicore implementation */ +#error "Please implement multicore functionality in core_portme.c to use multiple contexts." +#endif /* multithread implementations */ +#endif diff --git a/tests/riscv-coremark/riscv64/core_portme.h b/tests/riscv-coremark/riscv64/core_portme.h new file mode 100755 index 000000000..4e28afd36 --- /dev/null +++ b/tests/riscv-coremark/riscv64/core_portme.h @@ -0,0 +1,296 @@ +/* +Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +Original Author: Shay Gal-on +*/ + +/* Topic: Description + This file contains configuration constants required to execute on different platforms +*/ +#ifndef CORE_PORTME_H +#define CORE_PORTME_H +/************************/ +/* Data types and settings */ +/************************/ +/* Configuration: HAS_FLOAT + Define to 1 if the platform supports floating point. +*/ +#ifndef HAS_FLOAT +#define HAS_FLOAT 1 +#endif +/* Configuration: HAS_TIME_H + Define to 1 if platform has the time.h header file, + and implementation of functions thereof. +*/ +#ifndef HAS_TIME_H +#define HAS_TIME_H 0 +#endif +/* Configuration: USE_CLOCK + Define to 1 if platform has the time.h header file, + and implementation of functions thereof. +*/ +#ifndef USE_CLOCK +#define USE_CLOCK 0 +#endif +/* Configuration: HAS_STDIO + Define to 1 if the platform has stdio.h. +*/ +#ifndef HAS_STDIO +#define HAS_STDIO 1 +#endif +/* Configuration: HAS_PRINTF + Define to 1 if the platform has stdio.h and implements the printf function. +*/ +#ifndef HAS_PRINTF +#define HAS_PRINTF 1 +#endif + +/* Configuration: CORE_TICKS + Define type of return from the timing functions. + */ +#if defined(_MSC_VER) +#include +typedef size_t CORE_TICKS; +#elif HAS_TIME_H +#include +typedef clock_t CORE_TICKS; +#else +/* Configuration: size_t and clock_t + Note these need to match the size of the clock output and the xLen the processor supports + */ +typedef unsigned long int size_t; +typedef unsigned long int clock_t; +typedef clock_t CORE_TICKS; +#endif + +/* Definitions: COMPILER_VERSION, COMPILER_FLAGS, MEM_LOCATION + Initialize these strings per platform +*/ +#ifndef COMPILER_VERSION + #ifdef __GNUC__ + #define COMPILER_VERSION "GCC"__VERSION__ + #else + #define COMPILER_VERSION "Please put compiler version here (e.g. gcc 4.1)" + #endif +#endif +#ifndef COMPILER_FLAGS + #define COMPILER_FLAGS FLAGS_STR /* "Please put compiler flags here (e.g. -o3)" */ +#endif +#ifndef MEM_LOCATION + #define MEM_LOCATION "Please put data memory location here\n\t\t\t(e.g. code in flash, data on heap etc)" + #define MEM_LOCATION_UNSPEC 1 +#endif + +/* Data Types: + To avoid compiler issues, define the data types that need ot be used for 8b, 16b and 32b in . + + *Imprtant*: + ee_ptr_int needs to be the data type used to hold pointers, otherwise coremark may fail!!! +*/ +typedef signed short ee_s16; +typedef unsigned short ee_u16; +typedef signed int ee_s32; +typedef double ee_f32; +typedef unsigned char ee_u8; +typedef unsigned int ee_u32; +typedef unsigned long long ee_ptr_int; +typedef size_t ee_size_t; +/* align an offset to point to a 32b value */ +#define align_mem(x) (void *)(4 + (((ee_ptr_int)(x) - 1) & ~3)) + +/* Configuration: SEED_METHOD + Defines method to get seed values that cannot be computed at compile time. + + Valid values: + SEED_ARG - from command line. + SEED_FUNC - from a system function. + SEED_VOLATILE - from volatile variables. +*/ +#ifndef SEED_METHOD +#define SEED_METHOD SEED_ARG +#endif + +/* Configuration: MEM_METHOD + Defines method to get a block of memry. + + Valid values: + MEM_MALLOC - for platforms that implement malloc and have malloc.h. + MEM_STATIC - to use a static memory array. + MEM_STACK - to allocate the data block on the stack (NYI). +*/ +#ifndef MEM_METHOD +#define MEM_METHOD MEM_MALLOC +#endif + +/* Configuration: MULTITHREAD + Define for parallel execution + + Valid values: + 1 - only one context (default). + N>1 - will execute N copies in parallel. + + Note: + If this flag is defined to more then 1, an implementation for launching parallel contexts must be defined. + + Two sample implementations are provided. Use or to enable them. + + It is valid to have a different implementation of and in , + to fit a particular architecture. +*/ +#ifndef MULTITHREAD +#define MULTITHREAD 1 +#endif + +/* Configuration: USE_PTHREAD + Sample implementation for launching parallel contexts + This implementation uses pthread_thread_create and pthread_join. + + Valid values: + 0 - Do not use pthreads API. + 1 - Use pthreads API + + Note: + This flag only matters if MULTITHREAD has been defined to a value greater then 1. +*/ +#ifndef USE_PTHREAD +#define USE_PTHREAD 0 +#endif + +/* Configuration: USE_FORK + Sample implementation for launching parallel contexts + This implementation uses fork, waitpid, shmget,shmat and shmdt. + + Valid values: + 0 - Do not use fork API. + 1 - Use fork API + + Note: + This flag only matters if MULTITHREAD has been defined to a value greater then 1. +*/ +#ifndef USE_FORK +#define USE_FORK 0 +#endif + +/* Configuration: USE_SOCKET + Sample implementation for launching parallel contexts + This implementation uses fork, socket, sendto and recvfrom + + Valid values: + 0 - Do not use fork and sockets API. + 1 - Use fork and sockets API + + Note: + This flag only matters if MULTITHREAD has been defined to a value greater then 1. +*/ +#ifndef USE_SOCKET +#define USE_SOCKET 0 +#endif + +/* Configuration: MAIN_HAS_NOARGC + Needed if platform does not support getting arguments to main. + + Valid values: + 0 - argc/argv to main is supported + 1 - argc/argv to main is not supported +*/ +#ifndef MAIN_HAS_NOARGC +#define MAIN_HAS_NOARGC 0 +#endif + +/* Configuration: MAIN_HAS_NORETURN + Needed if platform does not support returning a value from main. + + Valid values: + 0 - main returns an int, and return value will be 0. + 1 - platform does not support returning a value from main +*/ +#ifndef MAIN_HAS_NORETURN +#define MAIN_HAS_NORETURN 0 +#endif + +/* Variable: default_num_contexts + Number of contexts to spawn in multicore context. + Override this global value to change number of contexts used. + + Note: + This value may not be set higher then the define. + + To experiment, you can set the define to the highest value expected, and use argc/argv in the to set this value from the command line. +*/ +extern ee_u32 default_num_contexts; + +#if (MULTITHREAD>1) +#if USE_PTHREAD + #include + #define PARALLEL_METHOD "PThreads" +#elif USE_FORK + #include + #include + #include + #include + #include /* for memcpy */ + #define PARALLEL_METHOD "Fork" +#elif USE_SOCKET + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #define PARALLEL_METHOD "Sockets" +#else + #define PARALLEL_METHOD "Proprietary" + #error "Please implement multicore functionality in core_portme.c to use multiple contexts." +#endif /* Method for multithreading */ +#endif /* MULTITHREAD > 1 */ + +typedef struct CORE_PORTABLE_S { +#if (MULTITHREAD>1) + #if USE_PTHREAD + pthread_t thread; + #elif USE_FORK + pid_t pid; + int shmid; + void *shm; + #elif USE_SOCKET + pid_t pid; + int sock; + struct sockaddr_in sa; + #endif /* Method for multithreading */ +#endif /* MULTITHREAD>1 */ + ee_u8 portable_id; +} core_portable; + +/* target specific init/fini */ +void portable_init(core_portable *p, int *argc, char *argv[]); +void portable_fini(core_portable *p); + +#if (SEED_METHOD==SEED_VOLATILE) + #if (VALIDATION_RUN || PERFORMANCE_RUN || PROFILE_RUN) + #define RUN_TYPE_FLAG 1 + #else + #if (TOTAL_DATA_SIZE==1200) + #define PROFILE_RUN 1 + #else + #define PERFORMANCE_RUN 1 + #endif + #endif +#endif /* SEED_METHOD==SEED_VOLATILE */ + +#endif /* CORE_PORTME_H */ diff --git a/tests/riscv-coremark/riscv64/core_portme.mak b/tests/riscv-coremark/riscv64/core_portme.mak new file mode 100755 index 000000000..edc341abc --- /dev/null +++ b/tests/riscv-coremark/riscv64/core_portme.mak @@ -0,0 +1,147 @@ +# Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Original Author: Shay Gal-on + +#File: core_portme.mak + +# Flag: RISCVTOOLS +# Use this flag to point to your RISCV tools +RISCVTOOLS=$(RISCV) +# Flag: RISCVTYPE +# Type of toolchain to use +RISCVTYPE=riscv64-unknown-elf +# Flag: OUTFLAG +# Use this flag to define how to to get an executable (e.g -o) +OUTFLAG= -o +# Flag: CC +# Use this flag to define compiler to use +CC = $(RISCVTOOLS)/bin/$(RISCVTYPE)-gcc +# Flag: CFLAGS +# Use this flag to define compiler options. Note, you can add compiler options from the command line using XCFLAGS="other flags" +#PORT_CFLAGS = -O2 -static -std=gnu99 +PORT_CFLAGS = -O2 +FLAGS_STR = "$(PORT_CFLAGS) $(XCFLAGS) $(XLFLAGS) $(LFLAGS_END)" +CFLAGS = $(PORT_CFLAGS) -I$(PORT_DIR) -I. -DFLAGS_STR=\"$(FLAGS_STR)\" +#Flag: LFLAGS_END +# Define any libraries needed for linking or other flags that should come at the end of the link line (e.g. linker scripts). +# Note: On certain platforms, the default clock_gettime implementation is supported but requires linking of librt. +LFLAGS_END += +# Flag: PORT_SRCS +# Port specific source files can be added here +PORT_SRCS = $(PORT_DIR)/core_portme.c +# Flag: LOAD +# Define this flag if you need to load to a target, as in a cross compile environment. + +# Flag: RUN +# Define this flag if running does not consist of simple invocation of the binary. +# In a cross compile environment, you need to define this. + +#For flashing and using a tera term macro, you could use +#LOAD = flash ADDR +#RUN = ttpmacro coremark.ttl + +#For copying to target and executing via SSH connection, you could use +#LOAD = scp $(OUTFILE) user@target:~ +#RUN = ssh user@target -c + +#For native compilation and execution +LOAD = echo Loading done +RUN = spike pk + +OEXT = .o +EXE = .riscv + +# Flag: SEPARATE_COMPILE +# Define if you need to separate compilation from link stage. +# In this case, you also need to define below how to create an object file, and how to link. +ifdef SEPARATE_COMPILE + +LD = $(RISCVTOOLS)/bin/$(RISCVTYPE)-gcc +OBJOUT = -o +LFLAGS = +OFLAG = -o +COUT = -c +# Flag: PORT_OBJS +# Port specific object files can be added here +PORT_OBJS = $(PORT_DIR)/core_portme$(OEXT) +PORT_CLEAN = *$(OEXT) + +$(OPATH)%$(OEXT) : %.c + $(CC) $(CFLAGS) $(XCFLAGS) $(COUT) $< $(OBJOUT) $@ + +endif + +# Target: port_prebuild +# Generate any files that are needed before actual build starts. +# E.g. generate profile guidance files. Sample PGO generation for gcc enabled with PGO=1 +# - First, check if PGO was defined on the command line, if so, need to add -fprofile-use to compile line. +# - Second, if PGO reference has not yet been generated, add a step to the prebuild that will build a profile-generate version and run it. +# Note - Using REBUILD=1 +# +# Use make PGO=1 to invoke this sample processing. + +ifdef PGO + ifeq (,$(findstring $(PGO),gen)) + PGO_STAGE=build_pgo_gcc + CFLAGS+=-fprofile-use + endif + PORT_CLEAN+=*.gcda *.gcno gmon.out +endif + +.PHONY: port_prebuild +port_prebuild: $(PGO_STAGE) + +.PHONY: build_pgo_gcc +build_pgo_gcc: + $(MAKE) PGO=gen XCFLAGS="$(XCFLAGS) -fprofile-generate -DTOTAL_DATA_SIZE=1200" ITERATIONS=10 gen_pgo_data REBUILD=1 + +# Target: port_postbuild +# Generate any files that are needed after actual build end. +# E.g. change format to srec, bin, zip in order to be able to load into flash +.PHONY: port_postbuild +port_postbuild: + +# Target: port_postrun +# Do platform specific after run stuff. +# E.g. reset the board, backup the logfiles etc. +.PHONY: port_postrun +port_postrun: + +# Target: port_prerun +# Do platform specific after run stuff. +# E.g. reset the board, backup the logfiles etc. +.PHONY: port_prerun +port_prerun: + +# Target: port_postload +# Do platform specific after load stuff. +# E.g. reset the reset power to the flash eraser +.PHONY: port_postload +port_postload: + +# Target: port_preload +# Do platform specific before load stuff. +# E.g. reset the reset power to the flash eraser +.PHONY: port_preload +port_preload: + +# FLAG: OPATH +# Path to the output folder. Default - current folder. +OPATH = ./ +MKDIR = mkdir -p + +# FLAG: PERL +# Define perl executable to calculate the geomean if running separate. +PERL=/usr/bin/perl diff --git a/tests/riscv-coremark/trace b/tests/riscv-coremark/trace new file mode 100644 index 000000000..7c76d0bfa --- /dev/null +++ b/tests/riscv-coremark/trace @@ -0,0 +1,48 @@ +Imperas riscvOVPsimPlus + + +riscvOVPsimPlus (64-Bit) v20210329.0 Open Virtual Platform simulator from www.IMPERAS.com. +Copyright (c) 2005-2021 Imperas Software Ltd. Contains Imperas Proprietary Information. +Licensed Software, All Rights Reserved. +Visit www.IMPERAS.com for multicore debug, verification and analysis solutions. + +riscvOVPsimPlus started: Wed May 12 17:55:33 2021 + + +Info (GDBT_PORT) Host: Tera.Eng.HMC.Edu, Port: 55460 +Info (DBC_LGDB) Starting Debugger /cad/riscv/imperas-riscv-tests/riscv-ovpsim-plus/bin/Linux64/riscv-none-embed-gdb +Info (GDBT_WAIT) Waiting for remote debugger to connect... +Info (OR_OF) Target 'riscvOVPsim/cpu' has object file read from 'coremark.bare.riscv' +Info (OR_PH) Program Headers: +Info (OR_PH) Type Offset VirtAddr PhysAddr +Info (OR_PH) FileSiz MemSiz Flags Align +Info (OR_PD) LOAD 0x0000000000001000 0x0000000080000000 0x0000000080000000 +Info (OR_PD) 0x0000000000000204 0x0000000000000204 R-E 1000 +Info (OR_PD) LOAD 0x0000000000002000 0x0000000080001000 0x0000000080001000 +Info (OR_PD) 0x00000000000047e0 0x0000000000004ff0 RWE 1000 +Info (GDBT_CONNECTED) Client connected +Info (GDBT_GON) Client disappeared 'riscvOVPsim/cpu' +Info +Info --------------------------------------------------- +Info CPU 'riscvOVPsim/cpu' STATISTICS +Info Type : riscv (RV64GC) +Info Nominal MIPS : 100 +Info Final program counter : 0x80003558 +Info Simulated instructions: 1,455,608 +Info Simulated MIPS : 0.0 +Info --------------------------------------------------- +Info +Info --------------------------------------------------- +Info SIMULATION TIME STATISTICS +Info Simulated time : 0.02 seconds +Info User time : 99.23 seconds +Info System time : 254.08 seconds +Info Elapsed time : 1107.49 seconds +Info --------------------------------------------------- + +riscvOVPsimPlus finished: Wed May 12 18:14:04 2021 + + +riscvOVPsimPlus (64-Bit) v20210329.0 Open Virtual Platform simulator from www.IMPERAS.com. +Visit www.IMPERAS.com for multicore debug, verification and analysis solutions. + diff --git a/tests/riscv-coremark/transferobjdump.sh b/tests/riscv-coremark/transferobjdump.sh new file mode 100755 index 000000000..69578566a --- /dev/null +++ b/tests/riscv-coremark/transferobjdump.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash +./build-coremark.sh + +riscv64-unknown-elf-objdump -D coremark.bare.riscv > coremarkcodemod.bare.riscv.objdump +cp coremarkcodemod.bare.riscv.objdump ~/riscv-wally/tests/imperas-riscv-tests/riscv-ovpsim-plus/examples/CoreMark/. +pushd ~/riscv-wally/tests/imperas-riscv-tests/riscv-ovpsim-plus/examples/CoreMark +./exe2memfile.pl coremarkcodemod.bare.riscv +popd diff --git a/toy/riscvpipelined.sv b/toy/riscvpipelined.sv deleted file mode 100644 index 74290a2db..000000000 --- a/toy/riscvpipelined.sv +++ /dev/null @@ -1,570 +0,0 @@ -// riscvpipelined.sv - -// RISC-V pipelined processor -// From Section 7.6 of Digital Design & Computer Architecture: RISC-V Edition -// 27 April 2020 -// David_Harris@hmc.edu -// Sarah.Harris@unlv.edu - -// run 210 -// Expect simulator to print "Simulation succeeded" -// when the value 25 (0x19) is written to address 100 (0x64) - -// Pipelined implementation of RISC-V (RV32I) -// User-level Instruction Set Architecture V2.2 (May 7, 2017) -// Implements a subset of the base integer instructions: -// lw, sw -// add, sub, and, or, slt, -// addi, andi, ori, slti -// beq -// jal -// Exceptions, traps, and interrupts not implemented -// little-endian memory - -// 31 32-bit registers x1-x31, x0 hardwired to 0 -// R-Type instructions -// add, sub, and, or, slt -// INSTR rd, rs1, rs2 -// Instr[31:25] = funct7 (funct7b5 & opb5 = 1 for sub, 0 for others) -// Instr[24:20] = rs2 -// Instr[19:15] = rs1 -// Instr[14:12] = funct3 -// Instr[11:7] = rd -// Instr[6:0] = opcode -// I-Type Instructions -// lw, I-type ALU (addi, andi, ori, slti) -// lw: INSTR rd, imm(rs1) -// I-type ALU: INSTR rd, rs1, imm (12-bit signed) -// Instr[31:20] = imm[11:0] -// Instr[24:20] = rs2 -// Instr[19:15] = rs1 -// Instr[14:12] = funct3 -// Instr[11:7] = rd -// Instr[6:0] = opcode -// S-Type Instruction -// sw rs2, imm(rs1) (store rs2 into address specified by rs1 + immm) -// Instr[31:25] = imm[11:5] (offset[11:5]) -// Instr[24:20] = rs2 (src) -// Instr[19:15] = rs1 (base) -// Instr[14:12] = funct3 -// Instr[11:7] = imm[4:0] (offset[4:0]) -// Instr[6:0] = opcode -// B-Type Instruction -// beq rs1, rs2, imm (PCTarget = PC + (signed imm x 2)) -// Instr[31:25] = imm[12], imm[10:5] -// Instr[24:20] = rs2 -// Instr[19:15] = rs1 -// Instr[14:12] = funct3 -// Instr[11:7] = imm[4:1], imm[11] -// Instr[6:0] = opcode -// J-Type Instruction -// jal rd, imm (signed imm is multiplied by 2 and added to PC, rd = PC+4) -// Instr[31:12] = imm[20], imm[10:1], imm[11], imm[19:12] -// Instr[11:7] = rd -// Instr[6:0] = opcode - -// Instruction opcode funct3 funct7 -// add 0110011 000 0000000 -// sub 0110011 000 0100000 -// and 0110011 111 0000000 -// or 0110011 110 0000000 -// slt 0110011 010 0000000 -// addi 0010011 000 immediate -// andi 0010011 111 immediate -// ori 0010011 110 immediate -// slti 0010011 010 immediate -// beq 1100011 000 immediate -// lw 0000011 010 immediate -// sw 0100011 010 immediate -// jal 1101111 immediate immediate - -module testbench(); - - logic clk; - logic reset; - - logic [31:0] WriteData, DataAdr; - logic MemWrite; - - // instantiate device to be tested - top dut(clk, reset, WriteData, DataAdr, MemWrite); - - // initialize test - initial - begin - reset <= 1; # 22; reset <= 0; - end - - // generate clock to sequence tests - always - begin - clk <= 1; # 5; clk <= 0; # 5; - end - - // check results - always @(negedge clk) - begin - if(MemWrite) begin - if(DataAdr === 100 & WriteData === 25) begin - $display("Simulation succeeded"); - $stop; - end else if (DataAdr !== 96) begin - $display("Simulation failed"); - $stop; - end - end - end -endmodule - -module top(input logic clk, reset, - output logic [31:0] WriteDataM, DataAdrM, - output logic MemWriteM); - - logic [31:0] PCF, InstrF, ReadDataM; - - // instantiate processor and memories - riscv riscv(clk, reset, PCF, InstrF, MemWriteM, DataAdrM, - WriteDataM, ReadDataM); - imem imem(PCF, InstrF); - dmem dmem(clk, MemWriteM, DataAdrM, WriteDataM, ReadDataM); -endmodule - -module riscv(input logic clk, reset, - output logic [31:0] PCF, - input logic [31:0] InstrF, - output logic MemWriteM, - output logic [31:0] ALUResultM, WriteDataM, - input logic [31:0] ReadDataM); - - logic [6:0] opD; - logic [2:0] funct3D; - logic funct7b5D; - logic [1:0] ImmSrcD; - logic ZeroE; - logic PCSrcE; - logic [2:0] ALUControlE; - logic ALUSrcE; - logic ResultSrcEb0; - logic RegWriteM; - logic [1:0] ResultSrcW; - logic RegWriteW; - - logic [1:0] ForwardAE, ForwardBE; - logic StallF, StallD, FlushD, FlushE; - - logic [4:0] Rs1D, Rs2D, Rs1E, Rs2E, RdE, RdM, RdW; - - controller c(clk, reset, - opD, funct3D, funct7b5D, ImmSrcD, - FlushE, ZeroE, PCSrcE, ALUControlE, ALUSrcE, ResultSrcEb0, - MemWriteM, RegWriteM, - RegWriteW, ResultSrcW); - - datapath dp(clk, reset, - StallF, PCF, InstrF, - opD, funct3D, funct7b5D, StallD, FlushD, ImmSrcD, - FlushE, ForwardAE, ForwardBE, PCSrcE, ALUControlE, ALUSrcE, ZeroE, - MemWriteM, WriteDataM, ALUResultM, ReadDataM, - RegWriteW, ResultSrcW, - Rs1D, Rs2D, Rs1E, Rs2E, RdE, RdM, RdW); - - hazard hu(Rs1D, Rs2D, Rs1E, Rs2E, RdE, RdM, RdW, - PCSrcE, ResultSrcEb0, RegWriteM, RegWriteW, - ForwardAE, ForwardBE, StallF, StallD, FlushD, FlushE); -endmodule - - -module controller(input logic clk, reset, - // Decode stage control signals - input logic [6:0] opD, - input logic [2:0] funct3D, - input logic funct7b5D, - output logic [1:0] ImmSrcD, - // Execute stage control signals - input logic FlushE, - input logic ZeroE, - output logic PCSrcE, // for datapath and Hazard Unit - output logic [2:0] ALUControlE, - output logic ALUSrcE, - output logic ResultSrcEb0, // for Hazard Unit - // Memory stage control signals - output logic MemWriteM, - output logic RegWriteM, // for Hazard Unit - // Writeback stage control signals - output logic RegWriteW, // for datapath and Hazard Unit - output logic [1:0] ResultSrcW); - - // pipelined control signals - logic RegWriteD, RegWriteE; - logic [1:0] ResultSrcD, ResultSrcE, ResultSrcM; - logic MemWriteD, MemWriteE; - logic JumpD, JumpE; - logic BranchD, BranchE; - logic [1:0] ALUOpD; - logic [2:0] ALUControlD; - logic ALUSrcD; - - // Decode stage logic - maindec md(opD, ResultSrcD, MemWriteD, BranchD, - ALUSrcD, RegWriteD, JumpD, ImmSrcD, ALUOpD); - aludec ad(opD[5], funct3D, funct7b5D, ALUOpD, ALUControlD); - - // Execute stage pipeline control register and logic - floprc #(10) controlregE(clk, reset, FlushE, - {RegWriteD, ResultSrcD, MemWriteD, JumpD, BranchD, ALUControlD, ALUSrcD}, - {RegWriteE, ResultSrcE, MemWriteE, JumpE, BranchE, ALUControlE, ALUSrcE}); - - assign PCSrcE = (BranchE & ZeroE) | JumpE; - assign ResultSrcEb0 = ResultSrcE[0]; - - // Memory stage pipeline control register - flopr #(4) controlregM(clk, reset, - {RegWriteE, ResultSrcE, MemWriteE}, - {RegWriteM, ResultSrcM, MemWriteM}); - - // Writeback stage pipeline control register - flopr #(3) controlregW(clk, reset, - {RegWriteM, ResultSrcM}, - {RegWriteW, ResultSrcW}); -endmodule - -module maindec(input logic [6:0] op, - output logic [1:0] ResultSrc, - output logic MemWrite, - output logic Branch, ALUSrc, - output logic RegWrite, Jump, - output logic [1:0] ImmSrc, - output logic [1:0] ALUOp); - - logic [10:0] controls; - - assign {RegWrite, ImmSrc, ALUSrc, MemWrite, - ResultSrc, Branch, ALUOp, Jump} = controls; - - always_comb - case(op) - // RegWrite_ImmSrc_ALUSrc_MemWrite_ResultSrc_Branch_ALUOp_Jump - 7'b0000011: controls = 11'b1_00_1_0_01_0_00_0; // lw - 7'b0100011: controls = 11'b0_01_1_1_00_0_00_0; // sw - 7'b0110011: controls = 11'b1_xx_0_0_00_0_10_0; // R-type - 7'b1100011: controls = 11'b0_10_0_0_00_1_01_0; // beq - 7'b0010011: controls = 11'b1_00_1_0_00_0_10_0; // I-type ALU - 7'b1101111: controls = 11'b1_11_0_0_10_0_00_1; // jal - 7'b0000000: controls = 11'b0_00_0_0_00_0_00_0; // need valid values at reset - default: controls = 11'bx_xx_x_x_xx_x_xx_x; // non-implemented instruction - endcase -endmodule - -module aludec(input logic opb5, - input logic [2:0] funct3, - input logic funct7b5, - input logic [1:0] ALUOp, - output logic [2:0] ALUControl); - - logic RtypeSub; - assign RtypeSub = funct7b5 & opb5; // TRUE for R-type subtract instruction - - always_comb - case(ALUOp) - 2'b00: ALUControl = 3'b000; // addition - 2'b01: ALUControl = 3'b001; // subtraction - default: case(funct3) // R-type or I-type ALU - 3'b000: if (RtypeSub) - ALUControl = 3'b001; // sub - else - ALUControl = 3'b000; // add, addi - 3'b010: ALUControl = 3'b101; // slt, slti - 3'b110: ALUControl = 3'b011; // or, ori - 3'b111: ALUControl = 3'b010; // and, andi - default: ALUControl = 3'bxxx; // ??? - endcase - endcase -endmodule - -module datapath(input logic clk, reset, - // Fetch stage signals - input logic StallF, - output logic [31:0] PCF, - input logic [31:0] InstrF, - // Decode stage signals - output logic [6:0] opD, - output logic [2:0] funct3D, - output logic funct7b5D, - input logic StallD, FlushD, - input logic [1:0] ImmSrcD, - // Execute stage signals - input logic FlushE, - input logic [1:0] ForwardAE, ForwardBE, - input logic PCSrcE, - input logic [2:0] ALUControlE, - input logic ALUSrcE, - output logic ZeroE, - // Memory stage signals - input logic MemWriteM, - output logic [31:0] WriteDataM, ALUResultM, - input logic [31:0] ReadDataM, - // Writeback stage signals - input logic RegWriteW, - input logic [1:0] ResultSrcW, - // Hazard Unit signals - output logic [4:0] Rs1D, Rs2D, Rs1E, Rs2E, - output logic [4:0] RdE, RdM, RdW); - - // Fetch stage signals - logic [31:0] PCNextF, PCPlus4F; - // Decode stage signals - logic [31:0] InstrD; - logic [31:0] PCD, PCPlus4D; - logic [31:0] RD1D, RD2D; - logic [31:0] ImmExtD; - logic [4:0] RdD; - // Execute stage signals - logic [31:0] RD1E, RD2E; - logic [31:0] PCE, ImmExtE; - logic [31:0] SrcAE, SrcBE; - logic [31:0] ALUResultE; - logic [31:0] WriteDataE; - logic [31:0] PCPlus4E; - logic [31:0] PCTargetE; - // Memory stage signals - logic [31:0] PCPlus4M; - // Writeback stage signals - logic [31:0] ALUResultW; - logic [31:0] ReadDataW; - logic [31:0] PCPlus4W; - logic [31:0] ResultW; - - // Fetch stage pipeline register and logic - mux2 #(32) pcmux(PCPlus4F, PCTargetE, PCSrcE, PCNextF); - flopenr #(32) pcreg(clk, reset, ~StallF, PCNextF, PCF); - adder pcadd(PCF, 32'h4, PCPlus4F); - - // Decode stage pipeline register and logic - flopenrc #(96) regD(clk, reset, FlushD, ~StallD, - {InstrF, PCF, PCPlus4F}, - {InstrD, PCD, PCPlus4D}); - assign opD = InstrD[6:0]; - assign funct3D = InstrD[14:12]; - assign funct7b5D = InstrD[30]; - assign Rs1D = InstrD[19:15]; - assign Rs2D = InstrD[24:20]; - assign RdD = InstrD[11:7]; - - regfile rf(clk, RegWriteW, Rs1D, Rs2D, RdW, ResultW, RD1D, RD2D); - extend ext(InstrD[31:7], ImmSrcD, ImmExtD); - - // Execute stage pipeline register and logic - floprc #(175) regE(clk, reset, FlushE, - {RD1D, RD2D, PCD, Rs1D, Rs2D, RdD, ImmExtD, PCPlus4D}, - {RD1E, RD2E, PCE, Rs1E, Rs2E, RdE, ImmExtE, PCPlus4E}); - - mux3 #(32) faemux(RD1E, ResultW, ALUResultM, ForwardAE, SrcAE); - mux3 #(32) fbemux(RD2E, ResultW, ALUResultM, ForwardBE, WriteDataE); - mux2 #(32) srcbmux(WriteDataE, ImmExtE, ALUSrcE, SrcBE); - alu alu(SrcAE, SrcBE, ALUControlE, ALUResultE, ZeroE); - adder branchadd(ImmExtE, PCE, PCTargetE); - - // Memory stage pipeline register - flopr #(101) regM(clk, reset, - {ALUResultE, WriteDataE, RdE, PCPlus4E}, - {ALUResultM, WriteDataM, RdM, PCPlus4M}); - - // Writeback stage pipeline register and logic - flopr #(101) regW(clk, reset, - {ALUResultM, ReadDataM, RdM, PCPlus4M}, - {ALUResultW, ReadDataW, RdW, PCPlus4W}); - mux3 #(32) resultmux(ALUResultW, ReadDataW, PCPlus4W, ResultSrcW, ResultW); -endmodule - -// Hazard Unit: forward, stall, and flush -module hazard(input logic [4:0] Rs1D, Rs2D, Rs1E, Rs2E, RdE, RdM, RdW, - input logic PCSrcE, ResultSrcEb0, - input logic RegWriteM, RegWriteW, - output logic [1:0] ForwardAE, ForwardBE, - output logic StallF, StallD, FlushD, FlushE); - - logic lwStallD; - - // forwarding logic - always_comb begin - ForwardAE = 2'b00; - ForwardBE = 2'b00; - if (Rs1E != 5'b0) - if ((Rs1E == RdM) & RegWriteM) ForwardAE = 2'b10; - else if ((Rs1E == RdW) & RegWriteW) ForwardAE = 2'b01; - - if (Rs2E != 5'b0) - if ((Rs2E == RdM) & RegWriteM) ForwardBE = 2'b10; - else if ((Rs2E == RdW) & RegWriteW) ForwardBE = 2'b01; - end - - // stalls and flushes - assign lwStallD = ResultSrcEb0 & ((Rs1D == RdE) | (Rs2D == RdE)); - assign StallD = lwStallD; - assign StallF = lwStallD; - assign FlushD = PCSrcE; - assign FlushE = lwStallD | PCSrcE; -endmodule - -module regfile(input logic clk, - input logic we3, - input logic [ 4:0] a1, a2, a3, - input logic [31:0] wd3, - output logic [31:0] rd1, rd2); - - logic [31:0] rf[31:0]; - - // three ported register file - // read two ports combinationally (A1/RD1, A2/RD2) - // write third port on rising edge of clock (A3/WD3/WE3) - // write occurs on falling edge of clock - // register 0 hardwired to 0 - - always_ff @(negedge clk) - if (we3) rf[a3] <= wd3; - - assign rd1 = (a1 != 0) ? rf[a1] : 0; - assign rd2 = (a2 != 0) ? rf[a2] : 0; -endmodule - -module adder(input [31:0] a, b, - output [31:0] y); - - assign y = a + b; -endmodule - -module extend(input logic [31:7] instr, - input logic [1:0] immsrc, - output logic [31:0] immext); - - always_comb - case(immsrc) - // I-type - 2'b00: immext = {{20{instr[31]}}, instr[31:20]}; - // S-type (stores) - 2'b01: immext = {{20{instr[31]}}, instr[31:25], instr[11:7]}; - // B-type (branches) - 2'b10: immext = {{20{instr[31]}}, instr[7], instr[30:25], instr[11:8], 1'b0}; - // J-type (jal) - 2'b11: immext = {{12{instr[31]}}, instr[19:12], instr[20], instr[30:21], 1'b0}; - default: immext = 32'bx; // undefined - endcase -endmodule - -module flopr #(parameter WIDTH = 8) - (input logic clk, reset, - input logic [WIDTH-1:0] d, - output logic [WIDTH-1:0] q); - - always_ff @(posedge clk, posedge reset) - if (reset) q <= 0; - else q <= d; -endmodule - -module flopenr #(parameter WIDTH = 8) - (input logic clk, reset, en, - input logic [WIDTH-1:0] d, - output logic [WIDTH-1:0] q); - - always_ff @(posedge clk, posedge reset) - if (reset) q <= 0; - else if (en) q <= d; -endmodule - -module flopenrc #(parameter WIDTH = 8) - (input logic clk, reset, clear, en, - input logic [WIDTH-1:0] d, - output logic [WIDTH-1:0] q); - - always_ff @(posedge clk, posedge reset) - if (reset) q <= 0; - else if (en) - if (clear) q <= 0; - else q <= d; -endmodule - -module floprc #(parameter WIDTH = 8) - (input logic clk, - input logic reset, - input logic clear, - input logic [WIDTH-1:0] d, - output logic [WIDTH-1:0] q); - - always_ff @(posedge clk, posedge reset) - if (reset) q <= 0; - else - if (clear) q <= 0; - else q <= d; -endmodule - -module mux2 #(parameter WIDTH = 8) - (input logic [WIDTH-1:0] d0, d1, - input logic s, - output logic [WIDTH-1:0] y); - - assign y = s ? d1 : d0; -endmodule - -module mux3 #(parameter WIDTH = 8) - (input logic [WIDTH-1:0] d0, d1, d2, - input logic [1:0] s, - output logic [WIDTH-1:0] y); - - assign y = s[1] ? d2 : (s[0] ? d1 : d0); -endmodule - -module imem(input logic [31:0] a, - output logic [31:0] rd); - - logic [31:0] RAM[63:0]; - - initial - $readmemh("riscvtest.txt",RAM); - - assign rd = RAM[a[31:2]]; // word aligned -endmodule - -module dmem(input logic clk, we, - input logic [31:0] a, wd, - output logic [31:0] rd); - - logic [31:0] RAM[63:0]; - - assign rd = RAM[a[31:2]]; // word aligned - - always_ff @(posedge clk) - if (we) RAM[a[31:2]] <= wd; -endmodule - -module alu(input logic [31:0] a, b, - input logic [2:0] alucontrol, - output logic [31:0] result, - output logic zero); - - logic [31:0] condinvb, sum; - logic v; // overflow - logic isAddSub; // true when is add or subtract operation - - assign condinvb = alucontrol[0] ? ~b : b; - assign sum = a + condinvb + alucontrol[0]; - assign isAddSub = ~alucontrol[2] & ~alucontrol[1] | - ~alucontrol[1] & alucontrol[0]; - - always_comb - case (alucontrol) - 3'b000: result = sum; // add - 3'b001: result = sum; // subtract - 3'b010: result = a & b; // and - 3'b011: result = a | b; // or - 3'b100: result = a ^ b; // xor - 3'b101: result = sum[31] ^ v; // slt - 3'b110: result = a << b[4:0]; // sll - 3'b111: result = a >> b[4:0]; // srl - default: result = 32'bx; - endcase - - assign zero = (result == 32'b0); - assign v = ~(alucontrol[0] ^ a[31] ^ b[31]) & (a[31] ^ sum[31]) & isAddSub; - -endmodule - diff --git a/toy/riscvsingle.do b/toy/riscvsingle.do deleted file mode 100644 index d09f1728b..000000000 --- a/toy/riscvsingle.do +++ /dev/null @@ -1,37 +0,0 @@ -# riscv-single.do -# -# Simulate with vsim -do riscvsingle.do - -# run with vsim -do "do wally-pipelined.do rv64ic riscvarchtest-64m" - -#onbreak {resume} - -# create library -if [file exists work] { - vdel -all -} -vlib work - -vlog -lint riscvsingle.sv -vopt +acc work.testbench -o workopt -vsim workopt - -view wave --- display input and output signals as hexadecimal values -add wave -noupdate /testbench/clk -add wave -noupdate /testbench/reset -add wave -divider "Main Datapath" -add wave -noupdate /testbench/dut/PC -add wave -noupdate /testbench/dut/Instr -add wave -noupdate /testbench/dut/rvsingle/dp/SrcA -add wave -noupdate /testbench/dut/rvsingle/dp/SrcB -add wave -noupdate /testbench/dut/rvsingle/dp/Result -add wave -divider "Memory Bus" -add wave -noupdate /testbench/MemWrite -add wave -noupdate /testbench/DataAdr -add wave -noupdate /testbench/WriteData -add wave -noupdate /testbench/dut/ReadData - --- Run the Simulation -run -all -view wave diff --git a/toy/riscvsingle.sv b/toy/riscvsingle.sv deleted file mode 100644 index 4c4d99b5a..000000000 --- a/toy/riscvsingle.sv +++ /dev/null @@ -1,384 +0,0 @@ -// riscvsingle.sv - -// RISC-V single-cycle processor -// From Section 7.6 of Digital Design & Computer Architecture -// 27 April 2020 -// David_Harris@hmc.edu -// Sarah.Harris@unlv.edu - -// run 210 -// Expect simulator to print "Simulation succeeded" -// when the value 25 (0x19) is written to address 100 (0x64) - -// Single-cycle implementation of RISC-V (RV32I) -// User-level Instruction Set Architecture V2.2 (May 7, 2017) -// Implements a subset of the base integer instructions: -// lw, sw -// add, sub, and, or, slt, -// addi, andi, ori, slti -// beq -// jal -// Exceptions, traps, and interrupts not implemented -// little-endian memory - -// 31 32-bit registers x1-x31, x0 hardwired to 0 -// R-Type instructions -// add, sub, and, or, slt -// INSTR rd, rs1, rs2 -// Instr[31:25] = funct7 (funct7b5 & opb5 = 1 for sub, 0 for others) -// Instr[24:20] = rs2 -// Instr[19:15] = rs1 -// Instr[14:12] = funct3 -// Instr[11:7] = rd -// Instr[6:0] = opcode -// I-Type Instructions -// lw, I-type ALU (addi, andi, ori, slti) -// lw: INSTR rd, imm(rs1) -// I-type ALU: INSTR rd, rs1, imm (12-bit signed) -// Instr[31:20] = imm[11:0] -// Instr[24:20] = rs2 -// Instr[19:15] = rs1 -// Instr[14:12] = funct3 -// Instr[11:7] = rd -// Instr[6:0] = opcode -// S-Type Instruction -// sw rs2, imm(rs1) (store rs2 into address specified by rs1 + immm) -// Instr[31:25] = imm[11:5] (offset[11:5]) -// Instr[24:20] = rs2 (src) -// Instr[19:15] = rs1 (base) -// Instr[14:12] = funct3 -// Instr[11:7] = imm[4:0] (offset[4:0]) -// Instr[6:0] = opcode -// B-Type Instruction -// beq rs1, rs2, imm (PCTarget = PC + (signed imm x 2)) -// Instr[31:25] = imm[12], imm[10:5] -// Instr[24:20] = rs2 -// Instr[19:15] = rs1 -// Instr[14:12] = funct3 -// Instr[11:7] = imm[4:1], imm[11] -// Instr[6:0] = opcode -// J-Type Instruction -// jal rd, imm (signed imm is multiplied by 2 and added to PC, rd = PC+4) -// Instr[31:12] = imm[20], imm[10:1], imm[11], imm[19:12] -// Instr[11:7] = rd -// Instr[6:0] = opcode - -// Instruction opcode funct3 funct7 -// add 0110011 000 0000000 -// sub 0110011 000 0100000 -// and 0110011 111 0000000 -// or 0110011 110 0000000 -// slt 0110011 010 0000000 -// addi 0010011 000 immediate -// andi 0010011 111 immediate -// ori 0010011 110 immediate -// slti 0010011 010 immediate -// beq 1100011 000 immediate -// lw 0000011 010 immediate -// sw 0100011 010 immediate -// jal 1101111 immediate immediate - -module testbench; - - logic clk; - logic reset; - - logic [31:0] WriteData, DataAdr; - logic MemWrite; - - // instantiate device to be tested - top dut(clk, reset, WriteData, DataAdr, MemWrite); - - // initialize test - initial - begin - reset <= 1; # 22; reset <= 0; - end - - // generate clock to sequence tests - always - begin - clk <= 1; # 5; clk <= 0; # 5; - end - - // check results - always @(negedge clk) - begin - if(MemWrite) begin - if(DataAdr === 100 & WriteData === 25) begin - $display("Simulation succeeded"); - $stop; - end else if (DataAdr !== 96) begin - $display("Simulation failed"); - $stop; - end - end - end -endmodule - -module top(input logic clk, reset, - output logic [31:0] WriteData, DataAdr, - output logic MemWrite); - - logic [31:0] PC, Instr, ReadData; - - // instantiate processor and memories - riscvsingle rvsingle(clk, reset, PC, Instr, MemWrite, DataAdr, - WriteData, ReadData); - imem imem(PC, Instr); - dmem dmem(clk, MemWrite, DataAdr, WriteData, ReadData); -endmodule - -module riscvsingle(input logic clk, reset, - output logic [31:0] PC, - input logic [31:0] Instr, - output logic MemWrite, - output logic [31:0] ALUResult, WriteData, - input logic [31:0] ReadData); - - logic ALUSrc, RegWrite, Jump, Zero, PCSrc; - logic [1:0] ResultSrc, ImmSrc; - logic [2:0] ALUControl; - - controller c(Instr[6:0], Instr[14:12], Instr[30], Zero, - ResultSrc, MemWrite, PCSrc, - ALUSrc, RegWrite, Jump, - ImmSrc, ALUControl); - datapath dp(clk, reset, ResultSrc, PCSrc, - ALUSrc, RegWrite, - ImmSrc, ALUControl, - Zero, PC, Instr, - ALUResult, WriteData, ReadData); -endmodule - -module controller(input logic [6:0] op, - input logic [2:0] funct3, - input logic funct7b5, - input logic Zero, - output logic [1:0] ResultSrc, - output logic MemWrite, - output logic PCSrc, ALUSrc, - output logic RegWrite, Jump, - output logic [1:0] ImmSrc, - output logic [2:0] ALUControl); - - logic [1:0] ALUOp; - logic Branch; - - maindec md(op, ResultSrc, MemWrite, Branch, - ALUSrc, RegWrite, Jump, ImmSrc, ALUOp); - aludec ad(op[5], funct3, funct7b5, ALUOp, ALUControl); - - assign PCSrc = Branch & Zero | Jump; -endmodule - -module maindec(input logic [6:0] op, - output logic [1:0] ResultSrc, - output logic MemWrite, - output logic Branch, ALUSrc, - output logic RegWrite, Jump, - output logic [1:0] ImmSrc, - output logic [1:0] ALUOp); - - logic [10:0] controls; - - assign {RegWrite, ImmSrc, ALUSrc, MemWrite, - ResultSrc, Branch, ALUOp, Jump} = controls; - - always_comb - case(op) - // RegWrite_ImmSrc_ALUSrc_MemWrite_ResultSrc_Branch_ALUOp_Jump - 7'b0000011: controls = 11'b1_00_1_0_01_0_00_0; // lw - 7'b0100011: controls = 11'b0_01_1_1_00_0_00_0; // sw - 7'b0110011: controls = 11'b1_xx_0_0_00_0_10_0; // R-type - 7'b1100011: controls = 11'b0_10_0_0_00_1_01_0; // beq - 7'b0010011: controls = 11'b1_00_1_0_00_0_10_0; // I-type ALU - 7'b1101111: controls = 11'b1_11_0_0_10_0_00_1; // jal - default: controls = 11'bx_xx_x_x_xx_x_xx_x; // non-implemented instruction - endcase -endmodule - -module aludec(input logic opb5, - input logic [2:0] funct3, - input logic funct7b5, - input logic [1:0] ALUOp, - output logic [2:0] ALUControl); - - logic RtypeSub; - assign RtypeSub = funct7b5 & opb5; // TRUE for R-type subtract instruction - - always_comb - case(ALUOp) - 2'b00: ALUControl = 3'b000; // addition - 2'b01: ALUControl = 3'b001; // subtraction - default: case(funct3) // R-type or I-type ALU - 3'b000: if (RtypeSub) - ALUControl = 3'b001; // sub - else - ALUControl = 3'b000; // add, addi - 3'b010: ALUControl = 3'b101; // slt, slti - 3'b110: ALUControl = 3'b011; // or, ori - 3'b111: ALUControl = 3'b010; // and, andi - default: ALUControl = 3'bxxx; // ??? - endcase - endcase -endmodule - -module datapath(input logic clk, reset, - input logic [1:0] ResultSrc, - input logic PCSrc, ALUSrc, - input logic RegWrite, - input logic [1:0] ImmSrc, - input logic [2:0] ALUControl, - output logic Zero, - output logic [31:0] PC, - input logic [31:0] Instr, - output logic [31:0] ALUResult, WriteData, - input logic [31:0] ReadData); - - logic [31:0] PCNext, PCPlus4, PCTarget; - logic [31:0] ImmExt; - logic [31:0] SrcA, SrcB; - logic [31:0] Result; - - // next PC logic - flopr #(32) pcreg(clk, reset, PCNext, PC); - adder pcadd4(PC, 32'd4, PCPlus4); - adder pcaddbranch(PC, ImmExt, PCTarget); - mux2 #(32) pcmux(PCPlus4, PCTarget, PCSrc, PCNext); - - // register file logic - regfile rf(clk, RegWrite, Instr[19:15], Instr[24:20], - Instr[11:7], Result, SrcA, WriteData); - extend ext(Instr[31:7], ImmSrc, ImmExt); - - // ALU logic - mux2 #(32) srcbmux(WriteData, ImmExt, ALUSrc, SrcB); - alu alu(SrcA, SrcB, ALUControl, ALUResult, Zero); - mux3 #(32) resultmux(ALUResult, ReadData, PCPlus4, ResultSrc, Result); -endmodule - -module regfile(input logic clk, - input logic we3, - input logic [ 4:0] a1, a2, a3, - input logic [31:0] wd3, - output logic [31:0] rd1, rd2); - - logic [31:0] rf[31:0]; - - // three ported register file - // read two ports combinationally (A1/RD1, A2/RD2) - // write third port on rising edge of clock (A3/WD3/WE3) - // register 0 hardwired to 0 - - always_ff @(posedge clk) - if (we3) rf[a3] <= wd3; - - assign rd1 = (a1 != 0) ? rf[a1] : 0; - assign rd2 = (a2 != 0) ? rf[a2] : 0; -endmodule - -module adder(input [31:0] a, b, - output [31:0] y); - - assign y = a + b; -endmodule - -module extend(input logic [31:7] instr, - input logic [1:0] immsrc, - output logic [31:0] immext); - - always_comb - case(immsrc) - // I-type - 2'b00: immext = {{20{instr[31]}}, instr[31:20]}; - // S-type (stores) - 2'b01: immext = {{20{instr[31]}}, instr[31:25], instr[11:7]}; - // B-type (branches) - 2'b10: immext = {{20{instr[31]}}, instr[7], instr[30:25], instr[11:8], 1'b0}; - // J-type (jal) - 2'b11: immext = {{12{instr[31]}}, instr[19:12], instr[20], instr[30:21], 1'b0}; - default: immext = 32'bx; // undefined - endcase -endmodule - -module flopr #(parameter WIDTH = 8) - (input logic clk, reset, - input logic [WIDTH-1:0] d, - output logic [WIDTH-1:0] q); - - always_ff @(posedge clk, posedge reset) - if (reset) q <= 0; - else q <= d; -endmodule - -module mux2 #(parameter WIDTH = 8) - (input logic [WIDTH-1:0] d0, d1, - input logic s, - output logic [WIDTH-1:0] y); - - assign y = s ? d1 : d0; -endmodule - -module mux3 #(parameter WIDTH = 8) - (input logic [WIDTH-1:0] d0, d1, d2, - input logic [1:0] s, - output logic [WIDTH-1:0] y); - - assign y = s[1] ? d2 : (s[0] ? d1 : d0); -endmodule - -module imem(input logic [31:0] a, - output logic [31:0] rd); - - logic [31:0] RAM[63:0]; - - initial - $readmemh("riscvtest.txt",RAM); - - assign rd = RAM[a[31:2]]; // word aligned -endmodule - -module dmem(input logic clk, we, - input logic [31:0] a, wd, - output logic [31:0] rd); - - logic [31:0] RAM[63:0]; - - assign rd = RAM[a[31:2]]; // word aligned - - always_ff @(posedge clk) - if (we) RAM[a[31:2]] <= wd; -endmodule - -module alu(input logic [31:0] a, b, - input logic [2:0] alucontrol, - output logic [31:0] result, - output logic zero); - - logic [31:0] condinvb, sum; - logic v; // overflow - logic isAddSub; // true when is add or subtract operation - - assign condinvb = alucontrol[0] ? ~b : b; - assign sum = a + condinvb + alucontrol[0]; - assign isAddSub = ~alucontrol[2] & ~alucontrol[1] | - ~alucontrol[1] & alucontrol[0]; - - always_comb - case (alucontrol) - 3'b000: result = sum; // add - 3'b001: result = sum; // subtract - 3'b010: result = a & b; // and - 3'b011: result = a | b; // or - 3'b100: result = a ^ b; // xor - 3'b101: result = sum[31] ^ v; // slt - 3'b110: result = a << b[4:0]; // sll - 3'b111: result = a >> b[4:0]; // srl - default: result = 32'bx; - endcase - - assign zero = (result == 32'b0); - assign v = ~(alucontrol[0] ^ a[31] ^ b[31]) & (a[31] ^ sum[31]) & isAddSub; - -endmodule diff --git a/toy/riscvtest.S b/toy/riscvtest.S deleted file mode 100644 index 4c85cf9d0..000000000 --- a/toy/riscvtest.S +++ /dev/null @@ -1,33 +0,0 @@ -# riscvtest.S -# Sarah.Harris@unlv.edu -# David_Harris@hmc.edu -# 27 Oct 2020 -# -# Test the RISC-V processor. -# add, sub, and, or, slt, addi, lw, sw, beq, jal -# If successful, it should write the value 25 to address 100 - -# RISC-V Assembly Description Address Machine Code -main: addi x2, x0, 5 # x2 = 5 0 00500113 - addi x3, x0, 12 # x3 = 12 4 00C00193 - addi x7, x3, -9 # x7 = (12 - 9) = 3 8 FF718393 - or x4, x7, x2 # x4 = (3 OR 5) = 7 C 0023E233 - and x5, x3, x4 # x5 = (12 AND 7) = 4 10 0041F2B3 - add x5, x5, x4 # x5 = (4 + 7) = 11 14 004282B3 - beq x5, x7, end # shouldn't be taken 18 02728863 - slt x4, x3, x4 # x4 = (12 < 7) = 0 1C 0041A233 - beq x4, x0, around # should be taken 20 00020463 - addi x5, x0, 0 # shouldn't happen 24 00000293 -around: slt x4, x7, x2 # x4 = (3 < 5) = 1 28 0023A233 - add x7, x4, x5 # x7 = (1 + 11) = 12 2C 005203B3 - sub x7, x7, x2 # x7 = (12 - 5) = 7 30 402383B3 - sw x7, 84(x3) # [96] = 7 34 0471AA23 - lw x2, 96(x0) # x2 = [96] = 7 38 06002103 - add x9, x2, x5 # x9 = (7 + 11) = 18 3C 005104B3 - jal x3, end # jump to end, x3 = 0x44 40 008001EF - addi x2, x0, 1 # shouldn't happen 44 00100113 -end: add x2, x2, x9 # x2 = (7 + 18) = 25 48 00910133 - sw x2, 0x20(x3) # mem[100] = 25 4C 0221A023 -done: beq x2, x2, done # infinite loop 50 00210063 - - \ No newline at end of file diff --git a/toy/riscvtest.txt b/toy/riscvtest.txt deleted file mode 100644 index 3a565dfa2..000000000 --- a/toy/riscvtest.txt +++ /dev/null @@ -1,21 +0,0 @@ -00500113 -00C00193 -FF718393 -0023E233 -0041F2B3 -004282B3 -02728863 -0041A233 -00020463 -00000293 -0023A233 -005203B3 -402383B3 -0471AA23 -06002103 -005104B3 -008001EF -00100113 -00910133 -0221A023 -00210063 diff --git a/wally-pipelined/testbench/testbench-coremark_bare.sv b/wally-pipelined/testbench/testbench-coremark_bare.sv index 0b4590aaf..86311b9a7 100644 --- a/wally-pipelined/testbench/testbench-coremark_bare.sv +++ b/wally-pipelined/testbench/testbench-coremark_bare.sv @@ -48,8 +48,7 @@ module testbench(); // pick tests based on modes supported initial -// tests = {"../../tests/imperas-riscv-tests/riscv-ovpsim-plus/examples/CoreMark/coremarkcodemod.bare.riscv.memfile", "1000"}; - tests = {"../../benchmarks/riscv-coremark/coremark.bare.riscv.memfile", "1000"}; + tests = {"../../tests/imperas-riscv-tests/riscv-ovpsim-plus/examples/CoreMark/coremarkcodemod.bare.riscv.memfile", "1000"}; string signame, memfilename; logic [31:0] GPIOPinsIn, GPIOPinsOut, GPIOPinsEn; logic UARTSin, UARTSout; From d243f4bcd19fdad7c5ed58d6bf44d0975410d3e5 Mon Sep 17 00:00:00 2001 From: David Harris Date: Thu, 18 Nov 2021 20:12:52 -0800 Subject: [PATCH 118/132] Cleaning up CoreMark benchmark --- tests/riscv-coremark/.gitignore | 2 - tests/riscv-coremark/.gitmodules | 3 - tests/riscv-coremark/LICENSE | 29 - tests/riscv-coremark/README.md | 23 - tests/riscv-coremark/build-coremark.sh | 18 - tests/riscv-coremark/coremark/LICENSE.md | 100 -- tests/riscv-coremark/coremark/Makefile | 139 -- tests/riscv-coremark/coremark/README.md | 398 ----- .../coremark/barebones/core_portme.c | 153 -- .../coremark/barebones/core_portme.h | 210 --- .../coremark/barebones/core_portme.mak | 87 - tests/riscv-coremark/coremark/barebones/cvt.c | 127 -- .../coremark/barebones/ee_printf.c | 700 -------- .../riscv-coremark/coremark/core_list_join.c | 580 ------- tests/riscv-coremark/coremark/core_main.c | 447 ----- tests/riscv-coremark/coremark/core_matrix.c | 359 ---- tests/riscv-coremark/coremark/core_state.c | 330 ---- tests/riscv-coremark/coremark/core_util.c | 249 --- tests/riscv-coremark/coremark/coremark.h | 183 -- tests/riscv-coremark/coremark/coremark.md5 | 6 - .../coremark/cygwin/core_portme.c | 336 ---- .../coremark/cygwin/core_portme.h | 293 ---- .../coremark/cygwin/core_portme.mak | 17 - tests/riscv-coremark/coremark/docs/READM.md | 1 - .../coremark/docs/balance_O0_joined.png | Bin 48672 -> 0 bytes .../html/files/PIC32/core_portme-mak.html | 68 - .../docs/html/files/core_list_join-c.html | 58 - .../coremark/docs/html/files/core_main-c.html | 42 - .../docs/html/files/core_matrix-c.html | 56 - .../docs/html/files/core_state-c.html | 46 - .../coremark/docs/html/files/core_util-c.html | 42 - .../coremark/docs/html/files/coremark-h.html | 46 - .../docs/html/files/docs/core_state.png | Bin 72093 -> 0 bytes .../docs/html/files/linux/core_portme-c.html | 58 - .../docs/html/files/linux/core_portme-h.html | 72 - .../html/files/linux/core_portme-mak.html | 76 - .../coremark/docs/html/files/readme-txt.html | 71 - .../docs/html/files/release_notes-txt.html | 56 - .../coremark/docs/html/index.html | 1 - .../docs/html/index/BuildTargets.html | 31 - .../docs/html/index/Configuration.html | 51 - .../docs/html/index/Configurations.html | 45 - .../coremark/docs/html/index/Files.html | 35 - .../coremark/docs/html/index/Functions.html | 55 - .../coremark/docs/html/index/General.html | 75 - .../coremark/docs/html/index/General2.html | 47 - .../coremark/docs/html/index/Types.html | 31 - .../coremark/docs/html/index/Variables.html | 55 - .../coremark/docs/html/javascript/main.js | 836 ---------- .../docs/html/javascript/searchdata.js | 212 --- .../docs/html/search/BuildTargetsP.html | 18 - .../docs/html/search/ConfigurationC.html | 18 - .../docs/html/search/ConfigurationH.html | 18 - .../docs/html/search/ConfigurationM.html | 18 - .../docs/html/search/ConfigurationS.html | 18 - .../docs/html/search/ConfigurationT.html | 18 - .../docs/html/search/ConfigurationU.html | 18 - .../docs/html/search/ConfigurationsH.html | 20 - .../docs/html/search/ConfigurationsM.html | 20 - .../docs/html/search/ConfigurationsS.html | 20 - .../docs/html/search/ConfigurationsT.html | 20 - .../coremark/docs/html/search/FilesC.html | 18 - .../coremark/docs/html/search/FilesR.html | 18 - .../coremark/docs/html/search/FunctionsC.html | 18 - .../coremark/docs/html/search/FunctionsG.html | 18 - .../coremark/docs/html/search/FunctionsI.html | 18 - .../coremark/docs/html/search/FunctionsM.html | 18 - .../coremark/docs/html/search/FunctionsP.html | 18 - .../coremark/docs/html/search/FunctionsS.html | 18 - .../coremark/docs/html/search/FunctionsT.html | 18 - .../coremark/docs/html/search/GeneralB.html | 18 - .../coremark/docs/html/search/GeneralC.html | 18 - .../coremark/docs/html/search/GeneralD.html | 18 - .../coremark/docs/html/search/GeneralF.html | 18 - .../coremark/docs/html/search/GeneralG.html | 18 - .../coremark/docs/html/search/GeneralH.html | 18 - .../coremark/docs/html/search/GeneralI.html | 18 - .../coremark/docs/html/search/GeneralL.html | 18 - .../coremark/docs/html/search/GeneralM.html | 18 - .../coremark/docs/html/search/GeneralO.html | 18 - .../coremark/docs/html/search/GeneralP.html | 18 - .../coremark/docs/html/search/GeneralR.html | 18 - .../coremark/docs/html/search/GeneralS.html | 18 - .../coremark/docs/html/search/GeneralT.html | 18 - .../coremark/docs/html/search/GeneralU.html | 18 - .../coremark/docs/html/search/GeneralV.html | 18 - .../coremark/docs/html/search/GeneralW.html | 18 - .../coremark/docs/html/search/NoResults.html | 13 - .../coremark/docs/html/search/TypesS.html | 18 - .../coremark/docs/html/search/VariablesC.html | 18 - .../coremark/docs/html/search/VariablesD.html | 18 - .../coremark/docs/html/search/VariablesL.html | 18 - .../coremark/docs/html/search/VariablesO.html | 18 - .../coremark/docs/html/search/VariablesP.html | 18 - .../coremark/docs/html/search/VariablesR.html | 18 - .../coremark/docs/html/search/VariablesS.html | 18 - .../coremark/docs/html/styles/1.css | 767 --------- .../coremark/docs/html/styles/2.css | 6 - .../coremark/docs/html/styles/main.css | 2 - .../coremark/freebsd/core_portme.mak | 17 - .../coremark/linux/core_portme.c | 338 ---- .../coremark/linux/core_portme.h | 290 ---- .../coremark/linux/core_portme.mak | 17 - .../coremark/linux64/core_portme.c | 336 ---- .../coremark/linux64/core_portme.h | 291 ---- .../coremark/linux64/core_portme.mak | 140 -- .../coremark/macos/core_portme.mak | 18 - .../coremark/posix/core_portme.c | 419 ----- .../coremark/posix/core_portme.h | 314 ---- .../coremark/posix/core_portme.mak | 151 -- .../posix/core_portme_posix_overrides.h | 28 - .../coremark/rtems/core_portme.mak | 18 - tests/riscv-coremark/coremark/rtems/init.c | 63 - .../coremark/simple/core_portme.c | 149 -- .../coremark/simple/core_portme.h | 208 --- .../coremark/simple/core_portme.mak | 60 - tests/riscv-coremark/extraPortmes/README.md | 7 - .../extraPortmes/cygwin/core_portme.c | 336 ---- .../extraPortmes/cygwin/core_portme.h | 293 ---- .../extraPortmes/cygwin/core_portme.mak | 17 - .../extraPortmes/linux/core_portme.c | 338 ---- .../extraPortmes/linux/core_portme.h | 290 ---- .../extraPortmes/linux/core_portme.mak | 17 - .../extraPortmes/linux64/core_portme.c | 336 ---- .../extraPortmes/linux64/core_portme.h | 291 ---- .../extraPortmes/linux64/core_portme.mak | 140 -- .../riscv64-baremetal/core_portme.c | 382 ----- .../riscv64-baremetal/core_portme.h | 296 ---- .../riscv64-baremetal/core_portme.mak | 147 -- tests/riscv-coremark/riscv64-baremetal/crt.S | 237 --- .../riscv64-baremetal/encoding.h | 1471 ----------------- .../riscv-coremark/riscv64-baremetal/link.ld | 66 - .../riscv64-baremetal/syscallbackup.c | 1072 ------------ .../riscv64-baremetal/syscalls.c | 505 ------ tests/riscv-coremark/riscv64-baremetal/util.h | 90 - tests/riscv-coremark/riscv64/core_portme.c | 346 ---- tests/riscv-coremark/riscv64/core_portme.h | 296 ---- tests/riscv-coremark/riscv64/core_portme.mak | 147 -- tests/riscv-coremark/trace | 48 - tests/riscv-coremark/transferobjdump.sh | 8 - .../testbench/testbench-coremark_bare.sv | 3 +- 141 files changed, 2 insertions(+), 18595 deletions(-) delete mode 100644 tests/riscv-coremark/.gitignore delete mode 100644 tests/riscv-coremark/.gitmodules delete mode 100644 tests/riscv-coremark/LICENSE delete mode 100644 tests/riscv-coremark/README.md delete mode 100755 tests/riscv-coremark/build-coremark.sh delete mode 100644 tests/riscv-coremark/coremark/LICENSE.md delete mode 100644 tests/riscv-coremark/coremark/Makefile delete mode 100644 tests/riscv-coremark/coremark/README.md delete mode 100644 tests/riscv-coremark/coremark/barebones/core_portme.c delete mode 100644 tests/riscv-coremark/coremark/barebones/core_portme.h delete mode 100755 tests/riscv-coremark/coremark/barebones/core_portme.mak delete mode 100644 tests/riscv-coremark/coremark/barebones/cvt.c delete mode 100644 tests/riscv-coremark/coremark/barebones/ee_printf.c delete mode 100644 tests/riscv-coremark/coremark/core_list_join.c delete mode 100644 tests/riscv-coremark/coremark/core_main.c delete mode 100644 tests/riscv-coremark/coremark/core_matrix.c delete mode 100644 tests/riscv-coremark/coremark/core_state.c delete mode 100644 tests/riscv-coremark/coremark/core_util.c delete mode 100644 tests/riscv-coremark/coremark/coremark.h delete mode 100644 tests/riscv-coremark/coremark/coremark.md5 delete mode 100755 tests/riscv-coremark/coremark/cygwin/core_portme.c delete mode 100755 tests/riscv-coremark/coremark/cygwin/core_portme.h delete mode 100644 tests/riscv-coremark/coremark/cygwin/core_portme.mak delete mode 100644 tests/riscv-coremark/coremark/docs/READM.md delete mode 100644 tests/riscv-coremark/coremark/docs/balance_O0_joined.png delete mode 100644 tests/riscv-coremark/coremark/docs/html/files/PIC32/core_portme-mak.html delete mode 100644 tests/riscv-coremark/coremark/docs/html/files/core_list_join-c.html delete mode 100644 tests/riscv-coremark/coremark/docs/html/files/core_main-c.html delete mode 100644 tests/riscv-coremark/coremark/docs/html/files/core_matrix-c.html delete mode 100644 tests/riscv-coremark/coremark/docs/html/files/core_state-c.html delete mode 100644 tests/riscv-coremark/coremark/docs/html/files/core_util-c.html delete mode 100644 tests/riscv-coremark/coremark/docs/html/files/coremark-h.html delete mode 100644 tests/riscv-coremark/coremark/docs/html/files/docs/core_state.png delete mode 100644 tests/riscv-coremark/coremark/docs/html/files/linux/core_portme-c.html delete mode 100644 tests/riscv-coremark/coremark/docs/html/files/linux/core_portme-h.html delete mode 100644 tests/riscv-coremark/coremark/docs/html/files/linux/core_portme-mak.html delete mode 100644 tests/riscv-coremark/coremark/docs/html/files/readme-txt.html delete mode 100644 tests/riscv-coremark/coremark/docs/html/files/release_notes-txt.html delete mode 100644 tests/riscv-coremark/coremark/docs/html/index.html delete mode 100644 tests/riscv-coremark/coremark/docs/html/index/BuildTargets.html delete mode 100644 tests/riscv-coremark/coremark/docs/html/index/Configuration.html delete mode 100644 tests/riscv-coremark/coremark/docs/html/index/Configurations.html delete mode 100644 tests/riscv-coremark/coremark/docs/html/index/Files.html delete mode 100644 tests/riscv-coremark/coremark/docs/html/index/Functions.html delete mode 100644 tests/riscv-coremark/coremark/docs/html/index/General.html delete mode 100644 tests/riscv-coremark/coremark/docs/html/index/General2.html delete mode 100644 tests/riscv-coremark/coremark/docs/html/index/Types.html delete mode 100644 tests/riscv-coremark/coremark/docs/html/index/Variables.html delete mode 100644 tests/riscv-coremark/coremark/docs/html/javascript/main.js delete mode 100644 tests/riscv-coremark/coremark/docs/html/javascript/searchdata.js delete mode 100644 tests/riscv-coremark/coremark/docs/html/search/BuildTargetsP.html delete mode 100644 tests/riscv-coremark/coremark/docs/html/search/ConfigurationC.html delete mode 100644 tests/riscv-coremark/coremark/docs/html/search/ConfigurationH.html delete mode 100644 tests/riscv-coremark/coremark/docs/html/search/ConfigurationM.html delete mode 100644 tests/riscv-coremark/coremark/docs/html/search/ConfigurationS.html delete mode 100644 tests/riscv-coremark/coremark/docs/html/search/ConfigurationT.html delete mode 100644 tests/riscv-coremark/coremark/docs/html/search/ConfigurationU.html delete mode 100644 tests/riscv-coremark/coremark/docs/html/search/ConfigurationsH.html delete mode 100644 tests/riscv-coremark/coremark/docs/html/search/ConfigurationsM.html delete mode 100644 tests/riscv-coremark/coremark/docs/html/search/ConfigurationsS.html delete mode 100644 tests/riscv-coremark/coremark/docs/html/search/ConfigurationsT.html delete mode 100644 tests/riscv-coremark/coremark/docs/html/search/FilesC.html delete mode 100644 tests/riscv-coremark/coremark/docs/html/search/FilesR.html delete mode 100644 tests/riscv-coremark/coremark/docs/html/search/FunctionsC.html delete mode 100644 tests/riscv-coremark/coremark/docs/html/search/FunctionsG.html delete mode 100644 tests/riscv-coremark/coremark/docs/html/search/FunctionsI.html delete mode 100644 tests/riscv-coremark/coremark/docs/html/search/FunctionsM.html delete mode 100644 tests/riscv-coremark/coremark/docs/html/search/FunctionsP.html delete mode 100644 tests/riscv-coremark/coremark/docs/html/search/FunctionsS.html delete mode 100644 tests/riscv-coremark/coremark/docs/html/search/FunctionsT.html delete mode 100644 tests/riscv-coremark/coremark/docs/html/search/GeneralB.html delete mode 100644 tests/riscv-coremark/coremark/docs/html/search/GeneralC.html delete mode 100644 tests/riscv-coremark/coremark/docs/html/search/GeneralD.html delete mode 100644 tests/riscv-coremark/coremark/docs/html/search/GeneralF.html delete mode 100644 tests/riscv-coremark/coremark/docs/html/search/GeneralG.html delete mode 100644 tests/riscv-coremark/coremark/docs/html/search/GeneralH.html delete mode 100644 tests/riscv-coremark/coremark/docs/html/search/GeneralI.html delete mode 100644 tests/riscv-coremark/coremark/docs/html/search/GeneralL.html delete mode 100644 tests/riscv-coremark/coremark/docs/html/search/GeneralM.html delete mode 100644 tests/riscv-coremark/coremark/docs/html/search/GeneralO.html delete mode 100644 tests/riscv-coremark/coremark/docs/html/search/GeneralP.html delete mode 100644 tests/riscv-coremark/coremark/docs/html/search/GeneralR.html delete mode 100644 tests/riscv-coremark/coremark/docs/html/search/GeneralS.html delete mode 100644 tests/riscv-coremark/coremark/docs/html/search/GeneralT.html delete mode 100644 tests/riscv-coremark/coremark/docs/html/search/GeneralU.html delete mode 100644 tests/riscv-coremark/coremark/docs/html/search/GeneralV.html delete mode 100644 tests/riscv-coremark/coremark/docs/html/search/GeneralW.html delete mode 100644 tests/riscv-coremark/coremark/docs/html/search/NoResults.html delete mode 100644 tests/riscv-coremark/coremark/docs/html/search/TypesS.html delete mode 100644 tests/riscv-coremark/coremark/docs/html/search/VariablesC.html delete mode 100644 tests/riscv-coremark/coremark/docs/html/search/VariablesD.html delete mode 100644 tests/riscv-coremark/coremark/docs/html/search/VariablesL.html delete mode 100644 tests/riscv-coremark/coremark/docs/html/search/VariablesO.html delete mode 100644 tests/riscv-coremark/coremark/docs/html/search/VariablesP.html delete mode 100644 tests/riscv-coremark/coremark/docs/html/search/VariablesR.html delete mode 100644 tests/riscv-coremark/coremark/docs/html/search/VariablesS.html delete mode 100644 tests/riscv-coremark/coremark/docs/html/styles/1.css delete mode 100644 tests/riscv-coremark/coremark/docs/html/styles/2.css delete mode 100644 tests/riscv-coremark/coremark/docs/html/styles/main.css delete mode 100644 tests/riscv-coremark/coremark/freebsd/core_portme.mak delete mode 100755 tests/riscv-coremark/coremark/linux/core_portme.c delete mode 100755 tests/riscv-coremark/coremark/linux/core_portme.h delete mode 100644 tests/riscv-coremark/coremark/linux/core_portme.mak delete mode 100755 tests/riscv-coremark/coremark/linux64/core_portme.c delete mode 100755 tests/riscv-coremark/coremark/linux64/core_portme.h delete mode 100755 tests/riscv-coremark/coremark/linux64/core_portme.mak delete mode 100644 tests/riscv-coremark/coremark/macos/core_portme.mak delete mode 100644 tests/riscv-coremark/coremark/posix/core_portme.c delete mode 100644 tests/riscv-coremark/coremark/posix/core_portme.h delete mode 100755 tests/riscv-coremark/coremark/posix/core_portme.mak delete mode 100644 tests/riscv-coremark/coremark/posix/core_portme_posix_overrides.h delete mode 100644 tests/riscv-coremark/coremark/rtems/core_portme.mak delete mode 100644 tests/riscv-coremark/coremark/rtems/init.c delete mode 100644 tests/riscv-coremark/coremark/simple/core_portme.c delete mode 100644 tests/riscv-coremark/coremark/simple/core_portme.h delete mode 100755 tests/riscv-coremark/coremark/simple/core_portme.mak delete mode 100644 tests/riscv-coremark/extraPortmes/README.md delete mode 100755 tests/riscv-coremark/extraPortmes/cygwin/core_portme.c delete mode 100755 tests/riscv-coremark/extraPortmes/cygwin/core_portme.h delete mode 100644 tests/riscv-coremark/extraPortmes/cygwin/core_portme.mak delete mode 100755 tests/riscv-coremark/extraPortmes/linux/core_portme.c delete mode 100755 tests/riscv-coremark/extraPortmes/linux/core_portme.h delete mode 100644 tests/riscv-coremark/extraPortmes/linux/core_portme.mak delete mode 100755 tests/riscv-coremark/extraPortmes/linux64/core_portme.c delete mode 100755 tests/riscv-coremark/extraPortmes/linux64/core_portme.h delete mode 100755 tests/riscv-coremark/extraPortmes/linux64/core_portme.mak delete mode 100755 tests/riscv-coremark/riscv64-baremetal/core_portme.c delete mode 100755 tests/riscv-coremark/riscv64-baremetal/core_portme.h delete mode 100755 tests/riscv-coremark/riscv64-baremetal/core_portme.mak delete mode 100644 tests/riscv-coremark/riscv64-baremetal/crt.S delete mode 100644 tests/riscv-coremark/riscv64-baremetal/encoding.h delete mode 100644 tests/riscv-coremark/riscv64-baremetal/link.ld delete mode 100644 tests/riscv-coremark/riscv64-baremetal/syscallbackup.c delete mode 100644 tests/riscv-coremark/riscv64-baremetal/syscalls.c delete mode 100644 tests/riscv-coremark/riscv64-baremetal/util.h delete mode 100755 tests/riscv-coremark/riscv64/core_portme.c delete mode 100755 tests/riscv-coremark/riscv64/core_portme.h delete mode 100755 tests/riscv-coremark/riscv64/core_portme.mak delete mode 100644 tests/riscv-coremark/trace delete mode 100755 tests/riscv-coremark/transferobjdump.sh diff --git a/tests/riscv-coremark/.gitignore b/tests/riscv-coremark/.gitignore deleted file mode 100644 index 0f2251abe..000000000 --- a/tests/riscv-coremark/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -coremark.riscv -coremark.bare.riscv \ No newline at end of file diff --git a/tests/riscv-coremark/.gitmodules b/tests/riscv-coremark/.gitmodules deleted file mode 100644 index 938028cb7..000000000 --- a/tests/riscv-coremark/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "coremark"] - path = coremark - url = https://github.com/eembc/coremark diff --git a/tests/riscv-coremark/LICENSE b/tests/riscv-coremark/LICENSE deleted file mode 100644 index 860ca9cc6..000000000 --- a/tests/riscv-coremark/LICENSE +++ /dev/null @@ -1,29 +0,0 @@ -BSD 3-Clause License - -Copyright (c) 2017, Christopher Celio -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -* Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/tests/riscv-coremark/README.md b/tests/riscv-coremark/README.md deleted file mode 100644 index 7c02eb1bf..000000000 --- a/tests/riscv-coremark/README.md +++ /dev/null @@ -1,23 +0,0 @@ -Coremark EEMBC Wrapper -====================== - -This repository provides the utility files to port [CoreMark EEMBC](https://www.eembc.org/coremark/) to RISC-V. - -### Requirements - - - You must have installed the RISC-V tools - -### Setup - - - `git submodule update --init` - - Run the `./build-coremark.sh` script that does the following - - Builds a version of Coremark for Linux or pk (coremark.riscv) - - Builds a version of Coremark for bare-metal (coremark.bare.riscv) - - Copies the output binaries into this directory - -### Default Files - -The default files target **RV64GC** and use minimal amount of compilation flags. Additionally, the `*.mak` file in the `riscv64` -folder setups `spike pk` as the default `run` rule. - -Feel free to change these to suit your needs. diff --git a/tests/riscv-coremark/build-coremark.sh b/tests/riscv-coremark/build-coremark.sh deleted file mode 100755 index bdd100725..000000000 --- a/tests/riscv-coremark/build-coremark.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/bash - -set -e - -BASEDIR=$PWD -CM_FOLDER=coremark -#RISCV=/home/ehedenberg/riscvcompiler -RISCV=/courses/e190ax/riscvcompiler -XCFLAGS="-march=rv64im" -cd $BASEDIR/$CM_FOLDER - -# run the compile -echo "Start compilation" -#make PORT_DIR=../riscv64 compile RISCV=$RISCV -#mv coremark.riscv ../ - -make PORT_DIR=../riscv64-baremetal compile RISCV=$RISCV XCFLAGS=$XCFLAGS -mv coremark.bare.riscv ../ diff --git a/tests/riscv-coremark/coremark/LICENSE.md b/tests/riscv-coremark/coremark/LICENSE.md deleted file mode 100644 index 14e53e9ee..000000000 --- a/tests/riscv-coremark/coremark/LICENSE.md +++ /dev/null @@ -1,100 +0,0 @@ -# COREMARK® ACCEPTABLE USE AGREEMENT - -This ACCEPTABLE USE AGREEMENT (this “Agreementâ€) is offered by Embedded Microprocessor Benchmark Consortium, a California nonprofit corporation (“Licensorâ€), to users of its CoreMark® software (“Licenseeâ€) exclusively on the following terms. - -Licensor offers benchmarking software (“Softwareâ€) pursuant to an open source license, but carefully controls use of its benchmarks and their associated goodwill. Licensor has registered its trademark in one of the benchmarks available through the Software, COREMARK, Ser. No. 85/487,290; Reg. No. 4,179,307 (the “Trademarkâ€), and promotes the use of a standard metric as a benchmark for assessing the performance of embedded systems. Solely on the terms described herein, Licensee may use and display the Trademark in connection with the generation of data regarding measurement and analysis of computer and embedded system benchmarking via the Software (the “Licensed Useâ€). - -## Article 1 – License Grant. -1.1. License. Subject to the terms and conditions of this Agreement, Licensor hereby grants to Licensee, and Licensee hereby accepts from Licensor, a personal, non-exclusive, royalty-free, revocable right and license to use and display the Trademark during the term of this Agreement (the “Termâ€), solely and exclusively in connection with the Licensed Use. During the Term, Licensee (i) shall not modify or otherwise create derivative works of the Trademark, and (ii) may use the Trademark only to the extent permitted under this License. Neither Licensee nor any affiliate or agent thereof shall otherwise use the Trademark without the prior express written consent of Licensor, which may be withheld in its sole and absolute discretion. All rights not expressly granted to Licensee hereunder shall remain the exclusive property of Licensor. - -1.2. Modifications to the Software. Licensee shall not use the Trademark in connection with any use of a modified, derivative, or otherwise altered copy of the Software. - -1.3. Licensor’s Use. Nothing in this Agreement shall preclude Licensor or any of its successors or assigns from using or permitting other entities to use the Trademark, whether or not such entity directly or indirectly competes or conflicts with Licensee’s Licensed Use in any manner. - -1.4. Term and Termination. This Agreement is perpetual unless terminated by either of the parties. Licensee may terminate this Agreement for convenience, without cause or liability, for any reason or for no reason whatsoever, upon ten (10) business days written notice. Licensor may terminate this Agreement effective immediately upon notice of breach. Upon termination, Licensee shall immediately remove all implementations of the Trademark from the Licensed Use, and delete all digitals files and records of all materials related to the Trademark. - -## Article 2 – Ownership. -2.1. Ownership. Licensee acknowledges and agrees that Licensor is the owner of all right, title, and interest in and to the Trademark, and all such right, title, and interest shall remain with Licensor. Licensee shall not contest, dispute, challenge, oppose, or seek to cancel Licensor’s right, title, and interest in and to the Trademark. Licensee shall not prosecute any application for registration of the Trademark. Licensee shall display appropriate notices regarding ownership of the Trademark in connection with the Licensed Use. - -2.2. Goodwill. Licensee acknowledges that Licensee shall not acquire any right, title, or interest in the Trademark by virtue of this Agreement other than the license granted hereunder, and disclaims any such right, title, interest, or ownership. All goodwill and reputation generated by Licensee’s use of the Trademark shall inure to the exclusive benefit of Licensor. Licensee shall not by any act or omission use the Trademark in any manner that disparages or reflects adversely on Licensor or its Licensed Use or reputation. Licensee shall not take any action that would interfere with or prejudice Licensor’s ownership or registration of the Trademark, the validity of the Trademark or the validity of the license granted by this Agreement. If Licensor determines and notifies Licensee that any act taken in connection with the Licensed Use (i) is inaccurate, unlawful or offensive to good taste; (ii) fails to provide for proper trademark notices, or (iii) otherwise violates Licensee’s obligations under this Agreement, the license granted under this Agreement shall terminate. - -## Article 3 – Indemnification. -3.1. Indemnification Generally. Licensee agrees to indemnify, defend, and hold harmless (collectively “indemnify†or “indemnificationâ€) Licensor, including Licensor’s members, managers, officers, and employees (collectively “Related Personsâ€), from and against, and pay or reimburse Licensor and such Related Persons for, any and all third-party actions, claims, demands, proceedings, investigations, inquiries (collectively, “Claimsâ€), and any and all liabilities, obligations, fines, deficiencies, costs, expenses, royalties, losses, and damages (including reasonable outside counsel fees and expenses) associated with such Claims, to the extent that such Claim arises out of (i) Licensee’s material breach of this Agreement, or (ii) any allegation(s) that Licensee’s actions infringe or violate any third-party intellectual property right, including without limitation, any U.S. copyright, patent, or trademark, or are otherwise found to be tortious or criminal (whether or not such indemnified person is a named party in a legal proceeding). - -3.2. Notice and Defense of Claims. Licensor shall promptly notify Licensee of any Claim for which indemnification is sought, following actual knowledge of such Claim, provided however that the failure to give such notice shall not relieve Licensee of its obligations hereunder except to the extent that Licensee is materially prejudiced by such failure. In the event that any third-party Claim is brought, Licensee shall have the right and option to undertake and control the defense of such action with counsel of its choice, provided however that (i) Licensor at its own expense may participate and appear on an equal footing with Licensee in the defense of any such Claim, (ii) Licensor may undertake and control such defense in the event of the material failure of Licensee to undertake and control the same; and (iii) the defense of any Claim relating to the intellectual property rights of Licensor or its licensors and any related counterclaims shall be solely controlled by Licensor with counsel of its choice. Licensee shall not consent to judgment or concede or settle or compromise any Claim without the prior written approval of Licensor (whose approval shall not be unreasonably withheld), unless such concession or settlement or compromise includes a full and unconditional release of Licensor and any applicable Related Persons from all liabilities in respect of such Claim. - -## Article 4 – Miscellaneous. -4.1. Relationship of the Parties. This Agreement does not create a partnership, franchise, joint venture, agency, fiduciary, or employment relationship between the parties. - -4.2. No Third-Party Beneficiaries. Except for the rights of Related Persons under Article 3 (Indemnification), there are no third-party beneficiaries to this Agreement. - -4.3. Assignment. Licensee’s rights hereunder are non-assignable, and may not be sublicensed. - -4.4. Equitable Relief. Licensee acknowledges that the remedies available at law for any breach of this Agreement will, by their nature, be inadequate. Accordingly, Licensor may obtain injunctive relief or other equitable relief to restrain a breach or threatened breach of this Agreement or to specifically enforce this Agreement, without proving that any monetary damages have been sustained, and without the requirement of posting of a bond prior to obtaining such equitable relief. - -4.5. Governing Law. This Agreement will be interpreted, construed, and enforced in all respects in accordance with the laws of the State of California, without reference to its conflict of law principles. - -4.6. Attorneys’ Fees. If any legal action, arbitration or other proceeding is brought for the enforcement of this Agreement, or because of an alleged dispute, breach, default, or misrepresentation in connection with any of the provisions of this Agreement, the successful or prevailing party shall be entitled to recover its reasonable attorneys’ fees and other reasonable costs incurred in that action or proceeding, in addition to any other relief to which it may be entitled. - -4.7. Amendment; Waiver. This Agreement may not be amended, nor may any rights under it be waived, except in writing by Licensor. - -4.8. Severability. If any provision of this Agreement is held by a court of competent jurisdiction to be contrary to law, the provision shall be modified by the court and interpreted so as best to accomplish the objectives of the original provision to the fullest extent -permitted by law, and the remaining provisions of this Agreement shall remain in effect. - -4.9. Entire Agreement. This Agreement constitutes the entire agreement between the parties and supersedes all prior and contemporaneous agreements, proposals or representations, written or oral, concerning its subject matter. - - -# Apache License - -Version 2.0, January 2004 - -http://www.apache.org/licenses/ - -## TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - -"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. - -"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. - -"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. - -"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. - -"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. - -"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. - -"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). - -"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. - -"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." - -"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: - - You must give any other recipients of the Work or Derivative Works a copy of this License; and - You must cause any modified files to carry prominent notices stating that You changed the files; and - You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and - If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. - - You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS diff --git a/tests/riscv-coremark/coremark/Makefile b/tests/riscv-coremark/coremark/Makefile deleted file mode 100644 index 51760d1dd..000000000 --- a/tests/riscv-coremark/coremark/Makefile +++ /dev/null @@ -1,139 +0,0 @@ -# Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# Original Author: Shay Gal-on - -# Make sure the default target is to simply build and run the benchmark. -RSTAMP = v1.0 - -.PHONY: run score -run: $(OUTFILE) rerun score - -score: - @echo "Check run1.log and run2.log for results." - @echo "See README.md for run and reporting rules." - -ifndef PORT_DIR -# Ports for a couple of common self hosted platforms -UNAME=$(shell if command -v uname 2> /dev/null; then uname ; fi) -ifneq (,$(findstring CYGWIN,$(UNAME))) -PORT_DIR=cygwin -endif -ifneq (,$(findstring Linux,$(UNAME))) -MACHINE=$(shell uname -m) -ifneq (,$(findstring 64,$(MACHINE))) -PORT_DIR=linux64 -else -PORT_DIR=linux -endif -endif -endif -ifndef PORT_DIR -$(error PLEASE define PORT_DIR! (e.g. make PORT_DIR=simple)) -endif -vpath %.c $(PORT_DIR) -vpath %.h $(PORT_DIR) -vpath %.mak $(PORT_DIR) -include $(PORT_DIR)/core_portme.mak - -ifndef $(ITERATIONS) -ITERATIONS=0 -endif -ifdef REBUILD -FORCE_REBUILD=force_rebuild -endif - -CFLAGS += -DITERATIONS=$(ITERATIONS) - -CORE_FILES = core_list_join core_main core_matrix core_state core_util -ORIG_SRCS = $(addsuffix .c,$(CORE_FILES)) -SRCS = $(ORIG_SRCS) $(PORT_SRCS) -OBJS = $(addprefix $(OPATH),$(addsuffix $(OEXT),$(CORE_FILES)) $(PORT_OBJS)) -OUTNAME = coremark$(EXE) -OUTFILE = $(OPATH)$(OUTNAME) -LOUTCMD = $(OFLAG) $(OUTFILE) $(LFLAGS_END) -OUTCMD = $(OUTFLAG) $(OUTFILE) $(LFLAGS_END) - -HEADERS = coremark.h -CHECK_FILES = $(ORIG_SRCS) $(HEADERS) - -$(OPATH): - $(MKDIR) $(OPATH) - -.PHONY: compile link -ifdef SEPARATE_COMPILE -$(OPATH)$(PORT_DIR): - $(MKDIR) $(OPATH)$(PORT_DIR) - -compile: $(OPATH) $(OPATH)$(PORT_DIR) $(OBJS) $(HEADERS) -link: compile - $(LD) $(LFLAGS) $(XLFLAGS) $(OBJS) $(LOUTCMD) - -else - -compile: $(OPATH) $(SRCS) $(HEADERS) - $(CC) $(CFLAGS) $(XCFLAGS) $(SRCS) $(OUTCMD) -link: compile - @echo "Link performed along with compile" - -endif - -$(OUTFILE): $(SRCS) $(HEADERS) Makefile core_portme.mak $(FORCE_REBUILD) - $(MAKE) port_prebuild - $(MAKE) link - $(MAKE) port_postbuild - -.PHONY: rerun -rerun: - $(MAKE) XCFLAGS="$(XCFLAGS) -DPERFORMANCE_RUN=1" load run1.log - $(MAKE) XCFLAGS="$(XCFLAGS) -DVALIDATION_RUN=1" load run2.log - -PARAM1=$(PORT_PARAMS) 0x0 0x0 0x66 $(ITERATIONS) -PARAM2=$(PORT_PARAMS) 0x3415 0x3415 0x66 $(ITERATIONS) -PARAM3=$(PORT_PARAMS) 8 8 8 $(ITERATIONS) - -run1.log-PARAM=$(PARAM1) 7 1 2000 -run2.log-PARAM=$(PARAM2) 7 1 2000 -run3.log-PARAM=$(PARAM3) 7 1 1200 - -run1.log run2.log run3.log: load - $(MAKE) port_prerun - $(RUN) $(OUTFILE) $($(@)-PARAM) > $(OPATH)$@ - $(MAKE) port_postrun - -.PHONY: gen_pgo_data -gen_pgo_data: run3.log - -.PHONY: load -load: $(OUTFILE) - $(MAKE) port_preload - $(LOAD) $(OUTFILE) - $(MAKE) port_postload - -.PHONY: clean -clean: - rm -f $(OUTFILE) $(OPATH)*.log *.info $(OPATH)index.html $(PORT_CLEAN) - -.PHONY: force_rebuild -force_rebuild: - echo "Forcing Rebuild" - -.PHONY: check -check: - md5sum -c coremark.md5 - -ifdef ETC -# Targets related to testing and releasing CoreMark. Not part of the general release! -include Makefile.internal -endif diff --git a/tests/riscv-coremark/coremark/README.md b/tests/riscv-coremark/coremark/README.md deleted file mode 100644 index 16b54b7b3..000000000 --- a/tests/riscv-coremark/coremark/README.md +++ /dev/null @@ -1,398 +0,0 @@ - -# Introduction - -CoreMark's primary goals are simplicity and providing a method for testing only a processor's core features. For more information about EEMBC's comprehensive embedded benchmark suites, please see www.eembc.org. - -For a more compute-intensive version of CoreMark that uses larger datasets and execution loops taken from common applications, please check out EEMBC's [CoreMark-PRO](https://www.github.com/eembc/coremark-pro) benchmark, also on GitHub. - -# Building and Running - -To build and run the benchmark, type - -`> make` - -Full results are available in the files `run1.log` and `run2.log`. CoreMark result can be found in `run1.log`. - -## Cross Compiling - -For cross compile platforms please adjust `core_portme.mak`, `core_portme.h` (and possibly `core_portme.c`) according to the specific platform used. When porting to a new platform, it is recommended to copy one of the default port folders (e.g. `mkdir && cp linux/* `), adjust the porting files, and run: -~~~ -% make PORT_DIR= -~~~ - -## Make Targets -`run` - Default target, creates `run1.log` and `run2.log`. -`run1.log` - Run the benchmark with performance parameters, and output to `run1.log` -`run2.log` - Run the benchmark with validation parameters, and output to `run2.log` -`run3.log` - Run the benchmark with profile generation parameters, and output to `run3.log` -`compile` - compile the benchmark executable -`link` - link the benchmark executable -`check` - test MD5 of sources that may not be modified -`clean` - clean temporary files - -### Make flag: `ITERATIONS` -By default, the benchmark will run between 10-100 seconds. To override, use `ITERATIONS=N` -~~~ -% make ITERATIONS=10 -~~~ -Will run the benchmark for 10 iterations. It is recommended to set a specific number of iterations in certain situations e.g.: - -* Running with a simulator -* Measuring power/energy -* Timing cannot be restarted - -Minimum required run time: **Results are only valid for reporting if the benchmark ran for at least 10 secs!** - -### Make flag: `XCFLAGS` -To add compiler flags from the command line, use `XCFLAGS` e.g.: - -~~~ -% make XCFLAGS="-g -DMULTITHREAD=4 -DUSE_FORK=1" -~~~ - -### Make flag: `CORE_DEBUG` - -Define to compile for a debug run if you get incorrect CRC. - -~~~ -% make XCFLAGS="-DCORE_DEBUG=1" -~~~ - -### Make flag: `REBUILD` - -Force a rebuild of the executable. - -## Systems Without `make` -The following files need to be compiled: -* `core_list_join.c` -* `core_main.c` -* `core_matrix.c` -* `core_state.c` -* `core_util.c` -* `PORT_DIR/core_portme.c` - -For example: -~~~ -% gcc -O2 -o coremark.exe core_list_join.c core_main.c core_matrix.c core_state.c core_util.c simple/core_portme.c -DPERFORMANCE_RUN=1 -DITERATIONS=1000 -% ./coremark.exe > run1.log -~~~ -The above will compile the benchmark for a performance run and 1000 iterations. Output is redirected to `run1.log`. - -# Parallel Execution -Use `XCFLAGS=-DMULTITHREAD=N` where N is number of threads to run in parallel. Several implementations are available to execute in multiple contexts, or you can implement your own in `core_portme.c`. - -~~~ -% make XCFLAGS="-DMULTITHREAD=4 -DUSE_PTHREAD" -~~~ - -The above will compile the benchmark for execution on 4 cores, using POSIX Threads API. - -Note: linking may fail on the previous command if your linker does not automatically add the `pthread` library. If you encounter `undefined reference` errors, please modify the `core_portme.mak` file for your platform, (e.g. `linux/core_portme.mak`) and add `-lpthread` to the `LFLAGS_END` parameter. - -# Run Parameters for the Benchmark Executable -CoreMark's executable takes several parameters as follows (but only if `main()` accepts arguments): -1st - A seed value used for initialization of data. -2nd - A seed value used for initialization of data. -3rd - A seed value used for initialization of data. -4th - Number of iterations (0 for auto : default value) -5th - Reserved for internal use. -6th - Reserved for internal use. -7th - For malloc users only, ovreride the size of the input data buffer. - -The run target from make will run coremark with 2 different data initialization seeds. - -## Alternative parameters: -If not using `malloc` or command line arguments are not supported, the buffer size -for the algorithms must be defined via the compiler define `TOTAL_DATA_SIZE`. -`TOTAL_DATA_SIZE` must be set to 2000 bytes (default) for standard runs. -The default for such a target when testing different configurations could be: - -~~~ -% make XCFLAGS="-DTOTAL_DATA_SIZE=6000 -DMAIN_HAS_NOARGC=1" -~~~ - -# Submitting Results - -CoreMark results can be submitted on the web. Open a web browser and go to the [submission page](https://www.eembc.org/coremark/submit.php). After registering an account you may enter a score. - -# Run Rules -What is and is not allowed. - -## Required -1. The benchmark needs to run for at least 10 seconds. -2. All validation must succeed for seeds `0,0,0x66` and `0x3415,0x3415,0x66`, buffer size of 2000 bytes total. - * If not using command line arguments to main: -~~~ - % make XCFLAGS="-DPERFORMANCE_RUN=1" REBUILD=1 run1.log - % make XCFLAGS="-DVALIDATION_RUN=1" REBUILD=1 run2.log -~~~ -3. If using profile guided optimization, profile must be generated using seeds of `8,8,8`, and buffer size of 1200 bytes total. -~~~ - % make XCFLAGS="-DTOTAL_DATA_SIZE=1200 -DPROFILE_RUN=1" REBUILD=1 run3.log -~~~ -4. All source files must be compiled with the same flags. -5. All data type sizes must match size in bits such that: - * `ee_u8` is an unsigned 8-bit datatype. - * `ee_s16` is a signed 16-bit datatype. - * `ee_u16` is an unsigned 16-bit datatype. - * `ee_s32` is a signed 32-bit datatype. - * `ee_u32` is an unsigned 32-bit datatype. - -## Allowed - -1. Changing number of iterations -2. Changing toolchain and build/load/run options -3. Changing method of acquiring a data memory block -5. Changing the method of acquiring seed values -6. Changing implementation `in core_portme.c` -7. Changing configuration values in `core_portme.h` -8. Changing `core_portme.mak` - -## NOT ALLOWED -1. Changing of source file other then `core_portme*` (use `make check` to validate) - -# Reporting rules -Use the following syntax to report results on a data sheet: - -CoreMark 1.0 : N / C [/ P] [/ M] - -N - Number of iterations per second with seeds 0,0,0x66,size=2000) - -C - Compiler version and flags - -P - Parameters such as data and code allocation specifics - -* This parameter *may* be omitted if all data was allocated on the heap in RAM. -* This parameter *may not* be omitted when reporting CoreMark/MHz - -M - Type of parallel execution (if used) and number of contexts -* This parameter may be omitted if parallel execution was not used. - -e.g.: - -~~~ -CoreMark 1.0 : 128 / GCC 4.1.2 -O2 -fprofile-use / Heap in TCRAM / FORK:2 -~~~ -or -~~~ -CoreMark 1.0 : 1400 / GCC 3.4 -O4 -~~~ - -If reporting scaling results, the results must be reported as follows: - -CoreMark/MHz 1.0 : N / C / P [/ M] - -P - When reporting scaling results, memory parameter must also indicate memory frequency:core frequency ratio. -1. If the core has cache and cache frequency to core frequency ratio is configurable, that must also be included. - -e.g.: - -~~~ -CoreMark/MHz 1.0 : 1.47 / GCC 4.1.2 -O2 / DDR3(Heap) 30:1 Memory 1:1 Cache -~~~ - -# Log File Format -The log files have the following format - -~~~ -2K performance run parameters for coremark. (Run type) -CoreMark Size : 666 (Buffer size) -Total ticks : 25875 (platform dependent value) -Total time (secs) : 25.875000 (actual time in seconds) -Iterations/Sec : 3864.734300 (Performance value to report) -Iterations : 100000 (number of iterations used) -Compiler version : GCC3.4.4 (Compiler and version) -Compiler flags : -O2 (Compiler and linker flags) -Memory location : Code in flash, data in on chip RAM -seedcrc : 0xe9f5 (identifier for the input seeds) -[0]crclist : 0xe714 (validation for list part) -[0]crcmatrix : 0x1fd7 (validation for matrix part) -[0]crcstate : 0x8e3a (validation for state part) -[0]crcfinal : 0x33ff (iteration dependent output) -Correct operation validated. See README.md for run and reporting rules. (*Only when run is successful*) -CoreMark 1.0 : 6508.490622 / GCC3.4.4 -O2 / Heap (*Only on a successful performance run*) -~~~ - -# Theory of Operation - -This section describes the initial goals of CoreMark and their implementation. - -## Small and easy to understand - -* X number of source code lines for timed portion of the benchmark. -* Meaningful names for variables and functions. -* Comments for each block of code more than 10 lines long. - -## Portability - -A thin abstraction layer will be provided for I/O and timing in a separate file. All I/O and timing of the benchmark will be done through this layer. - -### Code / data size - -* Compile with gcc on x86 and make sure all sizes are according to requirements. -* If dynamic memory allocation is used, take total memory allocated into account as well. -* Avoid recursive functions and keep track of stack usage. -* Use the same memory block as data site for all algorithms, and initialize the data before each algorithm – while this means that initialization with data happens during the timed portion, it will only happen once during the timed portion and so have negligible effect on the results. - -## Controlled output - -This may be the most difficult goal. Compilers are constantly improving and getting better at analyzing code. To create work that cannot be computed at compile time and must be computed at run time, we will rely on two assumptions: - -* Some system functions (e.g. time, scanf) and parameters cannot be computed at compile time. In most cases, marking a variable volatile means the compiler is force to read this variable every time it is read. This will be used to introduce a factor into the input that cannot be precomputed at compile time. Since the results are input dependent, that will make sure that computation has to happen at run time. - -* Either a system function or I/O (e.g. scanf) or command line parameters or volatile variables will be used before the timed portion to generate data which is not available at compile time. Specific method used is not relevant as long as it can be controlled, and that it cannot be computed or eliminated by the compiler at compile time. E.g. if the clock() functions is a compiler stub, it may not be used. The derived values will be reported on the output so that verification can be done on a different machine. - -* We cannot rely on command line parameters since some embedded systems do not have the capability to provide command line parameters. All 3 methods above will be implemented (time based, scanf and command line parameters) and all 3 are valid if the compiler cannot determine the value at compile time. - -* It is important to note that The actual values that are to be supplied at run time will be standardized. The methodology is not intended to provide random data, but simply to provide controlled data that cannot be precomputed at compile time. - -* Printed results must be valid at run time. This will be used to make sure the computation has been executed. - -* Some embedded systems do not provide “printf†or other I/O functionality. All I/O will be done through a thin abstraction interface to allow execution on such systems (e.g. allow output via JTAG). - -## Key Algorithms - -### Linked List - -The following linked list structure will be used: - -~~~ -typedef struct list_data_s { - ee_s16 data16; - ee_s16 idx; -} list_data; - -typedef struct list_head_s { - struct list_head_s *next; - struct list_data_s *info; -} list_head; -~~~ - -While adding a level of indirection accessing the data, this structure is realistic and used in many embedded applications for small to medium lists. - -The list itself will be initialized on a block of memory that will be passed in to the initialization function. While in general linked lists use malloc for new nodes, embedded applications sometime control the memory for small data structures such as arrays and lists directly to avoid the overhead of system calls, so this approach is realistic. - -The linked list will be initialized such that 1/4 of the list pointers point to sequential areas in memory, and 3/4 of the list pointers are distributed in a non sequential manner. This is done to emulate a linked list that had add/remove happen for a while disrupting the neat order, and then a series of adds that are likely to come from sequential memory locations. - -For the benchmark itself: -- Multiple find operations are going to be performed. These find operations may result in the whole list being traversed. The result of each find will become part of the output chain. -- The list will be sorted using merge sort based on the data16 value, and then derive CRC of the data16 item in order for part of the list. The CRC will become part of the output chain. -- The list will be sorted again using merge sort based on the idx value. This sort will guarantee that the list is returned to the primary state before leaving the function, so that multiple iterations of the function will have the same result. CRC of the data16 for part of the list will again be calculated and become part of the output chain. - -The actual `data16` in each cell will be pseudo random based on a single 16b input that cannot be determined at compile time. In addition, the part of the list which is used for CRC will also be passed to the function, and determined based on an input that cannot be determined at run time. - -### Matrix Multiply - -This very simple algorithm forms the basis of many more complex algorithms. The tight inner loop is the focus of many optimizations (compiler as well as hardware based) and is thus relevant for embedded processing. - -The total available data space will be divided to 3 parts: -1. NxN matrix A. -2. NxN matrix B. -3. NxN matrix C. - -E.g. for 2K we will have 3 12x12 matrices (assuming data type of 32b 12(len)*12(wid)*4(size)*3(num) =1728 bytes). - -Matrix A will be initialized with small values (upper 3/4 of the bits all zero). -Matrix B will be initialized with medium values (upper half of the bits all zero). -Matrix C will be used for the result. - -For the benchmark itself: -- Multiple A by a constant into C, add the upper bits of each of the values in the result matrix. The result will become part of the output chain. -- Multiple A by column X of B into C, add the upper bits of each of the values in the result matrix. The result will become part of the output chain. -- Multiple A by B into C, add the upper bits of each of the values in the result matrix. The result will become part of the output chain. - -The actual values for A and B must be derived based on input that is not available at compile time. - -### State Machine - -This part of the code needs to exercise switch and if statements. As such, we will use a small Moore state machine. In particular, this will be a state machine that identifies string input as numbers and divides them according to format. - -The state machine will parse the input string until either a “,†separator or end of input is encountered. An invalid number will cause the state machine to return invalid state and a valid number will cause the state machine to return with type of number format (int/float/scientific). - -This code will perform a realistic task, be small enough to easily understand, and exercise the required functionality. The other option used in embedded systems is a mealy based state machine, which is driven by a table. The table then determines the number of states and complexity of transitions. This approach, however, tests mainly the load/store and function call mechanisms and less the handling of branches. If analysis of the final results shows that the load/store functionality of the processor is not exercised thoroughly, it may be a good addition to the benchmark (codesize allowing). - -For input, the memory block will be initialized with comma separated values of mixed formats, as well as invalid inputs. - -For the benchmark itself: -- Invoke the state machine on all of the input and count final states and state transitions. CRC of all final states and transitions will become part of the output chain. -- Modify the input at intervals (inject errors) and repeat the state machine operation. -- Modify the input back to original form. - -The actual input must be initialized based on data that cannot be determined at compile time. In addition the intervals for modification of the input and the actual modification must be based on input that cannot be determined at compile time. - -# Validation - -This release was tested on the following platforms: -* x86 cygwin and gcc 3.4 (Quad, dual and single core systems) -* x86 linux (Ubuntu/Fedora) and gcc (4.2/4.1) (Quad and single core systems) -* MIPS64 BE linux and gcc 3.4 16 cores system -* MIPS32 BE linux with CodeSourcery compiler 4.2-177 on Malta/Linux with a 1004K 3-core system -* PPC simulator with gcc 4.2.2 (No OS) -* PPC 64b BE linux (yellowdog) with gcc 3.4 and 4.1 (Dual core system) -* BF533 with VDSP50 -* Renesas R8C/H8 MCU with HEW 4.05 -* NXP LPC1700 armcc v4.0.0.524 -* NEC 78K with IAR v4.61 -* ARM simulator with armcc v4 - -# Memory Analysis - -Valgrind 3.4.0 used and no errors reported. - -# Balance Analysis - -Number of instructions executed for each function tested with cachegrind and found balanced with gcc and -O0. - -# Statistics - -Lines: -~~~ -Lines Blank Cmnts Source AESL -===== ===== ===== ===== ========== ======================================= - 469 66 170 251 627.5 core_list_join.c (C) - 330 18 54 268 670.0 core_main.c (C) - 256 32 80 146 365.0 core_matrix.c (C) - 240 16 51 186 465.0 core_state.c (C) - 165 11 20 134 335.0 core_util.c (C) - 150 23 36 98 245.0 coremark.h (C) - 1610 166 411 1083 2707.5 ----- Benchmark ----- (6 files) - 293 15 74 212 530.0 linux/core_portme.c (C) - 235 30 104 104 260.0 linux/core_portme.h (C) - 528 45 178 316 790.0 ----- Porting ----- (2 files) - -* For comparison, here are the stats for Dhrystone -Lines Blank Cmnts Source AESL -===== ===== ===== ===== ========== ======================================= - 311 15 242 54 135.0 dhry.h (C) - 789 132 119 553 1382.5 dhry_1.c (C) - 186 26 68 107 267.5 dhry_2.c (C) - 1286 173 429 714 1785.0 ----- C ----- (3 files) -~~~ - -# Credits -Many thanks to all of the individuals who helped with the development or testing of CoreMark including (Sorted by company name; note that company names may no longer be accurate as this was written in 2009). -* Alan Anderson, ADI -* Adhikary Rajiv, ADI -* Elena Stohr, ARM -* Ian Rickards, ARM -* Andrew Pickard, ARM -* Trent Parker, CAVIUM -* Shay Gal-On, EEMBC -* Markus Levy, EEMBC -* Peter Torelli, EEMBC -* Ron Olson, IBM -* Eyal Barzilay, MIPS -* Jens Eltze, NEC -* Hirohiko Ono, NEC -* Ulrich Drees, NEC -* Frank Roscheda, NEC -* Rob Cosaro, NXP -* Shumpei Kawasaki, RENESAS - -# Legal -Please refer to LICENSE.md in this reposity for a description of your rights to use this code. - -# Copyright -Copyright © 2009 EEMBC All rights reserved. -CoreMark is a trademark of EEMBC and EEMBC is a registered trademark of the Embedded Microprocessor Benchmark Consortium. - diff --git a/tests/riscv-coremark/coremark/barebones/core_portme.c b/tests/riscv-coremark/coremark/barebones/core_portme.c deleted file mode 100644 index 18967676b..000000000 --- a/tests/riscv-coremark/coremark/barebones/core_portme.c +++ /dev/null @@ -1,153 +0,0 @@ -/* -Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Original Author: Shay Gal-on -*/ -#include "coremark.h" -#include "core_portme.h" - -#if VALIDATION_RUN -volatile ee_s32 seed1_volatile = 0x3415; -volatile ee_s32 seed2_volatile = 0x3415; -volatile ee_s32 seed3_volatile = 0x66; -#endif -#if PERFORMANCE_RUN -volatile ee_s32 seed1_volatile = 0x0; -volatile ee_s32 seed2_volatile = 0x0; -volatile ee_s32 seed3_volatile = 0x66; -#endif -#if PROFILE_RUN -volatile ee_s32 seed1_volatile = 0x8; -volatile ee_s32 seed2_volatile = 0x8; -volatile ee_s32 seed3_volatile = 0x8; -#endif -volatile ee_s32 seed4_volatile = ITERATIONS; -volatile ee_s32 seed5_volatile = 0; -/* Porting : Timing functions - How to capture time and convert to seconds must be ported to whatever is - supported by the platform. e.g. Read value from on board RTC, read value from - cpu clock cycles performance counter etc. Sample implementation for standard - time.h and windows.h definitions included. -*/ -CORETIMETYPE -barebones_clock() -{ -#error \ - "You must implement a method to measure time in barebones_clock()! This function should return current time.\n" -} -/* Define : TIMER_RES_DIVIDER - Divider to trade off timer resolution and total time that can be - measured. - - Use lower values to increase resolution, but make sure that overflow - does not occur. If there are issues with the return value overflowing, - increase this value. - */ -#define GETMYTIME(_t) (*_t = barebones_clock()) -#define MYTIMEDIFF(fin, ini) ((fin) - (ini)) -#define TIMER_RES_DIVIDER 1 -#define SAMPLE_TIME_IMPLEMENTATION 1 -#define EE_TICKS_PER_SEC (CLOCKS_PER_SEC / TIMER_RES_DIVIDER) - -/** Define Host specific (POSIX), or target specific global time variables. */ -static CORETIMETYPE start_time_val, stop_time_val; - -/* Function : start_time - This function will be called right before starting the timed portion of - the benchmark. - - Implementation may be capturing a system timer (as implemented in the - example code) or zeroing some system parameters - e.g. setting the cpu clocks - cycles to 0. -*/ -void -start_time(void) -{ - GETMYTIME(&start_time_val); -} -/* Function : stop_time - This function will be called right after ending the timed portion of the - benchmark. - - Implementation may be capturing a system timer (as implemented in the - example code) or other system parameters - e.g. reading the current value of - cpu cycles counter. -*/ -void -stop_time(void) -{ - GETMYTIME(&stop_time_val); -} -/* Function : get_time - Return an abstract "ticks" number that signifies time on the system. - - Actual value returned may be cpu cycles, milliseconds or any other - value, as long as it can be converted to seconds by . This - methodology is taken to accomodate any hardware or simulated platform. The - sample implementation returns millisecs by default, and the resolution is - controlled by -*/ -CORE_TICKS -get_time(void) -{ - CORE_TICKS elapsed - = (CORE_TICKS)(MYTIMEDIFF(stop_time_val, start_time_val)); - return elapsed; -} -/* Function : time_in_secs - Convert the value returned by get_time to seconds. - - The type is used to accomodate systems with no support for - floating point. Default implementation implemented by the EE_TICKS_PER_SEC - macro above. -*/ -secs_ret -time_in_secs(CORE_TICKS ticks) -{ - secs_ret retval = ((secs_ret)ticks) / (secs_ret)EE_TICKS_PER_SEC; - return retval; -} - -ee_u32 default_num_contexts = 1; - -/* Function : portable_init - Target specific initialization code - Test for some common mistakes. -*/ -void -portable_init(core_portable *p, int *argc, char *argv[]) -{ -#error \ - "Call board initialization routines in portable init (if needed), in particular initialize UART!\n" - if (sizeof(ee_ptr_int) != sizeof(ee_u8 *)) - { - ee_printf( - "ERROR! Please define ee_ptr_int to a type that holds a " - "pointer!\n"); - } - if (sizeof(ee_u32) != 4) - { - ee_printf("ERROR! Please define ee_u32 to a 32b unsigned type!\n"); - } - p->portable_id = 1; -} -/* Function : portable_fini - Target specific final code -*/ -void -portable_fini(core_portable *p) -{ - p->portable_id = 0; -} diff --git a/tests/riscv-coremark/coremark/barebones/core_portme.h b/tests/riscv-coremark/coremark/barebones/core_portme.h deleted file mode 100644 index 55f643bf3..000000000 --- a/tests/riscv-coremark/coremark/barebones/core_portme.h +++ /dev/null @@ -1,210 +0,0 @@ -/* -Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Original Author: Shay Gal-on -*/ -/* Topic : Description - This file contains configuration constants required to execute on - different platforms -*/ -#ifndef CORE_PORTME_H -#define CORE_PORTME_H -/************************/ -/* Data types and settings */ -/************************/ -/* Configuration : HAS_FLOAT - Define to 1 if the platform supports floating point. -*/ -#ifndef HAS_FLOAT -#define HAS_FLOAT 1 -#endif -/* Configuration : HAS_TIME_H - Define to 1 if platform has the time.h header file, - and implementation of functions thereof. -*/ -#ifndef HAS_TIME_H -#define HAS_TIME_H 1 -#endif -/* Configuration : USE_CLOCK - Define to 1 if platform has the time.h header file, - and implementation of functions thereof. -*/ -#ifndef USE_CLOCK -#define USE_CLOCK 1 -#endif -/* Configuration : HAS_STDIO - Define to 1 if the platform has stdio.h. -*/ -#ifndef HAS_STDIO -#define HAS_STDIO 0 -#endif -/* Configuration : HAS_PRINTF - Define to 1 if the platform has stdio.h and implements the printf - function. -*/ -#ifndef HAS_PRINTF -#define HAS_PRINTF 0 -#endif - -/* Definitions : COMPILER_VERSION, COMPILER_FLAGS, MEM_LOCATION - Initialize these strings per platform -*/ -#ifndef COMPILER_VERSION -#ifdef __GNUC__ -#define COMPILER_VERSION "GCC"__VERSION__ -#else -#define COMPILER_VERSION "Please put compiler version here (e.g. gcc 4.1)" -#endif -#endif -#ifndef COMPILER_FLAGS -#define COMPILER_FLAGS \ - FLAGS_STR /* "Please put compiler flags here (e.g. -o3)" */ -#endif -#ifndef MEM_LOCATION -#define MEM_LOCATION "STACK" -#endif - -/* Data Types : - To avoid compiler issues, define the data types that need ot be used for - 8b, 16b and 32b in . - - *Imprtant* : - ee_ptr_int needs to be the data type used to hold pointers, otherwise - coremark may fail!!! -*/ -typedef signed short ee_s16; -typedef unsigned short ee_u16; -typedef signed int ee_s32; -typedef double ee_f32; -typedef unsigned char ee_u8; -typedef unsigned int ee_u32; -typedef ee_u32 ee_ptr_int; -typedef size_t ee_size_t; -#define NULL ((void *)0) -/* align_mem : - This macro is used to align an offset to point to a 32b value. It is - used in the Matrix algorithm to initialize the input memory blocks. -*/ -#define align_mem(x) (void *)(4 + (((ee_ptr_int)(x)-1) & ~3)) - -/* Configuration : CORE_TICKS - Define type of return from the timing functions. - */ -#define CORETIMETYPE ee_u32 -typedef ee_u32 CORE_TICKS; - -/* Configuration : SEED_METHOD - Defines method to get seed values that cannot be computed at compile - time. - - Valid values : - SEED_ARG - from command line. - SEED_FUNC - from a system function. - SEED_VOLATILE - from volatile variables. -*/ -#ifndef SEED_METHOD -#define SEED_METHOD SEED_VOLATILE -#endif - -/* Configuration : MEM_METHOD - Defines method to get a block of memry. - - Valid values : - MEM_MALLOC - for platforms that implement malloc and have malloc.h. - MEM_STATIC - to use a static memory array. - MEM_STACK - to allocate the data block on the stack (NYI). -*/ -#ifndef MEM_METHOD -#define MEM_METHOD MEM_STACK -#endif - -/* Configuration : MULTITHREAD - Define for parallel execution - - Valid values : - 1 - only one context (default). - N>1 - will execute N copies in parallel. - - Note : - If this flag is defined to more then 1, an implementation for launching - parallel contexts must be defined. - - Two sample implementations are provided. Use or - to enable them. - - It is valid to have a different implementation of - and in , to fit a particular architecture. -*/ -#ifndef MULTITHREAD -#define MULTITHREAD 1 -#define USE_PTHREAD 0 -#define USE_FORK 0 -#define USE_SOCKET 0 -#endif - -/* Configuration : MAIN_HAS_NOARGC - Needed if platform does not support getting arguments to main. - - Valid values : - 0 - argc/argv to main is supported - 1 - argc/argv to main is not supported - - Note : - This flag only matters if MULTITHREAD has been defined to a value - greater then 1. -*/ -#ifndef MAIN_HAS_NOARGC -#define MAIN_HAS_NOARGC 0 -#endif - -/* Configuration : MAIN_HAS_NORETURN - Needed if platform does not support returning a value from main. - - Valid values : - 0 - main returns an int, and return value will be 0. - 1 - platform does not support returning a value from main -*/ -#ifndef MAIN_HAS_NORETURN -#define MAIN_HAS_NORETURN 0 -#endif - -/* Variable : default_num_contexts - Not used for this simple port, must cintain the value 1. -*/ -extern ee_u32 default_num_contexts; - -typedef struct CORE_PORTABLE_S -{ - ee_u8 portable_id; -} core_portable; - -/* target specific init/fini */ -void portable_init(core_portable *p, int *argc, char *argv[]); -void portable_fini(core_portable *p); - -#if !defined(PROFILE_RUN) && !defined(PERFORMANCE_RUN) \ - && !defined(VALIDATION_RUN) -#if (TOTAL_DATA_SIZE == 1200) -#define PROFILE_RUN 1 -#elif (TOTAL_DATA_SIZE == 2000) -#define PERFORMANCE_RUN 1 -#else -#define VALIDATION_RUN 1 -#endif -#endif - -int ee_printf(const char *fmt, ...); - -#endif /* CORE_PORTME_H */ diff --git a/tests/riscv-coremark/coremark/barebones/core_portme.mak b/tests/riscv-coremark/coremark/barebones/core_portme.mak deleted file mode 100755 index 81594697d..000000000 --- a/tests/riscv-coremark/coremark/barebones/core_portme.mak +++ /dev/null @@ -1,87 +0,0 @@ -# Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# Original Author: Shay Gal-on - -#File : core_portme.mak - -# Flag : OUTFLAG -# Use this flag to define how to to get an executable (e.g -o) -OUTFLAG= -o -# Flag : CC -# Use this flag to define compiler to use -CC = gcc -# Flag : LD -# Use this flag to define compiler to use -LD = gld -# Flag : AS -# Use this flag to define compiler to use -AS = gas -# Flag : CFLAGS -# Use this flag to define compiler options. Note, you can add compiler options from the command line using XCFLAGS="other flags" -PORT_CFLAGS = -O0 -g -FLAGS_STR = "$(PORT_CFLAGS) $(XCFLAGS) $(XLFLAGS) $(LFLAGS_END)" -CFLAGS = $(PORT_CFLAGS) -I$(PORT_DIR) -I. -DFLAGS_STR=\"$(FLAGS_STR)\" -#Flag : LFLAGS_END -# Define any libraries needed for linking or other flags that should come at the end of the link line (e.g. linker scripts). -# Note : On certain platforms, the default clock_gettime implementation is supported but requires linking of librt. -SEPARATE_COMPILE=1 -# Flag : SEPARATE_COMPILE -# You must also define below how to create an object file, and how to link. -OBJOUT = -o -LFLAGS = -ASFLAGS = -OFLAG = -o -COUT = -c - -LFLAGS_END = -# Flag : PORT_SRCS -# Port specific source files can be added here -# You may also need cvt.c if the fcvt functions are not provided as intrinsics by your compiler! -PORT_SRCS = $(PORT_DIR)/core_portme.c $(PORT_DIR)/ee_printf.c -vpath %.c $(PORT_DIR) -vpath %.s $(PORT_DIR) - -# Flag : LOAD -# For a simple port, we assume self hosted compile and run, no load needed. - -# Flag : RUN -# For a simple port, we assume self hosted compile and run, simple invocation of the executable - -LOAD = echo "Please set LOAD to the process of loading the executable to the flash" -RUN = echo "Please set LOAD to the process of running the executable (e.g. via jtag, or board reset)" - -OEXT = .o -EXE = .bin - -$(OPATH)$(PORT_DIR)/%$(OEXT) : %.c - $(CC) $(CFLAGS) $(XCFLAGS) $(COUT) $< $(OBJOUT) $@ - -$(OPATH)%$(OEXT) : %.c - $(CC) $(CFLAGS) $(XCFLAGS) $(COUT) $< $(OBJOUT) $@ - -$(OPATH)$(PORT_DIR)/%$(OEXT) : %.s - $(AS) $(ASFLAGS) $< $(OBJOUT) $@ - -# Target : port_pre% and port_post% -# For the purpose of this simple port, no pre or post steps needed. - -.PHONY : port_prebuild port_postbuild port_prerun port_postrun port_preload port_postload -port_pre% port_post% : - -# FLAG : OPATH -# Path to the output folder. Default - current folder. -OPATH = ./ -MKDIR = mkdir -p - diff --git a/tests/riscv-coremark/coremark/barebones/cvt.c b/tests/riscv-coremark/coremark/barebones/cvt.c deleted file mode 100644 index 333e8ead2..000000000 --- a/tests/riscv-coremark/coremark/barebones/cvt.c +++ /dev/null @@ -1,127 +0,0 @@ -/* -Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ -#include -#define CVTBUFSIZE 80 -static char CVTBUF[CVTBUFSIZE]; - -static char * -cvt(double arg, int ndigits, int *decpt, int *sign, char *buf, int eflag) -{ - int r2; - double fi, fj; - char * p, *p1; - - if (ndigits < 0) - ndigits = 0; - if (ndigits >= CVTBUFSIZE - 1) - ndigits = CVTBUFSIZE - 2; - r2 = 0; - *sign = 0; - p = &buf[0]; - if (arg < 0) - { - *sign = 1; - arg = -arg; - } - arg = modf(arg, &fi); - p1 = &buf[CVTBUFSIZE]; - - if (fi != 0) - { - p1 = &buf[CVTBUFSIZE]; - while (fi != 0) - { - fj = modf(fi / 10, &fi); - *--p1 = (int)((fj + .03) * 10) + '0'; - r2++; - } - while (p1 < &buf[CVTBUFSIZE]) - *p++ = *p1++; - } - else if (arg > 0) - { - while ((fj = arg * 10) < 1) - { - arg = fj; - r2--; - } - } - p1 = &buf[ndigits]; - if (eflag == 0) - p1 += r2; - *decpt = r2; - if (p1 < &buf[0]) - { - buf[0] = '\0'; - return buf; - } - while (p <= p1 && p < &buf[CVTBUFSIZE]) - { - arg *= 10; - arg = modf(arg, &fj); - *p++ = (int)fj + '0'; - } - if (p1 >= &buf[CVTBUFSIZE]) - { - buf[CVTBUFSIZE - 1] = '\0'; - return buf; - } - p = p1; - *p1 += 5; - while (*p1 > '9') - { - *p1 = '0'; - if (p1 > buf) - ++*--p1; - else - { - *p1 = '1'; - (*decpt)++; - if (eflag == 0) - { - if (p > buf) - *p = '0'; - p++; - } - } - } - *p = '\0'; - return buf; -} - -char * -ecvt(double arg, int ndigits, int *decpt, int *sign) -{ - return cvt(arg, ndigits, decpt, sign, CVTBUF, 1); -} - -char * -ecvtbuf(double arg, int ndigits, int *decpt, int *sign, char *buf) -{ - return cvt(arg, ndigits, decpt, sign, buf, 1); -} - -char * -fcvt(double arg, int ndigits, int *decpt, int *sign) -{ - return cvt(arg, ndigits, decpt, sign, CVTBUF, 0); -} - -char * -fcvtbuf(double arg, int ndigits, int *decpt, int *sign, char *buf) -{ - return cvt(arg, ndigits, decpt, sign, buf, 0); -} diff --git a/tests/riscv-coremark/coremark/barebones/ee_printf.c b/tests/riscv-coremark/coremark/barebones/ee_printf.c deleted file mode 100644 index f2d362dc0..000000000 --- a/tests/riscv-coremark/coremark/barebones/ee_printf.c +++ /dev/null @@ -1,700 +0,0 @@ -/* -Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -#include -#include - -#define ZEROPAD (1 << 0) /* Pad with zero */ -#define SIGN (1 << 1) /* Unsigned/signed long */ -#define PLUS (1 << 2) /* Show plus */ -#define SPACE (1 << 3) /* Spacer */ -#define LEFT (1 << 4) /* Left justified */ -#define HEX_PREP (1 << 5) /* 0x */ -#define UPPERCASE (1 << 6) /* 'ABCDEF' */ - -#define is_digit(c) ((c) >= '0' && (c) <= '9') - -static char * 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) -{ - const char *sc; - for (sc = s; *sc != '\0' && count--; ++sc) - ; - return sc - s; -} - -static int -skip_atoi(const char **s) -{ - int i = 0; - while (is_digit(**s)) - i = i * 10 + *((*s)++) - '0'; - return i; -} - -static char * -number(char *str, long num, int base, int size, int precision, int type) -{ - char c, sign, tmp[66]; - char *dig = digits; - int i; - - if (type & UPPERCASE) - dig = upper_digits; - if (type & LEFT) - type &= ~ZEROPAD; - if (base < 2 || base > 36) - return 0; - - c = (type & ZEROPAD) ? '0' : ' '; - sign = 0; - if (type & SIGN) - { - if (num < 0) - { - sign = '-'; - num = -num; - size--; - } - else if (type & PLUS) - { - sign = '+'; - size--; - } - else if (type & SPACE) - { - sign = ' '; - size--; - } - } - - if (type & HEX_PREP) - { - if (base == 16) - size -= 2; - else if (base == 8) - size--; - } - - i = 0; - - if (num == 0) - tmp[i++] = '0'; - else - { - while (num != 0) - { - tmp[i++] = dig[((unsigned long)num) % (unsigned)base]; - num = ((unsigned long)num) / (unsigned)base; - } - } - - if (i > precision) - precision = i; - size -= precision; - if (!(type & (ZEROPAD | LEFT))) - while (size-- > 0) - *str++ = ' '; - if (sign) - *str++ = sign; - - if (type & HEX_PREP) - { - if (base == 8) - *str++ = '0'; - else if (base == 16) - { - *str++ = '0'; - *str++ = digits[33]; - } - } - - if (!(type & LEFT)) - while (size-- > 0) - *str++ = c; - while (i < precision--) - *str++ = '0'; - while (i-- > 0) - *str++ = tmp[i]; - while (size-- > 0) - *str++ = ' '; - - return str; -} - -static char * -eaddr(char *str, unsigned char *addr, int size, int precision, int type) -{ - char tmp[24]; - char *dig = digits; - int i, len; - - if (type & UPPERCASE) - dig = upper_digits; - len = 0; - for (i = 0; i < 6; i++) - { - if (i != 0) - tmp[len++] = ':'; - tmp[len++] = dig[addr[i] >> 4]; - tmp[len++] = dig[addr[i] & 0x0F]; - } - - if (!(type & LEFT)) - while (len < size--) - *str++ = ' '; - for (i = 0; i < len; ++i) - *str++ = tmp[i]; - while (len < size--) - *str++ = ' '; - - return str; -} - -static char * -iaddr(char *str, unsigned char *addr, int size, int precision, int type) -{ - char tmp[24]; - int i, n, len; - - len = 0; - for (i = 0; i < 4; i++) - { - if (i != 0) - tmp[len++] = '.'; - n = addr[i]; - - if (n == 0) - tmp[len++] = digits[0]; - else - { - if (n >= 100) - { - tmp[len++] = digits[n / 100]; - n = n % 100; - tmp[len++] = digits[n / 10]; - n = n % 10; - } - else if (n >= 10) - { - tmp[len++] = digits[n / 10]; - n = n % 10; - } - - tmp[len++] = digits[n]; - } - } - - if (!(type & LEFT)) - while (len < size--) - *str++ = ' '; - for (i = 0; i < len; ++i) - *str++ = tmp[i]; - while (len < size--) - *str++ = ' '; - - return str; -} - -#if HAS_FLOAT - -char * ecvtbuf(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); - -void -ee_bufcpy(char *pd, char *ps, int count) -{ - char *pe = ps + count; - while (ps != pe) - *pd++ = *ps++; -} - -static void -parse_float(double value, char *buffer, char fmt, int precision) -{ - int decpt, sign, exp, pos; - char *digits = NULL; - char cvtbuf[80]; - int capexp = 0; - int magnitude; - - if (fmt == 'G' || fmt == 'E') - { - capexp = 1; - fmt += 'a' - 'A'; - } - - if (fmt == 'g') - { - digits = ecvtbuf(value, precision, &decpt, &sign, cvtbuf); - magnitude = decpt - 1; - if (magnitude < -4 || magnitude > precision - 1) - { - fmt = 'e'; - precision -= 1; - } - else - { - fmt = 'f'; - precision -= decpt; - } - } - - if (fmt == 'e') - { - digits = ecvtbuf(value, precision + 1, &decpt, &sign, cvtbuf); - - if (sign) - *buffer++ = '-'; - *buffer++ = *digits; - if (precision > 0) - *buffer++ = '.'; - ee_bufcpy(buffer, digits + 1, precision); - buffer += precision; - *buffer++ = capexp ? 'E' : 'e'; - - if (decpt == 0) - { - if (value == 0.0) - exp = 0; - else - exp = -1; - } - else - exp = decpt - 1; - - if (exp < 0) - { - *buffer++ = '-'; - exp = -exp; - } - else - *buffer++ = '+'; - - buffer[2] = (exp % 10) + '0'; - exp = exp / 10; - buffer[1] = (exp % 10) + '0'; - exp = exp / 10; - buffer[0] = (exp % 10) + '0'; - buffer += 3; - } - else if (fmt == 'f') - { - digits = fcvtbuf(value, precision, &decpt, &sign, cvtbuf); - if (sign) - *buffer++ = '-'; - if (*digits) - { - if (decpt <= 0) - { - *buffer++ = '0'; - *buffer++ = '.'; - for (pos = 0; pos < -decpt; pos++) - *buffer++ = '0'; - while (*digits) - *buffer++ = *digits++; - } - else - { - pos = 0; - while (*digits) - { - if (pos++ == decpt) - *buffer++ = '.'; - *buffer++ = *digits++; - } - } - } - else - { - *buffer++ = '0'; - if (precision > 0) - { - *buffer++ = '.'; - for (pos = 0; pos < precision; pos++) - *buffer++ = '0'; - } - } - } - - *buffer = '\0'; -} - -static void -decimal_point(char *buffer) -{ - while (*buffer) - { - if (*buffer == '.') - return; - if (*buffer == 'e' || *buffer == 'E') - break; - buffer++; - } - - if (*buffer) - { - int n = strnlen(buffer, 256); - while (n > 0) - { - buffer[n + 1] = buffer[n]; - n--; - } - - *buffer = '.'; - } - else - { - *buffer++ = '.'; - *buffer = '\0'; - } -} - -static void -cropzeros(char *buffer) -{ - char *stop; - - while (*buffer && *buffer != '.') - buffer++; - if (*buffer++) - { - while (*buffer && *buffer != 'e' && *buffer != 'E') - buffer++; - stop = buffer--; - while (*buffer == '0') - buffer--; - if (*buffer == '.') - buffer--; - while (buffer != stop) - *++buffer = 0; - } -} - -static char * -flt(char *str, double num, int size, int precision, char fmt, int flags) -{ - char tmp[80]; - char c, sign; - int n, i; - - // Left align means no zero padding - if (flags & LEFT) - flags &= ~ZEROPAD; - - // Determine padding and sign char - c = (flags & ZEROPAD) ? '0' : ' '; - sign = 0; - if (flags & SIGN) - { - if (num < 0.0) - { - sign = '-'; - num = -num; - size--; - } - else if (flags & PLUS) - { - sign = '+'; - size--; - } - else if (flags & SPACE) - { - sign = ' '; - size--; - } - } - - // Compute the precision value - if (precision < 0) - precision = 6; // Default precision: 6 - - // Convert floating point number to text - parse_float(num, tmp, fmt, precision); - - if ((flags & HEX_PREP) && precision == 0) - decimal_point(tmp); - if (fmt == 'g' && !(flags & HEX_PREP)) - cropzeros(tmp); - - n = strnlen(tmp, 256); - - // Output number with alignment and padding - size -= n; - if (!(flags & (ZEROPAD | LEFT))) - while (size-- > 0) - *str++ = ' '; - if (sign) - *str++ = sign; - if (!(flags & LEFT)) - while (size-- > 0) - *str++ = c; - for (i = 0; i < n; i++) - *str++ = tmp[i]; - while (size-- > 0) - *str++ = ' '; - - return str; -} - -#endif - -static int -ee_vsprintf(char *buf, const char *fmt, va_list args) -{ - int len; - unsigned long num; - int i, base; - char * str; - char * s; - - int flags; // Flags to number() - - int field_width; // Width of output field - int precision; // Min. # of digits for integers; max number of chars for - // from string - int qualifier; // 'h', 'l', or 'L' for integer fields - - for (str = buf; *fmt; fmt++) - { - if (*fmt != '%') - { - *str++ = *fmt; - continue; - } - - // Process flags - flags = 0; - repeat: - fmt++; // This also skips first '%' - switch (*fmt) - { - case '-': - flags |= LEFT; - goto repeat; - case '+': - flags |= PLUS; - goto repeat; - case ' ': - flags |= SPACE; - goto repeat; - case '#': - flags |= HEX_PREP; - goto repeat; - case '0': - flags |= ZEROPAD; - goto repeat; - } - - // Get field width - field_width = -1; - if (is_digit(*fmt)) - field_width = skip_atoi(&fmt); - else if (*fmt == '*') - { - fmt++; - field_width = va_arg(args, int); - if (field_width < 0) - { - field_width = -field_width; - flags |= LEFT; - } - } - - // Get the precision - precision = -1; - if (*fmt == '.') - { - ++fmt; - if (is_digit(*fmt)) - precision = skip_atoi(&fmt); - else if (*fmt == '*') - { - ++fmt; - precision = va_arg(args, int); - } - if (precision < 0) - precision = 0; - } - - // Get the conversion qualifier - qualifier = -1; - if (*fmt == 'l' || *fmt == 'L') - { - qualifier = *fmt; - fmt++; - } - - // Default base - base = 10; - - switch (*fmt) - { - case 'c': - if (!(flags & LEFT)) - while (--field_width > 0) - *str++ = ' '; - *str++ = (unsigned char)va_arg(args, int); - while (--field_width > 0) - *str++ = ' '; - continue; - - case 's': - s = va_arg(args, char *); - if (!s) - s = ""; - len = strnlen(s, precision); - if (!(flags & LEFT)) - while (len < field_width--) - *str++ = ' '; - for (i = 0; i < len; ++i) - *str++ = *s++; - while (len < field_width--) - *str++ = ' '; - continue; - - case 'p': - if (field_width == -1) - { - field_width = 2 * sizeof(void *); - flags |= ZEROPAD; - } - str = number(str, - (unsigned long)va_arg(args, void *), - 16, - field_width, - precision, - flags); - continue; - - case 'A': - flags |= UPPERCASE; - - case 'a': - if (qualifier == 'l') - str = eaddr(str, - va_arg(args, unsigned char *), - field_width, - precision, - flags); - else - str = iaddr(str, - va_arg(args, unsigned char *), - field_width, - precision, - flags); - continue; - - // Integer number formats - set up the flags and "break" - case 'o': - base = 8; - break; - - case 'X': - flags |= UPPERCASE; - - case 'x': - base = 16; - break; - - case 'd': - case 'i': - flags |= SIGN; - - case 'u': - break; - -#if HAS_FLOAT - - case 'f': - str = flt(str, - va_arg(args, double), - field_width, - precision, - *fmt, - flags | SIGN); - continue; - -#endif - - default: - if (*fmt != '%') - *str++ = '%'; - if (*fmt) - *str++ = *fmt; - else - --fmt; - continue; - } - - if (qualifier == 'l') - num = va_arg(args, unsigned long); - else if (flags & SIGN) - num = va_arg(args, int); - else - num = va_arg(args, unsigned int); - - str = number(str, num, base, field_width, precision, flags); - } - - *str = '\0'; - return str - buf; -} - -void -uart_send_char(char c) -{ -#error "You must implement the method uart_send_char to use this file!\n"; - /* Output of a char to a UART usually follows the following model: - Wait until UART is ready - Write char to UART - Wait until UART is done - - Or in code: - while (*UART_CONTROL_ADDRESS != UART_READY); - *UART_DATA_ADDRESS = c; - while (*UART_CONTROL_ADDRESS != UART_READY); - - Check the UART sample code on your platform or the board - documentation. - */ -} - -int -ee_printf(const char *fmt, ...) -{ - char buf[1024], *p; - va_list args; - int n = 0; - - va_start(args, fmt); - ee_vsprintf(buf, fmt, args); - va_end(args); - p = buf; - while (*p) - { - uart_send_char(*p); - n++; - p++; - } - - return n; -} diff --git a/tests/riscv-coremark/coremark/core_list_join.c b/tests/riscv-coremark/coremark/core_list_join.c deleted file mode 100644 index 4bffeeccf..000000000 --- a/tests/riscv-coremark/coremark/core_list_join.c +++ /dev/null @@ -1,580 +0,0 @@ -/* -Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Original Author: Shay Gal-on -*/ - -#include "coremark.h" -//#include -//#include -/* -Topic: Description - Benchmark using a linked list. - - Linked list is a common data structure used in many applications. - - For our purposes, this will excercise the memory units of the processor. - In particular, usage of the list pointers to find and alter data. - - We are not using Malloc since some platforms do not support this library. - - Instead, the memory block being passed in is used to create a list, - and the benchmark takes care not to add more items then can be - accomodated by the memory block. The porting layer will make sure - that we have a valid memory block. - - All operations are done in place, without using any extra memory. - - The list itself contains list pointers and pointers to data items. - Data items contain the following: - - idx - An index that captures the initial order of the list. - data - Variable data initialized based on the input parameters. The 16b are divided as follows: - o Upper 8b are backup of original data. - o Bit 7 indicates if the lower 7 bits are to be used as is or calculated. - o Bits 0-2 indicate type of operation to perform to get a 7b value. - o Bits 3-6 provide input for the operation. - -*/ - -/* local functions */ - -list_head *core_list_find(list_head *list,list_data *info); -list_head *core_list_reverse(list_head *list); -list_head *core_list_remove(list_head *item); -list_head *core_list_undo_remove(list_head *item_removed, list_head *item_modified); -list_head *core_list_insert_new(list_head *insert_point - , list_data *info, list_head **memblock, list_data **datablock - , list_head *memblock_end, list_data *datablock_end); -typedef ee_s32(*list_cmp)(list_data *a, list_data *b, core_results *res); -list_head *core_list_mergesort(list_head *list, list_cmp cmp, core_results *res); - -ee_s16 calc_func(ee_s16 *pdata, core_results *res) { - ee_s16 data=*pdata; - ee_s16 retval; - ee_u8 optype=(data>>7) & 1; /* bit 7 indicates if the function result has been cached */ - if (optype) /* if cached, use cache */ - return (data & 0x007f); - else { /* otherwise calculate and cache the result */ - ee_s16 flag=data & 0x7; /* bits 0-2 is type of function to perform */ - ee_s16 dtype=((data>>3) & 0xf); /* bits 3-6 is specific data for the operation */ - dtype |= dtype << 4; /* replicate the lower 4 bits to get an 8b value */ - switch (flag) { - case 0: - if (dtype<0x22) /* set min period for bit corruption */ - dtype=0x22; - retval=core_bench_state(res->size,res->memblock[3],res->seed1,res->seed2,dtype,res->crc); - if (res->crcstate==0) - res->crcstate=retval; - break; - case 1: - retval=core_bench_matrix(&(res->mat),dtype,res->crc); - if (res->crcmatrix==0) - res->crcmatrix=retval; - break; - default: - retval=data; - break; - } - res->crc=crcu16(retval,res->crc); - retval &= 0x007f; - *pdata = (data & 0xff00) | 0x0080 | retval; /* cache the result */ - return retval; - } -} -/* Function: cmp_complex - Compare the data item in a list cell. - - Can be used by mergesort. -*/ -ee_s32 cmp_complex(list_data *a, list_data *b, core_results *res) { - ee_s16 val1=calc_func(&(a->data16),res); - ee_s16 val2=calc_func(&(b->data16),res); - return val1 - val2; -} - -/* Function: cmp_idx - Compare the idx item in a list cell, and regen the data. - - Can be used by mergesort. -*/ -ee_s32 cmp_idx(list_data *a, list_data *b, core_results *res) { - if (res==NULL) { - a->data16 = (a->data16 & 0xff00) | (0x00ff & (a->data16>>8)); - b->data16 = (b->data16 & 0xff00) | (0x00ff & (b->data16>>8)); - } - return a->idx - b->idx; -} - -/*void ehitoa(int value, char *str, int base){ - if (value>100000) strcpy(str,"too big"); - else{ - int places[6] = {100000, 10000, 1000, 100, 10, 1}; - int col; - int pv; - for(col = 0; col<6; col++){ - pv = 0; - while (value >= places[col]){ - value=value -places[col]; - pv++; - - } - str[col]=pv+'0'; - } - str[6]=0; - } -}*/ - -void copy_info(list_data *to,list_data *from) { - to->data16=from->data16; - to->idx=from->idx; -} - -/* Benchmark for linked list: - - Try to find multiple data items. - - List sort - - Operate on data from list (crc) - - Single remove/reinsert - * At the end of this function, the list is back to original state -*/ -ee_u16 core_bench_list(core_results *res, ee_s16 finder_idx) { - ee_u16 retval=0; - ee_u16 found=0,missed=0; - list_head *list=res->list; - ee_s16 find_num=res->seed3; - list_head *this_find; - list_head *finder, *remover; - list_data info; - ee_s16 i; - //ee_printf("entered corebenchlist \n"); - info.idx=finder_idx; - /* find values in the list, and change the list each time (reverse and cache if value found) */ - for (i=0; inext->info->data16 >> 8) & 1; - //ee_printf("if statement \n"); - } - else { - found++; - //ee_printf("else statement \n"); - if (this_find->info->data16 & 0x1) /* use found value */ - retval+=(this_find->info->data16 >> 9) & 1; - /* and cache next item at the head of the list (if any) */ - if (this_find->next != NULL) { - finder = this_find->next; - this_find->next = finder->next; - finder->next=list->next; - list->next=finder; - } - } - if (info.idx>=0) - info.idx++; -#if CORE_DEBUG - //ee_printf("List find %d: [%d,%d,%d]\n",i,retval,missed,found); -#endif - } - retval+=found*4-missed; - /* sort the list by data content and remove one item*/ - if (finder_idx>0) - list=core_list_mergesort(list,cmp_complex,res); - remover=core_list_remove(list->next); - /* CRC data content of list from location of index N forward, and then undo remove */ - finder=core_list_find(list,&info); - if (!finder) - finder=list->next; - while (finder) { - retval=crc16(list->info->data16,retval); - finder=finder->next; - } -#if CORE_DEBUG - //ee_printf("List sort 1: %04x\n",retval); -#endif - remover=core_list_undo_remove(remover,list->next); - /* sort the list by index, in effect returning the list to original state */ - list=core_list_mergesort(list,cmp_idx,NULL); - /* CRC data content of list */ - finder=list->next; - while (finder) { - retval=crc16(list->info->data16,retval); - finder=finder->next; - } -#if CORE_DEBUG - //ee_printf("List sort 2: %04x\n",retval); -#endif - return retval; -} -/* Function: core_list_init - Initialize list with data. - - Parameters: - blksize - Size of memory to be initialized. - memblock - Pointer to memory block. - seed - Actual values chosen depend on the seed parameter. - The seed parameter MUST be supplied from a source that cannot be determined at compile time - - Returns: - Pointer to the head of the list. - -*/ -list_head *core_list_init(ee_u32 blksize, list_head *memblock, ee_s16 seed) { - /* calculated pointers for the list */ - //ee_printf("%d \n blksize", blksize); - ee_u32 per_item=16+sizeof(struct list_data_s); - //ee_printf("%d \n sizeof", sizeof(struct list_data_s)); - //ee_printf("%d \n per_item", per_item); - ee_u32 size=(blksize/per_item)-2; - //char bufftwo[200]; - //ehitoa(size, bufftwo, 10); - //ee_printf(" size = %s done \n", bufftwo); - //ee_printf("%d", size);/* to accomodate systems with 64b pointers, and make sure same code is executed, set max list elements */ - list_head *memblock_end=memblock+size; - - list_data *datablock=(list_data *)(memblock_end); - list_data *datablock_end=datablock+size; - //ee_printf("datablock_end"); - /* some useful variables */ - ee_u32 i; - list_head *finder,*list=memblock; - list_data info; - //ehitoa(size, bufftwo, 10); - //ee_printf(" size2 = %s done \n", bufftwo); - - /* create a fake items for the list head and tail */ - list->next=NULL; - list->info=datablock; - list->info->idx=0x0000; - list->info->data16=(ee_s16)0x8080; - memblock++; - datablock++; - info.idx=0x7fff; - info.data16=(ee_s16)0xffff; - //ehitoa(size, bufftwo, 10); - //ee_printf(" size3 = %s done \n", bufftwo); - core_list_insert_new(list,&info,&memblock,&datablock,memblock_end,datablock_end); - //ehitoa(size, bufftwo, 10); - //ee_printf(" size4 = %s done \n", bufftwo);; - /* then insert size items */ - for (i=0; inext; - i=1; - //ehitoa(i, bufftwo, 10); - //ee_printf(" i = %s done \n", bufftwo); - while (finder->next!=NULL) { - //ee_printf("enter while statement \n"); - if (iinfo->idx=i++; - //ehitoa(i, bufftwo, 10); - //ee_printf(" if i = %s done \n", bufftwo); - } - - else { - ee_u16 pat=(ee_u16)(i++ ^ seed); /* get a pseudo random number */ - finder->info->idx=0x3fff & (((i & 0x07) << 8) | pat); /* make sure the mixed items end up after the ones in sequence */ - //ehitoa(i, bufftwo, 10); - //ee_printf(" else i = %s done \n", bufftwo); - } - finder=finder->next; - } - //ehitoa(i, bufftwo, 10); - //ee_printf(" i2 = %s done \n", bufftwo); - list = core_list_mergesort(list,cmp_idx,NULL); -#if CORE_DEBUG - //ee_printf("Initialized list:\n"); - finder=list; - while (finder) { - //ee_printf("[%04x,%04x]",finder->info->idx,(ee_u16)finder->info->data16); - finder=finder->next; - } - //ee_printf("\n"); -#endif - return list; -} - -/* Function: core_list_insert - Insert an item to the list - - Parameters: - insert_point - where to insert the item. - info - data for the cell. - memblock - pointer for the list header - datablock - pointer for the list data - memblock_end - end of region for list headers - datablock_end - end of region for list data - - Returns: - Pointer to new item. -*/ -list_head *core_list_insert_new(list_head *insert_point, list_data *info, list_head **memblock, list_data **datablock - , list_head *memblock_end, list_data *datablock_end) { - list_head *newitem; - - if ((*memblock+1) >= memblock_end) - return NULL; - if ((*datablock+1) >= datablock_end) - return NULL; - - newitem=*memblock; - (*memblock)++; - newitem->next=insert_point->next; - insert_point->next=newitem; - - newitem->info=*datablock; - (*datablock)++; - copy_info(newitem->info,info); - - return newitem; -} - -/* Function: core_list_remove - Remove an item from the list. - - Operation: - For a singly linked list, remove by copying the data from the next item - over to the current cell, and unlinking the next item. - - Note: - since there is always a fake item at the end of the list, no need to check for NULL. - - Returns: - Removed item. -*/ -list_head *core_list_remove(list_head *item) { - list_data *tmp; - list_head *ret=item->next; - /* swap data pointers */ - tmp=item->info; - item->info=ret->info; - ret->info=tmp; - /* and eliminate item */ - item->next=item->next->next; - ret->next=NULL; - return ret; -} - -/* Function: core_list_undo_remove - Undo a remove operation. - - Operation: - Since we want each iteration of the benchmark to be exactly the same, - we need to be able to undo a remove. - Link the removed item back into the list, and switch the info items. - - Parameters: - item_removed - Return value from the - item_modified - List item that was modified during - - Returns: - The item that was linked back to the list. - -*/ -list_head *core_list_undo_remove(list_head *item_removed, list_head *item_modified) { - list_data *tmp; - /* swap data pointers */ - tmp=item_removed->info; - item_removed->info=item_modified->info; - item_modified->info=tmp; - /* and insert item */ - item_removed->next=item_modified->next; - item_modified->next=item_removed; - return item_removed; -} - -/* Function: core_list_find - Find an item in the list - - Operation: - Find an item by idx (if not 0) or specific data value - - Parameters: - list - list head - info - idx or data to find - - Returns: - Found item, or NULL if not found. -*/ -list_head *core_list_find(list_head *list,list_data *info) { - //ee_printf("entered core_list_find \n"); - if (info->idx>=0) { - //ee_printf("find if \n"); - while (list && (list->info->idx != info->idx)){ - list=list->next; - //ee_printf("find while if \n"); - } - //ee_printf("core_list_find end \n"); - return list; - } else { - //ee_printf("find else"); - while (list && ((list->info->data16 & 0xff) != info->data16)){ - list=list->next; - //ee_printf("find while else \n"); - } - //ee_printf("core list find end \n"); - return list; - } -} -/* Function: core_list_reverse - Reverse a list - - Operation: - Rearrange the pointers so the list is reversed. - - Parameters: - list - list head - info - idx or data to find - - Returns: - Found item, or NULL if not found. -*/ - -list_head *core_list_reverse(list_head *list) { -// ee_printf("entered core_list_reverse"); - list_head *next=NULL, *tmp; - while (list) { - tmp=list->next; - list->next=next; - next=list; - list=tmp; - } - //ee_printf("core_list_reverse done"); - return next; -} -/* Function: core_list_mergesort - Sort the list in place without recursion. - - Description: - Use mergesort, as for linked list this is a realistic solution. - Also, since this is aimed at embedded, care was taken to use iterative rather then recursive algorithm. - The sort can either return the list to original order (by idx) , - or use the data item to invoke other other algorithms and change the order of the list. - - Parameters: - list - list to be sorted. - cmp - cmp function to use - - Returns: - New head of the list. - - Note: - We have a special header for the list that will always be first, - but the algorithm could theoretically modify where the list starts. - - */ -list_head *core_list_mergesort(list_head *list, list_cmp cmp, core_results *res) { - list_head *p, *q, *e, *tail; - ee_s32 insize, nmerges, psize, qsize, i; - - insize = 1; - //char bufftwo[200]; - while (1) { - p = list; - list = NULL; - tail = NULL; - - nmerges = 0; /* count number of merges we do in this pass */ - //ehitoa(nmerges, bufftwo, 10); - //ee_printf(" nmerges default value = %s done \n", bufftwo); - while (p) { - nmerges++; /* there exists a merge to be done */ - //ehitoa(nmerges, bufftwo, 10); - //ee_printf(" current nmerges = %s done \n", bufftwo); - /* step `insize' places along from p */ - q = p; - psize = 0; - //ehitoa(insize, bufftwo, 10); - //ee_printf(" insize = %s done \n", bufftwo); - for (i = 0; i < insize; i++) { - //ehitoa(i, bufftwo, 10); - //ee_printf(" i = %s done \n", bufftwo); - psize++; - q = q->next; - if (!q) break; - } - - /* if q hasn't fallen off end, we have two lists to merge */ - qsize = insize; - //ehitoa(qsize, bufftwo, 10); - //ee_printf(" qsize = %s done \n", bufftwo); - - /* now we have two lists; merge them */ - while (psize > 0 || (qsize > 0 && q)) { - - /* decide whether next element of merge comes from p or q */ - if (psize == 0) { - //ee_printf("if \n"); - /* p is empty; e must come from q. */ - e = q; q = q->next; qsize--; - } else if (qsize == 0 || !q) { - //ee_printf("else if \n"); - /* q is empty; e must come from p. */ - e = p; p = p->next; psize--; - } else if (cmp(p->info,q->info,res) <= 0) { - //ee_printf("else if 2 \n"); - /* First element of p is lower (or same); e must come from p. */ - e = p; p = p->next; psize--; - } else { - //ee_printf("else \n"); - /* First element of q is lower; e must come from q. */ - e = q; q = q->next; qsize--; - } - - /* add the next element to the merged list */ - if (tail) { - //ee_printf("tail if \n"); - tail->next = e; - } else { - //ee_printf("tail else \n"); - list = e; - } - tail = e; - } - - /* now p has stepped `insize' places along, and q has too */ - p = q; - } - - tail->next = NULL; - - /* If we have done only one merge, we're finished. */ - if (nmerges <= 1) /* allow for nmerges==0, the empty list case */ - return list; - - /* Otherwise repeat, merging lists twice the size */ - insize *= 2; - //ehitoa(insize, bufftwo, 10); - //ee_printf(" insize2 = %s done \n", bufftwo); - } -#if COMPILER_REQUIRES_SORT_RETURN - return list; -#endif -} diff --git a/tests/riscv-coremark/coremark/core_main.c b/tests/riscv-coremark/coremark/core_main.c deleted file mode 100644 index b1ec758bf..000000000 --- a/tests/riscv-coremark/coremark/core_main.c +++ /dev/null @@ -1,447 +0,0 @@ -/* -Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Original Author: Shay Gal-on -*/ - -/* File: core_main.c - This file contains the framework to acquire a block of memory, seed - initial parameters, tun t he benchmark and report the results. -*/ -#include "coremark.h" - -/* Function: iterate - Run the benchmark for a specified number of iterations. - - Operation: - For each type of benchmarked algorithm: - a - Initialize the data block for the algorithm. - b - Execute the algorithm N times. - - Returns: - NULL. -*/ -static ee_u16 list_known_crc[] = { (ee_u16)0xd4b0, - (ee_u16)0x3340, - (ee_u16)0x6a79, - (ee_u16)0xe714, - (ee_u16)0xe3c1 }; -static ee_u16 matrix_known_crc[] = { (ee_u16)0xbe52, - (ee_u16)0x1199, - (ee_u16)0x5608, - (ee_u16)0x1fd7, - (ee_u16)0x0747 }; -static ee_u16 state_known_crc[] = { (ee_u16)0x5e47, - (ee_u16)0x39bf, - (ee_u16)0xe5a4, - (ee_u16)0x8e3a, - (ee_u16)0x8d84 }; -void * -iterate(void *pres) -{ - ee_u32 i; - ee_u16 crc; - core_results *res = (core_results *)pres; - ee_u32 iterations = res->iterations; - res->crc = 0; - res->crclist = 0; - res->crcmatrix = 0; - res->crcstate = 0; - - for (i = 0; i < iterations; i++) - { - crc = core_bench_list(res, 1); - res->crc = crcu16(crc, res->crc); - crc = core_bench_list(res, -1); - res->crc = crcu16(crc, res->crc); - if (i == 0) - res->crclist = res->crc; - } - return NULL; -} - -#if (SEED_METHOD == SEED_ARG) -ee_s32 get_seed_args(int i, int argc, char *argv[]); -#define get_seed(x) (ee_s16) get_seed_args(x, argc, argv) -#define get_seed_32(x) get_seed_args(x, argc, argv) -#else /* via function or volatile */ -ee_s32 get_seed_32(int i); -#define get_seed(x) (ee_s16) get_seed_32(x) -#endif - -#if (MEM_METHOD == MEM_STATIC) -ee_u8 static_memblk[TOTAL_DATA_SIZE]; -#endif -char *mem_name[3] = { "Static", "Heap", "Stack" }; -/* Function: main - Main entry routine for the benchmark. - This function is responsible for the following steps: - - 1 - Initialize input seeds from a source that cannot be determined at - compile time. 2 - Initialize memory block for use. 3 - Run and time the - benchmark. 4 - Report results, testing the validity of the output if the - seeds are known. - - Arguments: - 1 - first seed : Any value - 2 - second seed : Must be identical to first for iterations to be - identical 3 - third seed : Any value, should be at least an order of - magnitude less then the input size, but bigger then 32. 4 - Iterations : - Special, if set to 0, iterations will be automatically determined such that - the benchmark will run between 10 to 100 secs - -*/ - -#if MAIN_HAS_NOARGC -MAIN_RETURN_TYPE -main(void) -{ - int argc = 0; - char *argv[1]; -#else -MAIN_RETURN_TYPE -main(int argc, char *argv[]) -{ -#endif - ee_printf("SHOWTIME\n"); - ee_u16 i, j = 0, num_algorithms = 0; - ee_s16 known_id = -1, total_errors = 0; - ee_u16 seedcrc = 0; - CORE_TICKS total_time; - core_results results[MULTITHREAD]; -#if (MEM_METHOD == MEM_STACK) - ee_u8 stack_memblock[TOTAL_DATA_SIZE * MULTITHREAD]; -#endif - /* first call any initializations needed */ - portable_init(&(results[0].port), &argc, argv); - /* First some checks to make sure benchmark will run ok */ - if (sizeof(struct list_head_s) > 128) - { - ee_printf("list_head structure too big for comparable data!\n"); - return MAIN_RETURN_VAL; - } - results[0].seed1 = get_seed(1); - results[0].seed2 = get_seed(2); - results[0].seed3 = get_seed(3); - results[0].iterations = get_seed_32(4); -#if CORE_DEBUG - results[0].iterations = 1; -#endif - results[0].execs = get_seed_32(5); - if (results[0].execs == 0) - { /* if not supplied, execute all algorithms */ - results[0].execs = ALL_ALGORITHMS_MASK; - } - /* put in some default values based on one seed only for easy testing */ - if ((results[0].seed1 == 0) && (results[0].seed2 == 0) - && (results[0].seed3 == 0)) - { /* perfromance run */ - results[0].seed1 = 0; - results[0].seed2 = 0; - results[0].seed3 = 0x66; - } - if ((results[0].seed1 == 1) && (results[0].seed2 == 0) - && (results[0].seed3 == 0)) - { /* validation run */ - results[0].seed1 = 0x3415; - results[0].seed2 = 0x3415; - results[0].seed3 = 0x66; - } -#if (MEM_METHOD == MEM_STATIC) - results[0].memblock[0] = (void *)static_memblk; - results[0].size = TOTAL_DATA_SIZE; - results[0].err = 0; -#if (MULTITHREAD > 1) -#error "Cannot use a static data area with multiple contexts!" -#endif -#elif (MEM_METHOD == MEM_MALLOC) - for (i = 0; i < MULTITHREAD; i++) - { - ee_s32 malloc_override = get_seed(7); - if (malloc_override != 0) - results[i].size = malloc_override; - else - results[i].size = TOTAL_DATA_SIZE; - results[i].memblock[0] = portable_malloc(results[i].size); - results[i].seed1 = results[0].seed1; - results[i].seed2 = results[0].seed2; - results[i].seed3 = results[0].seed3; - results[i].err = 0; - results[i].execs = results[0].execs; - } -#elif (MEM_METHOD == MEM_STACK) -for (i = 0; i < MULTITHREAD; i++) -{ - results[i].memblock[0] = stack_memblock + i * TOTAL_DATA_SIZE; - results[i].size = TOTAL_DATA_SIZE; - results[i].seed1 = results[0].seed1; - results[i].seed2 = results[0].seed2; - results[i].seed3 = results[0].seed3; - results[i].err = 0; - results[i].execs = results[0].execs; -} -#else -#error "Please define a way to initialize a memory block." -#endif - /* Data init */ - /* Find out how space much we have based on number of algorithms */ - for (i = 0; i < NUM_ALGORITHMS; i++) - { - if ((1 << (ee_u32)i) & results[0].execs) - num_algorithms++; - } - for (i = 0; i < MULTITHREAD; i++) - results[i].size = results[i].size / num_algorithms; - /* Assign pointers */ - for (i = 0; i < NUM_ALGORITHMS; i++) - { - ee_u32 ctx; - if ((1 << (ee_u32)i) & results[0].execs) - { - for (ctx = 0; ctx < MULTITHREAD; ctx++) - results[ctx].memblock[i + 1] - = (char *)(results[ctx].memblock[0]) + results[0].size * j; - j++; - } - } - /* call inits */ - for (i = 0; i < MULTITHREAD; i++) - { - if (results[i].execs & ID_LIST) - { - results[i].list = core_list_init( - results[0].size, results[i].memblock[1], results[i].seed1); - } - if (results[i].execs & ID_MATRIX) - { - core_init_matrix(results[0].size, - results[i].memblock[2], - (ee_s32)results[i].seed1 - | (((ee_s32)results[i].seed2) << 16), - &(results[i].mat)); - } - if (results[i].execs & ID_STATE) - { - core_init_state( - results[0].size, results[i].seed1, results[i].memblock[3]); - } - } - - /* automatically determine number of iterations if not set */ - if (results[0].iterations == 0) - { - secs_ret secs_passed = 0; - ee_u32 divisor; - results[0].iterations = 1; - while (secs_passed < (secs_ret)1) - { - results[0].iterations *= 10; - start_time(); - iterate(&results[0]); - stop_time(); - secs_passed = time_in_secs(get_time()); - } - /* now we know it executes for at least 1 sec, set actual run time at - * about 10 secs */ - divisor = (ee_u32)secs_passed; - if (divisor == 0) /* some machines cast float to int as 0 since this - conversion is not defined by ANSI, but we know at - least one second passed */ - divisor = 1; - results[0].iterations *= 1 + 10 / divisor; - } - /* perform actual benchmark */ - start_time(); -#if (MULTITHREAD > 1) - if (default_num_contexts > MULTITHREAD) - { - default_num_contexts = MULTITHREAD; - } - for (i = 0; i < default_num_contexts; i++) - { - results[i].iterations = results[0].iterations; - results[i].execs = results[0].execs; - core_start_parallel(&results[i]); - } - for (i = 0; i < default_num_contexts; i++) - { - core_stop_parallel(&results[i]); - } -#else - iterate(&results[0]); -#endif - stop_time(); - total_time = get_time(); - /* get a function of the input to report */ - seedcrc = crc16(results[0].seed1, seedcrc); - seedcrc = crc16(results[0].seed2, seedcrc); - seedcrc = crc16(results[0].seed3, seedcrc); - seedcrc = crc16(results[0].size, seedcrc); - - switch (seedcrc) - { /* test known output for common seeds */ - case 0x8a02: /* seed1=0, seed2=0, seed3=0x66, size 2000 per algorithm */ - known_id = 0; - ee_printf("6k performance run parameters for coremark.\n"); - break; - case 0x7b05: /* seed1=0x3415, seed2=0x3415, seed3=0x66, size 2000 per - algorithm */ - known_id = 1; - ee_printf("6k validation run parameters for coremark.\n"); - break; - case 0x4eaf: /* seed1=0x8, seed2=0x8, seed3=0x8, size 400 per algorithm - */ - known_id = 2; - ee_printf("Profile generation run parameters for coremark.\n"); - break; - case 0xe9f5: /* seed1=0, seed2=0, seed3=0x66, size 666 per algorithm */ - known_id = 3; - ee_printf("2K performance run parameters for coremark.\n"); - break; - case 0x18f2: /* seed1=0x3415, seed2=0x3415, seed3=0x66, size 666 per - algorithm */ - known_id = 4; - ee_printf("2K validation run parameters for coremark.\n"); - break; - default: - total_errors = -1; - break; - } - if (known_id >= 0) - { - for (i = 0; i < default_num_contexts; i++) - { - results[i].err = 0; - if ((results[i].execs & ID_LIST) - && (results[i].crclist != list_known_crc[known_id])) - { - ee_printf("[%u]ERROR! list crc 0x%04x - should be 0x%04x\n", - i, - results[i].crclist, - list_known_crc[known_id]); - results[i].err++; - } - if ((results[i].execs & ID_MATRIX) - && (results[i].crcmatrix != matrix_known_crc[known_id])) - { - ee_printf("[%u]ERROR! matrix crc 0x%04x - should be 0x%04x\n", - i, - results[i].crcmatrix, - matrix_known_crc[known_id]); - results[i].err++; - } - if ((results[i].execs & ID_STATE) - && (results[i].crcstate != state_known_crc[known_id])) - { - ee_printf("[%u]ERROR! state crc 0x%04x - should be 0x%04x\n", - i, - results[i].crcstate, - state_known_crc[known_id]); - results[i].err++; - } - total_errors += results[i].err; - } - } - total_errors += check_data_types(); - /* and report results */ - ee_printf("CoreMark Size : %lu\n", (long unsigned)results[0].size); - ee_printf("Total ticks : %lu\n", (long unsigned)total_time); -#if HAS_FLOAT - ee_printf("Total time (secs): %f\n", time_in_secs(total_time)); - if (time_in_secs(total_time) > 0) - ee_printf("Iterations/Sec : %f\n", - default_num_contexts * results[0].iterations - / time_in_secs(total_time)); -#else - ee_printf("Total time (secs): %d\n", time_in_secs(total_time)); - if (time_in_secs(total_time) > 0) - ee_printf("Iterations/Sec : %d\n", - default_num_contexts * results[0].iterations - / time_in_secs(total_time)); -#endif - if (time_in_secs(total_time) < 10) - { - ee_printf( - "ERROR! Must execute for at least 10 secs for a valid result!\n"); - total_errors++; - } - - ee_printf("Iterations : %lu\n", - (long unsigned)default_num_contexts * results[0].iterations); - ee_printf("Compiler version : %s\n", COMPILER_VERSION); - ee_printf("Compiler flags : %s\n", COMPILER_FLAGS); -#if (MULTITHREAD > 1) - ee_printf("Parallel %s : %d\n", PARALLEL_METHOD, default_num_contexts); -#endif - ee_printf("Memory location : %s\n", MEM_LOCATION); - /* output for verification */ - ee_printf("seedcrc : 0x%04x\n", seedcrc); - if (results[0].execs & ID_LIST) - for (i = 0; i < default_num_contexts; i++) - ee_printf("[%d]crclist : 0x%04x\n", i, results[i].crclist); - if (results[0].execs & ID_MATRIX) - for (i = 0; i < default_num_contexts; i++) - ee_printf("[%d]crcmatrix : 0x%04x\n", i, results[i].crcmatrix); - if (results[0].execs & ID_STATE) - for (i = 0; i < default_num_contexts; i++) - ee_printf("[%d]crcstate : 0x%04x\n", i, results[i].crcstate); - for (i = 0; i < default_num_contexts; i++) - ee_printf("[%d]crcfinal : 0x%04x\n", i, results[i].crc); - if (total_errors == 0) - { - ee_printf( - "Correct operation validated. See README.md for run and reporting " - "rules.\n"); -#if HAS_FLOAT - if (known_id == 3) - { - unsigned long long tmp = (unsigned long long) 1000.0*default_num_contexts*results[0].iterations/time_in_secs(total_time); - secs_ret totalmsecs = time_in_secs(total_time); - int totalmint = (int) totalmsecs; - ee_printf("ELAPSED TIME: %d\n", totalmint); - - ee_printf("CoreMark 1.0 : %d / %s %s", - tmp, - COMPILER_VERSION, - COMPILER_FLAGS); -#if defined(MEM_LOCATION) && !defined(MEM_LOCATION_UNSPEC) - ee_printf(" / %s", MEM_LOCATION); -#else - ee_printf(" / %s", mem_name[MEM_METHOD]); -#endif - -#if (MULTITHREAD > 1) - ee_printf(" / %d:%s", default_num_contexts, PARALLEL_METHOD); -#endif - ee_printf("\n"); - } -#endif - } - if (total_errors > 0) - ee_printf("Errors detected\n"); - if (total_errors < 0) - ee_printf( - "Cannot validate operation for these seed values, please compare " - "with results on a known platform.\n"); - -#if (MEM_METHOD == MEM_MALLOC) - for (i = 0; i < MULTITHREAD; i++) - portable_free(results[i].memblock[0]); -#endif - /* And last call any target specific code for finalizing */ - portable_fini(&(results[0].port)); - - return MAIN_RETURN_VAL; -} diff --git a/tests/riscv-coremark/coremark/core_matrix.c b/tests/riscv-coremark/coremark/core_matrix.c deleted file mode 100644 index 29fd8ab45..000000000 --- a/tests/riscv-coremark/coremark/core_matrix.c +++ /dev/null @@ -1,359 +0,0 @@ -/* -Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Original Author: Shay Gal-on -*/ - -#include "coremark.h" -/* -Topic: Description - Matrix manipulation benchmark - - This very simple algorithm forms the basis of many more complex -algorithms. - - The tight inner loop is the focus of many optimizations (compiler as -well as hardware based) and is thus relevant for embedded processing. - - The total available data space will be divided to 3 parts: - NxN Matrix A - initialized with small values (upper 3/4 of the bits all -zero). NxN Matrix B - initialized with medium values (upper half of the bits all -zero). NxN Matrix C - used for the result. - - The actual values for A and B must be derived based on input that is not -available at compile time. -*/ -ee_s16 matrix_test(ee_u32 N, MATRES *C, MATDAT *A, MATDAT *B, MATDAT val); -ee_s16 matrix_sum(ee_u32 N, MATRES *C, MATDAT clipval); -void matrix_mul_const(ee_u32 N, MATRES *C, MATDAT *A, MATDAT val); -void matrix_mul_vect(ee_u32 N, MATRES *C, MATDAT *A, MATDAT *B); -void matrix_mul_matrix(ee_u32 N, MATRES *C, MATDAT *A, MATDAT *B); -void matrix_mul_matrix_bitextract(ee_u32 N, MATRES *C, MATDAT *A, MATDAT *B); -void matrix_add_const(ee_u32 N, MATDAT *A, MATDAT val); - -#define matrix_test_next(x) (x + 1) -#define matrix_clip(x, y) ((y) ? (x)&0x0ff : (x)&0x0ffff) -#define matrix_big(x) (0xf000 | (x)) -#define bit_extract(x, from, to) (((x) >> (from)) & (~(0xffffffff << (to)))) - -#if CORE_DEBUG -void -printmat(MATDAT *A, ee_u32 N, char *name) -{ - ee_u32 i, j; - ee_printf("Matrix %s [%dx%d]:\n", name, N, N); - for (i = 0; i < N; i++) - { - for (j = 0; j < N; j++) - { - if (j != 0) - ee_printf(","); - ee_printf("%d", A[i * N + j]); - } - ee_printf("\n"); - } -} -void -printmatC(MATRES *C, ee_u32 N, char *name) -{ - ee_u32 i, j; - ee_printf("Matrix %s [%dx%d]:\n", name, N, N); - for (i = 0; i < N; i++) - { - for (j = 0; j < N; j++) - { - if (j != 0) - ee_printf(","); - ee_printf("%d", C[i * N + j]); - } - ee_printf("\n"); - } -} -#endif -/* Function: core_bench_matrix - Benchmark function - - Iterate N times, - changing the matrix values slightly by a constant amount each time. -*/ -ee_u16 -core_bench_matrix(mat_params *p, ee_s16 seed, ee_u16 crc) -{ - ee_u32 N = p->N; - MATRES *C = p->C; - MATDAT *A = p->A; - MATDAT *B = p->B; - MATDAT val = (MATDAT)seed; - - crc = crc16(matrix_test(N, C, A, B, val), crc); - - return crc; -} - -/* Function: matrix_test - Perform matrix manipulation. - - Parameters: - N - Dimensions of the matrix. - C - memory for result matrix. - A - input matrix - B - operator matrix (not changed during operations) - - Returns: - A CRC value that captures all results calculated in the function. - In particular, crc of the value calculated on the result matrix - after each step by . - - Operation: - - 1 - Add a constant value to all elements of a matrix. - 2 - Multiply a matrix by a constant. - 3 - Multiply a matrix by a vector. - 4 - Multiply a matrix by a matrix. - 5 - Add a constant value to all elements of a matrix. - - After the last step, matrix A is back to original contents. -*/ -ee_s16 -matrix_test(ee_u32 N, MATRES *C, MATDAT *A, MATDAT *B, MATDAT val) -{ - ee_u16 crc = 0; - MATDAT clipval = matrix_big(val); - - matrix_add_const(N, A, val); /* make sure data changes */ -#if CORE_DEBUG - printmat(A, N, "matrix_add_const"); -#endif - matrix_mul_const(N, C, A, val); - crc = crc16(matrix_sum(N, C, clipval), crc); -#if CORE_DEBUG - printmatC(C, N, "matrix_mul_const"); -#endif - matrix_mul_vect(N, C, A, B); - crc = crc16(matrix_sum(N, C, clipval), crc); -#if CORE_DEBUG - printmatC(C, N, "matrix_mul_vect"); -#endif - matrix_mul_matrix(N, C, A, B); - crc = crc16(matrix_sum(N, C, clipval), crc); -#if CORE_DEBUG - printmatC(C, N, "matrix_mul_matrix"); -#endif - matrix_mul_matrix_bitextract(N, C, A, B); - crc = crc16(matrix_sum(N, C, clipval), crc); -#if CORE_DEBUG - printmatC(C, N, "matrix_mul_matrix_bitextract"); -#endif - - matrix_add_const(N, A, -val); /* return matrix to initial value */ - return crc; -} - -/* Function : matrix_init - Initialize the memory block for matrix benchmarking. - - Parameters: - blksize - Size of memory to be initialized. - memblk - Pointer to memory block. - seed - Actual values chosen depend on the seed parameter. - p - pointers to containing initialized matrixes. - - Returns: - Matrix dimensions. - - Note: - The seed parameter MUST be supplied from a source that cannot be - determined at compile time -*/ -ee_u32 -core_init_matrix(ee_u32 blksize, void *memblk, ee_s32 seed, mat_params *p) -{ - ee_u32 N = 0; - MATDAT *A; - MATDAT *B; - ee_s32 order = 1; - MATDAT val; - ee_u32 i = 0, j = 0; - if (seed == 0) - seed = 1; - while (j < blksize) - { - i++; - j = i * i * 2 * 4; - } - N = i - 1; - A = (MATDAT *)align_mem(memblk); - B = A + N * N; - - for (i = 0; i < N; i++) - { - for (j = 0; j < N; j++) - { - seed = ((order * seed) % 65536); - val = (seed + order); - val = matrix_clip(val, 0); - B[i * N + j] = val; - val = (val + order); - val = matrix_clip(val, 1); - A[i * N + j] = val; - order++; - } - } - - p->A = A; - p->B = B; - p->C = (MATRES *)align_mem(B + N * N); - p->N = N; -#if CORE_DEBUG - printmat(A, N, "A"); - printmat(B, N, "B"); -#endif - return N; -} - -/* Function: matrix_sum - Calculate a function that depends on the values of elements in the - matrix. - - For each element, accumulate into a temporary variable. - - As long as this value is under the parameter clipval, - add 1 to the result if the element is bigger then the previous. - - Otherwise, reset the accumulator and add 10 to the result. -*/ -ee_s16 -matrix_sum(ee_u32 N, MATRES *C, MATDAT clipval) -{ - MATRES tmp = 0, prev = 0, cur = 0; - ee_s16 ret = 0; - ee_u32 i, j; - for (i = 0; i < N; i++) - { - for (j = 0; j < N; j++) - { - cur = C[i * N + j]; - tmp += cur; - if (tmp > clipval) - { - ret += 10; - tmp = 0; - } - else - { - ret += (cur > prev) ? 1 : 0; - } - prev = cur; - } - } - return ret; -} - -/* Function: matrix_mul_const - Multiply a matrix by a constant. - This could be used as a scaler for instance. -*/ -void -matrix_mul_const(ee_u32 N, MATRES *C, MATDAT *A, MATDAT val) -{ - ee_u32 i, j; - for (i = 0; i < N; i++) - { - for (j = 0; j < N; j++) - { - C[i * N + j] = (MATRES)A[i * N + j] * (MATRES)val; - } - } -} - -/* Function: matrix_add_const - Add a constant value to all elements of a matrix. -*/ -void -matrix_add_const(ee_u32 N, MATDAT *A, MATDAT val) -{ - ee_u32 i, j; - for (i = 0; i < N; i++) - { - for (j = 0; j < N; j++) - { - A[i * N + j] += val; - } - } -} - -/* Function: matrix_mul_vect - Multiply a matrix by a vector. - This is common in many simple filters (e.g. fir where a vector of - coefficients is applied to the matrix.) -*/ -void -matrix_mul_vect(ee_u32 N, MATRES *C, MATDAT *A, MATDAT *B) -{ - ee_u32 i, j; - for (i = 0; i < N; i++) - { - C[i] = 0; - for (j = 0; j < N; j++) - { - C[i] += (MATRES)A[i * N + j] * (MATRES)B[j]; - } - } -} - -/* Function: matrix_mul_matrix - Multiply a matrix by a matrix. - Basic code is used in many algorithms, mostly with minor changes such as - scaling. -*/ -void -matrix_mul_matrix(ee_u32 N, MATRES *C, MATDAT *A, MATDAT *B) -{ - ee_u32 i, j, k; - for (i = 0; i < N; i++) - { - for (j = 0; j < N; j++) - { - C[i * N + j] = 0; - for (k = 0; k < N; k++) - { - C[i * N + j] += (MATRES)A[i * N + k] * (MATRES)B[k * N + j]; - } - } - } -} - -/* Function: matrix_mul_matrix_bitextract - Multiply a matrix by a matrix, and extract some bits from the result. - Basic code is used in many algorithms, mostly with minor changes such as - scaling. -*/ -void -matrix_mul_matrix_bitextract(ee_u32 N, MATRES *C, MATDAT *A, MATDAT *B) -{ - ee_u32 i, j, k; - for (i = 0; i < N; i++) - { - for (j = 0; j < N; j++) - { - C[i * N + j] = 0; - for (k = 0; k < N; k++) - { - MATRES tmp = (MATRES)A[i * N + k] * (MATRES)B[k * N + j]; - C[i * N + j] += bit_extract(tmp, 2, 4) * bit_extract(tmp, 5, 7); - } - } - } -} diff --git a/tests/riscv-coremark/coremark/core_state.c b/tests/riscv-coremark/coremark/core_state.c deleted file mode 100644 index 6dbab9dd9..000000000 --- a/tests/riscv-coremark/coremark/core_state.c +++ /dev/null @@ -1,330 +0,0 @@ -/* -Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Original Author: Shay Gal-on -*/ - -#include "coremark.h" -/* local functions */ -enum CORE_STATE core_state_transition(ee_u8 **instr, ee_u32 *transition_count); - -/* -Topic: Description - Simple state machines like this one are used in many embedded products. - - For more complex state machines, sometimes a state transition table -implementation is used instead, trading speed of direct coding for ease of -maintenance. - - Since the main goal of using a state machine in CoreMark is to excercise -the switch/if behaviour, we are using a small moore machine. - - In particular, this machine tests type of string input, - trying to determine whether the input is a number or something else. - (see core_state.png). -*/ - -/* Function: core_bench_state - Benchmark function - - Go over the input twice, once direct, and once after introducing some - corruption. -*/ -ee_u16 -core_bench_state(ee_u32 blksize, - ee_u8 *memblock, - ee_s16 seed1, - ee_s16 seed2, - ee_s16 step, - ee_u16 crc) -{ - ee_u32 final_counts[NUM_CORE_STATES]; - ee_u32 track_counts[NUM_CORE_STATES]; - ee_u8 *p = memblock; - ee_u32 i; - -#if CORE_DEBUG - ee_printf("State Bench: %d,%d,%d,%04x\n", seed1, seed2, step, crc); -#endif - for (i = 0; i < NUM_CORE_STATES; i++) - { - final_counts[i] = track_counts[i] = 0; - } - /* run the state machine over the input */ - while (*p != 0) - { - enum CORE_STATE fstate = core_state_transition(&p, track_counts); - final_counts[fstate]++; -#if CORE_DEBUG - ee_printf("%d,", fstate); - } - ee_printf("\n"); -#else - } -#endif - p = memblock; - while (p < (memblock + blksize)) - { /* insert some corruption */ - if (*p != ',') - *p ^= (ee_u8)seed1; - p += step; - } - p = memblock; - /* run the state machine over the input again */ - while (*p != 0) - { - enum CORE_STATE fstate = core_state_transition(&p, track_counts); - final_counts[fstate]++; -#if CORE_DEBUG - ee_printf("%d,", fstate); - } - ee_printf("\n"); -#else - } -#endif - p = memblock; - while (p < (memblock + blksize)) - { /* undo corruption is seed1 and seed2 are equal */ - if (*p != ',') - *p ^= (ee_u8)seed2; - p += step; - } - /* end timing */ - for (i = 0; i < NUM_CORE_STATES; i++) - { - crc = crcu32(final_counts[i], crc); - crc = crcu32(track_counts[i], crc); - } - return crc; -} - -/* Default initialization patterns */ -static ee_u8 *intpat[4] - = { (ee_u8 *)"5012", (ee_u8 *)"1234", (ee_u8 *)"-874", (ee_u8 *)"+122" }; -static ee_u8 *floatpat[4] = { (ee_u8 *)"35.54400", - (ee_u8 *)".1234500", - (ee_u8 *)"-110.700", - (ee_u8 *)"+0.64400" }; -static ee_u8 *scipat[4] = { (ee_u8 *)"5.500e+3", - (ee_u8 *)"-.123e-2", - (ee_u8 *)"-87e+832", - (ee_u8 *)"+0.6e-12" }; -static ee_u8 *errpat[4] = { (ee_u8 *)"T0.3e-1F", - (ee_u8 *)"-T.T++Tq", - (ee_u8 *)"1T3.4e4z", - (ee_u8 *)"34.0e-T^" }; - -/* Function: core_init_state - Initialize the input data for the state machine. - - Populate the input with several predetermined strings, interspersed. - Actual patterns chosen depend on the seed parameter. - - Note: - The seed parameter MUST be supplied from a source that cannot be - determined at compile time -*/ -void -core_init_state(ee_u32 size, ee_s16 seed, ee_u8 *p) -{ - ee_u32 total = 0, next = 0, i; - ee_u8 *buf = 0; -#if CORE_DEBUG - ee_u8 *start = p; - ee_printf("State: %d,%d\n", size, seed); -#endif - size--; - next = 0; - while ((total + next + 1) < size) - { - if (next > 0) - { - for (i = 0; i < next; i++) - *(p + total + i) = buf[i]; - *(p + total + i) = ','; - total += next + 1; - } - seed++; - switch (seed & 0x7) - { - case 0: /* int */ - case 1: /* int */ - case 2: /* int */ - buf = intpat[(seed >> 3) & 0x3]; - next = 4; - break; - case 3: /* float */ - case 4: /* float */ - buf = floatpat[(seed >> 3) & 0x3]; - next = 8; - break; - case 5: /* scientific */ - case 6: /* scientific */ - buf = scipat[(seed >> 3) & 0x3]; - next = 8; - break; - case 7: /* invalid */ - buf = errpat[(seed >> 3) & 0x3]; - next = 8; - break; - default: /* Never happen, just to make some compilers happy */ - break; - } - } - size++; - while (total < size) - { /* fill the rest with 0 */ - *(p + total) = 0; - total++; - } -#if CORE_DEBUG - ee_printf("State Input: %s\n", start); -#endif -} - -static ee_u8 -ee_isdigit(ee_u8 c) -{ - ee_u8 retval; - retval = ((c >= '0') & (c <= '9')) ? 1 : 0; - return retval; -} - -/* Function: core_state_transition - Actual state machine. - - The state machine will continue scanning until either: - 1 - an invalid input is detcted. - 2 - a valid number has been detected. - - The input pointer is updated to point to the end of the token, and the - end state is returned (either specific format determined or invalid). -*/ - -enum CORE_STATE -core_state_transition(ee_u8 **instr, ee_u32 *transition_count) -{ - ee_u8 * str = *instr; - ee_u8 NEXT_SYMBOL; - enum CORE_STATE state = CORE_START; - for (; *str && state != CORE_INVALID; str++) - { - NEXT_SYMBOL = *str; - if (NEXT_SYMBOL == ',') /* end of this input */ - { - str++; - break; - } - switch (state) - { - case CORE_START: - if (ee_isdigit(NEXT_SYMBOL)) - { - state = CORE_INT; - } - else if (NEXT_SYMBOL == '+' || NEXT_SYMBOL == '-') - { - state = CORE_S1; - } - else if (NEXT_SYMBOL == '.') - { - state = CORE_FLOAT; - } - else - { - state = CORE_INVALID; - transition_count[CORE_INVALID]++; - } - transition_count[CORE_START]++; - break; - case CORE_S1: - if (ee_isdigit(NEXT_SYMBOL)) - { - state = CORE_INT; - transition_count[CORE_S1]++; - } - else if (NEXT_SYMBOL == '.') - { - state = CORE_FLOAT; - transition_count[CORE_S1]++; - } - else - { - state = CORE_INVALID; - transition_count[CORE_S1]++; - } - break; - case CORE_INT: - if (NEXT_SYMBOL == '.') - { - state = CORE_FLOAT; - transition_count[CORE_INT]++; - } - else if (!ee_isdigit(NEXT_SYMBOL)) - { - state = CORE_INVALID; - transition_count[CORE_INT]++; - } - break; - case CORE_FLOAT: - if (NEXT_SYMBOL == 'E' || NEXT_SYMBOL == 'e') - { - state = CORE_S2; - transition_count[CORE_FLOAT]++; - } - else if (!ee_isdigit(NEXT_SYMBOL)) - { - state = CORE_INVALID; - transition_count[CORE_FLOAT]++; - } - break; - case CORE_S2: - if (NEXT_SYMBOL == '+' || NEXT_SYMBOL == '-') - { - state = CORE_EXPONENT; - transition_count[CORE_S2]++; - } - else - { - state = CORE_INVALID; - transition_count[CORE_S2]++; - } - break; - case CORE_EXPONENT: - if (ee_isdigit(NEXT_SYMBOL)) - { - state = CORE_SCIENTIFIC; - transition_count[CORE_EXPONENT]++; - } - else - { - state = CORE_INVALID; - transition_count[CORE_EXPONENT]++; - } - break; - case CORE_SCIENTIFIC: - if (!ee_isdigit(NEXT_SYMBOL)) - { - state = CORE_INVALID; - transition_count[CORE_INVALID]++; - } - break; - default: - break; - } - } - *instr = str; - return state; -} diff --git a/tests/riscv-coremark/coremark/core_util.c b/tests/riscv-coremark/coremark/core_util.c deleted file mode 100644 index 67c5d7757..000000000 --- a/tests/riscv-coremark/coremark/core_util.c +++ /dev/null @@ -1,249 +0,0 @@ -/* -Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Original Author: Shay Gal-on -*/ - -#include "coremark.h" -/* Function: get_seed - Get a values that cannot be determined at compile time. - - Since different embedded systems and compilers are used, 3 different - methods are provided: 1 - Using a volatile variable. This method is only - valid if the compiler is forced to generate code that reads the value of a - volatile variable from memory at run time. Please note, if using this method, - you would need to modify core_portme.c to generate training profile. 2 - - Command line arguments. This is the preferred method if command line - arguments are supported. 3 - System function. If none of the first 2 methods - is available on the platform, a system function which is not a stub can be - used. - - e.g. read the value on GPIO pins connected to switches, or invoke - special simulator functions. -*/ -#if (SEED_METHOD == SEED_VOLATILE) -extern volatile ee_s32 seed1_volatile; -extern volatile ee_s32 seed2_volatile; -extern volatile ee_s32 seed3_volatile; -extern volatile ee_s32 seed4_volatile; -extern volatile ee_s32 seed5_volatile; -ee_s32 -get_seed_32(int i) -{ - ee_s32 retval; - switch (i) - { - case 1: - retval = seed1_volatile; - break; - case 2: - retval = seed2_volatile; - break; - case 3: - retval = seed3_volatile; - break; - case 4: - retval = seed4_volatile; - break; - case 5: - retval = seed5_volatile; - break; - default: - retval = 0; - break; - } - return retval; -} -#elif (SEED_METHOD == SEED_ARG) -ee_s32 -parseval(char *valstring) -{ - ee_s32 retval = 0; - ee_s32 neg = 1; - int hexmode = 0; - if (*valstring == '-') - { - neg = -1; - valstring++; - } - if ((valstring[0] == '0') && (valstring[1] == 'x')) - { - hexmode = 1; - valstring += 2; - } - /* first look for digits */ - if (hexmode) - { - while (((*valstring >= '0') && (*valstring <= '9')) - || ((*valstring >= 'a') && (*valstring <= 'f'))) - { - ee_s32 digit = *valstring - '0'; - if (digit > 9) - digit = 10 + *valstring - 'a'; - retval *= 16; - retval += digit; - valstring++; - } - } - else - { - while ((*valstring >= '0') && (*valstring <= '9')) - { - ee_s32 digit = *valstring - '0'; - retval *= 10; - retval += digit; - valstring++; - } - } - /* now add qualifiers */ - if (*valstring == 'K') - retval *= 1024; - if (*valstring == 'M') - retval *= 1024 * 1024; - - retval *= neg; - return retval; -} - -ee_s32 -get_seed_args(int i, int argc, char *argv[]) -{ - if (argc > i) - return parseval(argv[i]); - return 0; -} - -#elif (SEED_METHOD == SEED_FUNC) -/* If using OS based function, you must define and implement the functions below - * in core_portme.h and core_portme.c ! */ -ee_s32 -get_seed_32(int i) -{ - ee_s32 retval; - switch (i) - { - case 1: - retval = portme_sys1(); - break; - case 2: - retval = portme_sys2(); - break; - case 3: - retval = portme_sys3(); - break; - case 4: - retval = portme_sys4(); - break; - case 5: - retval = portme_sys5(); - break; - default: - retval = 0; - break; - } - return retval; -} -#endif - -/* Function: crc* - Service functions to calculate 16b CRC code. - -*/ -ee_u16 -crcu8(ee_u8 data, ee_u16 crc) -{ - ee_u8 i = 0, x16 = 0, carry = 0; - - for (i = 0; i < 8; i++) - { - x16 = (ee_u8)((data & 1) ^ ((ee_u8)crc & 1)); - data >>= 1; - - if (x16 == 1) - { - crc ^= 0x4002; - carry = 1; - } - else - carry = 0; - crc >>= 1; - if (carry) - crc |= 0x8000; - else - crc &= 0x7fff; - } - return crc; -} -ee_u16 -crcu16(ee_u16 newval, ee_u16 crc) -{ - crc = crcu8((ee_u8)(newval), crc); - crc = crcu8((ee_u8)((newval) >> 8), crc); - return crc; -} -ee_u16 -crcu32(ee_u32 newval, ee_u16 crc) -{ - crc = crc16((ee_s16)newval, crc); - crc = crc16((ee_s16)(newval >> 16), crc); - return crc; -} -ee_u16 -crc16(ee_s16 newval, ee_u16 crc) -{ - return crcu16((ee_u16)newval, crc); -} - -ee_u8 -check_data_types() -{ - ee_u8 retval = 0; - if (sizeof(ee_u8) != 1) - { - ee_printf("ERROR: ee_u8 is not an 8b datatype!\n"); - retval++; - } - if (sizeof(ee_u16) != 2) - { - ee_printf("ERROR: ee_u16 is not a 16b datatype!\n"); - retval++; - } - if (sizeof(ee_s16) != 2) - { - ee_printf("ERROR: ee_s16 is not a 16b datatype!\n"); - retval++; - } - if (sizeof(ee_s32) != 4) - { - ee_printf("ERROR: ee_s32 is not a 32b datatype!\n"); - retval++; - } - if (sizeof(ee_u32) != 4) - { - ee_printf("ERROR: ee_u32 is not a 32b datatype!\n"); - retval++; - } - if (sizeof(ee_ptr_int) != sizeof(int *)) - { - ee_printf( - "ERROR: ee_ptr_int is not a datatype that holds an int pointer!\n"); - retval++; - } - if (retval > 0) - { - ee_printf("ERROR: Please modify the datatypes in core_portme.h!\n"); - } - return retval; -} diff --git a/tests/riscv-coremark/coremark/coremark.h b/tests/riscv-coremark/coremark/coremark.h deleted file mode 100644 index 9c5e4060a..000000000 --- a/tests/riscv-coremark/coremark/coremark.h +++ /dev/null @@ -1,183 +0,0 @@ -/* -Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Original Author: Shay Gal-on -*/ - -/* Topic: Description - This file contains declarations of the various benchmark functions. -*/ - -/* Configuration: TOTAL_DATA_SIZE - Define total size for data algorithms will operate on -*/ -#ifndef TOTAL_DATA_SIZE -#define TOTAL_DATA_SIZE 2 * 1000 -#endif - -#define SEED_ARG 0 -#define SEED_FUNC 1 -#define SEED_VOLATILE 2 - -#define MEM_STATIC 0 -#define MEM_MALLOC 1 -#define MEM_STACK 2 - -#include "core_portme.h" - -#if HAS_STDIO -#include -#endif -#if HAS_PRINTF -#define ee_printf printf -#endif - -/* Actual benchmark execution in iterate */ -void *iterate(void *pres); - -/* Typedef: secs_ret - For machines that have floating point support, get number of seconds as - a double. Otherwise an unsigned int. -*/ -#if HAS_FLOAT -typedef double secs_ret; -#else -typedef ee_u32 secs_ret; -#endif - -#if MAIN_HAS_NORETURN -#define MAIN_RETURN_VAL -#define MAIN_RETURN_TYPE void -#else -#define MAIN_RETURN_VAL 0 -#define MAIN_RETURN_TYPE int -#endif - -void start_time(void); -void stop_time(void); -CORE_TICKS get_time(void); -secs_ret time_in_secs(CORE_TICKS ticks); - -/* Misc useful functions */ -ee_u16 crcu8(ee_u8 data, ee_u16 crc); -ee_u16 crc16(ee_s16 newval, ee_u16 crc); -ee_u16 crcu16(ee_u16 newval, ee_u16 crc); -ee_u16 crcu32(ee_u32 newval, ee_u16 crc); -ee_u8 check_data_types(void); -void * portable_malloc(ee_size_t size); -void portable_free(void *p); -ee_s32 parseval(char *valstring); - -/* Algorithm IDS */ -#define ID_LIST (1 << 0) -#define ID_MATRIX (1 << 1) -#define ID_STATE (1 << 2) -#define ALL_ALGORITHMS_MASK (ID_LIST | ID_MATRIX | ID_STATE) -#define NUM_ALGORITHMS 3 - -/* list data structures */ -typedef struct list_data_s -{ - ee_s16 data16; - ee_s16 idx; -} list_data; - -typedef struct list_head_s -{ - struct list_head_s *next; - struct list_data_s *info; -} list_head; - -/*matrix benchmark related stuff */ -#define MATDAT_INT 1 -#if MATDAT_INT -typedef ee_s16 MATDAT; -typedef ee_s32 MATRES; -#else -typedef ee_f16 MATDAT; -typedef ee_f32 MATRES; -#endif - -typedef struct MAT_PARAMS_S -{ - int N; - MATDAT *A; - MATDAT *B; - MATRES *C; -} mat_params; - -/* state machine related stuff */ -/* List of all the possible states for the FSM */ -typedef enum CORE_STATE -{ - CORE_START = 0, - CORE_INVALID, - CORE_S1, - CORE_S2, - CORE_INT, - CORE_FLOAT, - CORE_EXPONENT, - CORE_SCIENTIFIC, - NUM_CORE_STATES -} core_state_e; - -/* Helper structure to hold results */ -typedef struct RESULTS_S -{ - /* inputs */ - ee_s16 seed1; /* Initializing seed */ - ee_s16 seed2; /* Initializing seed */ - ee_s16 seed3; /* Initializing seed */ - void * memblock[4]; /* Pointer to safe memory location */ - ee_u32 size; /* Size of the data */ - ee_u32 iterations; /* Number of iterations to execute */ - ee_u32 execs; /* Bitmask of operations to execute */ - struct list_head_s *list; - mat_params mat; - /* outputs */ - ee_u16 crc; - ee_u16 crclist; - ee_u16 crcmatrix; - ee_u16 crcstate; - ee_s16 err; - /* ultithread specific */ - core_portable port; -} core_results; - -/* Multicore execution handling */ -#if (MULTITHREAD > 1) -ee_u8 core_start_parallel(core_results *res); -ee_u8 core_stop_parallel(core_results *res); -#endif - -/* list benchmark functions */ -list_head *core_list_init(ee_u32 blksize, list_head *memblock, ee_s16 seed); -ee_u16 core_bench_list(core_results *res, ee_s16 finder_idx); - -/* state benchmark functions */ -void core_init_state(ee_u32 size, ee_s16 seed, ee_u8 *p); -ee_u16 core_bench_state(ee_u32 blksize, - ee_u8 *memblock, - ee_s16 seed1, - ee_s16 seed2, - ee_s16 step, - ee_u16 crc); - -/* matrix benchmark functions */ -ee_u32 core_init_matrix(ee_u32 blksize, - void * memblk, - ee_s32 seed, - mat_params *p); -ee_u16 core_bench_matrix(mat_params *p, ee_s16 seed, ee_u16 crc); diff --git a/tests/riscv-coremark/coremark/coremark.md5 b/tests/riscv-coremark/coremark/coremark.md5 deleted file mode 100644 index 94160db22..000000000 --- a/tests/riscv-coremark/coremark/coremark.md5 +++ /dev/null @@ -1,6 +0,0 @@ -8d082dc4a9676c02731a8cf209339072 core_list_join.c -c984863b84b59185d8b5fb81c1ca7535 core_main.c -5fa21a0f7c3964167c9691db531ca652 core_matrix.c -edcfc7a0b146a50028014f06e6826aa3 core_state.c -45540ba2145adea1ec7ea2c72a1fbbcb core_util.c -8ca974c013b380dc7f0d6d1afb76eb2d coremark.h diff --git a/tests/riscv-coremark/coremark/cygwin/core_portme.c b/tests/riscv-coremark/coremark/cygwin/core_portme.c deleted file mode 100755 index fe8d29983..000000000 --- a/tests/riscv-coremark/coremark/cygwin/core_portme.c +++ /dev/null @@ -1,336 +0,0 @@ -/* -Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Original Author: Shay Gal-on -*/ - -#include -#include -#include "coremark.h" -#if CALLGRIND_RUN -#include -#endif - -#if (MEM_METHOD==MEM_MALLOC) -#include -/* Function: portable_malloc - Provide malloc() functionality in a platform specific way. -*/ -void *portable_malloc(size_t size) { - return malloc(size); -} -/* Function: portable_free - Provide free() functionality in a platform specific way. -*/ -void portable_free(void *p) { - free(p); -} -#else -void *portable_malloc(size_t size) { - return NULL; -} -void portable_free(void *p) { - p=NULL; -} -#endif - -#if (SEED_METHOD==SEED_VOLATILE) -#if VALIDATION_RUN - volatile ee_s32 seed1_volatile=0x3415; - volatile ee_s32 seed2_volatile=0x3415; - volatile ee_s32 seed3_volatile=0x66; -#endif -#if PERFORMANCE_RUN - volatile ee_s32 seed1_volatile=0x0; - volatile ee_s32 seed2_volatile=0x0; - volatile ee_s32 seed3_volatile=0x66; -#endif -#if PROFILE_RUN - volatile ee_s32 seed1_volatile=0x8; - volatile ee_s32 seed2_volatile=0x8; - volatile ee_s32 seed3_volatile=0x8; -#endif - volatile ee_s32 seed4_volatile=ITERATIONS; - volatile ee_s32 seed5_volatile=0; -#endif -/* Porting: Timing functions - How to capture time and convert to seconds must be ported to whatever is supported by the platform. - e.g. Read value from on board RTC, read value from cpu clock cycles performance counter etc. - Sample implementation for standard time.h and windows.h definitions included. -*/ -/* Define: TIMER_RES_DIVIDER - Divider to trade off timer resolution and total time that can be measured. - - Use lower values to increase resolution, but make sure that overflow does not occur. - If there are issues with the return value overflowing, increase this value. - */ -#if USE_CLOCK - #define NSECS_PER_SEC CLOCKS_PER_SEC - #define EE_TIMER_TICKER_RATE 1000 - #define CORETIMETYPE clock_t - #define GETMYTIME(_t) (*_t=clock()) - #define MYTIMEDIFF(fin,ini) ((fin)-(ini)) - #define TIMER_RES_DIVIDER 1 - #define SAMPLE_TIME_IMPLEMENTATION 1 -#elif defined(_MSC_VER) - #define NSECS_PER_SEC 10000000 - #define EE_TIMER_TICKER_RATE 1000 - #define CORETIMETYPE FILETIME - #define GETMYTIME(_t) GetSystemTimeAsFileTime(_t) - #define MYTIMEDIFF(fin,ini) (((*(__int64*)&fin)-(*(__int64*)&ini))/TIMER_RES_DIVIDER) - /* setting to millisces resolution by default with MSDEV */ - #ifndef TIMER_RES_DIVIDER - #define TIMER_RES_DIVIDER 1000 - #endif - #define SAMPLE_TIME_IMPLEMENTATION 1 -#elif HAS_TIME_H - #define NSECS_PER_SEC 1000000000 - #define EE_TIMER_TICKER_RATE 1000 - #define CORETIMETYPE struct timespec - #define GETMYTIME(_t) clock_gettime(CLOCK_REALTIME,_t) - #define MYTIMEDIFF(fin,ini) ((fin.tv_sec-ini.tv_sec)*(NSECS_PER_SEC/TIMER_RES_DIVIDER)+(fin.tv_nsec-ini.tv_nsec)/TIMER_RES_DIVIDER) - /* setting to 1/1000 of a second resolution by default with linux */ - #ifndef TIMER_RES_DIVIDER - #define TIMER_RES_DIVIDER 1000000 - #endif - #define SAMPLE_TIME_IMPLEMENTATION 1 -#else - #define SAMPLE_TIME_IMPLEMENTATION 0 -#endif -#define EE_TICKS_PER_SEC (NSECS_PER_SEC / TIMER_RES_DIVIDER) - -#if SAMPLE_TIME_IMPLEMENTATION -/** Define Host specific (POSIX), or target specific global time variables. */ -static CORETIMETYPE start_time_val, stop_time_val; - -/* Function: start_time - This function will be called right before starting the timed portion of the benchmark. - - Implementation may be capturing a system timer (as implemented in the example code) - or zeroing some system parameters - e.g. setting the cpu clocks cycles to 0. -*/ -void start_time(void) { - GETMYTIME(&start_time_val ); -#if CALLGRIND_RUN - CALLGRIND_START_INSTRUMENTATION -#endif -#if MICA - asm volatile("int3");/*1 */ -#endif -} -/* Function: stop_time - This function will be called right after ending the timed portion of the benchmark. - - Implementation may be capturing a system timer (as implemented in the example code) - or other system parameters - e.g. reading the current value of cpu cycles counter. -*/ -void stop_time(void) { -#if CALLGRIND_RUN - CALLGRIND_STOP_INSTRUMENTATION -#endif -#if MICA - asm volatile("int3");/*1 */ -#endif - GETMYTIME(&stop_time_val ); -} -/* Function: get_time - Return an abstract "ticks" number that signifies time on the system. - - Actual value returned may be cpu cycles, milliseconds or any other value, - as long as it can be converted to seconds by . - This methodology is taken to accomodate any hardware or simulated platform. - The sample implementation returns millisecs by default, - and the resolution is controlled by -*/ -CORE_TICKS get_time(void) { - CORE_TICKS elapsed=(CORE_TICKS)(MYTIMEDIFF(stop_time_val, start_time_val)); - return elapsed; -} -/* Function: time_in_secs - Convert the value returned by get_time to seconds. - - The type is used to accomodate systems with no support for floating point. - Default implementation implemented by the EE_TICKS_PER_SEC macro above. -*/ -secs_ret time_in_secs(CORE_TICKS ticks) { - secs_ret retval=((secs_ret)ticks) / (secs_ret)EE_TICKS_PER_SEC; - return retval; -} -#else -#error "Please implement timing functionality in core_portme.c" -#endif /* SAMPLE_TIME_IMPLEMENTATION */ - -ee_u32 default_num_contexts=MULTITHREAD; - -/* Function: portable_init - Target specific initialization code - Test for some common mistakes. -*/ -void portable_init(core_portable *p, int *argc, char *argv[]) -{ -#if PRINT_ARGS - int i; - for (i=0; i<*argc; i++) { - ee_printf("Arg[%d]=%s\n",i,argv[i]); - } -#endif - if (sizeof(ee_ptr_int) != sizeof(ee_u8 *)) { - ee_printf("ERROR! Please define ee_ptr_int to a type that holds a pointer!\n"); - } - if (sizeof(ee_u32) != 4) { - ee_printf("ERROR! Please define ee_u32 to a 32b unsigned type!\n"); - } -#if (MAIN_HAS_NOARGC && (SEED_METHOD==SEED_ARG)) - ee_printf("ERROR! Main has no argc, but SEED_METHOD defined to SEED_ARG!\n"); -#endif - -#if (MULTITHREAD>1) && (SEED_METHOD==SEED_ARG) - int nargs=*argc,i; - if ((nargs>1) && (*argv[1]=='M')) { - default_num_contexts=parseval(argv[1]+1); - if (default_num_contexts>MULTITHREAD) - default_num_contexts=MULTITHREAD; - /* Shift args since first arg is directed to the portable part and not to coremark main */ - --nargs; - for (i=1; i*/ - p->portable_id=1; -} -/* Function: portable_fini - Target specific final code -*/ -void portable_fini(core_portable *p) -{ - p->portable_id=0; -} - -#if (MULTITHREAD>1) - -/* Function: core_start_parallel - Start benchmarking in a parallel context. - - Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets. - Other implementations using MCAPI or other standards can easily be devised. -*/ -/* Function: core_stop_parallel - Stop a parallel context execution of coremark, and gather the results. - - Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets. - Other implementations using MCAPI or other standards can easily be devised. -*/ -#if USE_PTHREAD -ee_u8 core_start_parallel(core_results *res) { - return (ee_u8)pthread_create(&(res->port.thread),NULL,iterate,(void *)res); -} -ee_u8 core_stop_parallel(core_results *res) { - void *retval; - return (ee_u8)pthread_join(res->port.thread,&retval); -} -#elif USE_FORK -static int key_id=0; -ee_u8 core_start_parallel(core_results *res) { - key_t key=4321+key_id; - key_id++; - res->port.pid=fork(); - res->port.shmid=shmget(key, 8, IPC_CREAT | 0666); - if (res->port.shmid<0) { - ee_printf("ERROR in shmget!\n"); - } - if (res->port.pid==0) { - iterate(res); - res->port.shm=shmat(res->port.shmid, NULL, 0); - /* copy the validation values to the shared memory area and quit*/ - if (res->port.shm == (char *) -1) { - ee_printf("ERROR in child shmat!\n"); - } else { - memcpy(res->port.shm,&(res->crc),8); - shmdt(res->port.shm); - } - exit(0); - } - return 1; -} -ee_u8 core_stop_parallel(core_results *res) { - int status; - pid_t wpid = waitpid(res->port.pid,&status,WUNTRACED); - if (wpid != res->port.pid) { - ee_printf("ERROR waiting for child.\n"); - if (errno == ECHILD) ee_printf("errno=No such child %d\n",res->port.pid); - if (errno == EINTR) ee_printf("errno=Interrupted\n"); - return 0; - } - /* after process is done, get the values from the shared memory area */ - res->port.shm=shmat(res->port.shmid, NULL, 0); - if (res->port.shm == (char *) -1) { - ee_printf("ERROR in parent shmat!\n"); - return 0; - } - memcpy(&(res->crc),res->port.shm,8); - shmdt(res->port.shm); - return 1; -} -#elif USE_SOCKET -static int key_id=0; -ee_u8 core_start_parallel(core_results *res) { - int bound, buffer_length=8; - res->port.sa.sin_family = AF_INET; - res->port.sa.sin_addr.s_addr = htonl(0x7F000001); - res->port.sa.sin_port = htons(7654+key_id); - key_id++; - res->port.pid=fork(); - if (res->port.pid==0) { /* benchmark child */ - iterate(res); - res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); - if (-1 == res->port.sock) /* if socket failed to initialize, exit */ { - ee_printf("Error Creating Socket"); - } else { - int bytes_sent = sendto(res->port.sock, &(res->crc), buffer_length, 0,(struct sockaddr*)&(res->port.sa), sizeof (struct sockaddr_in)); - if (bytes_sent < 0) - ee_printf("Error sending packet: %s\n", strerror(errno)); - close(res->port.sock); /* close the socket */ - } - exit(0); - } - /* parent process, open the socket */ - res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); - bound = bind(res->port.sock,(struct sockaddr*)&(res->port.sa), sizeof(struct sockaddr)); - if (bound < 0) - ee_printf("bind(): %s\n",strerror(errno)); - return 1; -} -ee_u8 core_stop_parallel(core_results *res) { - int status; - int fromlen=sizeof(struct sockaddr); - int recsize = recvfrom(res->port.sock, &(res->crc), 8, 0, (struct sockaddr*)&(res->port.sa), &fromlen); - if (recsize < 0) { - ee_printf("Error in receive: %s\n", strerror(errno)); - return 0; - } - pid_t wpid = waitpid(res->port.pid,&status,WUNTRACED); - if (wpid != res->port.pid) { - ee_printf("ERROR waiting for child.\n"); - if (errno == ECHILD) ee_printf("errno=No such child %d\n",res->port.pid); - if (errno == EINTR) ee_printf("errno=Interrupted\n"); - return 0; - } - return 1; -} -#else /* no standard multicore implementation */ -#error "Please implement multicore functionality in core_portme.c to use multiple contexts." -#endif /* multithread implementations */ -#endif diff --git a/tests/riscv-coremark/coremark/cygwin/core_portme.h b/tests/riscv-coremark/coremark/cygwin/core_portme.h deleted file mode 100755 index 9471b12ec..000000000 --- a/tests/riscv-coremark/coremark/cygwin/core_portme.h +++ /dev/null @@ -1,293 +0,0 @@ -/* -Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Original Author: Shay Gal-on -*/ - -/* Topic: Description - This file contains configuration constants required to execute on different platforms -*/ -#ifndef CORE_PORTME_H -#define CORE_PORTME_H -/************************/ -/* Data types and settings */ -/************************/ -/* Configuration: HAS_FLOAT - Define to 1 if the platform supports floating point. -*/ -#ifndef HAS_FLOAT -#define HAS_FLOAT 1 -#endif -/* Configuration: HAS_TIME_H - Define to 1 if platform has the time.h header file, - and implementation of functions thereof. -*/ -#ifndef HAS_TIME_H -#define HAS_TIME_H 1 -#endif -/* Configuration: USE_CLOCK - Define to 1 if platform has the time.h header file, - and implementation of functions thereof. -*/ -#ifndef USE_CLOCK -#define USE_CLOCK 0 -#endif -/* Configuration: HAS_STDIO - Define to 1 if the platform has stdio.h. -*/ -#ifndef HAS_STDIO -#define HAS_STDIO 1 -#endif -/* Configuration: HAS_PRINTF - Define to 1 if the platform has stdio.h and implements the printf function. -*/ -#ifndef HAS_PRINTF -#define HAS_PRINTF 1 -#endif - -/* Configuration: CORE_TICKS - Define type of return from the timing functions. - */ -#if defined(_MSC_VER) -#include -typedef size_t CORE_TICKS; -#elif HAS_TIME_H -#include -typedef clock_t CORE_TICKS; -#else -#error "Please define type of CORE_TICKS and implement start_time, end_time get_time and time_in_secs functions!" -#endif - -/* Definitions: COMPILER_VERSION, COMPILER_FLAGS, MEM_LOCATION - Initialize these strings per platform -*/ -#ifndef COMPILER_VERSION - #ifdef __GNUC__ - #define COMPILER_VERSION "GCC"__VERSION__ - #else - #define COMPILER_VERSION "Please put compiler version here (e.g. gcc 4.1)" - #endif -#endif -#ifndef COMPILER_FLAGS - #define COMPILER_FLAGS FLAGS_STR /* "Please put compiler flags here (e.g. -o3)" */ -#endif -#ifndef MEM_LOCATION - #define MEM_LOCATION "Please put data memory location here\n\t\t\t(e.g. code in flash, data on heap etc)" - #define MEM_LOCATION_UNSPEC 1 -#endif - -/* Data Types: - To avoid compiler issues, define the data types that need ot be used for 8b, 16b and 32b in . - - *Imprtant*: - ee_ptr_int needs to be the data type used to hold pointers, otherwise coremark may fail!!! -*/ -typedef signed short ee_s16; -typedef unsigned short ee_u16; -typedef signed int ee_s32; -typedef double ee_f32; -typedef unsigned char ee_u8; -typedef unsigned int ee_u32; -typedef ee_u32 ee_ptr_int; -typedef size_t ee_size_t; -/* align_mem: - This macro is used to align an offset to point to a 32b value. It is used in the Matrix algorithm to initialize the input memory blocks. -*/ -#define align_mem(x) (void *)(4 + (((ee_ptr_int)(x) - 1) & ~3)) - -/* Configuration: SEED_METHOD - Defines method to get seed values that cannot be computed at compile time. - - Valid values: - SEED_ARG - from command line. - SEED_FUNC - from a system function. - SEED_VOLATILE - from volatile variables. -*/ -#ifndef SEED_METHOD -#define SEED_METHOD SEED_ARG -#endif - -/* Configuration: MEM_METHOD - Defines method to get a block of memry. - - Valid values: - MEM_MALLOC - for platforms that implement malloc and have malloc.h. - MEM_STATIC - to use a static memory array. - MEM_STACK - to allocate the data block on the stack (NYI). -*/ -#ifndef MEM_METHOD -#define MEM_METHOD MEM_MALLOC -#endif - -/* Configuration: MULTITHREAD - Define for parallel execution - - Valid values: - 1 - only one context (default). - N>1 - will execute N copies in parallel. - - Note: - If this flag is defined to more then 1, an implementation for launching parallel contexts must be defined. - - Two sample implementations are provided. Use or to enable them. - - It is valid to have a different implementation of and in , - to fit a particular architecture. -*/ -#ifndef MULTITHREAD -#define MULTITHREAD 1 -#endif - -/* Configuration: USE_PTHREAD - Sample implementation for launching parallel contexts - This implementation uses pthread_thread_create and pthread_join. - - Valid values: - 0 - Do not use pthreads API. - 1 - Use pthreads API - - Note: - This flag only matters if MULTITHREAD has been defined to a value greater then 1. -*/ -#ifndef USE_PTHREAD -#define USE_PTHREAD 0 -#endif - -/* Configuration: USE_FORK - Sample implementation for launching parallel contexts - This implementation uses fork, waitpid, shmget,shmat and shmdt. - - Valid values: - 0 - Do not use fork API. - 1 - Use fork API - - Note: - This flag only matters if MULTITHREAD has been defined to a value greater then 1. -*/ -#ifndef USE_FORK -#define USE_FORK 0 -#endif - -/* Configuration: USE_SOCKET - Sample implementation for launching parallel contexts - This implementation uses fork, socket, sendto and recvfrom - - Valid values: - 0 - Do not use fork and sockets API. - 1 - Use fork and sockets API - - Note: - This flag only matters if MULTITHREAD has been defined to a value greater then 1. -*/ -#ifndef USE_SOCKET -#define USE_SOCKET 0 -#endif - -/* Configuration: MAIN_HAS_NOARGC - Needed if platform does not support getting arguments to main. - - Valid values: - 0 - argc/argv to main is supported - 1 - argc/argv to main is not supported -*/ -#ifndef MAIN_HAS_NOARGC -#define MAIN_HAS_NOARGC 0 -#endif - -/* Configuration: MAIN_HAS_NORETURN - Needed if platform does not support returning a value from main. - - Valid values: - 0 - main returns an int, and return value will be 0. - 1 - platform does not support returning a value from main -*/ -#ifndef MAIN_HAS_NORETURN -#define MAIN_HAS_NORETURN 0 -#endif - -/* Variable: default_num_contexts - Number of contexts to spawn in multicore context. - Override this global value to change number of contexts used. - - Note: - This value may not be set higher then the define. - - To experiment, you can set the define to the highest value expected, and use argc/argv in the to set this value from the command line. -*/ -extern ee_u32 default_num_contexts; - -#if (MULTITHREAD>1) -#if USE_PTHREAD - #include - #define PARALLEL_METHOD "PThreads" -#elif USE_FORK - #include - #include - #include - #include - #include /* for memcpy */ - #define PARALLEL_METHOD "Fork" -#elif USE_SOCKET - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #define PARALLEL_METHOD "Sockets" -#else - #define PARALLEL_METHOD "Proprietary" - #error "Please implement multicore functionality in core_portme.c to use multiple contexts." -#endif /* Method for multithreading */ -#endif /* MULTITHREAD > 1 */ - -typedef struct CORE_PORTABLE_S { -#if (MULTITHREAD>1) - #if USE_PTHREAD - pthread_t thread; - #elif USE_FORK - pid_t pid; - int shmid; - void *shm; - #elif USE_SOCKET - pid_t pid; - int sock; - struct sockaddr_in sa; - #endif /* Method for multithreading */ -#endif /* MULTITHREAD>1 */ - ee_u8 portable_id; -} core_portable; - -/* target specific init/fini */ -void portable_init(core_portable *p, int *argc, char *argv[]); -void portable_fini(core_portable *p); - -#if (SEED_METHOD==SEED_VOLATILE) - #if (VALIDATION_RUN || PERFORMANCE_RUN || PROFILE_RUN) - #define RUN_TYPE_FLAG 1 - #else - #if (TOTAL_DATA_SIZE==1200) - #define PROFILE_RUN 1 - #else - #define PERFORMANCE_RUN 1 - #endif - #endif -#endif /* SEED_METHOD==SEED_VOLATILE */ - -#endif /* CORE_PORTME_H */ diff --git a/tests/riscv-coremark/coremark/cygwin/core_portme.mak b/tests/riscv-coremark/coremark/cygwin/core_portme.mak deleted file mode 100644 index 97b6d6ace..000000000 --- a/tests/riscv-coremark/coremark/cygwin/core_portme.mak +++ /dev/null @@ -1,17 +0,0 @@ -# Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# Original Author: Shay Gal-on - -include posix/core_portme.mak diff --git a/tests/riscv-coremark/coremark/docs/READM.md b/tests/riscv-coremark/coremark/docs/READM.md deleted file mode 100644 index 6f71f426d..000000000 --- a/tests/riscv-coremark/coremark/docs/READM.md +++ /dev/null @@ -1 +0,0 @@ -This folder contains the original, unaltered documents from the CoreMark V1.0 release. diff --git a/tests/riscv-coremark/coremark/docs/balance_O0_joined.png b/tests/riscv-coremark/coremark/docs/balance_O0_joined.png deleted file mode 100644 index 46b41583a8b834d371c2bced376f956e0f54065b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48672 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 - -core_portme.mak - CoreMark - - - - - - - -

core_portme.mak

Summary
core_portme.mak
Variables
OUTFLAGUse this flag to define how to to get an executable (e.g -o)
CFLAGSUse this flag to define compiler options.
LFLAGS_ENDDefine any libraries needed for linking or other flags that should come at the end of the link line (e.g.
SEPARATE_COMPILEDefine if you need to separate compilation from link stage.
PORT_OBJSPort specific object files can be added here
Build Targets
port_prebuildGenerate any files that are needed before actual build starts.
port_postbuildGenerate any files that are needed after actual build end.
port_postrunDo platform specific after run stuff.
port_prerunDo platform specific after run stuff.
port_postloadDo platform specific after load stuff.
port_preloadDo platform specific before load stuff.
Variables
OPATH
PERLDefine perl executable to calculate the geomean if running separate.
- -

Variables

- -

OUTFLAG

Use this flag to define how to to get an executable (e.g -o)

- -

CFLAGS

Use this flag to define compiler options.  Note, you can add compiler options from the command line using XCFLAGS=”other flags”

- -

LFLAGS_END

Define any libraries needed for linking or other flags that should come at the end of the link line (e.g. linker scripts).  Note: On certain platforms, the default clock_gettime implementation is supported but requires linking of librt.

- -

SEPARATE_COMPILE

Define if you need to separate compilation from link stage.  In this case, you also need to define below how to create an object file, and how to link.

- -

PORT_OBJS

Port specific object files can be added here

- -

Build Targets

- -

port_prebuild

Generate any files that are needed before actual build starts.  E.g. generate profile guidance files.  Sample PGO generation for gcc enabled with PGO=1

  • First, check if PGO was defined on the command line, if so, need to add -fprofile-use to compile line.
  • Second, if PGO reference has not yet been generated, add a step to the prebuild that will build a profile-generate version and run it.
NoteUsing REBUILD=1

Use make PGO=1 to invoke this sample processing.

- -

port_postbuild

Generate any files that are needed after actual build end.  E.g. change format to srec, bin, zip in order to be able to load into flash

- -

port_postrun

Do platform specific after run stuff.  E.g. reset the board, backup the logfiles etc.

- -

port_prerun

Do platform specific after run stuff.  E.g. reset the board, backup the logfiles etc.

- -

port_postload

Do platform specific after load stuff.  E.g. reset the reset power to the flash eraser

- -

port_preload

Do platform specific before load stuff.  E.g. reset the reset power to the flash eraser

- -

Variables

- -

OPATH

Path to the output folder.  Defaultcurrent folder.
- -

PERL

Define perl executable to calculate the geomean if running separate.

- -
- - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/files/core_list_join-c.html b/tests/riscv-coremark/coremark/docs/html/files/core_list_join-c.html deleted file mode 100644 index 6ee2aeecd..000000000 --- a/tests/riscv-coremark/coremark/docs/html/files/core_list_join-c.html +++ /dev/null @@ -1,58 +0,0 @@ - - -/cygdrive/d/dev/code/coremark/core_list_join.c - CoreMark - - - - - - - -

core_list_join.c

Summary
core_list_join.c
DescriptionBenchmark using a linked list.
Functions
cmp_complexCompare the data item in a list cell.
cmp_idxCompare the idx item in a list cell, and regen the data.
core_list_initInitialize list with data.
core_list_insertInsert an item to the list
core_list_removeRemove an item from the list.
core_list_undo_removeUndo a remove operation.
core_list_findFind an item in the list
core_list_reverseReverse a list
core_list_mergesortSort the list in place without recursion.
- -

Description

Benchmark using a linked list.

Linked list is a common data structure used in many applications.

For our purposes, this will excercise the memory units of the processor.  In particular, usage of the list pointers to find and alter data.

We are not using Malloc since some platforms do not support this library.

Instead, the memory block being passed in is used to create a list, and the benchmark takes care not to add more items then can be accomodated by the memory block.  The porting layer will make sure that we have a valid memory block.

All operations are done in place, without using any extra memory.

The list itself contains list pointers and pointers to data items.  Data items contain the following:

idxAn index that captures the initial order of the list.
dataVariable data initialized based on the input parameters.  The 16b are divided as follows:
  • Upper 8b are backup of original data.
  • Bit 7 indicates if the lower 7 bits are to be used as is or calculated.
  • Bits 0-2 indicate type of operation to perform to get a 7b value.
  • Bits 3-6 provide input for the operation.
- -

Functions

- -

cmp_complex

ee_s32 cmp_complex(list_data *a,
list_data *b,
core_results *res)

Compare the data item in a list cell.

Can be used by mergesort.

- -

cmp_idx

ee_s32 cmp_idx(list_data *a,
list_data *b,
core_results *res)

Compare the idx item in a list cell, and regen the data.

Can be used by mergesort.

- -

core_list_init

list_head *core_list_init(ee_u32 blksize,
list_head *memblock,
ee_s16 seed)

Initialize list with data.

Parameters

blksizeSize of memory to be initialized.
memblockPointer to memory block.
seedActual values chosen depend on the seed parameter.  The seed parameter MUST be supplied from a source that cannot be determined at compile time

Returns

Pointer to the head of the list.

- -

core_list_insert

list_head *core_list_insert_new(list_head *insert_point,
list_data *info,
list_head **memblock,
list_data **datablock ,
list_head *memblock_end,
list_data *datablock_end)

Insert an item to the list

Parameters

insert_pointwhere to insert the item.
infodata for the cell.
memblockpointer for the list header
datablockpointer for the list data
memblock_endend of region for list headers
datablock_endend of region for list data

Returns

Pointer to new item.

- -

core_list_remove

list_head *core_list_remove(list_head *item)

Remove an item from the list.

Operation

For a singly linked list, remove by copying the data from the next item over to the current cell, and unlinking the next item.

Note

since there is always a fake item at the end of the list, no need to check for NULL.

Returns

Removed item.

- -

core_list_undo_remove

list_head *core_list_undo_remove(list_head *item_removed,
list_head *item_modified)

Undo a remove operation.

Operation

Since we want each iteration of the benchmark to be exactly the same, we need to be able to undo a remove.  Link the removed item back into the list, and switch the info items.

Parameters

item_removedReturn value from the core_list_remove
item_modifiedList item that was modified during core_list_remove

Returns

The item that was linked back to the list.

- -

core_list_find

list_head *core_list_find(list_head *list,
list_data *info)

Find an item in the list

Operation

Find an item by idx (if not 0) or specific data value

Parameters

listlist head
infoidx or data to find

Returns

Found item, or NULL if not found.

- -

core_list_reverse

list_head *core_list_reverse(list_head *list)

Reverse a list

Operation

Rearrange the pointers so the list is reversed.

Parameters

listlist head
infoidx or data to find

Returns

Found item, or NULL if not found.

- -

core_list_mergesort

list_head *core_list_mergesort(list_head *list,
list_cmp cmp,
core_results *res)

Sort the list in place without recursion.

Description

Use mergesort, as for linked list this is a realistic solution.  Also, since this is aimed at embedded, care was taken to use iterative rather then recursive algorithm.  The sort can either return the list to original order (by idx) , or use the data item to invoke other other algorithms and change the order of the list.

Parameters

listlist to be sorted.
cmpcmp function to use

Returns

New head of the list.

Note

We have a special header for the list that will always be first, but the algorithm could theoretically modify where the list starts.

- -
- - - - - - - - - - -
ee_s32 cmp_complex(list_data *a,
list_data *b,
core_results *res)
Compare the data item in a list cell.
ee_s32 cmp_idx(list_data *a,
list_data *b,
core_results *res)
Compare the idx item in a list cell, and regen the data.
list_head *core_list_init(ee_u32 blksize,
list_head *memblock,
ee_s16 seed)
Initialize list with data.
list_head *core_list_insert_new(list_head *insert_point,
list_data *info,
list_head **memblock,
list_data **datablock ,
list_head *memblock_end,
list_data *datablock_end)
Insert an item to the list
list_head *core_list_remove(list_head *item)
Remove an item from the list.
list_head *core_list_undo_remove(list_head *item_removed,
list_head *item_modified)
Undo a remove operation.
list_head *core_list_find(list_head *list,
list_data *info)
Find an item in the list
list_head *core_list_reverse(list_head *list)
Reverse a list
list_head *core_list_mergesort(list_head *list,
list_cmp cmp,
core_results *res)
Sort the list in place without recursion.
- - - - - - - - \ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/files/core_main-c.html b/tests/riscv-coremark/coremark/docs/html/files/core_main-c.html deleted file mode 100644 index 847744131..000000000 --- a/tests/riscv-coremark/coremark/docs/html/files/core_main-c.html +++ /dev/null @@ -1,42 +0,0 @@ - - -core_main.c - CoreMark - - - - - - - -

core_main.c

This file contains the framework to acquire a block of memory, seed initial parameters, tun t he benchmark and report the results.

Summary
core_main.cThis file contains the framework to acquire a block of memory, seed initial parameters, tun t he benchmark and report the results.
Functions
iterateRun the benchmark for a specified number of iterations.
mainMain entry routine for the benchmark.
- -

Functions

- -

iterate

Run the benchmark for a specified number of iterations.

Operation

For each type of benchmarked algorithm: a - Initialize the data block for the algorithm. b - Execute the algorithm N times.

Returns

NULL.

- -

main

#if MAIN_HAS_NOARGC MAIN_RETURN_TYPE main(void)

Main entry routine for the benchmark.  This function is responsible for the following steps:

1Initialize input seeds from a source that cannot be determined at compile time.
2Initialize memory block for use.
3Run and time the benchmark.
4Report results, testing the validity of the output if the seeds are known.

Arguments

1first seed : Any value
2second seed : Must be identical to first for iterations to be identical
3third seed : Any value, should be at least an order of magnitude less then the input size, but bigger then 32.
4Iterations : Special, if set to 0, iterations will be automatically determined such that the benchmark will run between 10 to 100 secs
- -
- - - - - - - - - - -
#if MAIN_HAS_NOARGC MAIN_RETURN_TYPE main(void)
Main entry routine for the benchmark.
- - - - - - - - \ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/files/core_matrix-c.html b/tests/riscv-coremark/coremark/docs/html/files/core_matrix-c.html deleted file mode 100644 index 2ad041b71..000000000 --- a/tests/riscv-coremark/coremark/docs/html/files/core_matrix-c.html +++ /dev/null @@ -1,56 +0,0 @@ - - -/cygdrive/d/dev/code/coremark/core_matrix.c - CoreMark - - - - - - - -

core_matrix.c

Summary
core_matrix.c
DescriptionMatrix manipulation benchmark
Functions
core_bench_matrixBenchmark function
matrix_testPerform matrix manipulation.
matrix_sumCalculate a function that depends on the values of elements in the matrix.
matrix_mul_constMultiply a matrix by a constant.
matrix_add_constAdd a constant value to all elements of a matrix.
matrix_mul_vectMultiply a matrix by a vector.
matrix_mul_matrixMultiply a matrix by a matrix.
matrix_mul_matrix_bitextractMultiply a matrix by a matrix, and extract some bits from the result.
- -

Description

Matrix manipulation benchmark

This very simple algorithm forms the basis of many more complex algorithms.

The tight inner loop is the focus of many optimizations (compiler as well as hardware based) and is thus relevant for embedded processing.

The total available data space will be divided to 3 parts

NxN Matrix Ainitialized with small values (upper 3/4 of the bits all zero).
NxN Matrix Binitialized with medium values (upper half of the bits all zero).
NxN Matrix Cused for the result.

The actual values for A and B must be derived based on input that is not available at compile time.

- -

Functions

- -

core_bench_matrix

ee_u16 core_bench_matrix(mat_params *p,
ee_s16 seed,
ee_u16 crc)

Benchmark function

Iterate matrix_test N times, changing the matrix values slightly by a constant amount each time.

- -

matrix_test

ee_s16 matrix_test(ee_u32 N,
MATRES *C,
MATDAT *A,
MATDAT *B,
MATDAT val)

Perform matrix manipulation.

Parameters

NDimensions of the matrix.
Cmemory for result matrix.
Ainput matrix
Boperator matrix (not changed during operations)

Returns

A CRC value that captures all results calculated in the function.  In particular, crc of the value calculated on the result matrix after each step by matrix_sum.

Operation

1Add a constant value to all elements of a matrix.
2Multiply a matrix by a constant.
3Multiply a matrix by a vector.
4Multiply a matrix by a matrix.
5Add a constant value to all elements of a matrix.

After the last step, matrix A is back to original contents.

- -

matrix_sum

ee_s16 matrix_sum(ee_u32 N,
MATRES *C,
MATDAT clipval)

Calculate a function that depends on the values of elements in the matrix.

For each element, accumulate into a temporary variable.

As long as this value is under the parameter clipval, add 1 to the result if the element is bigger then the previous.

Otherwise, reset the accumulator and add 10 to the result.

- -

matrix_mul_const

void matrix_mul_const(ee_u32 N,
MATRES *C,
MATDAT *A,
MATDAT val)

Multiply a matrix by a constant.  This could be used as a scaler for instance.

- -

matrix_add_const

void matrix_add_const(ee_u32 N,
MATDAT *A,
MATDAT val)

Add a constant value to all elements of a matrix.

- -

matrix_mul_vect

void matrix_mul_vect(ee_u32 N,
MATRES *C,
MATDAT *A,
MATDAT *B)

Multiply a matrix by a vector.  This is common in many simple filters (e.g. fir where a vector of coefficients is applied to the matrix.)

- -

matrix_mul_matrix

void matrix_mul_matrix(ee_u32 N,
MATRES *C,
MATDAT *A,
MATDAT *B)

Multiply a matrix by a matrix.  Basic code is used in many algorithms, mostly with minor changes such as scaling.

- -

matrix_mul_matrix_bitextract

void matrix_mul_matrix_bitextract(ee_u32 N,
MATRES *C,
MATDAT *A,
MATDAT *B)

Multiply a matrix by a matrix, and extract some bits from the result.  Basic code is used in many algorithms, mostly with minor changes such as scaling.

- -
- - - - - - - - - - -
ee_u16 core_bench_matrix(mat_params *p,
ee_s16 seed,
ee_u16 crc)
Benchmark function
ee_s16 matrix_test(ee_u32 N,
MATRES *C,
MATDAT *A,
MATDAT *B,
MATDAT val)
Perform matrix manipulation.
ee_s16 matrix_sum(ee_u32 N,
MATRES *C,
MATDAT clipval)
Calculate a function that depends on the values of elements in the matrix.
void matrix_mul_const(ee_u32 N,
MATRES *C,
MATDAT *A,
MATDAT val)
Multiply a matrix by a constant.
void matrix_add_const(ee_u32 N,
MATDAT *A,
MATDAT val)
Add a constant value to all elements of a matrix.
void matrix_mul_vect(ee_u32 N,
MATRES *C,
MATDAT *A,
MATDAT *B)
Multiply a matrix by a vector.
void matrix_mul_matrix(ee_u32 N,
MATRES *C,
MATDAT *A,
MATDAT *B)
Multiply a matrix by a matrix.
void matrix_mul_matrix_bitextract(ee_u32 N,
MATRES *C,
MATDAT *A,
MATDAT *B)
Multiply a matrix by a matrix, and extract some bits from the result.
- - - - - - - - \ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/files/core_state-c.html b/tests/riscv-coremark/coremark/docs/html/files/core_state-c.html deleted file mode 100644 index 9f8035990..000000000 --- a/tests/riscv-coremark/coremark/docs/html/files/core_state-c.html +++ /dev/null @@ -1,46 +0,0 @@ - - -/cygdrive/d/dev/code/coremark/core_state.c - CoreMark - - - - - - - -

core_state.c

Summary
core_state.c
DescriptionSimple state machines like this one are used in many embedded products.
Functions
core_bench_stateBenchmark function
core_init_stateInitialize the input data for the state machine.
core_state_transitionActual state machine.
- -

Description

Simple state machines like this one are used in many embedded products.

For more complex state machines, sometimes a state transition table implementation is used instead, trading speed of direct coding for ease of maintenance.

Since the main goal of using a state machine in CoreMark is to excercise the switch/if behaviour, we are using a small moore machine.

In particular, this machine tests type of string input, trying to determine whether the input is a number or something else.  (see core_state).

core_state
- -

Functions

- -

core_bench_state

ee_u16 core_bench_state(ee_u32 blksize,
ee_u8 *memblock,
ee_s16 seed1,
ee_s16 seed2,
ee_s16 step,
ee_u16 crc)

Benchmark function

Go over the input twice, once direct, and once after introducing some corruption.

- -

core_init_state

void core_init_state(ee_u32 size,
ee_s16 seed,
ee_u8 *p)

Initialize the input data for the state machine.

Populate the input with several predetermined strings, interspersed.  Actual patterns chosen depend on the seed parameter.

Note

The seed parameter MUST be supplied from a source that cannot be determined at compile time

- -

core_state_transition

enum CORE_STATE core_state_transition(ee_u8 **instr ,
ee_u32 *transition_count)

Actual state machine.

The state machine will continue scanning until either

1an invalid input is detcted.
2a valid number has been detected.

The input pointer is updated to point to the end of the token, and the end state is returned (either specific format determined or invalid).

- -
- - - - - - - - - - -
ee_u16 core_bench_state(ee_u32 blksize,
ee_u8 *memblock,
ee_s16 seed1,
ee_s16 seed2,
ee_s16 step,
ee_u16 crc)
Benchmark function
void core_init_state(ee_u32 size,
ee_s16 seed,
ee_u8 *p)
Initialize the input data for the state machine.
enum CORE_STATE core_state_transition(ee_u8 **instr ,
ee_u32 *transition_count)
Actual state machine.
- - - - - - - - \ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/files/core_util-c.html b/tests/riscv-coremark/coremark/docs/html/files/core_util-c.html deleted file mode 100644 index 3ebdb3879..000000000 --- a/tests/riscv-coremark/coremark/docs/html/files/core_util-c.html +++ /dev/null @@ -1,42 +0,0 @@ - - -/cygdrive/d/dev/code/coremark/core_util.c - CoreMark - - - - - - - -

core_util.c

Summary
core_util.c
Functions
get_seedGet a values that cannot be determined at compile time.
crc*Service functions to calculate 16b CRC code.
- -

Functions

- -

get_seed

Get a values that cannot be determined at compile time.

Since different embedded systems and compilers are used, 3 different methods are provided

1Using a volatile variable.  This method is only valid if the compiler is forced to generate code that reads the value of a volatile variable from memory at run time.  Please note, if using this method, you would need to modify core_portme.c to generate training profile.
2Command line arguments.  This is the preferred method if command line arguments are supported.
3System function.  If none of the first 2 methods is available on the platform, a system function which is not a stub can be used.

e.g. read the value on GPIO pins connected to switches, or invoke special simulator functions.

- -

crc*

Service functions to calculate 16b CRC code.

- -
- - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/files/coremark-h.html b/tests/riscv-coremark/coremark/docs/html/files/coremark-h.html deleted file mode 100644 index 337bc1a0c..000000000 --- a/tests/riscv-coremark/coremark/docs/html/files/coremark-h.html +++ /dev/null @@ -1,46 +0,0 @@ - - -/cygdrive/d/dev/code/coremark/coremark.h - CoreMark - - - - - - - -

coremark.h

Summary
coremark.h
DescriptionThis file contains declarations of the various benchmark functions.
Configuration
TOTAL_DATA_SIZEDefine total size for data algorithms will operate on
Types
secs_retFor machines that have floating point support, get number of seconds as a double.
- -

Description

This file contains declarations of the various benchmark functions.

- -

Configuration

- -

TOTAL_DATA_SIZE

Define total size for data algorithms will operate on

- -

Types

- -

secs_ret

For machines that have floating point support, get number of seconds as a double.  Otherwise an unsigned int.

- -
- - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/files/docs/core_state.png b/tests/riscv-coremark/coremark/docs/html/files/docs/core_state.png deleted file mode 100644 index 9b5a4ea6078f44f7ffab2d06574052d01ae0db55..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 72093 zcmZ6z2Rzp8`#*e{nb{*Fvtd&ykv-EuW|EnbD2kHol`SRh?2@udW$%?13JqjN8Ymd!o=<$~e zdn4yO;29R{8AQqrd7MGY{W7hQ3LYAPPm4vQtmn!tds{zOyzK zt}B{T+oB&{Rg-6o7XACVd3~68fm6oCJDJ&Kcds3`O0{q=GrPX)=*~NrhpMlXhPGvj z4NBd&vQ|Vjt?Wvcc(ReCs5t(} zT(508PSGQOy!Eo7uyf!KWieSwH2LE?JMVx0X%7Q4<-cDYK}R9K#EdI*y$?m)-A`X% zzxCCtC?m=GhVyJWNi9htSw%(c6w`hC!s_dFN{;slyu7YVLm_{YZ~IuM;`H}yHg$FN z%0HiPn3@l#ap6;4)9e3I*p=;%9z7Zz8>?eyCp0uP#4aL|6d%vR&CPA3(5vP%Zu%w6 z-qMms&bCDBd8%B_cWz$Z%cF(1qB5mHB|Ufd9id9GYK<0yZEUoFIqaf!M4jXrT(+hAD(zJ3knL7-%?*s zedo@d@$P)VlE;r-`-6`km*2E$6M39>?`#@dT82Nryx}+ZZOylD-v$N-DBHGed-vgk zu^~5>D|fJ%BD&8Rk5Si=W$68LWM{!D-FpqOd4v8;VOFaBXp;Yf;ue{;^OWz zc&$<~t*u5L{grE0mj5d3*s(*=cfw+3@{>qjUR%XA>zz9p!@|OfPL1uosdi@dWc6S9 z&#%+in3rSz)-BFt;tX6dN z&H8um-`BOYtg1Tqn^%<=yCkcDI>boZ_0S>5j!ga1v%l6?FU=j;eN{1Ir^n+zi+@gi zdsj?ztouRTKwbFs((g~hFSmW-{_i(tRGwNDEg%)67nUHnt-iaPH!(4>)b}gzdXw9| zlJd(`S_cmbpZfel8@r|a^!Heezy-&#SGROp@RHrPs8DNVYyJHBQ}OK2LpuT&xPw=g zw*78jbs;5%RzX35f6bb~-=BgDeS)dUmQYW`@-QSDMNrYu*Vffhg@%S!&aY@TH#e91 zeBo5}ortIlUp0*X*D=H|-{&qwCAyDNR#xWaPRge4VD*QX5L6bgWx;_l>Q4##NY3;6yMmGSn0OG|HDsqt&-$;&?hVhM zGao;G{Hl_RLDdH_eCt@eX2y*&GRzH8th#!7v?V1a6J1ta%yU1Pr()@9zg7oZo-6cU z_I=%zUGu?jYJlqIty|uIe!7-;etcr@N#3)vkmd%?_7gQrQBvl2-u@k`QMFWf=y1AY zDKBo(IxyDZ4*y=xFyC35p)|Sv(~NgBF74^*Ir8~)Th8|d`O^HO)26<6GombPY#8?J*^_&3`ZYhcq^B2ch>_^a z8{5u@hEiR;c=1r@ZCQzbPl#`#eZjnC6jl0(R8`u3^D;qZ4x z?+kg1P_Kbns>^hSK6xs&s{6oiMng?@Ac!mqsp*pYHDU=ZKR9Q zqc$-yaXWf+5GBFwQ?)t^D{Dv9xikFy{ORX@|L8nlP$1vKfI?weM|N3LQxm_EGp#{_ zKxC5UvJH0GT+z@ zPo28jTFSwS)0VBXtoYtP8}XS`Bcr2r&z>>jl-1QoGDjw66;&@U9J{H0j#pb-TeK$m2n_6~JbNlbLW-r>CjRWN&tmH8!iGs}^MCutoWvJlkJ0=0Ok&E)Jb(WDQTXrk zRtu}PO0L2S)ODu9>Bc@%I`w%sDT=>;^eHMSaj0G#INn=Ig#%t%TI%@b&K^^1>k~!Q zX_~=_Gcz-MvEe_HX^U;_?kVP$(`W3tv6VITGD`LxQXJDYm*;6TG&HVm^%O{z-5<8C z-%oekh*e%wQv}VX0XumLt6BTzjrq8dg5Sc-(VV0Dqvi>1BCf8kopf!MhMeRZr^+2* z3S`3jq$Q=>bo=)0^AqS65eLp7e<>9X-8=EqFC`*rZOg z6J4c#)8eSqNk`w@QEqFxw`R?nsb9as)6ztG`}(FwuQ=4BWsTdMoShof&AxNTxJL+o z7GJlH?%ut7tzEw`!$2Zxjt-j%U9RD!KEP4i0HGM}S`vaYi|xzkc1K zxw04@5<l^*eL)!)PsYA3`|S}tSI?SIhIybH1ze| zVs;uGc>m}~7cae(lvHbLs}@>`Oaea|#ZD3BvKneE%r-1cLWG{UwvW%2S819_GS&qH z01tlXzaAbQj*gBY_Er9MFJ7=m*e^K=MA^j&lP#R-$W{q(cZnO_PI~pyO<7^`-DDuvh~B`V;ce~TKBE; z)9>6_?|C;jm%-%rj!-@Ex_{`bx7TiDWJF7rHw*i(y{G4VWF+10J$sxEAEpQT`4L%o z=;WzW$v1DtW3h}QwNX8`C@VX8c-VP*i{8KS2-R*8FVVeGPn=_6_UrkY~l$TJ33*2v`KWcIs; ztlwOlv`?PgWLx4!B_WaJ&P?mt*L*oTw-{&qtx-&qvx=&!GiuD$%}4eoeBu)nWXAFC zE%hFL+!8e1#J5piz8MelmFu!V=-=Oy)&g?5HbS|1dD!>->({TBT^$|GO<|^F8W@Qu zJHEK8)c)p81K``S*?#O3kG^sqz}4XI#Xw`{b8^-dIMgH-9IWV8mRCM`_Uu`O-5aD= z)>7i*;~m}InYg&Pu3o)r6i3(pH6+?d164y=$02Z*r@*c(3`aX_|D(f?{U^Kg4{-4D zokw-)8lOjv9|8`1EWaf>Waayz%PA=l+1ZkSkP=EtW(%jV2XdOUny9rM9BR5(3Sy$i zS6uL|Tfg;J2|mA~V2C<=i+3RC&*&A>H+dE8?XreNGy)g^ZS@QcbgZqPb}w;M?Y6Sw z<>ca$QRn33^cs65JpT1-0}8UOXbK-=C8GdG$5-;k^y(WLl>BGhXjiRjc=xV!ujlTY zDjWpoH75!m82&AL;0eo_$^NFonq}L&8Zqu!rKSAn6b3pvVI_)2#>P52I@FEM#XbVb z*RJi)p$`3hQ&fCGgq#Sy!-v=3ym@n~MI_j<^@5o1@w>q*%kPSuXaJAh7jK7!Q3F#C z)vPS*qDp`5-DVcZ!^+IxN(A0KE=5FCG3?2_OA^yH{ zPfQrcQ4{!o<3_`a7rXsWu!v_igS8}IyksQFuNkyM)n_~eKe+pTerBe4$+4c*I3f3D z&jIZ^IXj14xWL}e7m{KONZk46P4d;N(Ws%4l9Hmp=*7jwZvB;IB^z`7E>#@wD`ynG z5uN*rG>|ga=c!_nlC)G*RBk}JRUeG^?u|NsewDL}%h#D82L}go_Jf!I9H~0VE)|Qd zDj_ew+S}XPX!q_$JPTnL;4u7xf(>9SpFe+AR923}*~H#!C!NxTi=&DY3~b#K@PPUG zc~M!}2i@kU^SIDkM1mJN@MC@bS1xTZal|)3`NW!ctFa|#`Y+5#4Gj88ajx@| zb}|kq;C1q3J^JIok00`nPS^bTEa>L$K7^k7;FKUbLL`3k-dn2c9@R(WDwUr5eLROF z{O9EJGaY%Vw_4lVFH~@GB-;Tb?c3yB%#VuWH(B+&$gM;C+7orxHf|OX4Iz7b`&suR zzdpYtz6lU2uz!PfuJq`xhP3=CL~ucKAfst6yWUoemv}KB5Q&R&R z*h~rs=eeMNVCP};c30%H3T`Exs^ZLKs`e&vX=@7$NnyF@#6$xR4_Wg0moCv@e;+k7 zUA}xEmD9`;>@1}bg{BxQf}Z;PP)k~#v9WRcojrnJ$vT#nkNdx?g9RBF7^nm<@7TS2 z_n`|HqU}e&ytx~lkf873@xZ5qJb&x!*XPU1wm*3A!13r&sX#)}bqv>whmwV-HZwEh z-|E5t>b5%bv17-|W>CLFwZrMf)~(Y&?1`Qyjt#AL`rC#5H}ovjuy>>5;&gZKX2Ai- z$)a~Iwox^9^z@VyR&EECQ{BYzYz=lC9cqsHyN@4ThMNo=tdpnWM$h64yt8Ha3#l+=X3-z zBAp*+4?s@5r~35w50N+#i_^2qwp~VhuLZ?f|K@azk;d8`ex^q~wf|VNva;G7 zIFMysXkS!Zto{17I%+|EzHv+nJ9*Bn*kvh~FAq-EtfZcE_!PXN-qzMO1+v;&(zm!6 zKuX+1*L`%COGiIKMtS(?5eFAn_}8972~|~rZ72HmY;6Uw?Cp<^m>e~8ba4rv`~Hzx z_)4^WDE30w&)M0g!G`nR(?j~X_wPTis=2oLNG8hYRaM`-7ax~D-#9S^00;8E|Fb7o zvR76WIX!*-LG&^xCiP&*?GIg_8)wl~`OoSktyTA1p%$kjynsqrGe`&(LJ9T1 zqwLfe{g+cH&IFbYOiW1sdh+Y%PsiiO69u;&_Zs8KTrVmkv&)t{Mf2gqhmMC2M*(RV z8!`djkgb$4%&EMc2m!l+fTGw$5>ak4v0kj*g^(i1>3!N%zAIH$8z2yyX~UJd7^7l{ zFDyz*N}Xn5^q`*tV%im90y zkD{P;oQ(Z`!>l7?V_Dz`C%;H++r|fwfm4=h_rpa?uT4rqLRU2~H=twyq^juQ!;8GM z-QC@Ie|3Th@W$~9uxW_it6a71UzP;lB1G#k0LGSJS z=;)}}rcIo{-B*IDf>$*B=f1^&ni$8?0G#~L(VGb-MEu*^d**;kt95jBGw$D)F``HJ zfr{pct$%WImn3H$4q!}7Oz%>7^az0`r9n%o1o_|@2T|ogzEH0oSa73CwtDt)C5r=; zNTx&eDJ?4_T(s!vQ$E=i$ZZ`JXHLAhx&4v$!j0{x)`OlB#{p7u{ zY5W#Qe>&{ciydHUmy@R9i1 zUe(%##UN<<-vq0@!7E5(oxPXUclQBxZR zXv2?YS5172?KU_$nY8rxH*@F8#}hRPy5- zd^Q`Jc81G72|}=6wVhe?_VMw!An4iEJ=7Ej3VEK6nU^8e2`hhf`>D^zp6c>Eq=<@N zJpb_FrpD&xq0XFLL@tzfsE!9~&v2*-8vj(Ii34>WM^p#wXFT_9G&@8So0CM?p!U>lqNS&ICQ7OIaI;LXA*yYz6j4>=50*!u#Mo5_tU)zJsSAUQ zf@f|obkIbJFdM&`-G~)`)`5mFJ(dn>QE6Hv$XEM9mBPJP$RsIN;AoyRwt|?LvBbZK4nm$Ol3)26e!TN}__c z3Vn=b)#`}LmoMuis$Oz-L|s{huR~x3Xg?F)WyWx&1=su-Q<)MNgr-XEs-LiTiaFonT>CR;3ub`z?PAbQR+2FO`iPX z#jv2Ig*x)&^eiE_ZV8{**Byc5e=!5xfkjxA8@fnjQc_a8x4jJDKgyJ@qhorz8D;Ur zHWnEf8IO-oSW&`sTEw7AL$cx!5RevL2h09s?iRls%`ckV=q=|(x?ED>h}Z5AIp z3$;A=c4k(V5*jtJA<)ZpTJBvYj0B(D5X~VGk+^TCnHdKZ3-6h6vzc%2&Bs;r^!C^r z8#Ccky?^v>Cr=G9N~F+!|F3eumZz3NE~2Dbuz`Pu;|1b4Nd6MEQH~&T&8JTyz~?%K zXX^-Y2bscGWfG2zj+Tawu8SH9SQ81nFS%hu!^@Yf5(e?Lc#QU(U3?i5oyV}l@`$@r z*VV-X|E2ljx?Na?4d6wF1_ty5yJTcl4xo@JZr$4a?9v7&SJ!o93;V}_>k%0h>sAjC z-ht0Msx&Y%LaVH-oFTD~2j_l5OFX&u<3~YvNDq(0_j>LKTI7eYtZQ$7yWPy*9qQ&h z!05o_q=FAOJPa!MBmi*(=>00b6WrjYbk^3^Uwp)bg@rRDI8htAofT$ZTh4He&_M6tLnrVkikmj+n3}RRVeG;`kH{yu1`~I3p83WJ96PIKUD8aSdeSOPLJg+4@ z2(*_)6w2}bs)}~+=xC$FMrWnHX&MQ{y2GzVi>$?QnSP}a*0DF#D4uJ>UPllj^x+n4ensygJ(jgQ_+g;%sovg)qcy{XgWddd^f?F62Iv-}u;Cqe zPmpQTErPcYuD`=?iUK`3j%)-YEv#E(vV%>M47D|7Y2gbdgdvv5*$ zG%c~w05V)4I{e}))rk`)d?w!R9Cu@ig9WU-Y4hg6fq@Wg13~BsIxWd%_}+m7ir{w6(&gz5P5!xxLu6}Ubk0~7Agbu)K z>gUgTeAqNZS2&T!;g#)^%T9=m4a>`uM%z0N>lZ?-W%;oY)HmAQP!?ki%+0xA;lkJ9 zBL)S!8IYO_ghrKsc}0-hh{TN>fzWwm50-Ni2Q!LQ5S_xht%PnP1w`2eT3_z*W@q96 z^;K-pl7=x#kCRwSJj~S8C=j+m)P*Q8!zai4n2K#=eRhzJyr4-|O%p6w{f=6Cnjb#zQeer(V@Hy2M*231yAPjcGO;G94gA?<`htx1(X_+jMEMW8Qg zb|E1a5fKp~b$@Qp4<#I`iM>)ExkU$pgG-_5F{1xMWin1vke1fjyEif98Ft@$93{Tx z<794P9;e0$``g(=!+t)x$dIzg5>*J4Kt|{Ieij)$!4r<_}^BEaV zIi8xEH*KQbtq+)EY+?fQV~Pfl#L3Bt3e_r}Ux^xjt7CXchL`d-n+LoL`+NRJ#Uw!} z8N*wmhlZTNXl1@Hx8m3`Ff)h4*PdB_7@U;)E)ctGce(E|S=$l@baNbwWv4-Pu9VCR7rA`;&?Vl!ueM)}11!w6zs{yRxPAxB(|%Ae<7+i@k+~19m%~{wfOpg zwl)IWpH$LWsgz6By#M6=}+z>)V zL%z$?et%|Y8oE$T9^~hL?FxdnCN3f2JwN3nr0TN`6*v4c|2eL@yse*K>75zvCb%IeTkVMOW} z=JDXHNTNaw_MQ3E1n#4Fv{N!;n8A2WH$`ZNA3I7#BqRh#p99~&%e}K@#mipALr(qv z-2y~$9$hXgJzeX9EIwa_sQajL&gd5)U^V*!jT)8l=`U`n@nIXPcnwhg>97*HSR!pn z&cTFj{p_l3%s?K+e$&nbm4P!vf}^x2OH09C!VVy>YVp@=O~uWdxl}pf1%|*9h!;?1 z0t#!m;t(X|bF&A2RYE^uUp)@NgWx55f|QOpIf)Tlcoo}P2H{aUC>5yFI-obuj(Gfc zy@DI=h=!wba)bfuNCd%KOaqXvp?;C=8MHKO9og@C!8|0_ObuNF2=zRE%a%WJ!CKyT zSD;iQPQr?^R|oBoXJJT$(j31g9LbydH*dH)IywmF5T}ExkN^ND23mt+8YUjx{E9k6 zARi}z{B9T#$PpB@dvk|n%2R-dmBCSpJwI-ZTyD%3KXT;A;-9fJeznuGJ+$l`9F%nZ zINo=Uj2+XSrHd@%UesmSQgOgaBKSxy)kGb$l5-S%VOhIU z_Ta_o^E&dz1u=L4al8;QF|mJmjSgUw85D*M$4?mrIWqAVHMZ6Gi`(jg{{H?p%XmN3I!YA3f@0|O?=(|Hov34w#$C*q$ANBmUgX~MP z4PEyWVzJ|hUd?vaVe!h>k53iw&+Kc~Nd0<(DtxwTY3`%n%y@Er0_P)2y20@L^zb}3 zxA#yZBf3}jJyw1DVg=?xK`OV_U$5KRbo~8Q7k*DFJk`ik6FGY;3u!Oxr_s)>*q4Qn z7KYGvc~uS8$x?F7h&KFS|06Ga6dFQt_hg}pYj$~0p4yX%tfAsq6(&5D*Y6((0i$Lk zd+dFec^nG;b_c#zmX+OIz_&6gke3UO3Y6b1e1`P9;ryrlIz~neumao7vTZ0AI-eu@ z2dN#QHu_`7zS`E*43#AJyj&?%ZOYF3ImYcRIf%Ui$v^7)b=#aV2j6AO|NVrmTX|Dc zQ+@p>pQns*Wl|m$6=^{r5C6Rj&0vqNE=^y>8N+~p%Kv`MJ}&ryK)4zU;}U*;es3$P z^7tM-zO_==>i&?<4Q~+#p2%mvPRsC0v+ifua-v@d8LI}k?*b1@u+vt<^}?QHSB>Ik zrtGtYs<8R+3!+N0K`yse1H>xrvHC4K=3Nn|`GQ8;wQ}d9w z_Q4Fv&bDwTPM$o;&d%QM7-&_MZjoxTLe(TgQ9b=F8inIo$;+Q#jCBa;1QLpRt+^sp zUS2-lnZt|-N;_H-9G*;gg<&J;^(2fawJta~7>7hcR+a_F;lln39=<15XT0)*A?DL9z(`ly@R7QfSoZ`qO;$q3AivgM6}r22i{ z+_Eb&pGQITeuZdI*Kuv0B(v0tJLagV+wN z(X;uVRyHX=JFsk-x*~Y6)Qf8E+O=0TgM%IyYQld)wgJ+onwlV3B62}cnh`?LhJg%G z0#8VTSm^kdFP01T*4BJ@aNqvVsi+{3iHz6dpx?fI8<8_UP*d0L<6X@C6V<`*Pjwws zl*zP~qb~Tqz2?WC>xj|FAsaabYU~We3^%%bM`7E#q?JHPPDbJcZ9ej5Me-E8-Y70KHWD^9>W9!yQSr+S80NX+u#_GG0{2xdzQoV)gdiIO3tcA5oFOjvbwP}N6wAR-u}4rTi8XOl@11g}O5 zjR(-X6~`Ibj~sDr07>ll^Y{%phEN42ZXueK!iBxc^#6nRsafR*UAbquR$^h!M3D#_ zUZ{@Yy~h6jwa9?f;olO5mNEP`2Ko+~5uulmxRs?inV6VhO~%a3_<&FlSO+QE$i&1D z-qg=uzZ^C)wTa*vT5g=EX0)_C&TXjomLE!2&QzDRLk4mrf?GYkzxrBSx)H*tk1aupGB6uE zH+KXu5HL|Qf@IL~BA~r93Fmaf#&IZHk4PXb0=UVE{Mk7u0rDTYQNMZp2tr|#!nY)-j>}$juW_? zRz(5`6TDF>8>|4e)De0|SI~mdV-y-<3Hq?y14AJyBasN9j0epRuKJ?RgeX{CD9tKo z;?B*@@v0nky>{&yfqu4+-6NsiWFoDkW4O}8~+wDH2R7CHJlHa1sF zY}z|Ji9hM+;lTnB_r)52I)1`fPm%_!F^HP$j5bA7oBrUHK(HmI*iF<^K-V6hs)fnx z2Y@a{NO=a%YNrzNVOn5?O33(r>#N{{{KXwWn~T>Edbzp#!T#`dyHXwN!sryL#DuDD zU%xKkKQlhv8Tp2AAV@{P2+0>N5UfbzZqJ@Q1NjXv;Yae~a?mHd&Al?H&|i+%vb}J+g3hhjoLYWPkwKgJ(I^D#& z=sz@B1_|}}4ujvm*-e(sqj%%D)dT5xK?4To8>;%<-v9>Xbo{t|;gg+yNQ@#?qlf5{ z&q#WJu^GM*{*!!F@pVMJUc7wS@z8Y_0ySn5o4_*Sg|>5o?dup))pAhwv4i`hAT#ob?b^IT*&I`Y68=tBZUGv6CG*2=P_j2plOnv5>OyOWYVXgzpUnWb|Y3P zPcjs)u5<{S5Q*xR+8G0E37NhJ5ETsp_Biy!IpDFA*bni=E6;MF1d^Qu6%F6BcjMDJ zk32Gy08a!Owza>#crtnhnG=9vLLx3iujb=hg}gJ#nP6rC{14&L5bz{)Q#w^tu;tmn~)Z?aPPzR8VgNUr4>zSX(oIl2E-tVi3um<%6FwWIHXvR7uS`U5oaU* zu9=n9`l<^_F)?)@SO|W_;IlH(2%z85QUFb1Fw+RD`qYw!fenJZ)$pw|{n}|7f$h*R zu8pm0x`W+P)l&!aUAiju_U%OYqEK2S;8mbC=mZ4pP(Aa5xFjU1^C=!bG({Ii#8qlyYY@HkQ{vhZuU7Uw>mIC)EzxKGF&IfC_dj#*e* z5;+Eeu4O^-YaNI=R#$5n#Pf>S_qyc$003vIR=%e z^|46i6?ouqP^ef~SQJl=7=8JLuyASM->nemBhftv0rYJuPRrqpcc9!H)kf$h2JIW< zDH^e!6Wl}W-z!@<@z7Ht8EB~d`|^Q(pHpMDC810<=1xayy^1u;+v z4g-W0Pszf4Bzs6DXi(^{Va>Yvox*EMO)zzkuh%jd7Kp@w% z@YGaZ4^L00W5*7B`9qW`sGtZ?HN!{q{`Gm!j(~Y~l9a(#%_hpxUNP}Ze|%F`X@FBe zR^V$vw3^7oH{)Q188FGMBD=B9#8}24fCwrE++*W#PYGK~^f!&A8FL5+sTB`Qv#hJD z(}&#Z02_!tZC7!c6(SXhkO6-<;d??b&O+dA94rtTcKV&>m257vms5pw%KUIcuzCYo zNg8=uOj1WSY~K8+Ic@n<D1usb7{KzGfA|eEoGEYF`q@e%3NYiwH;lQN7YZo)bJ0$upYW)88 zelw2rFmlIO5hl`&VERKKZg}--HOzYG0p|fTL!QMLnL%BpC+8FiWKmI3t?`X}+Ma)2 zxpMjP&Zp7=KSyGGWK8t`lqez^K^i#hpElvlXm>4LU0weShacDkNMxvjHhE#LO4gxT zh=d|Q`VjC&3=v8{-R`}5I;Qa}AI!5pPfoIdS0O$zeMg1$!30AsvU^0Dae|74Ksr}I zKmekM1*UxOAr#jEY!=Iv%q$wb}Vw;tz37V1Az=-sY9YVlD&9MB+hLb2L@N>7cUzBHylQg9)yGllyyW2Hr#U0#z#21 zi(gdcrATfA1cO-Ah|Dq)%F;eJ*GmC9kZCMFhk#JBm%uULJ@Tq{?-E8141hH{KAu~Z z$?Ou6LCh#?P;ID5HijGu5-u=I6iP1mcoN?X!2yz8z*tr5(vMGilA0*U^0#-Kr9N}! z42ogx%a@pB+Orp;CO|k`?btP&4~wo}Pk&3*ms7P{rmyN8A7m$jjMC9|eS|XC--j5| z`IkFIp&lwmJ(NqYFP-ZMaKmmJfB$F$T>OD=-&i0zVIawBU_{TtT$&Sz$cMq*4(i+> zq*PQ+Cs@HcEl2l}2tNF9aWOF}W?tD4kg*@1YS@tC%gCy_h`2j(s@&Q|W%obS!z-N; zfQLacF(gQV@PJ*p4)t)C zl7JCKDR2*3M5+LIhH%1~A{e=*#ycd?!X!3qFdUCAeC$1J0L)K|(!aP(H#-7m3em^0 zFT~+iLazEBNmX>LrC`jVXzv-x4eqks`IG@}(Tn%~U)(41=1m0PiPH$U3+q9QOy5E4 z+vUIqx3{nE=~gJBMTcJs5Lc1>sBF^sTwG{S!@rbdpshtjL=3#Rws~rLIuxP75`JQ~ zqZ`rg-SgH5)b3gtQV!J^>9GS-|L33V&GKDY4qSxTIgcb3_&_WI8|kQ53PRR|hJDA* zM%IRNtH(P^U?31Wdos&4%uHf>1cC~M0{c+{{h6dVk+`4`gWv1asqh;&1n;tND2rmx zasg-)+A#O+eS_Mbww>6w1OO7Vu0Dbh37SqBP3?2<_tbJfgPl$Slkp;&_9#1&N8sxd zqwwj|ZIl5VMFL*{Os1c0NK1!$ji1v%q7SfHO5D4Q2O9Mf_?RhqPya8?@$&ZOP~Drw zwPpCohfY8wg-y%y17KsuWuM=C^ly%4=7(V(VS9+Csbs2xeO z5wnRjOw~=v`w-Hb-4whWKqf5yS=dLpajuI`e9}PpLkDIb_FvT9yGL&Ewn+bEz$ozM z>AF=SweR2W$J%CxynXw20FiAJCQ@-=t)QOj5`0u}kQs-na<=;b$yCs@@TX555ayB+ z!1q0J;E6{aoEi>ZUV73dhc`aP#P1>~4$1!$s)mz*@fO7Q@8sl2jmVS0z8VpyNd61! zn-YOG4MsmOI7mf_PD&!ZoB%SC3FzoBvt{=Z79isb>8es`w>f!vn=77lH{c5wBd|jl z;fbnQUUE3mZh9*EfHjHT1O~IoNJmUpt@#e@x z<7`Dp==r@BXV{3;fRQi+n^s{hZ-FBcZ=8RJA6%;OP=xRnk@(y6sbDkA-$AAj;*mi% z0$Arm7)aR}>F)XY;UtoRLDb(7?|^tP{{x>ShXmn}M|FL2x{ADkvK6xE$e7iA{CMN< zlO7$|xMU%*Rm5QwfGbFm(JvTyWwX~(Q}38o9EymF8iK0UjN#PCL>;|7Mr4rt_gXRt zjmcrJZ|{`I3<=SX;M^;^zukzKC!_G?Ty4BQfg9@Qwt|)p4i8KCaOX^sxnBqjgwP}U zGYyMj7}X{!FK=;GKjM2lpI?=O#1Z$CkV_nOX5sVE*EeDx!iU1RmN3w>zMr28IjZP# z6bj;VNhk%Fov<6o*8ABarDZ`9PX80=ONU<{gXQW1=>o%ajo5_$m?erapdRbVX||14 zR3uPAEDRJZ;wDg2FhrDz3}5HU6Ja<|K<@nN{#*QKCnBM9kj(q|RlSp#ZMOgV|CQ^> zATW9s8IZ>Ou+g49`bg8P7SUkYu;DIWV!n-DS4n!_p25qvZx^tehd{VTPW)HfU%jGq zN%4&RwzlMi6B`de)y&2w8X+l_=Hie4Cks#uP(@Y^i-f?Gq`53*{BmYyrXog*K}mE5 zpQKoD!}+)X%<{GIa*Som_6 z=uf+P)ZTs`N{giC_!o^L(}j5aCMekPgdHFO2h8`b)LQ}}RQzy@6Zqjd_W}y6r<#dNr!t;WsxZ{Kyzo^4eMMj8;=uji&P#+79h!V!lCQ(7!xV&%&7_viI|D{FDn&BW(HxCt^$xIqmhW4YhzO) z!EZlik|kr`*nN6Acn?DvjVW?9Wa0{CEfYPlQ2jRFj9&H&G5~L)@rM?Cjp*-0N4;;Y zu$MzT5|CGV`uFeiH8q+ZjP#il%m#&!jN(H|iFb}@3^)^+Xh;i3Zz&D@ms9|FBMN=h50$X#g~*fx3QTQB2L@xMY+(IhF(iLg z+doc!JaqGS&%wnS52lOkbXt%y2#$h}Lq-*pgB%X>{yr(Dh;%Ksi3_YK!u!do2tb)d ze77ELZhC&&C1co(3m*Fv(rl!(A)56sjC52HP~u(183ml;>Gwy{1`+Af!Z0Qo^~DfX zTS;MT+P5nX@2u^55BNHH`KnPYmlhsUi(%M6n>hrH5Y~KMPtQ{WiFFEp4_XA~m!BHZ zaTMQYfT?1#SwNzS0{@;SD41k+FuNCz_Cg+}kvcs_Moumgt|G+!XzXs&aTQh_S>9oi z=7IW1R6&FZ2C$p2DmqcWeLM10$*Rd@RwgKa;b?HvnDmbz^V#W#8c?^=F@5m#SFSsN z95^T$6?Pc@ZSfo1`NQ+u8^re=UP-D_OS-@P?+RtvUHkr=<$F#!TlzJ}PDe%6DKcz+ z@=TRwjTB=>vA#S1Lj|P>kM}L_IHj^Bxpn{MSv+03{Ym6kmx9G{-^r!k1CwLJ9pOKg zdQaJp4)?$QbMyPx!kT78d)aw-=zvqnG%=*w22l92L<0d1cgmKNSm=#XQlTIYJ!X3H z@Ru;q8-Xu~)Gr~JWRd{bcSQAiJ7!_E4jibkYVevEhCW9?B8l1+zcpkKV~vE^2ODT= zqDzK^a!^Q#qCrM^%HM12B??dy-l2AR0dA1Q0!FunRTEn){b!lLW5O}vM@EIfp3wVo z$3^N_x3oV#47)wgS4N+jH$nL$iX&7Gva6i$U1HY}5WryS?%O-okg48Bk2VuZfL=jN z{=vPxs@pb_W)oW|NI;UL=J=Q-Q%r?H%<+_VF(Qx)Gv;NR(pD`yxH@RR;<-D zZDJ8G$L-CXgy@S)n$7%o_S}dfBS`Qw#S4@0LscQx5~UQ%ISGQ1dqTi>T<}G)goCPU zk2>a3wKJd+kvNfx|I9|n0WH2l8P4&8STKGSFHzzm%zSyX3ggd^q1fGAq>uhym_1g! zg@OW)iEawgs>wb23}Oi{NstXEbr^qDIX5Q@zi)7C%#f8ze9K#k8<|fg&=(s#19--+ zh2uK(I3bMyeh|-k%s`Rwai!lhHBq%MUgYeVZu|_$0?L(d^cCc{5tl4@p~=&$`^2;B zl;Rj}L%>u3gk>HZyd5eNvScZr87}x|(Q8TUv$rSbe*i-e_q$@{ER!y2KrqHTd zCqyII_dNzL9>gvn6bQPllE*tmXfmgSbAk71}HrTtBlfAuf(6ZTC{M~OJQa{Pq&dtq1eIQed(1mmwOr>`k8HFS#a~yJwT=}%n zb>EtFX@I!(kH^@>BDP54!WM{1I{5V@D~xZA3m3SstLzLV_Js&gSnV)RcxU&uFl^*F z-!nE&j`3n3n^0;Rkh>*ppPVb4>vmKn)!U6{XD2QjMXjWyq&TAb6CeViFw$N_EaF1B zIi%T&3N_@gkPBmm1dY*!NPL_6XQzZiqW3~)HAobSA+ilB$!FEXS|||SBdr`{I23OR zV{Ub@B=k=nsSxAn;!H<|1~*WIk__wf^%3miLiF_X#4sRpRd6cE94OLlm=7FQ6-d_d z(eKj2Ft{T&4j~QDCUICo$!!~81|%wmdk~PQh{E}ELUZ$(R-l+|p+M3j@$GNDW#+k~ zoH`5~32Ao#FYK{#!3Pga~Y+c2nb;f^ILF+{ttSr$y2Ue{UULIsbL&Tn^hMJfW z;4_<8FSSd+X)pC0l2SPSu%0)j{A3V|@IpL(Exs!G0K@?5#AwG9o=e^p5*Ag(Y7Di()4h-;f#3UuKgQPHSN+2GIwt_BWRn$n* z4{u?0yQK|H?eH`qSubvEW5ZCwfa>ay6)Q1SWFfa6?`43n2jw&L_1GI>R}PM5T1S+0 z92+PZStmYK*E1S0i0KWHZiU$g;z***gaVefkDZdxWu-{9@HYU#l3EBFbM>nV84Cu) zgJepg03?V@$Sj3n@iUGOP4m@_F2?E_X-OEYsKq5R_)Mc+yJ*s0w;-V9c<2zVx_Xsu z;Zh~^Rn#1#rZzLwlZh5+{qShW6-sDb-ctkGP}t&e0C(q7iH=(3+eVg@Y{4)`@*5!{ za$@cTPe5K3WDKhZpBwlu&8sm3Y5L7ii9wYN!v-ax24HiV(=Bre&I#ZmKy&edBJECQT@pn5H0bKoV+&HPa7L^o`(9{u_h6L^@iCNn-1 zb|@Ukk0ZvO{-K9mhvBFVJT^pS&SLzL>r=olRx)Pf`do1H^gI03tS2(Ox4b%B{5B_Ig* zG5edyH6pviv2g1$@r;Oh1u1hrK*MjxTKo@zv?9m>0tzF2y}hOu7PL@dOUuihA;}?R z3GFe%bTdj$vIhm-A{=BWUsJS%3dcFlxGy%I0Nfhd9<6DL;|CVDsSqa>oJ_Mvv5gz5|krBz60BpeQ=lGHP(fw?koyB|11cab`kq`Eb zXL?Jyz=^8?c=$Y!k9Wr3eS_}7doB@7W-CtMVGoZNTTk@Az)IxpD7X{n@4c0R;p%HB za+|kqJ&bSQ3Ukw0!J(Sl_K(QapMW`lnMX)DK0?JTMu4*j%&Z&9j`b1}4LIcQvGpQs zNmkU{)O3D)$YJNsn0))H^5!1T-qPu;9*oFt##qp4%z0&eCY2$ONT*;|xg4U0E_PEc zIK>}6U|f!fKXKxqn^2YyG=IhPLOu8=nNmw-0Y4>|!r^9~Da>3tVd6)5wc3IYgURUR zG5>!v8 zi|Bk{`Ut?=8B%EphVG<8mY-g~k)335JG7UKKxb1)yH3O7#2w0J*M~7UG1-Dt;ekbFB zl17-TtgNgeBwLaY04^qK9VWV^W)^6tVJHwC7MK5tsJ|MXCOs7b98-P)%7rd&L8PEY zori_e?YD^jsquH4g_V^7?vo*$67EcUUoam2DpWV(;h@a4clNTfD^nzUQFbgxBOk@a zG7(J?Q!P5k!fo^=XavL;36lnde2DLdt3N87@3nq#Tsg4t=%?51w%{PYg7QHPWo2G| z7Xn`4Y&pTO=2NgA!0;Eb$ABy&=l&Tl@oO+`M+U4=D{#Y0mgy!A)L8z?%F1-a4Uon!$YK}EIuOWt9D!>d zmzB^J`9&NFk^~AsxKZa`c+0R89v^kp0J=4q4FtjOs_1Rwn@h7F>G9c?Q9cHuMZ{bp zJYp~cI5VuKrsmyeZ3Z382SBJ&30&BMtI|SnkYEMTf@blwz^Q~nPUgM}&jjLkk(!Es zfaGO1T#Ph1Npgg&{8$ha5cuEaiv?#^W93=N&6UKT$L`AliX&MdV6zLRG+NPEk|~&` z#DIq~3|WD6OBWVQF`*CPR8a%5kl+{YdBgQAv}mV5T(d_;Nlp=uNm;Ha^7v391z|o8 zR}L|5*)0M1fKigJ{yo7f%jzVFi=hD|q}UK?yU5n;)l zS5qu*n%4$5G#+ww9faPEVhoijYiJjOrqH7?-?8p^e`O480T4weWU&YezrN+Dc=sn( zu?UKmu`$zajlfuJB2j=;jJ&ksA}Qc&EE4J7pq*~Vj_Eo$h~UFW{0Ua#-KxrjWb9u6 zq9`0J2_*cGov||%*U`F9>C(kBk&X!hOl~y6)d5i;*{GHTiQv%?>eSNL&l%GB3Q&cM zA#}j8aW~A==a-~v(E>b>i$DE;|44v7l>wwkL=OBYdSp>ZU>>oy0`IURt|$5{wUOu{ zVmp~X7g2|eO{y1(yU$MzB5f{3uHu^cWD-a`F)TX5Gf{ZEa5+gnGp78b!vWlqLWmRO zVKQS!q0CKwNo;|E+Sq8{XD1vB~i}GB;KMvvB z62jACmVGfhpIVPK#8w)^6G%>y;R(W$;jWOV6uAY}-Q9NVBr_9}7v=_faW4|sHxJ)& zIG=hr0{QaoX}GZuISC02+>sl$&|Rr0*!l!ELDNx076`U3Ew+U3D_IXLBH6lR?GP3Q zaHU5COZ$ra!O}#l6Sy&hTyzP!ISTul+`544G)YVf*B~GYCgUIGuEzMZq+}-U%+Kd- zZAD=8WUd3%m<;A2uR@?PE)V6~x^*k@sEHQLWwvE#_JA;3iNv@c>6<2{8U5Jc+6ej)W50n$!F z#Uv_93`M|i;}^o0P>sQD>EK3}2K?DXsy^=abVSw>bMk9?rYA-lrqamp4|W1k=`gg^ zj(a`Od2^g+*B0QiF4Dfpls#EQjPYc`mm(TJT+Ve$V@zUts${y8Bw}zQ2`*=iC-@T4 ze(`(v0a?jaxOkOB4J3W(z>@*ZD7KCq|n&%Fa8>&ER^08-|~&+ntRoA2A_jF`Br zn%aT*XZLX=n{afS3BQKVbS*rb<|8y!yyqcR+bXoYBAhzKRjXFr$;xVguH1+pkk_ZQ zpA%pDA>hDfM4JygI@UslyFYCvCy+>ni zLcsSuay~ZN+I5Dn9jg2<1GQS%&08&!~$q*_@4X(ixIJf;7%-K6eL!-#O)9EZ=V12hg=GZ%?#$4 zvM_y}$nr275M#n7ia<>q!U+JtNO{ZVM7{jc&I6-pB)*0&!-P?IpRe5{p-GIvo@pcX zBICa&EtbWzx1zjtV2}X;H&F;GkY3#PfrBoB#Ik^x3+lQdz3L{wdxQMvEukT=<^$~Xu=@Zq~eFg!R!ZLX*Ll3Sn^uQ-3=gk=4^*Cs>%xVxq_@vSK0y_wL5{m>=GST&A{9X&-6cu`{uf&vAK)I*H^ zA!UR#l7oCG4E` z2t>SmDy)SNQ;oR08|we9KzDUwqH1@9fuO8`J9e~?Tq^{3W@OM_aU?2Rnez_jh4xAC0Zj6 zSy8ne-x#P(q+%TVNHReH!!9ZRa%o;_=x=U7PE%t)n)hG0Rv*v+yOUt>2#TyF593}z z!89DYs>3sPA+!6pkH1;jmmgjZ69(|G-hu(V<>#kx)_1bB9M`Gx!iwKJJ9``rmcs+d z)KL)5W7sZ_!r>EY0glfZt~N`d3k{WKkPGU^CtX(R|1yTer*YXU}5ZR8-tM zeRrsJbq$+$b9ha^=QaCw9;sP%E-n3o-}s5cr|DeV937pBuJ}6l|7GRoaUMAST5>A` zfR3i0W^cdW-6NNq|ZN~Q@>$^Jcb79FgU*N^?I6` zkwv{jC{?QsVIms6+ zTv+YZDlaQ*wa57J$B?;&nkBg+ew#|x%4F8-w%nRQ8ww6Kf3IA!+vM5G#FX@2cA?)t z{RrqqLdeM(w~f-`@~>f#-p=+cv@i(fsymRJ{K%x)Ic*I`KZQf3`DCMwYx&j1@Y1As z{j((pcsmnZj`Hv_l;~PW=9Pn`8QnWIcao?%_=D6tv>nO)=LiExN)@&6!`C6z znzkq?sm|#ayP%A}#)8sVpS7>|`Zi`x8!)>LM6Sb?!5i7lfmgzjjas?HGCaTgvFL~Y zuLVHgAQANQC^ORHA}u4!)ddQ{MqG!Lzx>k!?$t6nGNJqELaOo>fcdNeq@e1z({p>y zyV1c&BedVHF0C>Quu<%XouIeZ5(7Xw!K?1J{Tq2EEnB;*V#p@i?lc`XV)q*(lEwRqyI z3HI>JF;SX)Q_nb#{$D_clR6*LO-vh46GY|tHrMjZ}RMrQUyr0_$w;$HO zf8O;kIG>i5+z$M(AwOB-T`Q^=C~7K0M1%nxgO^ut;5IfQBb`BC@x1Xtx_ z*g#?MMPK4s1?ijzs8;>;-blTFOrKp`xslCT0-I7EUe?T$QmKLStY9}L+<3Jl%GF*;ME$*jH1gUPbU6O?kw)A z6m3Jpo63eR8eX#%u9e2_k?)`8<^;48FrU-^#Kf43)aL9j(U*eJkrVm%oX34=OXJ79 zaNY93=}F<1jmg#9_a3T=77USlrX8njr60irk_?O?Q1N~4lHNo&ADL76`^^v2*B@e& zzLX*QQjXg(nUBZBhAUjp^@=a<8vs(8RCPFJWX*;FzfYx=KTgP9Tj17VWx=b}&f8x- z)4((0&M85dqRWS)p|A57wkmacb!qLFw4}1+vysV89(G@06@-)u>QV|cRU3z&`hMiI z+ezu)o8Mpd^6}P^7DOzPD3nLEsT%Xo3eEX*T&>eS z$AB@ySUc|iERTl+<+41+e*Mla)%u+{VvzAm(j3>xF~EEGv^Nb72s&_}4fu;RyCM+4 zmQT+WOi96)Q7C}pmFbBt<4b+(5ZPfsbxD`M+r8ZHDuuzvKfjlyc}I@Z{V`%}%zMip zZx$37jxYFP+$E`n_jVK=blBy)lF={9E){C%=!9V%U+FdH+LrkXlnq2R)3K>bBMB%K zoEs;H{RQGNOi=!v)#)b`A;+XonrzH17iRafp z+yG`)R=XEzq#fj_kW9&1_`vjp$^Fzh$!8}g-}JKvtVpbi-i@%>hW|UC`(4+6Qb79- z9ZE$AzJ7f$u_|I&hqpKWMDJs!?20`DvQDr4wd#?9jn0Kf&4d zS;6V_EAu3UJ%sv6^rK*io;jw$uBL>{gO$2jS4|mw9D=Eg0z@?X zX6$cgZBN7U`n;niO3j&?kxg~|)NHony>t7}x+{>>B>z)`HeY_I$pv;vV&$p9!_Reb zq|FEi1Lx*#r0gP5RVQ|ibZ%MNr}^nQQ;{`fU^Qt|q+@moQRe7rBM(BDgBv_J(rWt6 zooo05eS3q-(u+rPwN(6{{EgT9z}XsGR#idA+}`7KD-VtNx4=X+an#-S&yHx-DlWYB zz`>553sl*3d3cng3R}%NF`@lb5D_Rj&-3MPDQv0OD%?W;&i{5U(RaT|mzVL?=husBwyTrc zxO>5q2aa7WdILG|`Qil~N27S~2NYbo#k8IO;{q%?gZVFmCvI$)zi>tV%f|`@_@anO zp<9%>K{8k|CctBt z*k=vCNCZ*;rC$?9Tpw0w7kPe|oyEe>>_1*+^G8O#gB=W_dMi3SJM(*C>X)Q0-!B}$ zdwuQ2?pMS_BhV6sq4HLh3_*eUP_9`1Vph-D)6J+oTLEW7illxi@9mlJzFPbFwOe{)qDT-S7H(k8bAsOa0L-5Gv6s zzgxYiHePR3zArqsZ=~^|_eYX?wM(k50_7H=7`6Y~<~g5}lajocWDxU2$H;PFJE%c; zP?rxeBO^~7PadB$LEmrkuV25iu3bxFXSnrHNptT!Nbk3aQ8F~|YzO_J6 zUfK2Kdr&Wnevx-0n3nVJP?xTx8q3AR3LO5Yb$k$VjV2Vb?N3~vapm%5na3gafzuJT zng^$DkH2Y@B3GEmt=W2#CQmaVK|oLsWXb|v#pf0Rb%^tsO(0W{$Y&PB)#Bixe(W-g z+F^1Z9NaP#icC@eepITrdBTNCs<5X{7nwqL>yl2)1YR)2rjYM!%6lm`Gdz zZ4t+$m1*1BfiyROZ_w1#EDktRQbbacW?nm z2w)&8YpHTP?V}7B1|rx6D|IcBAISoGw!F%aRXz5_$Gt3ADrcmQt-w1ZH3c*f_x`nk zORq&^D597ZNiGLl+`5&v1}c<#@CH*j$8}GsdMJf=A$+cnrRCl10j4u2YX#==*$6yS zK z0quoIGHBMvo;YuZuLR^JWoA17Cb6Mn1x#Ml{AS2{ixAPYk!BxYZ46-|k<+Im25ai5 z@gqbEhu9(q)^5#(9tnr{A3PX`*joA}WE-a=28G(qJggNsa`|b8(Qa;QcoyP~V#Nt0 z3{g3dgUS>Jj1pF|x`bX~2j28APkQnEdGT7~6&cj_vRJ_><{2gq1Q4H{?dt+Sz;X#n zPqzefB}!-m%P5xMsr44(eL_x_4Q5)a0qZkwuXB$&`rbkc(PR}@RIK|?n=)$5n3t9Y zrgrOh_L?0|@hTgRcGX5`ksHZr`$T8EQC4Ony$TWI&PhG`!j);DXKboM#{Z;x2 zho%=!gtv6T68q)l&~7`$+hLfSZoI}ZKoH7Z>e)}9?opWxq&tmM%A3nc^?Vm|^WeUH z`W!}RahSyKqbwSowt5#SQcrs4G`f#o<37UNMd*9dTItxDD`IZXppBTuGJ8u`xBm94 z1%_c3SM)dLc!RIapcs2gIpdk*bB8NDdr$u*naYM?uU@~tO1p77!g*ibR|SS}$t4l6 zD?B{6`NmVojF96}f=r$=C5YnDwO@Zb!Sp0YOWG}}*=#t6JMoT9Zhh`y2e3bRz4%;F zq=#p;OsagHCwRC$u+GGbD>eYmda;s3;>I$v+cj>X@cLV~&PJ)kDR-D}1r6DfE9Qlz zk*S?3`4JMBBtvi5$$3;gBVOeJ2T0ro@{Yw{UTRTXSRe$u^;z32(O|e5=E1o8hcGe= z2wbZweX7}O9Z+X zY6n8WLki*mTy;H4K~I_00ao71M~nsX~_j9}I-vr#2sDS;D~lIV5OiH0^-Tqv1#?Bo+7D(!@Jv{ep|2a% zl}vn|EQhEK*q4yaqIP@wbYenf%t*FCEY;?9W-mKRGF|fXi!%86$emH8FS!Pv9yV;`FKQ! zl4uJC3ttyU^&w!S4EFKyAq~YX=sH<{_Lu=B5R*)^QYq4V_8g2NktJ8x=%i!tIs?V3 zed;!97UXq`3kxBiJXY>g0Zj=HnL2&Cc*_wA1mb%Ve>6uS1-oQ(p$ikU2tY4KH^nb$ zN`BsdI!NM{oTxhPw?LkIC`Cte5$1HGa8Q-_e1b1fufNOs}cDMR@Qk=wS} zqh0}Ok3!X?DE_qge~c{`J3buZ-|A55O4kTcBfKg=YGnr<+smbJrZTA`$t_vd0uh!b zycCMhHTc+NMh};=*k8GB>F3lp<_rSDg2Rx(dORhf2x0+BMXkpnw>K#%9Cd;%TrgFA z$#n)IM-m$6&+kTaC^-WN^uuJ-N|Db@3 z=wTh@>I3{qlbu8CV23U*j~zQE{#qW59N`ei6r;1U4SPV}hq8zj9jjVpgz2Ysd#ji|PHfC1Q4|-f85eEX|1K!DWq^Kz86ThBNeq17*fJ^K| zc~INTfm(`7kR5whlr=DrG+9B=c~B{Ye18A%9;4N4TAxSZIh0gl_y*1m@7N*A<j`v-*7XhIQRCgA8Pbg0xE6#60iP+zR$2B(9s@qdhXEWOmR!a{e zzz#Ii@Apy&6z>i1Z7=3fnR|vEq_S#{Inx^sJz$c1dyr@f4b|k+yH5bOM zGEg|LM5^{7S_+ll;!TCWKwdN9VBzS-iXYJkg`}0io;0cdNs7rUrnbS_nI~Aa+&`jm z^hzAb*$8gik4M<%q}ElkDX}QMnk;(~?9jkhksoLg0)#4g<0NY& zjP=M@v+*tEhjWHEczhLUQSyVP2-nT8QT2NFOBC_x?*5Byzq?+JA2o$hV0c#5FgI2 zu9rR3ZOvQsR3tGiP$(6o$4!nNt*q%ubeK#E(Y)p`C{sU6GD}{(a7*ral=^1y_Hg8# zFM*tEgLiN4%=T$SQzmL(p3|!y8m7_V28seHd?i`~Bh$Xk2a(ky0!nW=(0YFLcYmHo z8JQx9m40W=okgqa<^ijNce1n2x~9mf#6Agw2BKwGiuSxdFPYr4q{5^DZh80a4O+T1 zebjaHyU@W6adf2IGkC~1HhbcRdBV2>j$THFp)EqOuUmHZ@$-{s)`z-n+^IPmI4TN%o}dgibFkAiRgOj)%rOG`=omX^gw#IV3J3Ip zG=HFEwiYc682LVKHQTP^(Xa6JY`boAh#^~v+-3u?_|ye0CKYwwu5EjH8v9NF9~2d* zBR=bpdnyw)g<=J5&>g&|LJ@6F6-F$Wt*h&1hulI^GXRGia@*X^rZ)pRkpTAcuRl3A z!HDgy)@~$@k&l35Wz@((?OUj;i%UyY=`RsenOP*Ld>jDiBxgNGK1W5HXiJi*=rGzx z9}W8|eWf@hFacU_185E29?Dyt!<7cUH|%`Xb)7A2o>D4u$a0&sS5(&@D(|eu=h^6*!&bBsx@>M8AW~5iWv8wqn9o@MmpZ9b1PdozcvR&l!Td z(AoDZd8X2UNLLSHSLm-<;u-frW%7Cvtb?xGa0c3q+XlOQQ)T9JNtuC3=d*`Yw8K=< z7165%QIk`isoX3OsV(|N|8H+S57_*6=-1ez)Q_RhMQRa{hlm zW4(o}3|bW1N!`Y~QYo!Paxl+uwRYH@gqE`A$$t=K^VDgBYm)bF$S^ns%wWhBD)%i9 z!8Cp%j`K_USs1Z0lud)QP$NtF5isEyy6aa4m48V`H!Q~5kl)QY=j60*DgGZc6Cxa^ zR48K&1?M{<4`!3&d>I&4^tHkXgze77l`F;f57qdJK4q8haVrJY(iNU;w&h#F+?}wleww zyZ`_HKml8DXwke~o_Go$3AJeU#I7Z`QW)xnoG7TCI+jW_wp^)(9)bhIJS%)D=Eo zX=(O?De%nK0NWq@cPlZ5dD?r2WD>0k;}p4V?!s2@&>w1gHzYL9{o)EM#CD(a7M$=< zcXf3Nx$ip1?e>nHJIx6H;|MjoHYn6)>Qw7Ly3ZGz`u5NY6mJr3jW~Sz+#IMCc%=l0 z>*|dgO&^ZC*JIyyZL=;2fM^BlV~)9|Y`Ra<3^`rzjGf-fZgRJ73UA|;%a;aC`ms!> z$DWqisn?LC(GN{D+uAwK)JDtLyCIA?kw>Xl7j56VWy}62o$8sI)A-hx zq+3-EP(>!iwI1};f3I2T%pW$p|< zoKA}t*OU#-?0C77lttzX?efmva~nzDoQ_%WI=w6TW%-kPTOg*k1OKC926r@QHSkJR zgU^eVb^2cz*h@i&B49$;`Ku_1wGbVhju;p`6JP~VKyNzp>@hQ#tMQ=REVxG_5J>lP zi!EeoPT#&~EVnpsD;cn*ZS|NggCZR>PE_JR8W+5JUUJejE5G#bht9>09R6(OxJ6nU zg47=>#39Va)xdJfeRd7`E=^{srMgZuXOK55MP`>hDBm3K_%1jy#GB(8msVz^>7dIK z|8Z;nJ$Ad3NQ1FfHaPET>-)m#)uI=#23Vau`E2aIOFe5>Bt`7_;xH%Azk98+PLKV6 zEkG{@b*g?3xNx;sxEY;s*=ksab(Im(I1Ogk8KS9^1pF#ObVzPbd!0nmtEm?KxrRpc zJe_={8-I@(FFx(>s8iobtd|sb+2am@z}-|a3Dzv2T#~T~AUE?32ghT@ z7u-3`TRSsRy+DmL{`HVs)ud2(+W#=)e>sP)Wvl6?`4V6g7Z+z!F}1-a3|o~7ZQI~B zME782$)rL)9bq;f%2tALYLCg)J_?Y9DHw-2^0$Of>B+$~7>_l;OqQ~#i#>l=U=r?q zE&{H0YMsjyyPC#NVJvtHNoxc=Ns9~hB%3Q$VP{}sHk*UbJ^ZfVE(5`zBsQ+r*OZjliad~4Kq|1xm zJ_w>vTwu6=j7*UrDGrj>QZ5d720G71x4PZYHnDYBj)cz(NhfBWnwd?~Le_`WXn!_N z{GcKXIRbqZWWR`M!nv|?uU~&-HlluK0=A$}Uo1@Y@a1il`>|UH#GmE5&KaZCD78Rs zhb4_Oc(0OEee22;x@E(l*|TQx)#@~54hR5%usOS4?p0Tq##>9H4LcmB)L7t1k?Gh` zp`+TKU(bdiHo*MErX_rSr;aL)E&dnAA`)ON%=<-QKEqnTN?aQmk_h9+Ra2TXItPDf!#Low~ zJW><6gk*_hR?6sJRj}y zP$AZSHl4(+`5W$^C>00A1OG(Rgm#OQ(fi7JD)71-sv!F8729|cJ~Sc7EZ{`b;^wUy zQ~O~!K2VKI;LegIiH4WzD5NIb&3}b8y$1Sf?cto*H&~|v{lzOt=(QffoLhT~MjRH9~1>WK`dSw}Y2e~iF zJsYp-M_Um6x@h{OsTx22-!>{uY^}c_%tLajsvzq*iY!ja%X#|rg7dQ;4vvod zj1;zi>`PlJC~oMQC4BfygjqK{0~F{lEY*L+$PKb=ncNfX6P?a#Lp2j~k=qPd)(P}d z`UaXI!Py6Pc)veBepF+HX-%t7T7lpk09=5Z)Z z;DDE0|=H~7);ZU ztdDtEIn&|-04bW$rPaP`tTpXpQonF-t>Syaq8Li@Lc11KAdIc&JI=5@ZIWlD5Gn$N zNz1QKRu*4WSIky#(}HV1m~(Szwr>kOHOQo1TB@7ct-?+p=eVhj-ZLI*7T^r`mT!LZ z8b##Jo%N~HSfpk;=II)f*@xnADYUS=h0m}_}U#CezgUIuUNfQMYYQL z5pk6?`rbIzTzU?1MOuh2R?a+y0zyvw$%J#s1RZoLp7zoDfTS*!e@2A1bDX6%nU0>+ zfHKPvcdBN|3l-u*A`K(%wQEhbE+%)E!X_~58)2K6e?E`y#6^Qu0-!I}5LCe+b{YEk zZf@D<=#jt0W10z`ne9D%XAe^6>f;OoUQp*C6`Dpd4-({O|HOE{4L{;eUYthiXn+B0U&%WC>T$BUs6(iz))Ba*UhcFcCB%4JjrdtYDhnXjQiM%5XY>M z)o{SboyaV#%ZB7c8_4tI_7~Cz?ds&2Ged#!2J#GNU2K^KqK}kwoow-jVY3t>szP;i z^r)_ty+;D%0Ye@n>oF~^hb0Vzq*+ig-9mSZP%jfWjPuYT4qSf~p~4vHOE|RkR<6fE|LC9^v+s}x2IT8UO{a=FuAwm9;^3)P%r05{skE+GC6rB%96fO& zn@aCYL|!|Rlj?($*s@PJrTkzG-O_#x*VJirMPKYO#Oc6nkPKmlb`kbY?kw>q?;E5c z{+0s=4#<<6QSlZX)R-Hs{ODgOFzXt8nTXkqas{Q0t{9zx4WyRgIS?#N5=yiGLJa^r z;^*sYQN>-&F;7#GAiYi=N8|HmyL$Qgt*b44;_}FPOZ75e3OLi2K=rp+^}>@D$8siS!1N`*=2i!Aq=Kw0PYgg zI}9!5U8f(9MT}N_4V@^rI)Re-27%2j7e6Gi8TGW;8&7clF~KxzO(zKQH=~`Qw<1+}7r8Z~xF8)TgTN?Zu&dlfMS6 z*u?@ui9TAzCRCq*gpXK3iospQWlt!lR4l?TvQ|>cKJEN39vR9^QL|?Pg>xJ6DZ)-% z0=SbP6`Iw3*mL^4yU5WkS`7C7xl8{#pZxIbVh$?hBb3YcowpxhRug&y_netMxR9Z0 zOz+h_$mK5wE`&N~%(-n`dIE63QOhkY{5@!+@LK{9qKr1IUbm0G@EwHa6Lnq*CA2&J zgh)07T>qbl?Jqv~_UXeIYD}i|y@tUb>&>knC^`f_Y-I9^EtP}I6!EW+i4F+}IOmxX z`S8N>WpEOQsX*ph!BX&7`!Z!WoE}WhLrh#!f-@%QmgOE#AH;7^D4)oKDdx9t$H0rC zR*f458LCOER;wMmbWmvi(C=D5P(u1CIoO(BhHKh)P{hvwtHmL=b={?xPzQSxZR+WW zw@NZ$sKZOhy`U=1z|E7s%E1wySQN#O?`m>)ql1w71#;MOin!eTOf(O_C~;Nux*3SP zNQQjydTjT1BwkRKF!VUfGTgHPoG-$8F)>-zZ!2A+#ox9`fJK)jf@aZMck%;DB`%b# zk;gZDx`ME+KgQnEZ znH@&i{^|Ulejc{UMcg@3GSVS<J6(z`5m?dRh;CE&QS-{0w$Df3Xb^}(qZB2| zWW&|HMIy=ZaNpv&3%uluhbzI}?)&!{G&)FERZhfoFfttdN0!}qz(tbfz3$L7Bp zIr~xmt243RJPLc2|NPQB7!rxDbZsp{d|+7AgV+$RA=u?JdVg_jbE{iURT)WpUf;ueQ@DI(y2+?dfC0$W~YOOECQCV z1Q~bPx!L8a=B@QKY6|LgR86uTvVHQR=esEd;K{t{Pg2Z2ZbgJ6dzsgeEB<_jp7F+5 zV121gq;~-$2K$W{lesWt0t$RuUa;_vXXWJc)*3aX+HU%qt$fe^JZ{=qbcrigSj$VB zy{*2&C~@)addoi4tLSE)($Tq~*WzzRTU+0#Upt440G}S6w`t>d%GU}VB>68OS%hAB z*hg&#Lon;oC4$x~{yhgB$I?!_D(Au#AM`W|?rtwSdQ$Cs`qY=+Ix?d0ufFqx@AXPl z6i0tSdS9Gi75DsKNAAOTooU8 zCsg@Xc2vaH*L0aXZ0o@D82_P(5RY8)syb)iUBzFxJ2>SGmb<%sR05)wJ9>({uenqi z$)=z|bZOx<=8=jrJLvpjwE)KndI|561}zU)_;{X47>;-VG^CH;A@)BDBma@jm`}x4 z?GJ7DRFSAbavn0g3cFGDw4@kcXp<8}apMik@cQZbeiiL>r_GwRo__v57itH(YwDVh zUY{-}Y23MMoqQ|%&-eMQivfKkYJJALJhREcnr$mp=`9*d~_(!f4weWuBi8c#+4=R?h(k>$TqFEq26FkM}D|AB`q%9oD0(B)CV zv|$P--~fpnf>z4%__s&hgr;FT-`VHCwW;jfXUV9&xlIzAD?}N^NtAcI{idh(-QrLh zxhi_xp&hj##s?JtNQ9X`nJJ=L)4`-bL@~r16Rxaz3Rx3NsiEZ>Jx$*bZ zKXWTj2G1UOxlKXbM@;#wsXE-1cORz?BlBBAM?G>PJ@__~@zOP2-C;GIXhSV6QQBkQ zI|j+;DiVeNOqre&CiL|?b+UV@(!ujGvcgLzr9Y~%kG6#R_zE=Uu6BUss zi=K9MGd^@-_VSBuy*8EW1(JBAMqMgtHt}c1@5raU=bmIb)W6E6JC2ha48VWFx$-yF zR5qK~Bge$9Tre)Aav}ngi2jN`@kWRq!VEBrW6ah*-b~^1 zR`SfK_nGwFj5?FGr-4g>JETC!C=}Mht;swE5b&_!Wkc&KOfwx*6+%7B%(=uH1)aK* zw;`EDtkhhjh4aeu+Y8O8Y???q%zo9t9!u#xvqZOptBa~Pg9sD6$(JB(-0l6of`ETy zxT5G-DB%}Zf43k^$?V8)a6uu1P?+dG(l9+bw1a&afkL9*6(y+8+YxgZKO!1H&d8Lw ztLsrfmvY?7e1(d3E;GEmY$pV2{y4nio9&2W!P)bY z+&a=qXA$crv(8?xp!eB(@SuHLqk1~F9WLr2Pm|eXGN(y?wfJA?AQqGJQ_-%QDX|C) z8^45x%H4iSER~w%H?V8jEFXt(tRbsiS&RinIwN8RESR|=t~`p3l(K87Xr;u2Yen8A zKj99y82plGwCQl7$EjPsH?ixJ*i-?tD&si!AL)3eI|1!%*|o}sJ7kV0{=cAm)1FV; zKo&oBtvh(|KX4QhaxDvCQoyIW=+uR_A+g+uhTo3zs3NpmS56#YpCIh#;Mc3MQ2s?+ zAsxy0pB0DbN;?$v7b6e)I@c=4(3HrV+2B zpz`5!8gy2L1ji2?I8fAmSlRQSreXtvU{rXht+Ff|bzKt@BF!k02rA>g2u!MZ&M6=?3qUqixd>%^F*p_+ST^LhxFGSG zdShLnc*T-c7bZ#awM4Q)M+rnR#W1EjHyOx-9l|?+LlN{5HgP#8CyskU20^S_*8u7G z;z`+O*2){`-i|o?*-V5e!Stam~7`fyD+?Npr$;rW79X-HH(Vsi3}L+$|@U^ z;()=!Z4EXdB9$p9oDnh!SAmpqi3lu!xM}^w63@hT8NtKn+R_`6L!8NgHfYth740od z=hhwM>)QcdTr!hsKqavSfP~GF1yrAh=|hTEeye`3S^8K;8gcmbnBC#if{h z=06_=pupkib&Ebbv#AI=IqUyd$F4z}d1f`+D1a&|CGO)Yz#TAMxf^!=UZouY5t~Vn zATliDCo#Y-boabf!QKSN;24+B#OjxcWZdW?u`4K8Lyraxi`GJgL?3R9ee{07{=CE? zFOF|D$WZZODCq3zN=?Dy7f#GBx=A=n}fM!+!W!m-$K$`R?8D zvQ|mxRc!3+>gXwg9m3eF2&2|wPG}}+qa-CE(|7r?*vIFMy#|JgH&WS3hs3uBSTe=; z1IERt{XTQ)T^2b$qUFa25Dp+Yl{ESumy6qFXwIWg#R{Xn@&P(%{cyfwdzftFHPnd`3rF-a-=c!d*MKrgo5;fTzR ztRxYk(rtOzo5nlKgd+Bh1-CP-NA;%n|4=^Z@1K#X$YWqvLPB5Eth*R1rJC;$F5y-(B2~HziwH-D`^?bcGiQvn+~#h<||r69M5Gm-({Gb@=)E+^3emCNisjb|K1hP?@Z8d zw9;G=NY)Z(nZUQ)CJXU3 zd62$95;WNY`M=jj7Wt1;h?PLnvCe$zDu@O4>fJm6J=kUY)G$h*ux!wSj(BD8q09kcW5O! znWdbe(`zASBB&avVh?QIwk-=P2oxcUbta?D?nn9BsRa$FeQ|~}>IT}FWZ*<0IZZ!p zr@1W}iTV_68_F}fFrEr4Rv`2wpEMhn3F1etw)K}6wf}!DfLV7iFZrhoI1%WRubk4V zAiP%tGoI`jOF8H=o!LEP*44 z%{~xy)KDUQDaetdPCL*sxps*ZjB0LT>zm_I%j%W?Y1Nv&pTp9ll?dk)6#7c|az602 zTes4jCv-Nm`%9*6vKtuu5k$Cz4T3Udyk(qfu{T{H#Gvoy?k{v)jQOZyaC$$$#fwr0 z@{;T9D1DNoH-ISS0j=G4p6WugBS}(H2koZ`X5g_p7|svq?29YQ z^;kcVk&!lI*VRi@8&N-yg0+l~+bwUB%S066wzhOEXy%CQ2>z5 zc-1o8PKqJ=5n+q@gu^i%@>Y%;!MG{m;whTM;m?viKdiE<`IoeKXNTFdy<{#MZLer+ffP%htk_|0ZY63{nLmv(3Dn=btcsP{!jfoP(wR= zMnqZ`$1B8yBR}s1`-_rjzH(7-=6CTGq%ddGwnWs=!N0Sw3Pe zINbkE9?ht5ssgcgiqZzHd|fE>`%&f*^#fP_su^8nT>E3i%O+kY3CK0cmOAi z!Ofc9rdkDiRe3pqKWn<*rv%`xyE?e4k!UaoSVx0F&$nApDoPnB)fAMk7S!l+nK3<1 z^u?r6Zc&;iQZY23?0m7v_jUSSm5kv039IYZ9_B{>4L{>uy^S@* zhCyIeq^0h!nH_0wsWUdb@6^B;;v$aB5D{orwDUT%@Qp5wI_mx_Al@zUqeymX^RmI3 zDuEQjlK4hnaGDXDoTcveUUW(I#ocGPIt=N8A`sTH%slvNh`OEv{Lgc`sg|JbyDXJS z-?a3aT3;xbwyd76W*tfTfEL%=q;mwbz{zNe`(^sQ>Kh`pDqm|Qo0UfGkgkM=kH<*~E%>j&C= z{FM6B&$V({`*SN+R)5kE?(p0&-RwCK5RL~IMmH}lT6S=jh0zhI5zf|X^lk7b5eY|r?L3^ zACvfW{Pz-%zzIhQCc_j4&*^yGJNEMa*jQD7csd}?R3*bdj3=q=z1_ps*L;kMWEisI z8G}CRbs1WoEvJg!C;xPxP^9ziTv1V4>iP7kQFU2y*+ApjbN80MYWD5Ry7Yi?zwi1M ztn^!A$h1s#e)iW7&n7t>i>>)k@x{9IrHmv zE^Y{l$OPNFfB%{RHPuZ(P;5^nzo|NO;Mt4vi-oZ(YJS|x%}sJ{R3~EHy5yRMHZFhu zwbzUZbyM&KGUaow@5~3))~plbIVAP;NO1GdrsFIB?A$Zje`P_AisqBFa_^oe+NKQm zuv*ZARl_6FF}4oSJ`@xlbN1)$NtNAvD_8fOvTaQA)2_B?HmTmo6e${M)TFXz)Uzs` z!Vmj?9>4agYE*Wqf904MK6up-tEa}nuF4m=da`oi5v+t=0y*9HDD3AlmrvUhX0Q2u zq5iMm+v>{Fnm_O`cT~Yjb(8jgZng@Zd%1%G_s<;~jB%%uR}{Ne2Bw~DTv+t})#oga zF#}#F-^t0 z%fT~t#mn*!TFxtH)zcYhqAhv^v4*f1gNYj|s5sMe`J`>HuEt*JqnBV~Vgp0)PqM

-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 - -core_portme.c - CoreMark - - - - - - - -

core_portme.c

Summary
core_portme.c
portable_mallocProvide malloc() functionality in a platform specific way.
portable_freeProvide free() functionality in a platform specific way.
TIMER_RES_DIVIDERDivider to trade off timer resolution and total time that can be measured.
start_timeThis function will be called right before starting the timed portion of the benchmark.
stop_timeThis function will be called right after ending the timed portion of the benchmark.
get_timeReturn an abstract “ticks” number that signifies time on the system.
time_in_secsConvert the value returned by get_time to seconds.
portable_initTarget specific initialization code Test for some common mistakes.
portable_finiTarget specific final code
core_start_parallelStart benchmarking in a parallel context.
core_stop_parallelStop a parallel context execution of coremark, and gather the results.
- -

portable_malloc

void *portable_malloc(size_t size)

Provide malloc() functionality in a platform specific way.

- -

portable_free

void portable_free(void *p)

Provide free() functionality in a platform specific way.

- -

TIMER_RES_DIVIDER

Divider to trade off timer resolution and total time that can be measured.

Use lower values to increase resolution, but make sure that overflow does not occur.  If there are issues with the return value overflowing, increase this value.

- -

start_time

void start_time(void)

This function will be called right before starting the timed portion of the benchmark.

Implementation may be capturing a system timer (as implemented in the example code) or zeroing some system parameters - e.g. setting the cpu clocks cycles to 0.

- -

stop_time

void stop_time(void)

This function will be called right after ending the timed portion of the benchmark.

Implementation may be capturing a system timer (as implemented in the example code) or other system parameters - e.g. reading the current value of cpu cycles counter.

- -

get_time

CORE_TICKS get_time(void)

Return an abstract “ticks” number that signifies time on the system.

Actual value returned may be cpu cycles, milliseconds or any other value, as long as it can be converted to seconds by time_in_secs.  This methodology is taken to accomodate any hardware or simulated platform.  The sample implementation returns millisecs by default, and the resolution is controlled by TIMER_RES_DIVIDER

- -

time_in_secs

secs_ret time_in_secs(CORE_TICKS ticks)

Convert the value returned by get_time to seconds.

The secs_ret type is used to accomodate systems with no support for floating point.  Default implementation implemented by the EE_TICKS_PER_SEC macro above.

- -

portable_init

void portable_init(core_portable *p,
int *argc,
char *argv[])

Target specific initialization code Test for some common mistakes.

- -

portable_fini

void portable_fini(core_portable *p)

Target specific final code

- -

core_start_parallel

Start benchmarking in a parallel context.

Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets.  Other implementations using MCAPI or other standards can easily be devised.

- -

core_stop_parallel

Stop a parallel context execution of coremark, and gather the results.

Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets.  Other implementations using MCAPI or other standards can easily be devised.

- -
- - - - - - - - - - -
void *portable_malloc(size_t size)
Provide malloc() functionality in a platform specific way.
void portable_free(void *p)
Provide free() functionality in a platform specific way.
void start_time(void)
This function will be called right before starting the timed portion of the benchmark.
void stop_time(void)
This function will be called right after ending the timed portion of the benchmark.
CORE_TICKS get_time(void)
Return an abstract “ticks” number that signifies time on the system.
secs_ret time_in_secs(CORE_TICKS ticks)
Convert the value returned by get_time to seconds.
void portable_init(core_portable *p,
int *argc,
char *argv[])
Target specific initialization code Test for some common mistakes.
void portable_fini(core_portable *p)
Target specific final code
Divider to trade off timer resolution and total time that can be measured.
For machines that have floating point support, get number of seconds as a double.
- - - - - - - - \ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/files/linux/core_portme-h.html b/tests/riscv-coremark/coremark/docs/html/files/linux/core_portme-h.html deleted file mode 100644 index 90810f13d..000000000 --- a/tests/riscv-coremark/coremark/docs/html/files/linux/core_portme-h.html +++ /dev/null @@ -1,72 +0,0 @@ - - -core_portme.h - CoreMark - - - - - - - -

core_portme.h

Summary
core_portme.h
DescriptionThis file contains configuration constants required to execute on different platforms
Configuration
HAS_FLOATDefine to 1 if the platform supports floating point.
HAS_TIME_HDefine to 1 if platform has the time.h header file, and implementation of functions thereof.
USE_CLOCKDefine to 1 if platform has the time.h header file, and implementation of functions thereof.
HAS_STDIODefine to 1 if the platform has stdio.h.
HAS_PRINTFDefine to 1 if the platform has stdio.h and implements the printf function.
CORE_TICKSDefine type of return from the timing functions.
SEED_METHODDefines method to get seed values that cannot be computed at compile time.
MEM_METHODDefines method to get a block of memry.
MULTITHREADDefine for parallel execution
USE_PTHREADSample implementation for launching parallel contexts This implementation uses pthread_thread_create and pthread_join.
USE_FORKSample implementation for launching parallel contexts This implementation uses fork, waitpid, shmget,shmat and shmdt.
USE_SOCKETSample implementation for launching parallel contexts This implementation uses fork, socket, sendto and recvfrom
MAIN_HAS_NOARGCNeeded if platform does not support getting arguments to main.
MAIN_HAS_NORETURNNeeded if platform does not support returning a value from main.
Variables
default_num_contextsNumber of contexts to spawn in multicore context.
- -

Description

This file contains configuration constants required to execute on different platforms

- -

Configuration

- -

HAS_FLOAT

Define to 1 if the platform supports floating point.

- -

HAS_TIME_H

Define to 1 if platform has the time.h header file, and implementation of functions thereof.

- -

USE_CLOCK

Define to 1 if platform has the time.h header file, and implementation of functions thereof.

- -

HAS_STDIO

Define to 1 if the platform has stdio.h.

- -

HAS_PRINTF

Define to 1 if the platform has stdio.h and implements the printf function.

- -

CORE_TICKS

Define type of return from the timing functions.

- -

SEED_METHOD

Defines method to get seed values that cannot be computed at compile time.

Valid values

SEED_ARGfrom command line.
SEED_FUNCfrom a system function.
SEED_VOLATILEfrom volatile variables.
- -

MEM_METHOD

Defines method to get a block of memry.

Valid values

MEM_MALLOCfor platforms that implement malloc and have malloc.h.
MEM_STATICto use a static memory array.
MEM_STACKto allocate the data block on the stack (NYI).
- -

MULTITHREAD

Define for parallel execution

Valid values

1only one context (default).
N>1will execute N copies in parallel.

Note

If this flag is defined to more then 1, an implementation for launching parallel contexts must be defined.

Two sample implementations are provided.  Use USE_PTHREAD or USE_FORK to enable them.

It is valid to have a different implementation of core_start_parallel and <core_end_parallel> in core_portme.c, to fit a particular architecture.

- -

USE_PTHREAD

Sample implementation for launching parallel contexts This implementation uses pthread_thread_create and pthread_join.

Valid values

0Do not use pthreads API.
1Use pthreads API

Note

This flag only matters if MULTITHREAD has been defined to a value greater then 1.

- -

USE_FORK

Sample implementation for launching parallel contexts This implementation uses fork, waitpid, shmget,shmat and shmdt.

Valid values

0Do not use fork API.
1Use fork API

Note

This flag only matters if MULTITHREAD has been defined to a value greater then 1.

- -

USE_SOCKET

Sample implementation for launching parallel contexts This implementation uses fork, socket, sendto and recvfrom

Valid values

0Do not use fork and sockets API.
1Use fork and sockets API

Note

This flag only matters if MULTITHREAD has been defined to a value greater then 1.

- -

MAIN_HAS_NOARGC

Needed if platform does not support getting arguments to main.

Valid values

0argc/argv to main is supported
1argc/argv to main is not supported
- -

MAIN_HAS_NORETURN

Needed if platform does not support returning a value from main.

Valid values

0main returns an int, and return value will be 0.
1platform does not support returning a value from main
- -

Variables

- -

default_num_contexts

extern ee_u32 default_num_contexts

Number of contexts to spawn in multicore context.  Override this global value to change number of contexts used.

Note

This value may not be set higher then the MULTITHREAD define.

To experiment, you can set the MULTITHREAD define to the highest value expected, and use argc/argv in the portable_init to set this value from the command line.

- -
- - - - - - - - - - -
extern ee_u32 default_num_contexts
Number of contexts to spawn in multicore context.
Sample implementation for launching parallel contexts This implementation uses pthread_thread_create and pthread_join.
Sample implementation for launching parallel contexts This implementation uses fork, waitpid, shmget,shmat and shmdt.
Start benchmarking in a parallel context.
Define for parallel execution
void portable_init(core_portable *p,
int *argc,
char *argv[])
Target specific initialization code Test for some common mistakes.
- - - - - - - - \ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/files/linux/core_portme-mak.html b/tests/riscv-coremark/coremark/docs/html/files/linux/core_portme-mak.html deleted file mode 100644 index ffd6cbe66..000000000 --- a/tests/riscv-coremark/coremark/docs/html/files/linux/core_portme-mak.html +++ /dev/null @@ -1,76 +0,0 @@ - - -core_portme.mak - CoreMark - - - - - - - -

core_portme.mak

Summary
core_portme.mak
Variables
OUTFLAGUse this flag to define how to to get an executable (e.g -o)
CCUse this flag to define compiler to use
CFLAGSUse this flag to define compiler options.
LFLAGS_ENDDefine any libraries needed for linking or other flags that should come at the end of the link line (e.g.
PORT_SRCSPort specific source files can be added here
LOADDefine this flag if you need to load to a target, as in a cross compile environment.
RUNDefine this flag if running does not consist of simple invocation of the binary.
SEPARATE_COMPILEDefine if you need to separate compilation from link stage.
PORT_OBJSPort specific object files can be added here
Build Targets
port_prebuildGenerate any files that are needed before actual build starts.
port_postbuildGenerate any files that are needed after actual build end.
port_postrunDo platform specific after run stuff.
port_prerunDo platform specific after run stuff.
port_postloadDo platform specific after load stuff.
port_preloadDo platform specific before load stuff.
Variables
OPATH
PERLDefine perl executable to calculate the geomean if running separate.
- -

Variables

- -

OUTFLAG

Use this flag to define how to to get an executable (e.g -o)

- -

CC

Use this flag to define compiler to use

- -

CFLAGS

Use this flag to define compiler options.  Note, you can add compiler options from the command line using XCFLAGS=”other flags”

- -

LFLAGS_END

Define any libraries needed for linking or other flags that should come at the end of the link line (e.g. linker scripts).  Note: On certain platforms, the default clock_gettime implementation is supported but requires linking of librt.

- -

PORT_SRCS

Port specific source files can be added here

- -

LOAD

Define this flag if you need to load to a target, as in a cross compile environment.

- -

RUN

Define this flag if running does not consist of simple invocation of the binary.  In a cross compile environment, you need to define this.

- -

SEPARATE_COMPILE

Define if you need to separate compilation from link stage.  In this case, you also need to define below how to create an object file, and how to link.

- -

PORT_OBJS

Port specific object files can be added here

- -

Build Targets

- -

port_prebuild

Generate any files that are needed before actual build starts.  E.g. generate profile guidance files.  Sample PGO generation for gcc enabled with PGO=1

  • First, check if PGO was defined on the command line, if so, need to add -fprofile-use to compile line.
  • Second, if PGO reference has not yet been generated, add a step to the prebuild that will build a profile-generate version and run it.
NoteUsing REBUILD=1

Use make PGO=1 to invoke this sample processing.

- -

port_postbuild

Generate any files that are needed after actual build end.  E.g. change format to srec, bin, zip in order to be able to load into flash

- -

port_postrun

Do platform specific after run stuff.  E.g. reset the board, backup the logfiles etc.

- -

port_prerun

Do platform specific after run stuff.  E.g. reset the board, backup the logfiles etc.

- -

port_postload

Do platform specific after load stuff.  E.g. reset the reset power to the flash eraser

- -

port_preload

Do platform specific before load stuff.  E.g. reset the reset power to the flash eraser

- -

Variables

- -

OPATH

Path to the output folder.  Defaultcurrent folder.
- -

PERL

Define perl executable to calculate the geomean if running separate.

- -
- - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/files/readme-txt.html b/tests/riscv-coremark/coremark/docs/html/files/readme-txt.html deleted file mode 100644 index 2b57f37f4..000000000 --- a/tests/riscv-coremark/coremark/docs/html/files/readme-txt.html +++ /dev/null @@ -1,71 +0,0 @@ - - -CoreMark - - - - - - - -

CoreMark

Summary
CoreMark
WelcomeCopyright © 2009 EEMBC All rights reserved.
Building and runningDownload the release files from the www.coremark.org.
DocumentationWhen you unpack the documentation (tar -vzxf coremark_<version>_docs.tgz) a docs folder will be created.
Submitting resultsCoreMark results can be submitted on the web.
Run rulesWhat is and is not allowed.
Reporting rulesHow to report results on a data sheet?
Log File FormatThe log files have the following format
LegalSee LICENSE.txt or the word document file under docs/LICENSE.doc.
CreditsMany thanks to all of the individuals who helped with the development or testing of CoreMark including (Sorted by company name)
- -

Welcome

Copyright © 2009 EEMBC All rights reserved.  CoreMark is a trademark of EEMBC and EEMBC is a registered trademark of the Embedded Microprocessor Benchmark Consortium.

CoreMark’s primary goals are simplicity and providing a method for testing only a processor’s core features.

For more information about EEMBC’s comprehensive embedded benchmark suites, please see www.eembc.org.

- -

Building and running

Download the release files from the www.coremark.org.  You can verify the download using the coremark_<version>.md5 file

md5sum -c coremark_<version>.md5

Unpack the distribution (tar -vzxf coremark_<version>.tgz && tar -vzxf coremark_<version>_docs.tgz) then change to the coremark_<version> folder.

To build and run the benchmark, type

make

Full results are available in the files run1.log and run2.log.  CoreMark result can be found in run1.log.

For self hosted Linux or Cygwin platforms, a simple make should work.

Cross Compile

For cross compile platforms please adjust core_portme.mak, core_portme.h (and possibly core_portme.c) according to the specific platform used.  When porting to a new platform, it is recommended to copy one of the default port folders (e.g. mkdir <platform> && cp linux/* <platform>), adjust the porting files, and run

make PORT_DIR=<platform>

Systems without make

The following files need to be compiled:

For example

gcc -O2 -o coremark.exe core_list_join.c core_main.c core_matrix.c core_state.c core_util.c simple/core_portme.c -DPERFORMANCE_RUN=1 -DITERATIONS=1000
-./coremark.exe > run1.log

The above will compile the benchmark for a performance run and 1000 iterations.  Output is redirected to run1.log.

Make targets

runDefault target, creates run1.log and run2.log.
run1.logRun the benchmark with performance parameters, and output to run1.log
run2.logRun the benchmark with validation parameters, and output to run2.log
run3.logRun the benchmark with profile generation parameters, and output to run3.log
compilecompile the benchmark executable
linklink the benchmark executable
checktest MD5 of sources that may not be modified
cleanclean temporary files

ITERATIONS

By default, the benchmark will run between 10-100 seconds.  To override, use ITERATIONS=N

make ITERATIONS=10

Will run the benchmark for 10 iterations.  It is recommended to set a specific number of iterations in certain situations e.g.:

  • Running with a simulator
  • Measuring power/energy
  • Timing cannot be restarted

Minimum required run time

Results are only valid for reporting if the benchmark ran for at least 10 secs!

XCFLAGS

To add compiler flags from the command line, use XCFLAGS e.g.

make XCFLAGS="-g -DMULTITHREAD=4 -DUSE_FORK=1"
  • CORE_DEBUG

Define to compile for a debug run if you get incorrect CRC.

make XCFLAGS="-DCORE_DEBUG=1"
  • Parallel Execution

Use XCFLAGS=-DMULTITHREAD=N where N is number of threads to run in parallel.  Several implementations are available to execute in multiple contexts, or you can implement your own in core_portme.c.

make XCFLAGS="-DMULTITHREAD=4 -DUSE_PTHREAD"

Above will compile the benchmark for execution on 4 cores, using POSIX Threads API.

REBUILD

To force rebuild, add the flag REBUILD to the command line

make REBUILD=1

Check core_portme.mak for more important options.

Run parameters for the benchmark executable

Coremark executable takes several parameters as follows (if main accepts arguments).  1st - A seed value used for initialization of data.  2nd - A seed value used for initialization of data.  3rd - A seed value used for initialization of data.  4th - Number of iterations (0 for auto : default value) 5th - Reserved for internal use.  6th - Reserved for internal use.  7th - For malloc users only, ovreride the size of the input data buffer.

The run target from make will run coremark with 2 different data initialization seeds.

Alternative parameters

If not using malloc or command line arguments are not supported, the buffer size for the algorithms must be defined via the compiler define TOTAL_DATA_SIZE.  TOTAL_DATA_SIZE must be set to 2000 bytes (default) for standard runs.  The default for such a target when testing different configurations could be ...

make XCFLAGS="-DTOTAL_DATA_SIZE=6000 -DMAIN_HAS_NOARGC=1"
- -

Documentation

When you unpack the documentation (tar -vzxf coremark_<version>_docs.tgz) a docs folder will be created.  Check the file docs/html/index.html and the website http://www.coremark.org for more info.

- -

Submitting results

CoreMark results can be submitted on the web.

Open a web browser and go to http://www.coremark.org- /benchmark- /index.php?pg=benchmark Select the link to add a new score and follow the instructions.

- -

Run rules

What is and is not allowed.

Required

1The benchmark needs to run for at least 10 seconds.
2All validation must succeed for seeds 0,0,0x66 and 0x3415,0x3415,0x66, buffer size of 2000 bytes total.
  • If not using command line arguments to main:
make XCFLAGS="-DPERFORMANCE_RUN=1" REBUILD=1 run1.log
-make XCFLAGS="-DVALIDATION_RUN=1" REBUILD=1 run2.log
3If using profile guided optimization, profile must be generated using seeds of 8,8,8, and buffer size of 1200 bytes total.
make XCFLAGS="-DTOTAL_DATA_SIZE=1200 -DPROFILE_RUN=1" REBUILD=1 run3.log
4All source files must be compiled with the same flags.
5All data type sizes must match size in bits such that:
  • ee_u8 is an 8 bits datatype.
  • ee_s16 is an 16 bits datatype.
  • ee_u16 is an 16 bits datatype.
  • ee_s32 is an 32 bits datatype.
  • ee_u32 is an 32 bits datatype.

Allowed

  • Changing number of iterations
  • Changing toolchain and build/load/run options
  • Changing method of acquiring a data memory block
  • Changing the method of acquiring seed values
  • Changing implementation in core_portme.c
  • Changing configuration values in core_portme.h
  • Changing core_portme.mak

Not allowed

  • Changing of source file other then core_portme* (use make check to validate)
- -

Reporting rules

How to report results on a data sheet?

CoreMark 1.0 : N / C [/ P] [/ M]

NNumber of iterations per second with seeds 0,0,0x66,size=2000)
CCompiler version and flags
PParameters such as data and code allocation specifics
  • This parameter may be omitted if all data was allocated on the heap in RAM.
  • This parameter may not be omitted when reporting CoreMark/MHz
MType of parallel execution (if used) and number of contexts This parameter may be omitted if parallel execution was not used.

e.g.

CoreMark 1.0 : 128 / GCC 4.1.2 -O2 -fprofile-use / Heap in TCRAM / FORK:2

or

CoreMark 1.0 : 1400 / GCC 3.4 -O4

If reporting scaling results, the results must be reported as follows

CoreMark/MHz 1.0 : N / C / P [/ M]

PWhen reporting scaling results, memory parameter must also indicate memory frequency:core frequency ratio.
  • If the core has cache and cache frequency to core frequency ratio is configurable, that must also be included.

e.g.

CoreMark/MHz 1.0 : 1.47 / GCC 4.1.2 -O2 / DDR3(Heap) 30:1 Memory 1:1 Cache
- -

Log File Format

The log files have the following format

2K performance run parameters for coremark. (Run type)
-CoreMark Size       : 666                   (Buffer size)
-Total ticks         : 25875                 (platform dependent value)
-Total time (secs)   : 25.875000             (actual time in seconds)
-Iterations/Sec      : 3864.734300           (Performance value to report)
-Iterations          : 100000                (number of iterations used)
-Compiler version    : GCC3.4.4              (Compiler and version)
-Compiler flags      : -O2                   (Compiler and linker flags)
-Memory location     : Code in flash, data in on chip RAM
-seedcrc             : 0xe9f5                (identifier for the input seeds)
-[0]crclist          : 0xe714                (validation for list part)
-[0]crcmatrix        : 0x1fd7                (validation for matrix part)
-[0]crcstate         : 0x8e3a                (validation for state part)
-[0]crcfinal         : 0x33ff                (iteration dependent output)
-Correct operation validated. See README.md for run and reporting rules.  (*Only when run is successful*)
-CoreMark 1.0 : 6508.490622 / GCC3.4.4 -O2 / Heap                          (*Only on a successful performance run*)
- -

Legal

See LICENSE.txt or the word document file under docs/LICENSE.doc.  For more information on your legal rights to use this benchmark, please see http://www.coremark.org- /download- /register.php?pg=register

- -

Credits

Many thanks to all of the individuals who helped with the development or testing of CoreMark including (Sorted by company name)

  • Alan Anderson, ADI
  • Adhikary Rajiv, ADI
  • Elena Stohr, ARM
  • Ian Rickards, ARM
  • Andrew Pickard, ARM
  • Trent Parker, CAVIUM
  • Shay Gal-On, EEMBC
  • Markus Levy, EEMBC
  • Ron Olson, IBM
  • Eyal Barzilay, MIPS
  • Jens Eltze, NEC
  • Hirohiko Ono, NEC
  • Ulrich Drees, NEC
  • Frank Roscheda, NEC
  • Rob Cosaro, NXP
  • Shumpei Kawasaki, RENESAS
- -
- - - - - - - - - - -
This file contains the framework to acquire a block of memory, seed initial parameters, tun t he benchmark and report the results.
- - - - - - - - diff --git a/tests/riscv-coremark/coremark/docs/html/files/release_notes-txt.html b/tests/riscv-coremark/coremark/docs/html/files/release_notes-txt.html deleted file mode 100644 index 6658c7141..000000000 --- a/tests/riscv-coremark/coremark/docs/html/files/release_notes-txt.html +++ /dev/null @@ -1,56 +0,0 @@ - - -Release Notes - CoreMark - - - - - - - -

Release Notes

Version: 1.01

History

Version 1.01

  • Added validation testing the sizes of datatypes.

Version 1.00

  • First public version.

Validation

This release was tested on the following platforms

  • x86 cygwin and gcc 3.4 (Quad, dual and single core systems)
  • x86 linux (Ubuntu/Fedora) and gcc (4.2/4.1) (Quad and single core systems)
  • MIPS64 BE linux and gcc 3.4 16 cores system
  • MIPS32 BE linux with CodeSourcery compiler 4.2-177 on Malta/Linux with a 1004K 3-core system
  • PPC simulator with gcc 4.2.2 (No OS)
  • PPC 64b BE linux (yellowdog) with gcc 3.4 and 4.1 (Dual core system)
  • BF533 with VDSP50
  • Renesas R8C/H8 MCU with HEW 4.05
  • NXP LPC1700 armcc v4.0.0.524
  • NEC 78K with IAR v4.61
  • ARM simulator with armcc v4

Coverage

GCOV results can be found on SVN under cover.

Memory analysis

Valgrind 3.4.0 used and no errors reported.

Balance analysis

Number of instructions executed for each function tested with cachegrind and found balanced with gcc and -O0.

Statistics

Lines

Lines  Blank  Cmnts  Source     AESL
-=====  =====  =====  =====  ==========  =======================================
-  469     66    170    251       627.5  core_list_join.c  (C)
-  330     18     54    268       670.0  core_main.c  (C)
-  256     32     80    146       365.0  core_matrix.c  (C)
-  240     16     51    186       465.0  core_state.c  (C)
-  165     11     20    134       335.0  core_util.c  (C)
-  150     23     36     98       245.0  coremark.h  (C)
- 1610    166    411   1083      2707.5  ----- Benchmark -----  (6 files)
-  293     15     74    212       530.0  linux/core_portme.c  (C)
-  235     30    104    104       260.0  linux/core_portme.h  (C)
-  528     45    178    316       790.0  ----- Porting -----  (2 files)
-
-
-* For comparison, here are the stats for Dhrystone
-Lines  Blank  Cmnts  Source     AESL
-=====  =====  =====  =====  ==========  =======================================
-  311     15    242     54       135.0  dhry.h  (C)
-  789    132    119    553      1382.5  dhry_1.c  (C)
-  186     26     68    107       267.5  dhry_2.c  (C)
- 1286    173    429    714      1785.0  ----- C -----  (3 files)
- -
- - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/index.html b/tests/riscv-coremark/coremark/docs/html/index.html deleted file mode 100644 index f7a88682a..000000000 --- a/tests/riscv-coremark/coremark/docs/html/index.html +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/index/BuildTargets.html b/tests/riscv-coremark/coremark/docs/html/index/BuildTargets.html deleted file mode 100644 index 635c0ff78..000000000 --- a/tests/riscv-coremark/coremark/docs/html/index/BuildTargets.html +++ /dev/null @@ -1,31 +0,0 @@ - - -Build Target Index - CoreMark - - - - - - - -
Build Target Index
$#! · 0-9 · A · B · C · D · E · F · G · H · I · J · K · L · M · N · O · P · Q · R · S · T · U · V · W · X · Y · Z
P
 port_postbuild
 port_postload
 port_postrun
 port_prebuild
 port_preload
 port_prerun
- -
Generate any files that are needed after actual build end.
Do platform specific after load stuff.
Do platform specific after run stuff.
Generate any files that are needed before actual build starts.
Do platform specific before load stuff.
Do platform specific after run stuff.
- -
- - - - - - - - - - - - \ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/index/Configuration.html b/tests/riscv-coremark/coremark/docs/html/index/Configuration.html deleted file mode 100644 index 8e5ef3aab..000000000 --- a/tests/riscv-coremark/coremark/docs/html/index/Configuration.html +++ /dev/null @@ -1,51 +0,0 @@ - - -Configuration Index - CoreMark - - - - - - - -
Configuration Index
$#! · 0-9 · A · B · C · D · E · F · G · H · I · J · K · L · M · N · O · P · Q · R · S · T · U · V · W · X · Y · Z
C
 CORE_TICKS
H
 HAS_FLOAT
 HAS_PRINTF
 HAS_STDIO
 HAS_TIME_H
M
 MAIN_HAS_NOARGC
 MAIN_HAS_NORETURN
 MEM_METHOD
 MULTITHREAD
S
 SEED_METHOD
T
 TOTAL_DATA_SIZE
U
 USE_CLOCK
 USE_FORK
 USE_PTHREAD
 USE_SOCKET
- -
Define type of return from the timing functions.
- - - -
Define to 1 if the platform supports floating point.
Define to 1 if the platform has stdio.h and implements the printf function.
Define to 1 if the platform has stdio.h.
Define to 1 if platform has the time.h header file, and implementation of functions thereof.
- - - -
Needed if platform does not support getting arguments to main.
Needed if platform does not support returning a value from main.
Defines method to get a block of memry.
Define for parallel execution
- - - -
Defines method to get seed values that cannot be computed at compile time.
- - - -
Define total size for data algorithms will operate on
- - - -
Define to 1 if platform has the time.h header file, and implementation of functions thereof.
Sample implementation for launching parallel contexts This implementation uses fork, waitpid, shmget,shmat and shmdt.
Sample implementation for launching parallel contexts This implementation uses pthread_thread_create and pthread_join.
Sample implementation for launching parallel contexts This implementation uses fork, socket, sendto and recvfrom
- -
- - - - - - - - - - - - \ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/index/Configurations.html b/tests/riscv-coremark/coremark/docs/html/index/Configurations.html deleted file mode 100644 index 0faee64a0..000000000 --- a/tests/riscv-coremark/coremark/docs/html/index/Configurations.html +++ /dev/null @@ -1,45 +0,0 @@ - - -Configuration Index - - - - - - - - - -
Configuration Index
$#! · 0-9 · A · B · C · D · E · F · G · H · I · J · K · L · M · N · O · P · Q · R · S · T · U · V · W · X · Y · Z
H
 HAS_FLOAT
 HAS_STDIO
 HAS_TIME_H
M
 MEM_METHOD
S
 SEED_METHOD
T
 TOTAL_DATA_SIZE
- -
Define to 1 if the platform supports floating point.
Define to 1 if the platform has stdio.h and implements the printf function.
Define to 1 if platform has the time.h header file, and implementation of functions thereof.
- - - -
Defines method to get a block of memry.
- - - -
Defines method to get seed values that cannot be computed at compile time.
- - - -
Define total size for data algorithms will operate on
- -
- - - - - - - - - - - - \ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/index/Files.html b/tests/riscv-coremark/coremark/docs/html/index/Files.html deleted file mode 100644 index 7e6d2fa04..000000000 --- a/tests/riscv-coremark/coremark/docs/html/index/Files.html +++ /dev/null @@ -1,35 +0,0 @@ - - -File Index - CoreMark - - - - - - - -
File Index
$#! · 0-9 · A · B · C · D · E · F · G · H · I · J · K · L · M · N · O · P · Q · R · S · T · U · V · W · X · Y · Z
C
 core_list_join.c
 core_main.c
 core_matrix.c
 core_portme.c
 core_portme.h
 core_portme.mak
 core_state.c
 core_util.c
 CoreMark
 coremark.h
R
 Release Notes
- -
This file contains the framework to acquire a block of memory, seed initial parameters, tun t he benchmark and report the results.
- - - -
Version: 1.01
- -
- - - - - - - - - - - - \ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/index/Functions.html b/tests/riscv-coremark/coremark/docs/html/index/Functions.html deleted file mode 100644 index a249d5186..000000000 --- a/tests/riscv-coremark/coremark/docs/html/index/Functions.html +++ /dev/null @@ -1,55 +0,0 @@ - - -Function Index - CoreMark - - - - - - - -
Function Index
$#! · 0-9 · A · B · C · D · E · F · G · H · I · J · K · L · M · N · O · P · Q · R · S · T · U · V · W · X · Y · Z
C
 cmp_complex
 cmp_idx
 core_bench_matrix
 core_bench_state
 core_init_state
 core_list_find
 core_list_init
 core_list_insert
 core_list_mergesort
 core_list_remove
 core_list_reverse
 core_list_undo_remove
 core_start_parallel
 core_state_transition
 core_stop_parallel
 crc*
G
 get_seed
 get_time
I
 iterate
M
 main
 matrix_add_const
 matrix_mul_const
 matrix_mul_matrix
 matrix_mul_matrix_bitextract
 matrix_mul_vect
 matrix_sum
 matrix_test
P
 portable_fini
 portable_free
 portable_init
 portable_malloc
S
 start_time
 stop_time
T
 time_in_secs
- -
ee_s32 cmp_complex(list_data *a,
list_data *b,
core_results *res)
Compare the data item in a list cell.
ee_s32 cmp_idx(list_data *a,
list_data *b,
core_results *res)
Compare the idx item in a list cell, and regen the data.
ee_u16 core_bench_matrix(mat_params *p,
ee_s16 seed,
ee_u16 crc)
Benchmark function
ee_u16 core_bench_state(ee_u32 blksize,
ee_u8 *memblock,
ee_s16 seed1,
ee_s16 seed2,
ee_s16 step,
ee_u16 crc)
Benchmark function
void core_init_state(ee_u32 size,
ee_s16 seed,
ee_u8 *p)
Initialize the input data for the state machine.
list_head *core_list_find(list_head *list,
list_data *info)
Find an item in the list
list_head *core_list_init(ee_u32 blksize,
list_head *memblock,
ee_s16 seed)
Initialize list with data.
list_head *core_list_insert_new(list_head *insert_point,
list_data *info,
list_head **memblock,
list_data **datablock ,
list_head *memblock_end,
list_data *datablock_end)
Insert an item to the list
list_head *core_list_mergesort(list_head *list,
list_cmp cmp,
core_results *res)
Sort the list in place without recursion.
list_head *core_list_remove(list_head *item)
Remove an item from the list.
list_head *core_list_reverse(list_head *list)
Reverse a list
list_head *core_list_undo_remove(list_head *item_removed,
list_head *item_modified)
Undo a remove operation.
Start benchmarking in a parallel context.
enum CORE_STATE core_state_transition(ee_u8 **instr ,
ee_u32 *transition_count)
Actual state machine.
Stop a parallel context execution of coremark, and gather the results.
Service functions to calculate 16b CRC code.
- - - -
Get a values that cannot be determined at compile time.
CORE_TICKS get_time(void)
Return an abstract “ticks” number that signifies time on the system.
- - - -
Run the benchmark for a specified number of iterations.
- - - -
#if MAIN_HAS_NOARGC MAIN_RETURN_TYPE main(void)
Main entry routine for the benchmark.
void matrix_add_const(ee_u32 N,
MATDAT *A,
MATDAT val)
Add a constant value to all elements of a matrix.
void matrix_mul_const(ee_u32 N,
MATRES *C,
MATDAT *A,
MATDAT val)
Multiply a matrix by a constant.
void matrix_mul_matrix(ee_u32 N,
MATRES *C,
MATDAT *A,
MATDAT *B)
Multiply a matrix by a matrix.
void matrix_mul_matrix_bitextract(ee_u32 N,
MATRES *C,
MATDAT *A,
MATDAT *B)
Multiply a matrix by a matrix, and extract some bits from the result.
void matrix_mul_vect(ee_u32 N,
MATRES *C,
MATDAT *A,
MATDAT *B)
Multiply a matrix by a vector.
ee_s16 matrix_sum(ee_u32 N,
MATRES *C,
MATDAT clipval)
Calculate a function that depends on the values of elements in the matrix.
ee_s16 matrix_test(ee_u32 N,
MATRES *C,
MATDAT *A,
MATDAT *B,
MATDAT val)
Perform matrix manipulation.
- - - -
void portable_fini(core_portable *p)
Target specific final code
void portable_free(void *p)
Provide free() functionality in a platform specific way.
void portable_init(core_portable *p,
int *argc,
char *argv[])
Target specific initialization code Test for some common mistakes.
void *portable_malloc(size_t size)
Provide malloc() functionality in a platform specific way.
- - - -
void start_time(void)
This function will be called right before starting the timed portion of the benchmark.
void stop_time(void)
This function will be called right after ending the timed portion of the benchmark.
- - - -
secs_ret time_in_secs(CORE_TICKS ticks)
Convert the value returned by get_time to seconds.
- -
- - - - - - - - - - - - \ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/index/General.html b/tests/riscv-coremark/coremark/docs/html/index/General.html deleted file mode 100644 index bd47b299f..000000000 --- a/tests/riscv-coremark/coremark/docs/html/index/General.html +++ /dev/null @@ -1,75 +0,0 @@ - - -Index - CoreMark - - - - - - - -
Index
$#! · 0-9 · A · B · C · D · E · F · G · H · I · J · K · L · M · N · O · P · Q · R · S · T · U · V · W · X · Y · Z
B
 Build Targets
 Building and running
C
 CC
 CFLAGS
 cmp_complex
 cmp_idx
 Configuration
 core_bench_matrix
 core_bench_state
 core_init_state
 core_list_find
 core_list_init
 core_list_insert
 core_list_join.c
 core_list_mergesort
 core_list_remove
 core_list_reverse
 core_list_undo_remove
 core_main.c
 core_matrix.c
 core_portme.c
 core_portme.h
 core_portme.mak
 core_start_parallel
 core_state.c
 core_state_transition
 core_stop_parallel
 CORE_TICKS
 core_util.c
 CoreMark
 coremark.h
 crc*
 Credits
D
 default_num_contexts
 Description
 Documentation
F
 Functions
G
 get_seed
 get_time
H
 HAS_FLOAT
 HAS_PRINTF
 HAS_STDIO
 HAS_TIME_H
I
 iterate
L
 Legal
 LFLAGS_END
 LOAD
 Log File Format
M
 main
 MAIN_HAS_NOARGC
 MAIN_HAS_NORETURN
 matrix_add_const
 matrix_mul_const
 matrix_mul_matrix
 matrix_mul_matrix_bitextract
 matrix_mul_vect
 matrix_sum
 matrix_test
 MEM_METHOD
 MULTITHREAD
O
 OPATH
 OUTFLAG
P
 PERL
 PORT_OBJS
 port_postbuild
 port_postload
 port_postrun
 port_prebuild
 port_preload
 port_prerun
 PORT_SRCS
 portable_fini
 portable_free
 portable_init
 portable_malloc
R
 Release Notes
 Reporting rules
 RUN
 Run rules
- -
Download the release files from the www.coremark.org.
- - - -
Use this flag to define compiler to use
Use this flag to define compiler options.
ee_s32 cmp_complex(list_data *a,
list_data *b,
core_results *res)
Compare the data item in a list cell.
ee_s32 cmp_idx(list_data *a,
list_data *b,
core_results *res)
Compare the idx item in a list cell, and regen the data.
ee_u16 core_bench_matrix(mat_params *p,
ee_s16 seed,
ee_u16 crc)
Benchmark function
ee_u16 core_bench_state(ee_u32 blksize,
ee_u8 *memblock,
ee_s16 seed1,
ee_s16 seed2,
ee_s16 step,
ee_u16 crc)
Benchmark function
void core_init_state(ee_u32 size,
ee_s16 seed,
ee_u8 *p)
Initialize the input data for the state machine.
list_head *core_list_find(list_head *list,
list_data *info)
Find an item in the list
list_head *core_list_init(ee_u32 blksize,
list_head *memblock,
ee_s16 seed)
Initialize list with data.
list_head *core_list_insert_new(list_head *insert_point,
list_data *info,
list_head **memblock,
list_data **datablock ,
list_head *memblock_end,
list_data *datablock_end)
Insert an item to the list
list_head *core_list_mergesort(list_head *list,
list_cmp cmp,
core_results *res)
Sort the list in place without recursion.
list_head *core_list_remove(list_head *item)
Remove an item from the list.
list_head *core_list_reverse(list_head *list)
Reverse a list
list_head *core_list_undo_remove(list_head *item_removed,
list_head *item_modified)
Undo a remove operation.
This file contains the framework to acquire a block of memory, seed initial parameters, tun t he benchmark and report the results.
Start benchmarking in a parallel context.
enum CORE_STATE core_state_transition(ee_u8 **instr ,
ee_u32 *transition_count)
Actual state machine.
Stop a parallel context execution of coremark, and gather the results.
Define type of return from the timing functions.
Service functions to calculate 16b CRC code.
Many thanks to all of the individuals who helped with the development or testing of CoreMark including (Sorted by company name)
- - - -
extern ee_u32 default_num_contexts
Number of contexts to spawn in multicore context.
Benchmark using a linked list.
When you unpack the documentation (tar -vzxf coremark_version_docs.tgz) a docs folder will be created.
- - - - - - - -
Get a values that cannot be determined at compile time.
CORE_TICKS get_time(void)
Return an abstract “ticks” number that signifies time on the system.
- - - -
Define to 1 if the platform supports floating point.
Define to 1 if the platform has stdio.h and implements the printf function.
Define to 1 if the platform has stdio.h.
Define to 1 if platform has the time.h header file, and implementation of functions thereof.
- - - -
Run the benchmark for a specified number of iterations.
- - - -
See LICENSE.txt or the word document file under docs/LICENSE.doc.
Define any libraries needed for linking or other flags that should come at the end of the link line (e.g.
Define this flag if you need to load to a target, as in a cross compile environment.
The log files have the following format
- - - -
#if MAIN_HAS_NOARGC MAIN_RETURN_TYPE main(void)
Main entry routine for the benchmark.
Needed if platform does not support getting arguments to main.
Needed if platform does not support returning a value from main.
void matrix_add_const(ee_u32 N,
MATDAT *A,
MATDAT val)
Add a constant value to all elements of a matrix.
void matrix_mul_const(ee_u32 N,
MATRES *C,
MATDAT *A,
MATDAT val)
Multiply a matrix by a constant.
void matrix_mul_matrix(ee_u32 N,
MATRES *C,
MATDAT *A,
MATDAT *B)
Multiply a matrix by a matrix.
void matrix_mul_matrix_bitextract(ee_u32 N,
MATRES *C,
MATDAT *A,
MATDAT *B)
Multiply a matrix by a matrix, and extract some bits from the result.
void matrix_mul_vect(ee_u32 N,
MATRES *C,
MATDAT *A,
MATDAT *B)
Multiply a matrix by a vector.
ee_s16 matrix_sum(ee_u32 N,
MATRES *C,
MATDAT clipval)
Calculate a function that depends on the values of elements in the matrix.
ee_s16 matrix_test(ee_u32 N,
MATRES *C,
MATDAT *A,
MATDAT *B,
MATDAT val)
Perform matrix manipulation.
Defines method to get a block of memry.
Define for parallel execution
- - - -
Use this flag to define how to to get an executable (e.g -o)
- - - -
Define perl executable to calculate the geomean if running separate.
Port specific object files can be added here
Generate any files that are needed after actual build end.
Do platform specific after load stuff.
Do platform specific after run stuff.
Generate any files that are needed before actual build starts.
Do platform specific before load stuff.
Do platform specific after run stuff.
Port specific source files can be added here
void portable_fini(core_portable *p)
Target specific final code
void portable_free(void *p)
Provide free() functionality in a platform specific way.
void portable_init(core_portable *p,
int *argc,
char *argv[])
Target specific initialization code Test for some common mistakes.
void *portable_malloc(size_t size)
Provide malloc() functionality in a platform specific way.
- - - -
Version: 1.01
How to report results on a data sheet?
Define this flag if running does not consist of simple invocation of the binary.
What is and is not allowed.
- -
- - - - - - - - - - - - \ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/index/General2.html b/tests/riscv-coremark/coremark/docs/html/index/General2.html deleted file mode 100644 index 3852ab5aa..000000000 --- a/tests/riscv-coremark/coremark/docs/html/index/General2.html +++ /dev/null @@ -1,47 +0,0 @@ - - -Index - CoreMark - - - - - - - -
Index
$#! · 0-9 · A · B · C · D · E · F · G · H · I · J · K · L · M · N · O · P · Q · R · S · T · U · V · W · X · Y · Z
S
 secs_ret
 SEED_METHOD
 SEPARATE_COMPILE
 start_time
 stop_time
 Submitting results
T
 time_in_secs
 TIMER_RES_DIVIDER
 TOTAL_DATA_SIZE
 Types
U
 USE_CLOCK
 USE_FORK
 USE_PTHREAD
 USE_SOCKET
V
 Variables
W
 Welcome
- -
For machines that have floating point support, get number of seconds as a double.
Defines method to get seed values that cannot be computed at compile time.
Define if you need to separate compilation from link stage.
void start_time(void)
This function will be called right before starting the timed portion of the benchmark.
void stop_time(void)
This function will be called right after ending the timed portion of the benchmark.
CoreMark results can be submitted on the web.
- - - -
secs_ret time_in_secs(CORE_TICKS ticks)
Convert the value returned by get_time to seconds.
Divider to trade off timer resolution and total time that can be measured.
Define total size for data algorithms will operate on
- - - -
Define to 1 if platform has the time.h header file, and implementation of functions thereof.
Sample implementation for launching parallel contexts This implementation uses fork, waitpid, shmget,shmat and shmdt.
Sample implementation for launching parallel contexts This implementation uses pthread_thread_create and pthread_join.
Sample implementation for launching parallel contexts This implementation uses fork, socket, sendto and recvfrom
- - - - - - - -
Copyright © 2009 EEMBC All rights reserved.
- -
- - - - - - - - - - - - \ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/index/Types.html b/tests/riscv-coremark/coremark/docs/html/index/Types.html deleted file mode 100644 index 1f4413653..000000000 --- a/tests/riscv-coremark/coremark/docs/html/index/Types.html +++ /dev/null @@ -1,31 +0,0 @@ - - -Type Index - CoreMark - - - - - - - -
Type Index
$#! · 0-9 · A · B · C · D · E · F · G · H · I · J · K · L · M · N · O · P · Q · R · S · T · U · V · W · X · Y · Z
S
 secs_ret
- -
For machines that have floating point support, get number of seconds as a double.
- -
- - - - - - - - - - - - \ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/index/Variables.html b/tests/riscv-coremark/coremark/docs/html/index/Variables.html deleted file mode 100644 index 8c050daef..000000000 --- a/tests/riscv-coremark/coremark/docs/html/index/Variables.html +++ /dev/null @@ -1,55 +0,0 @@ - - -Variable Index - CoreMark - - - - - - - -
Variable Index
$#! · 0-9 · A · B · C · D · E · F · G · H · I · J · K · L · M · N · O · P · Q · R · S · T · U · V · W · X · Y · Z
C
 CC
 CFLAGS
D
 default_num_contexts
L
 LFLAGS_END
 LOAD
O
 OPATH
 OUTFLAG
P
 PERL
 PORT_OBJS
 PORT_SRCS
R
 RUN
S
 SEPARATE_COMPILE
- -
Use this flag to define compiler to use
Use this flag to define compiler options.
- - - -
extern ee_u32 default_num_contexts
Number of contexts to spawn in multicore context.
- - - -
Define any libraries needed for linking or other flags that should come at the end of the link line (e.g.
Define this flag if you need to load to a target, as in a cross compile environment.
- - - -
Use this flag to define how to to get an executable (e.g -o)
- - - -
Define perl executable to calculate the geomean if running separate.
Port specific object files can be added here
Port specific source files can be added here
- - - -
Define this flag if running does not consist of simple invocation of the binary.
- - - -
Define if you need to separate compilation from link stage.
- -
- - - - - - - - - - - - \ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/javascript/main.js b/tests/riscv-coremark/coremark/docs/html/javascript/main.js deleted file mode 100644 index 91991f507..000000000 --- a/tests/riscv-coremark/coremark/docs/html/javascript/main.js +++ /dev/null @@ -1,836 +0,0 @@ -// This file is part of Natural Docs, which is Copyright (C) 2003-2008 Greg Valure -// Natural Docs is licensed under the GPL - - -// -// Browser Styles -// ____________________________________________________________________________ - -var agt=navigator.userAgent.toLowerCase(); -var browserType; -var browserVer; - -if (agt.indexOf("opera") != -1) - { - browserType = "Opera"; - - if (agt.indexOf("opera 7") != -1 || agt.indexOf("opera/7") != -1) - { browserVer = "Opera7"; } - else if (agt.indexOf("opera 8") != -1 || agt.indexOf("opera/8") != -1) - { browserVer = "Opera8"; } - else if (agt.indexOf("opera 9") != -1 || agt.indexOf("opera/9") != -1) - { browserVer = "Opera9"; } - } - -else if (agt.indexOf("applewebkit") != -1) - { - browserType = "Safari"; - - if (agt.indexOf("version/3") != -1) - { browserVer = "Safari3"; } - else if (agt.indexOf("safari/4") != -1) - { browserVer = "Safari2"; } - } - -else if (agt.indexOf("khtml") != -1) - { - browserType = "Konqueror"; - } - -else if (agt.indexOf("msie") != -1) - { - browserType = "IE"; - - if (agt.indexOf("msie 6") != -1) - { browserVer = "IE6"; } - else if (agt.indexOf("msie 7") != -1) - { browserVer = "IE7"; } - } - -else if (agt.indexOf("gecko") != -1) - { - browserType = "Firefox"; - - if (agt.indexOf("rv:1.7") != -1) - { browserVer = "Firefox1"; } - else if (agt.indexOf("rv:1.8)") != -1 || agt.indexOf("rv:1.8.0") != -1) - { browserVer = "Firefox15"; } - else if (agt.indexOf("rv:1.8.1") != -1) - { browserVer = "Firefox2"; } - } - - -// -// Support Functions -// ____________________________________________________________________________ - - -function GetXPosition(item) - { - var position = 0; - - if (item.offsetWidth != null) - { - while (item != document.body && item != null) - { - position += item.offsetLeft; - item = item.offsetParent; - }; - }; - - return position; - }; - - -function GetYPosition(item) - { - var position = 0; - - if (item.offsetWidth != null) - { - while (item != document.body && item != null) - { - position += item.offsetTop; - item = item.offsetParent; - }; - }; - - return position; - }; - - -function MoveToPosition(item, x, y) - { - // Opera 5 chokes on the px extension, so it can use the Microsoft one instead. - - if (item.style.left != null) - { - item.style.left = x + "px"; - item.style.top = y + "px"; - } - else if (item.style.pixelLeft != null) - { - item.style.pixelLeft = x; - item.style.pixelTop = y; - }; - }; - - -// -// Menu -// ____________________________________________________________________________ - - -function ToggleMenu(id) - { - if (!window.document.getElementById) - { return; }; - - var display = window.document.getElementById(id).style.display; - - if (display == "none") - { display = "block"; } - else - { display = "none"; } - - window.document.getElementById(id).style.display = display; - } - -function HideAllBut(ids, max) - { - if (document.getElementById) - { - ids.sort( function(a,b) { return a - b; } ); - var number = 1; - - while (number < max) - { - if (ids.length > 0 && number == ids[0]) - { ids.shift(); } - else - { - document.getElementById("MGroupContent" + number).style.display = "none"; - }; - - number++; - }; - }; - } - - -// -// Tooltips -// ____________________________________________________________________________ - - -var tooltipTimer = 0; - -function ShowTip(event, tooltipID, linkID) - { - if (tooltipTimer) - { clearTimeout(tooltipTimer); }; - - var docX = event.clientX + window.pageXOffset; - var docY = event.clientY + window.pageYOffset; - - var showCommand = "ReallyShowTip('" + tooltipID + "', '" + linkID + "', " + docX + ", " + docY + ")"; - - tooltipTimer = setTimeout(showCommand, 1000); - } - -function ReallyShowTip(tooltipID, linkID, docX, docY) - { - tooltipTimer = 0; - - var tooltip; - var link; - - if (document.getElementById) - { - tooltip = document.getElementById(tooltipID); - link = document.getElementById(linkID); - } -/* else if (document.all) - { - tooltip = eval("document.all['" + tooltipID + "']"); - link = eval("document.all['" + linkID + "']"); - } -*/ - if (tooltip) - { - var left = GetXPosition(link); - var top = GetYPosition(link); - top += link.offsetHeight; - - - // The fallback method is to use the mouse X and Y relative to the document. We use a separate if and test if its a number - // in case some browser snuck through the above if statement but didn't support everything. - - if (!isFinite(top) || top == 0) - { - left = docX; - top = docY; - } - - // Some spacing to get it out from under the cursor. - - top += 10; - - // Make sure the tooltip doesnt get smushed by being too close to the edge, or in some browsers, go off the edge of the - // page. We do it here because Konqueror does get offsetWidth right even if it doesnt get the positioning right. - - if (tooltip.offsetWidth != null) - { - var width = tooltip.offsetWidth; - var docWidth = document.body.clientWidth; - - if (left + width > docWidth) - { left = docWidth - width - 1; } - - // If there's a horizontal scroll bar we could go past zero because it's using the page width, not the window width. - if (left < 0) - { left = 0; }; - } - - MoveToPosition(tooltip, left, top); - tooltip.style.visibility = "visible"; - } - } - -function HideTip(tooltipID) - { - if (tooltipTimer) - { - clearTimeout(tooltipTimer); - tooltipTimer = 0; - } - - var tooltip; - - if (document.getElementById) - { tooltip = document.getElementById(tooltipID); } - else if (document.all) - { tooltip = eval("document.all['" + tooltipID + "']"); } - - if (tooltip) - { tooltip.style.visibility = "hidden"; } - } - - -// -// Blockquote fix for IE -// ____________________________________________________________________________ - - -function NDOnLoad() - { - if (browserVer == "IE6") - { - var scrollboxes = document.getElementsByTagName('blockquote'); - - if (scrollboxes.item(0)) - { - NDDoResize(); - window.onresize=NDOnResize; - }; - }; - }; - - -var resizeTimer = 0; - -function NDOnResize() - { - if (resizeTimer != 0) - { clearTimeout(resizeTimer); }; - - resizeTimer = setTimeout(NDDoResize, 250); - }; - - -function NDDoResize() - { - var scrollboxes = document.getElementsByTagName('blockquote'); - - var i; - var item; - - i = 0; - while (item = scrollboxes.item(i)) - { - item.style.width = 100; - i++; - }; - - i = 0; - while (item = scrollboxes.item(i)) - { - item.style.width = item.parentNode.offsetWidth; - i++; - }; - - clearTimeout(resizeTimer); - resizeTimer = 0; - } - - - -/* ________________________________________________________________________________________________________ - - Class: SearchPanel - ________________________________________________________________________________________________________ - - A class handling everything associated with the search panel. - - Parameters: - - name - The name of the global variable that will be storing this instance. Is needed to be able to set timeouts. - mode - The mode the search is going to work in. Pass CommandLineOption()>, so the - value will be something like "HTML" or "FramedHTML". - - ________________________________________________________________________________________________________ -*/ - - -function SearchPanel(name, mode, resultsPath) - { - if (!name || !mode || !resultsPath) - { alert("Incorrect parameters to SearchPanel."); }; - - - // Group: Variables - // ________________________________________________________________________ - - /* - var: name - The name of the global variable that will be storing this instance of the class. - */ - this.name = name; - - /* - var: mode - The mode the search is going to work in, such as "HTML" or "FramedHTML". - */ - this.mode = mode; - - /* - var: resultsPath - The relative path from the current HTML page to the results page directory. - */ - this.resultsPath = resultsPath; - - /* - var: keyTimeout - The timeout used between a keystroke and when a search is performed. - */ - this.keyTimeout = 0; - - /* - var: keyTimeoutLength - The length of in thousandths of a second. - */ - this.keyTimeoutLength = 500; - - /* - var: lastSearchValue - The last search string executed, or an empty string if none. - */ - this.lastSearchValue = ""; - - /* - var: lastResultsPage - The last results page. The value is only relevant if is set. - */ - this.lastResultsPage = ""; - - /* - var: deactivateTimeout - - The timeout used between when a control is deactivated and when the entire panel is deactivated. Is necessary - because a control may be deactivated in favor of another control in the same panel, in which case it should stay - active. - */ - this.deactivateTimout = 0; - - /* - var: deactivateTimeoutLength - The length of in thousandths of a second. - */ - this.deactivateTimeoutLength = 200; - - - - - // Group: DOM Elements - // ________________________________________________________________________ - - - // Function: DOMSearchField - this.DOMSearchField = function() - { return document.getElementById("MSearchField"); }; - - // Function: DOMSearchType - this.DOMSearchType = function() - { return document.getElementById("MSearchType"); }; - - // Function: DOMPopupSearchResults - this.DOMPopupSearchResults = function() - { return document.getElementById("MSearchResults"); }; - - // Function: DOMPopupSearchResultsWindow - this.DOMPopupSearchResultsWindow = function() - { return document.getElementById("MSearchResultsWindow"); }; - - // Function: DOMSearchPanel - this.DOMSearchPanel = function() - { return document.getElementById("MSearchPanel"); }; - - - - - // Group: Event Handlers - // ________________________________________________________________________ - - - /* - Function: OnSearchFieldFocus - Called when focus is added or removed from the search field. - */ - this.OnSearchFieldFocus = function(isActive) - { - this.Activate(isActive); - }; - - - /* - Function: OnSearchFieldChange - Called when the content of the search field is changed. - */ - this.OnSearchFieldChange = function() - { - if (this.keyTimeout) - { - clearTimeout(this.keyTimeout); - this.keyTimeout = 0; - }; - - var searchValue = this.DOMSearchField().value.replace(/ +/g, ""); - - if (searchValue != this.lastSearchValue) - { - if (searchValue != "") - { - this.keyTimeout = setTimeout(this.name + ".Search()", this.keyTimeoutLength); - } - else - { - if (this.mode == "HTML") - { this.DOMPopupSearchResultsWindow().style.display = "none"; }; - this.lastSearchValue = ""; - }; - }; - }; - - - /* - Function: OnSearchTypeFocus - Called when focus is added or removed from the search type. - */ - this.OnSearchTypeFocus = function(isActive) - { - this.Activate(isActive); - }; - - - /* - Function: OnSearchTypeChange - Called when the search type is changed. - */ - this.OnSearchTypeChange = function() - { - var searchValue = this.DOMSearchField().value.replace(/ +/g, ""); - - if (searchValue != "") - { - this.Search(); - }; - }; - - - - // Group: Action Functions - // ________________________________________________________________________ - - - /* - Function: CloseResultsWindow - Closes the results window. - */ - this.CloseResultsWindow = function() - { - this.DOMPopupSearchResultsWindow().style.display = "none"; - this.Activate(false, true); - }; - - - /* - Function: Search - Performs a search. - */ - this.Search = function() - { - this.keyTimeout = 0; - - var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); - var searchTopic = this.DOMSearchType().value; - - var pageExtension = searchValue.substr(0,1); - - if (pageExtension.match(/^[a-z]/i)) - { pageExtension = pageExtension.toUpperCase(); } - else if (pageExtension.match(/^[0-9]/)) - { pageExtension = 'Numbers'; } - else - { pageExtension = "Symbols"; }; - - var resultsPage; - var resultsPageWithSearch; - var hasResultsPage; - - // indexSectionsWithContent is defined in searchdata.js - if (indexSectionsWithContent[searchTopic][pageExtension] == true) - { - resultsPage = this.resultsPath + '/' + searchTopic + pageExtension + '.html'; - resultsPageWithSearch = resultsPage+'?'+escape(searchValue); - hasResultsPage = true; - } - else - { - resultsPage = this.resultsPath + '/NoResults.html'; - resultsPageWithSearch = resultsPage; - hasResultsPage = false; - }; - - var resultsFrame; - if (this.mode == "HTML") - { resultsFrame = window.frames.MSearchResults; } - else if (this.mode == "FramedHTML") - { resultsFrame = window.top.frames['Content']; }; - - - if (resultsPage != this.lastResultsPage || - - // Bug in IE. If everything becomes hidden in a run, none of them will be able to be reshown in the next for some - // reason. It counts the right number of results, and you can even read the display as "block" after setting it, but it - // just doesn't work in IE 6 or IE 7. So if we're on the right page but the previous search had no results, reload the - // page anyway to get around the bug. - (browserType == "IE" && hasResultsPage && - (!resultsFrame.searchResults || resultsFrame.searchResults.lastMatchCount == 0)) ) - - { - resultsFrame.location.href = resultsPageWithSearch; - } - - // So if the results page is right and there's no IE bug, reperform the search on the existing page. We have to check if there - // are results because NoResults.html doesn't have any JavaScript, and it would be useless to do anything on that page even - // if it did. - else if (hasResultsPage) - { - // We need to check if this exists in case the frame is present but didn't finish loading. - if (resultsFrame.searchResults) - { resultsFrame.searchResults.Search(searchValue); } - - // Otherwise just reload instead of waiting. - else - { resultsFrame.location.href = resultsPageWithSearch; }; - }; - - - var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); - - if (this.mode == "HTML" && domPopupSearchResultsWindow.style.display != "block") - { - var domSearchType = this.DOMSearchType(); - - var left = GetXPosition(domSearchType); - var top = GetYPosition(domSearchType) + domSearchType.offsetHeight; - - MoveToPosition(domPopupSearchResultsWindow, left, top); - domPopupSearchResultsWindow.style.display = 'block'; - }; - - - this.lastSearchValue = searchValue; - this.lastResultsPage = resultsPage; - }; - - - - // Group: Activation Functions - // Functions that handle whether the entire panel is active or not. - // ________________________________________________________________________ - - - /* - Function: Activate - - Activates or deactivates the search panel, resetting things to their default values if necessary. You can call this on every - control's OnBlur() and it will handle not deactivating the entire panel when focus is just switching between them transparently. - - Parameters: - - isActive - Whether you're activating or deactivating the panel. - ignoreDeactivateDelay - Set if you're positive the action will deactivate the panel and thus want to skip the delay. - */ - this.Activate = function(isActive, ignoreDeactivateDelay) - { - // We want to ignore isActive being false while the results window is open. - if (isActive || (this.mode == "HTML" && this.DOMPopupSearchResultsWindow().style.display == "block")) - { - if (this.inactivateTimeout) - { - clearTimeout(this.inactivateTimeout); - this.inactivateTimeout = 0; - }; - - this.DOMSearchPanel().className = 'MSearchPanelActive'; - - var searchField = this.DOMSearchField(); - - if (searchField.value == 'Search') - { searchField.value = ""; } - } - else if (!ignoreDeactivateDelay) - { - this.inactivateTimeout = setTimeout(this.name + ".InactivateAfterTimeout()", this.inactivateTimeoutLength); - } - else - { - this.InactivateAfterTimeout(); - }; - }; - - - /* - Function: InactivateAfterTimeout - - Called by , which is set by . Inactivation occurs on a timeout because a control may - receive OnBlur() when focus is really transferring to another control in the search panel. In this case we don't want to - actually deactivate the panel because not only would that cause a visible flicker but it could also reset the search value. - So by doing it on a timeout instead, there's a short period where the second control's OnFocus() can cancel the deactivation. - */ - this.InactivateAfterTimeout = function() - { - this.inactivateTimeout = 0; - - this.DOMSearchPanel().className = 'MSearchPanelInactive'; - this.DOMSearchField().value = "Search"; - - this.lastSearchValue = ""; - this.lastResultsPage = ""; - }; - }; - - - - -/* ________________________________________________________________________________________________________ - - Class: SearchResults - _________________________________________________________________________________________________________ - - The class that handles everything on the search results page. - _________________________________________________________________________________________________________ -*/ - - -function SearchResults(name, mode) - { - /* - var: mode - The mode the search is going to work in, such as "HTML" or "FramedHTML". - */ - this.mode = mode; - - /* - var: lastMatchCount - The number of matches from the last run of . - */ - this.lastMatchCount = 0; - - - /* - Function: Toggle - Toggles the visibility of the passed element ID. - */ - this.Toggle = function(id) - { - if (this.mode == "FramedHTML") - { return; }; - - var parentElement = document.getElementById(id); - - var element = parentElement.firstChild; - - while (element && element != parentElement) - { - if (element.nodeName == 'DIV' && element.className == 'ISubIndex') - { - if (element.style.display == 'block') - { element.style.display = "none"; } - else - { element.style.display = 'block'; } - }; - - if (element.nodeName == 'DIV' && element.hasChildNodes()) - { element = element.firstChild; } - else if (element.nextSibling) - { element = element.nextSibling; } - else - { - do - { - element = element.parentNode; - } - while (element && element != parentElement && !element.nextSibling); - - if (element && element != parentElement) - { element = element.nextSibling; }; - }; - }; - }; - - - /* - Function: Search - - Searches for the passed string. If there is no parameter, it takes it from the URL query. - - Always returns true, since other documents may try to call it and that may or may not be possible. - */ - this.Search = function(search) - { - if (!search) - { - search = window.location.search; - search = search.substring(1); // Remove the leading ? - search = unescape(search); - }; - - search = search.replace(/^ +/, ""); - search = search.replace(/ +$/, ""); - search = search.toLowerCase(); - - if (search.match(/[^a-z0-9]/)) // Just a little speedup so it doesn't have to go through the below unnecessarily. - { - search = search.replace(/\_/g, "_und"); - search = search.replace(/\ +/gi, "_spc"); - search = search.replace(/\~/g, "_til"); - search = search.replace(/\!/g, "_exc"); - search = search.replace(/\@/g, "_att"); - search = search.replace(/\#/g, "_num"); - search = search.replace(/\$/g, "_dol"); - search = search.replace(/\%/g, "_pct"); - search = search.replace(/\^/g, "_car"); - search = search.replace(/\&/g, "_amp"); - search = search.replace(/\*/g, "_ast"); - search = search.replace(/\(/g, "_lpa"); - search = search.replace(/\)/g, "_rpa"); - search = search.replace(/\-/g, "_min"); - search = search.replace(/\+/g, "_plu"); - search = search.replace(/\=/g, "_equ"); - search = search.replace(/\{/g, "_lbc"); - search = search.replace(/\}/g, "_rbc"); - search = search.replace(/\[/g, "_lbk"); - search = search.replace(/\]/g, "_rbk"); - search = search.replace(/\:/g, "_col"); - search = search.replace(/\;/g, "_sco"); - search = search.replace(/\"/g, "_quo"); - search = search.replace(/\'/g, "_apo"); - search = search.replace(/\/g, "_ran"); - search = search.replace(/\,/g, "_com"); - search = search.replace(/\./g, "_per"); - search = search.replace(/\?/g, "_que"); - search = search.replace(/\//g, "_sla"); - search = search.replace(/[^a-z0-9\_]i/gi, "_zzz"); - }; - - var resultRows = document.getElementsByTagName("div"); - var matches = 0; - - var i = 0; - while (i < resultRows.length) - { - var row = resultRows.item(i); - - if (row.className == "SRResult") - { - var rowMatchName = row.id.toLowerCase(); - rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); - - if (search.length <= rowMatchName.length && rowMatchName.substr(0, search.length) == search) - { - row.style.display = "block"; - matches++; - } - else - { row.style.display = "none"; }; - }; - - i++; - }; - - document.getElementById("Searching").style.display="none"; - - if (matches == 0) - { document.getElementById("NoMatches").style.display="block"; } - else - { document.getElementById("NoMatches").style.display="none"; } - - this.lastMatchCount = matches; - - return true; - }; - }; - diff --git a/tests/riscv-coremark/coremark/docs/html/javascript/searchdata.js b/tests/riscv-coremark/coremark/docs/html/javascript/searchdata.js deleted file mode 100644 index 901318e77..000000000 --- a/tests/riscv-coremark/coremark/docs/html/javascript/searchdata.js +++ /dev/null @@ -1,212 +0,0 @@ -var indexSectionsWithContent = { - "General": { - "Symbols": false, - "Numbers": false, - "A": false, - "B": false, - "C": true, - "D": true, - "E": false, - "F": true, - "G": true, - "H": false, - "I": true, - "J": false, - "K": false, - "L": false, - "M": true, - "N": false, - "O": false, - "P": false, - "Q": false, - "R": false, - "S": true, - "T": true, - "U": false, - "V": false, - "W": false, - "X": false, - "Y": false, - "Z": false - }, - "Variables": { - "Symbols": false, - "Numbers": false, - "A": false, - "B": false, - "C": true, - "D": true, - "E": false, - "F": false, - "G": false, - "H": false, - "I": false, - "J": false, - "K": false, - "L": true, - "M": false, - "N": false, - "O": true, - "P": true, - "Q": false, - "R": true, - "S": true, - "T": false, - "U": false, - "V": false, - "W": false, - "X": false, - "Y": false, - "Z": false - }, - "Functions": { - "Symbols": false, - "Numbers": false, - "A": false, - "B": false, - "C": true, - "D": false, - "E": false, - "F": false, - "G": true, - "H": false, - "I": true, - "J": false, - "K": false, - "L": false, - "M": true, - "N": false, - "O": false, - "P": true, - "Q": false, - "R": false, - "S": true, - "T": true, - "U": false, - "V": false, - "W": false, - "X": false, - "Y": false, - "Z": false - }, - "Files": { - "Symbols": false, - "Numbers": false, - "A": false, - "B": false, - "C": true, - "D": false, - "E": false, - "F": false, - "G": false, - "H": false, - "I": false, - "J": false, - "K": false, - "L": false, - "M": false, - "N": false, - "O": false, - "P": false, - "Q": false, - "R": true, - "S": false, - "T": false, - "U": false, - "V": false, - "W": false, - "X": false, - "Y": false, - "Z": false - }, - "Configuration": { - "Symbols": false, - "Numbers": false, - "A": false, - "B": false, - "C": true, - "D": false, - "E": false, - "F": false, - "G": false, - "H": true, - "I": false, - "J": false, - "K": false, - "L": false, - "M": true, - "N": false, - "O": false, - "P": false, - "Q": false, - "R": false, - "S": true, - "T": true, - "U": true, - "V": false, - "W": false, - "X": false, - "Y": false, - "Z": false - }, - "Types": { - "Symbols": false, - "Numbers": false, - "A": false, - "B": false, - "C": false, - "D": false, - "E": false, - "F": false, - "G": false, - "H": false, - "I": false, - "J": false, - "K": false, - "L": false, - "M": false, - "N": false, - "O": false, - "P": false, - "Q": false, - "R": false, - "S": true, - "T": false, - "U": false, - "V": false, - "W": false, - "X": false, - "Y": false, - "Z": false - }, - "BuildTargets": { - "Symbols": false, - "Numbers": false, - "A": false, - "B": false, - "C": false, - "D": false, - "E": false, - "F": false, - "G": false, - "H": false, - "I": false, - "J": false, - "K": false, - "L": false, - "M": false, - "N": false, - "O": false, - "P": true, - "Q": false, - "R": false, - "S": false, - "T": false, - "U": false, - "V": false, - "W": false, - "X": false, - "Y": false, - "Z": false - } - } \ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/BuildTargetsP.html b/tests/riscv-coremark/coremark/docs/html/search/BuildTargetsP.html deleted file mode 100644 index 65e741d65..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/BuildTargetsP.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/ConfigurationC.html b/tests/riscv-coremark/coremark/docs/html/search/ConfigurationC.html deleted file mode 100644 index 84b49ca3a..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/ConfigurationC.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/ConfigurationH.html b/tests/riscv-coremark/coremark/docs/html/search/ConfigurationH.html deleted file mode 100644 index 3b0c39213..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/ConfigurationH.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/ConfigurationM.html b/tests/riscv-coremark/coremark/docs/html/search/ConfigurationM.html deleted file mode 100644 index 022606fa2..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/ConfigurationM.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/ConfigurationS.html b/tests/riscv-coremark/coremark/docs/html/search/ConfigurationS.html deleted file mode 100644 index d26de19b9..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/ConfigurationS.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/ConfigurationT.html b/tests/riscv-coremark/coremark/docs/html/search/ConfigurationT.html deleted file mode 100644 index 183daf1ee..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/ConfigurationT.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/ConfigurationU.html b/tests/riscv-coremark/coremark/docs/html/search/ConfigurationU.html deleted file mode 100644 index d9b46a52d..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/ConfigurationU.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/ConfigurationsH.html b/tests/riscv-coremark/coremark/docs/html/search/ConfigurationsH.html deleted file mode 100644 index ade2ab757..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/ConfigurationsH.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/ConfigurationsM.html b/tests/riscv-coremark/coremark/docs/html/search/ConfigurationsM.html deleted file mode 100644 index baa189221..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/ConfigurationsM.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/ConfigurationsS.html b/tests/riscv-coremark/coremark/docs/html/search/ConfigurationsS.html deleted file mode 100644 index ceb8abf51..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/ConfigurationsS.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/ConfigurationsT.html b/tests/riscv-coremark/coremark/docs/html/search/ConfigurationsT.html deleted file mode 100644 index ef138108f..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/ConfigurationsT.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/FilesC.html b/tests/riscv-coremark/coremark/docs/html/search/FilesC.html deleted file mode 100644 index e2b01c4b1..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/FilesC.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/FilesR.html b/tests/riscv-coremark/coremark/docs/html/search/FilesR.html deleted file mode 100644 index 6202fb7c7..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/FilesR.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/FunctionsC.html b/tests/riscv-coremark/coremark/docs/html/search/FunctionsC.html deleted file mode 100644 index 43993db85..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/FunctionsC.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/FunctionsG.html b/tests/riscv-coremark/coremark/docs/html/search/FunctionsG.html deleted file mode 100644 index 217e8540b..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/FunctionsG.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/FunctionsI.html b/tests/riscv-coremark/coremark/docs/html/search/FunctionsI.html deleted file mode 100644 index f17354d65..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/FunctionsI.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/FunctionsM.html b/tests/riscv-coremark/coremark/docs/html/search/FunctionsM.html deleted file mode 100644 index 345e2ba83..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/FunctionsM.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/FunctionsP.html b/tests/riscv-coremark/coremark/docs/html/search/FunctionsP.html deleted file mode 100644 index c4b9d2dbe..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/FunctionsP.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/FunctionsS.html b/tests/riscv-coremark/coremark/docs/html/search/FunctionsS.html deleted file mode 100644 index 33dfa5fa4..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/FunctionsS.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/FunctionsT.html b/tests/riscv-coremark/coremark/docs/html/search/FunctionsT.html deleted file mode 100644 index 65ae37ccd..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/FunctionsT.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/GeneralB.html b/tests/riscv-coremark/coremark/docs/html/search/GeneralB.html deleted file mode 100644 index 66e27e49b..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/GeneralB.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/GeneralC.html b/tests/riscv-coremark/coremark/docs/html/search/GeneralC.html deleted file mode 100644 index f1ac9d2d3..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/GeneralC.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/GeneralD.html b/tests/riscv-coremark/coremark/docs/html/search/GeneralD.html deleted file mode 100644 index b3c21002d..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/GeneralD.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/GeneralF.html b/tests/riscv-coremark/coremark/docs/html/search/GeneralF.html deleted file mode 100644 index 126a24c57..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/GeneralF.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/GeneralG.html b/tests/riscv-coremark/coremark/docs/html/search/GeneralG.html deleted file mode 100644 index 217e8540b..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/GeneralG.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/GeneralH.html b/tests/riscv-coremark/coremark/docs/html/search/GeneralH.html deleted file mode 100644 index 3b0c39213..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/GeneralH.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/GeneralI.html b/tests/riscv-coremark/coremark/docs/html/search/GeneralI.html deleted file mode 100644 index f17354d65..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/GeneralI.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/GeneralL.html b/tests/riscv-coremark/coremark/docs/html/search/GeneralL.html deleted file mode 100644 index 22a700c93..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/GeneralL.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/GeneralM.html b/tests/riscv-coremark/coremark/docs/html/search/GeneralM.html deleted file mode 100644 index 57f55b249..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/GeneralM.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/GeneralO.html b/tests/riscv-coremark/coremark/docs/html/search/GeneralO.html deleted file mode 100644 index b14f18001..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/GeneralO.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/GeneralP.html b/tests/riscv-coremark/coremark/docs/html/search/GeneralP.html deleted file mode 100644 index 063a6c13e..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/GeneralP.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/GeneralR.html b/tests/riscv-coremark/coremark/docs/html/search/GeneralR.html deleted file mode 100644 index 24f33954e..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/GeneralR.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/GeneralS.html b/tests/riscv-coremark/coremark/docs/html/search/GeneralS.html deleted file mode 100644 index a18c40715..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/GeneralS.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/GeneralT.html b/tests/riscv-coremark/coremark/docs/html/search/GeneralT.html deleted file mode 100644 index a2fde7e28..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/GeneralT.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/GeneralU.html b/tests/riscv-coremark/coremark/docs/html/search/GeneralU.html deleted file mode 100644 index d9b46a52d..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/GeneralU.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/GeneralV.html b/tests/riscv-coremark/coremark/docs/html/search/GeneralV.html deleted file mode 100644 index 9c53066a5..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/GeneralV.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/GeneralW.html b/tests/riscv-coremark/coremark/docs/html/search/GeneralW.html deleted file mode 100644 index e22dcb062..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/GeneralW.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/NoResults.html b/tests/riscv-coremark/coremark/docs/html/search/NoResults.html deleted file mode 100644 index 49e385959..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/NoResults.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - -
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/TypesS.html b/tests/riscv-coremark/coremark/docs/html/search/TypesS.html deleted file mode 100644 index 3d87649f5..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/TypesS.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/VariablesC.html b/tests/riscv-coremark/coremark/docs/html/search/VariablesC.html deleted file mode 100644 index d3bdfef76..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/VariablesC.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/VariablesD.html b/tests/riscv-coremark/coremark/docs/html/search/VariablesD.html deleted file mode 100644 index d4b961d3c..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/VariablesD.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/VariablesL.html b/tests/riscv-coremark/coremark/docs/html/search/VariablesL.html deleted file mode 100644 index 09e4b9abc..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/VariablesL.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/VariablesO.html b/tests/riscv-coremark/coremark/docs/html/search/VariablesO.html deleted file mode 100644 index b14f18001..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/VariablesO.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/VariablesP.html b/tests/riscv-coremark/coremark/docs/html/search/VariablesP.html deleted file mode 100644 index c687999aa..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/VariablesP.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/VariablesR.html b/tests/riscv-coremark/coremark/docs/html/search/VariablesR.html deleted file mode 100644 index 9cd771d25..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/VariablesR.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/search/VariablesS.html b/tests/riscv-coremark/coremark/docs/html/search/VariablesS.html deleted file mode 100644 index a1280a7d0..000000000 --- a/tests/riscv-coremark/coremark/docs/html/search/VariablesS.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - -
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/tests/riscv-coremark/coremark/docs/html/styles/1.css b/tests/riscv-coremark/coremark/docs/html/styles/1.css deleted file mode 100644 index d5a8bd6a2..000000000 --- a/tests/riscv-coremark/coremark/docs/html/styles/1.css +++ /dev/null @@ -1,767 +0,0 @@ -/* - IMPORTANT: If you're editing this file in the output directory of one of - your projects, your changes will be overwritten the next time you run - Natural Docs. Instead, copy this file to your project directory, make your - changes, and you can use it with -s. Even better would be to make a CSS - file in your project directory with only your changes, which you can then - use with -s [original style] [your changes]. - - On the other hand, if you're editing this file in the Natural Docs styles - directory, the changes will automatically be applied to all your projects - that use this style the next time Natural Docs is run on them. - - This file is part of Natural Docs, which is Copyright (C) 2003-2008 Greg Valure - Natural Docs is licensed under the GPL -*/ - -body { - font: 10pt Verdana, Arial, sans-serif; - color: #000000; - margin: 0; padding: 0; - } - -.ContentPage, -.IndexPage, -.FramedMenuPage { - background-color: #E8E8E8; - } -.FramedContentPage, -.FramedIndexPage, -.FramedSearchResultsPage, -.PopupSearchResultsPage { - background-color: #FFFFFF; - } - - -a:link, -a:visited { color: #900000; text-decoration: none } -a:hover { color: #900000; text-decoration: underline } -a:active { color: #FF0000; text-decoration: underline } - -td { - vertical-align: top } - -img { border: 0; } - - -/* - Comment out this line to use web-style paragraphs (blank line between - paragraphs, no indent) instead of print-style paragraphs (no blank line, - indented.) -*/ -p { - text-indent: 5ex; margin: 0 } - - -/* Can't use something like display: none or it won't break. */ -.HB { - font-size: 1px; - visibility: hidden; - } - -/* Blockquotes are used as containers for things that may need to scroll. */ -blockquote { - padding: 0; - margin: 0; - overflow: auto; - } - - -.Firefox1 blockquote { - padding-bottom: .5em; - } - -/* Turn off scrolling when printing. */ -@media print { - blockquote { - overflow: visible; - } - .IE blockquote { - width: auto; - } - } - - - -#Menu { - font-size: 9pt; - padding: 10px 0 0 0; - } -.ContentPage #Menu, -.IndexPage #Menu { - position: absolute; - top: 0; - left: 0; - width: 31ex; - overflow: hidden; - } -.ContentPage .Firefox #Menu, -.IndexPage .Firefox #Menu { - width: 27ex; - } - - - .MTitle { - font-size: 16pt; font-weight: bold; font-variant: small-caps; - text-align: center; - padding: 5px 10px 15px 10px; - border-bottom: 1px dotted #000000; - margin-bottom: 15px } - - .MSubTitle { - font-size: 9pt; font-weight: normal; font-variant: normal; - margin-top: 1ex; margin-bottom: 5px } - - - .MEntry a:link, - .MEntry a:hover, - .MEntry a:visited { color: #606060; margin-right: 0 } - .MEntry a:active { color: #A00000; margin-right: 0 } - - - .MGroup { - font-variant: small-caps; font-weight: bold; - margin: 1em 0 1em 10px; - } - - .MGroupContent { - font-variant: normal; font-weight: normal } - - .MGroup a:link, - .MGroup a:hover, - .MGroup a:visited { color: #545454; margin-right: 10px } - .MGroup a:active { color: #A00000; margin-right: 10px } - - - .MFile, - .MText, - .MLink, - .MIndex { - padding: 1px 17px 2px 10px; - margin: .25em 0 .25em 0; - } - - .MText { - font-size: 8pt; font-style: italic } - - .MLink { - font-style: italic } - - #MSelected { - color: #000000; background-color: #FFFFFF; - /* Replace padding with border. */ - padding: 0 10px 0 10px; - border-width: 1px 2px 2px 0; border-style: solid; border-color: #000000; - margin-right: 5px; - } - - /* Close off the left side when its in a group. */ - .MGroup #MSelected { - padding-left: 9px; border-left-width: 1px } - - /* A treat for Mozilla users. Blatantly non-standard. Will be replaced with CSS 3 attributes when finalized/supported. */ - .Firefox #MSelected { - -moz-border-radius-topright: 10px; - -moz-border-radius-bottomright: 10px } - .Firefox .MGroup #MSelected { - -moz-border-radius-topleft: 10px; - -moz-border-radius-bottomleft: 10px } - - - #MSearchPanel { - padding: 0px 6px; - margin: .25em 0; - } - - - #MSearchField { - font: italic 9pt Verdana, sans-serif; - color: #606060; - background-color: #E8E8E8; - border: none; - padding: 2px 4px; - width: 100%; - } - /* Only Opera gets it right. */ - .Firefox #MSearchField, - .IE #MSearchField, - .Safari #MSearchField { - width: 94%; - } - .Opera9 #MSearchField, - .Konqueror #MSearchField { - width: 97%; - } - .FramedMenuPage .Firefox #MSearchField, - .FramedMenuPage .Safari #MSearchField, - .FramedMenuPage .Konqueror #MSearchField { - width: 98%; - } - - /* Firefox doesn't do this right in frames without #MSearchPanel added on. - It's presence doesn't hurt anything other browsers. */ - #MSearchPanel.MSearchPanelInactive:hover #MSearchField { - background-color: #FFFFFF; - border: 1px solid #C0C0C0; - padding: 1px 3px; - } - .MSearchPanelActive #MSearchField { - background-color: #FFFFFF; - border: 1px solid #C0C0C0; - font-style: normal; - padding: 1px 3px; - } - - #MSearchType { - visibility: hidden; - font: 8pt Verdana, sans-serif; - width: 98%; - padding: 0; - border: 1px solid #C0C0C0; - } - .MSearchPanelActive #MSearchType, - /* As mentioned above, Firefox doesn't do this right in frames without #MSearchPanel added on. */ - #MSearchPanel.MSearchPanelInactive:hover #MSearchType, - #MSearchType:focus { - visibility: visible; - color: #606060; - } - #MSearchType option#MSearchEverything { - font-weight: bold; - } - - .Opera8 .MSearchPanelInactive:hover, - .Opera8 .MSearchPanelActive { - margin-left: -1px; - } - - - iframe#MSearchResults { - width: 60ex; - height: 15em; - } - #MSearchResultsWindow { - display: none; - position: absolute; - left: 0; top: 0; - border: 1px solid #000000; - background-color: #E8E8E8; - } - #MSearchResultsWindowClose { - font-weight: bold; - font-size: 8pt; - display: block; - padding: 2px 5px; - } - #MSearchResultsWindowClose:link, - #MSearchResultsWindowClose:visited { - color: #000000; - text-decoration: none; - } - #MSearchResultsWindowClose:active, - #MSearchResultsWindowClose:hover { - color: #800000; - text-decoration: none; - background-color: #F4F4F4; - } - - - - -#Content { - padding-bottom: 15px; - } - -.ContentPage #Content { - border-width: 0 0 1px 1px; - border-style: solid; - border-color: #000000; - background-color: #FFFFFF; - font-size: 9pt; /* To make 31ex match the menu's 31ex. */ - margin-left: 31ex; - } -.ContentPage .Firefox #Content { - margin-left: 27ex; - } - - - - .CTopic { - font-size: 10pt; - margin-bottom: 3em; - } - - - .CTitle { - font-size: 12pt; font-weight: bold; - border-width: 0 0 1px 0; border-style: solid; border-color: #A0A0A0; - margin: 0 15px .5em 15px } - - .CGroup .CTitle { - font-size: 16pt; font-variant: small-caps; - padding-left: 15px; padding-right: 15px; - border-width: 0 0 2px 0; border-color: #000000; - margin-left: 0; margin-right: 0 } - - .CClass .CTitle, - .CInterface .CTitle, - .CDatabase .CTitle, - .CDatabaseTable .CTitle, - .CSection .CTitle { - font-size: 18pt; - color: #FFFFFF; background-color: #A0A0A0; - padding: 10px 15px 10px 15px; - border-width: 2px 0; border-color: #000000; - margin-left: 0; margin-right: 0 } - - #MainTopic .CTitle { - font-size: 20pt; - color: #FFFFFF; background-color: #7070C0; - padding: 10px 15px 10px 15px; - border-width: 0 0 3px 0; border-color: #000000; - margin-left: 0; margin-right: 0 } - - .CBody { - margin-left: 15px; margin-right: 15px } - - - .CToolTip { - position: absolute; visibility: hidden; - left: 0; top: 0; - background-color: #FFFFE0; - padding: 5px; - border-width: 1px 2px 2px 1px; border-style: solid; border-color: #000000; - font-size: 8pt; - } - - .Opera .CToolTip { - max-width: 98%; - } - - /* Scrollbars would be useless. */ - .CToolTip blockquote { - overflow: hidden; - } - .IE6 .CToolTip blockquote { - overflow: visible; - } - - .CHeading { - font-weight: bold; font-size: 10pt; - margin: 1.5em 0 .5em 0; - } - - .CBody pre { - font: 10pt "Courier New", Courier, monospace; - margin: 1em 0; - } - - .CBody ul { - /* I don't know why CBody's margin doesn't apply, but it's consistent across browsers so whatever. - Reapply it here as padding. */ - padding-left: 15px; padding-right: 15px; - margin: .5em 5ex .5em 5ex; - } - - .CDescriptionList { - margin: .5em 5ex 0 5ex } - - .CDLEntry { - font: 10pt "Courier New", Courier, monospace; color: #808080; - padding-bottom: .25em; - white-space: nowrap } - - .CDLDescription { - font-size: 10pt; /* For browsers that don't inherit correctly, like Opera 5. */ - padding-bottom: .5em; padding-left: 5ex } - - - .CTopic img { - text-align: center; - display: block; - margin: 1em auto; - } - .CImageCaption { - font-variant: small-caps; - font-size: 8pt; - color: #808080; - text-align: center; - position: relative; - top: 1em; - } - - .CImageLink { - color: #808080; - font-style: italic; - } - a.CImageLink:link, - a.CImageLink:visited, - a.CImageLink:hover { color: #808080 } - - - - - -.Prototype { - font: 10pt "Courier New", Courier, monospace; - padding: 5px 3ex; - border-width: 1px; border-style: solid; - margin: 0 5ex 1.5em 5ex; - } - - .Prototype td { - font-size: 10pt; - } - - .PDefaultValue, - .PDefaultValuePrefix, - .PTypePrefix { - color: #8F8F8F; - } - .PTypePrefix { - text-align: right; - } - .PAfterParameters { - vertical-align: bottom; - } - - .IE .Prototype table { - padding: 0; - } - - .CFunction .Prototype { - background-color: #F4F4F4; border-color: #D0D0D0 } - .CProperty .Prototype { - background-color: #F4F4FF; border-color: #C0C0E8 } - .CVariable .Prototype { - background-color: #FFFFF0; border-color: #E0E0A0 } - - .CClass .Prototype { - border-width: 1px 2px 2px 1px; border-style: solid; border-color: #A0A0A0; - background-color: #F4F4F4; - } - .CInterface .Prototype { - border-width: 1px 2px 2px 1px; border-style: solid; border-color: #A0A0D0; - background-color: #F4F4FF; - } - - .CDatabaseIndex .Prototype, - .CConstant .Prototype { - background-color: #D0D0D0; border-color: #000000 } - .CType .Prototype, - .CEnumeration .Prototype { - background-color: #FAF0F0; border-color: #E0B0B0; - } - .CDatabaseTrigger .Prototype, - .CEvent .Prototype, - .CDelegate .Prototype { - background-color: #F0FCF0; border-color: #B8E4B8 } - - .CToolTip .Prototype { - margin: 0 0 .5em 0; - white-space: nowrap; - } - - - - - -.Summary { - margin: 1.5em 5ex 0 5ex } - - .STitle { - font-size: 12pt; font-weight: bold; - margin-bottom: .5em } - - - .SBorder { - background-color: #FFFFF0; - padding: 15px; - border: 1px solid #C0C060 } - - /* In a frame IE 6 will make them too long unless you set the width to 100%. Without frames it will be correct without a width - or slightly too long (but not enough to scroll) with a width. This arbitrary weirdness simply astounds me. IE 7 has the same - problem with frames, haven't tested it without. */ - .FramedContentPage .IE .SBorder { - width: 100% } - - /* A treat for Mozilla users. Blatantly non-standard. Will be replaced with CSS 3 attributes when finalized/supported. */ - .Firefox .SBorder { - -moz-border-radius: 20px } - - - .STable { - font-size: 9pt; width: 100% } - - .SEntry { - width: 30% } - .SDescription { - width: 70% } - - - .SMarked { - background-color: #F8F8D8 } - - .SDescription { padding-left: 2ex } - .SIndent1 .SEntry { padding-left: 1.5ex } .SIndent1 .SDescription { padding-left: 3.5ex } - .SIndent2 .SEntry { padding-left: 3.0ex } .SIndent2 .SDescription { padding-left: 5.0ex } - .SIndent3 .SEntry { padding-left: 4.5ex } .SIndent3 .SDescription { padding-left: 6.5ex } - .SIndent4 .SEntry { padding-left: 6.0ex } .SIndent4 .SDescription { padding-left: 8.0ex } - .SIndent5 .SEntry { padding-left: 7.5ex } .SIndent5 .SDescription { padding-left: 9.5ex } - - .SDescription a { color: #800000} - .SDescription a:active { color: #A00000 } - - .SGroup td { - padding-top: .5em; padding-bottom: .25em } - - .SGroup .SEntry { - font-weight: bold; font-variant: small-caps } - - .SGroup .SEntry a { color: #800000 } - .SGroup .SEntry a:active { color: #F00000 } - - - .SMain td, - .SClass td, - .SDatabase td, - .SDatabaseTable td, - .SSection td { - font-size: 10pt; - padding-bottom: .25em } - - .SClass td, - .SDatabase td, - .SDatabaseTable td, - .SSection td { - padding-top: 1em } - - .SMain .SEntry, - .SClass .SEntry, - .SDatabase .SEntry, - .SDatabaseTable .SEntry, - .SSection .SEntry { - font-weight: bold; - } - - .SMain .SEntry a, - .SClass .SEntry a, - .SDatabase .SEntry a, - .SDatabaseTable .SEntry a, - .SSection .SEntry a { color: #000000 } - - .SMain .SEntry a:active, - .SClass .SEntry a:active, - .SDatabase .SEntry a:active, - .SDatabaseTable .SEntry a:active, - .SSection .SEntry a:active { color: #A00000 } - - - - - -.ClassHierarchy { - margin: 0 15px 1em 15px } - - .CHEntry { - border-width: 1px 2px 2px 1px; border-style: solid; border-color: #A0A0A0; - margin-bottom: 3px; - padding: 2px 2ex; - font-size: 10pt; - background-color: #F4F4F4; color: #606060; - } - - .Firefox .CHEntry { - -moz-border-radius: 4px; - } - - .CHCurrent .CHEntry { - font-weight: bold; - border-color: #000000; - color: #000000; - } - - .CHChildNote .CHEntry { - font-style: italic; - font-size: 8pt; - } - - .CHIndent { - margin-left: 3ex; - } - - .CHEntry a:link, - .CHEntry a:visited, - .CHEntry a:hover { - color: #606060; - } - .CHEntry a:active { - color: #800000; - } - - - - - -#Index { - background-color: #FFFFFF; - } - -/* As opposed to .PopupSearchResultsPage #Index */ -.IndexPage #Index, -.FramedIndexPage #Index, -.FramedSearchResultsPage #Index { - padding: 15px; - } - -.IndexPage #Index { - border-width: 0 0 1px 1px; - border-style: solid; - border-color: #000000; - font-size: 9pt; /* To make 27ex match the menu's 27ex. */ - margin-left: 27ex; - } - - - .IPageTitle { - font-size: 20pt; font-weight: bold; - color: #FFFFFF; background-color: #7070C0; - padding: 10px 15px 10px 15px; - border-width: 0 0 3px 0; border-color: #000000; border-style: solid; - margin: -15px -15px 0 -15px } - - .FramedSearchResultsPage .IPageTitle { - margin-bottom: 15px; - } - - .INavigationBar { - font-size: 10pt; - text-align: center; - background-color: #FFFFF0; - padding: 5px; - border-bottom: solid 1px black; - margin: 0 -15px 15px -15px; - } - - .INavigationBar a { - font-weight: bold } - - .IHeading { - font-size: 16pt; font-weight: bold; - padding: 2.5em 0 .5em 0; - text-align: center; - width: 3.5ex; - } - #IFirstHeading { - padding-top: 0; - } - - .IEntry { - font-size: 10pt; - padding-left: 1ex; - } - .PopupSearchResultsPage .IEntry { - font-size: 8pt; - padding: 1px 5px; - } - .PopupSearchResultsPage .Opera9 .IEntry, - .FramedSearchResultsPage .Opera9 .IEntry { - text-align: left; - } - .FramedSearchResultsPage .IEntry { - padding: 0; - } - - .ISubIndex { - padding-left: 3ex; padding-bottom: .5em } - .PopupSearchResultsPage .ISubIndex { - display: none; - } - - /* While it may cause some entries to look like links when they aren't, I found it's much easier to read the - index if everything's the same color. */ - .ISymbol { - font-weight: bold; color: #900000 } - - .IndexPage .ISymbolPrefix, - .FramedIndexPage .ISymbolPrefix { - font-size: 10pt; - text-align: right; - color: #C47C7C; - background-color: #F8F8F8; - border-right: 3px solid #E0E0E0; - border-left: 1px solid #E0E0E0; - padding: 0 1px 0 2px; - } - .PopupSearchResultsPage .ISymbolPrefix, - .FramedSearchResultsPage .ISymbolPrefix { - color: #900000; - } - .PopupSearchResultsPage .ISymbolPrefix { - font-size: 8pt; - } - - .IndexPage #IFirstSymbolPrefix, - .FramedIndexPage #IFirstSymbolPrefix { - border-top: 1px solid #E0E0E0; - } - .IndexPage #ILastSymbolPrefix, - .FramedIndexPage #ILastSymbolPrefix { - border-bottom: 1px solid #E0E0E0; - } - .IndexPage #IOnlySymbolPrefix, - .FramedIndexPage #IOnlySymbolPrefix { - border-top: 1px solid #E0E0E0; - border-bottom: 1px solid #E0E0E0; - } - - a.IParent, - a.IFile { - display: block; - } - - .PopupSearchResultsPage .SRStatus { - padding: 2px 5px; - font-size: 8pt; - font-style: italic; - } - .FramedSearchResultsPage .SRStatus { - font-size: 10pt; - font-style: italic; - } - - .SRResult { - display: none; - } - - - -#Footer { - font-size: 8pt; - color: #989898; - text-align: right; - } - -#Footer p { - text-indent: 0; - margin-bottom: .5em; - } - -.ContentPage #Footer, -.IndexPage #Footer { - text-align: right; - margin: 2px; - } - -.FramedMenuPage #Footer { - text-align: center; - margin: 5em 10px 10px 10px; - padding-top: 1em; - border-top: 1px solid #C8C8C8; - } - - #Footer a:link, - #Footer a:hover, - #Footer a:visited { color: #989898 } - #Footer a:active { color: #A00000 } - diff --git a/tests/riscv-coremark/coremark/docs/html/styles/2.css b/tests/riscv-coremark/coremark/docs/html/styles/2.css deleted file mode 100644 index 69a1d1a7a..000000000 --- a/tests/riscv-coremark/coremark/docs/html/styles/2.css +++ /dev/null @@ -1,6 +0,0 @@ -#Menu { - padding: 48px 0 0 0; - background: url(file:../../coremark_logo.jpg) no-repeat; - background-position: 30px 10px; - } - diff --git a/tests/riscv-coremark/coremark/docs/html/styles/main.css b/tests/riscv-coremark/coremark/docs/html/styles/main.css deleted file mode 100644 index a672a9492..000000000 --- a/tests/riscv-coremark/coremark/docs/html/styles/main.css +++ /dev/null @@ -1,2 +0,0 @@ -@import URL("1.css"); -@import URL("2.css"); diff --git a/tests/riscv-coremark/coremark/freebsd/core_portme.mak b/tests/riscv-coremark/coremark/freebsd/core_portme.mak deleted file mode 100644 index 97b6d6ace..000000000 --- a/tests/riscv-coremark/coremark/freebsd/core_portme.mak +++ /dev/null @@ -1,17 +0,0 @@ -# Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# Original Author: Shay Gal-on - -include posix/core_portme.mak diff --git a/tests/riscv-coremark/coremark/linux/core_portme.c b/tests/riscv-coremark/coremark/linux/core_portme.c deleted file mode 100755 index 6b63610d1..000000000 --- a/tests/riscv-coremark/coremark/linux/core_portme.c +++ /dev/null @@ -1,338 +0,0 @@ -/* -Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Original Author: Shay Gal-on -*/ - -#include -#include -#include "coremark.h" -#if CALLGRIND_RUN -#include -#endif - -#if (MEM_METHOD==MEM_MALLOC) -#include -/* Function: portable_malloc - Provide malloc() functionality in a platform specific way. -*/ -void *portable_malloc(size_t size) { - return malloc(size); -} -/* Function: portable_free - Provide free() functionality in a platform specific way. -*/ -void portable_free(void *p) { - free(p); -} -#else -void *portable_malloc(size_t size) { - return NULL; -} -void portable_free(void *p) { - p=NULL; -} -#endif - -#if (SEED_METHOD==SEED_VOLATILE) -#if VALIDATION_RUN - volatile ee_s32 seed1_volatile=0x3415; - volatile ee_s32 seed2_volatile=0x3415; - volatile ee_s32 seed3_volatile=0x66; -#endif -#if PERFORMANCE_RUN - volatile ee_s32 seed1_volatile=0x0; - volatile ee_s32 seed2_volatile=0x0; - volatile ee_s32 seed3_volatile=0x66; -#endif -#if PROFILE_RUN - volatile ee_s32 seed1_volatile=0x8; - volatile ee_s32 seed2_volatile=0x8; - volatile ee_s32 seed3_volatile=0x8; -#endif - volatile ee_s32 seed4_volatile=ITERATIONS; - volatile ee_s32 seed5_volatile=0; -#endif -/* Porting: Timing functions - How to capture time and convert to seconds must be ported to whatever is supported by the platform. - e.g. Read value from on board RTC, read value from cpu clock cycles performance counter etc. - Sample implementation for standard time.h and windows.h definitions included. -*/ -/* Define: TIMER_RES_DIVIDER - Divider to trade off timer resolution and total time that can be measured. - - Use lower values to increase resolution, but make sure that overflow does not occur. - If there are issues with the return value overflowing, increase this value. - */ -#if USE_CLOCK - #define NSECS_PER_SEC CLOCKS_PER_SEC - #define EE_TIMER_TICKER_RATE 1000 - #define CORETIMETYPE clock_t - #define GETMYTIME(_t) (*_t=clock()) - #define MYTIMEDIFF(fin,ini) ((fin)-(ini)) - #define TIMER_RES_DIVIDER 1 - #define SAMPLE_TIME_IMPLEMENTATION 1 -#elif defined(_MSC_VER) - #define NSECS_PER_SEC 10000000 - #define EE_TIMER_TICKER_RATE 1000 - #define CORETIMETYPE FILETIME - #define GETMYTIME(_t) GetSystemTimeAsFileTime(_t) - #define MYTIMEDIFF(fin,ini) (((*(__int64*)&fin)-(*(__int64*)&ini))/TIMER_RES_DIVIDER) - /* setting to millisces resolution by default with MSDEV */ - #ifndef TIMER_RES_DIVIDER - #define TIMER_RES_DIVIDER 1000 - #endif - #define SAMPLE_TIME_IMPLEMENTATION 1 -#elif HAS_TIME_H - #define NSECS_PER_SEC 1000000000 - #define EE_TIMER_TICKER_RATE 1000 - #define CORETIMETYPE struct timespec - #define GETMYTIME(_t) clock_gettime(CLOCK_REALTIME,_t) - #define MYTIMEDIFF(fin,ini) ((fin.tv_sec-ini.tv_sec)*(NSECS_PER_SEC/TIMER_RES_DIVIDER)+(fin.tv_nsec-ini.tv_nsec)/TIMER_RES_DIVIDER) - /* setting to 1/1000 of a second resolution by default with linux */ - #ifndef TIMER_RES_DIVIDER - #define TIMER_RES_DIVIDER 1000000 - #endif - #define SAMPLE_TIME_IMPLEMENTATION 1 -#else - #define SAMPLE_TIME_IMPLEMENTATION 0 -#endif -#define EE_TICKS_PER_SEC (NSECS_PER_SEC / TIMER_RES_DIVIDER) - -#if SAMPLE_TIME_IMPLEMENTATION -/** Define Host specific (POSIX), or target specific global time variables. */ -static CORETIMETYPE start_time_val, stop_time_val; - -/* Function: start_time - This function will be called right before starting the timed portion of the benchmark. - - Implementation may be capturing a system timer (as implemented in the example code) - or zeroing some system parameters - e.g. setting the cpu clocks cycles to 0. -*/ -void start_time(void) { - GETMYTIME(&start_time_val ); -#if CALLGRIND_RUN - CALLGRIND_START_INSTRUMENTATION -#endif -#if MICA - asm volatile("int3");/*1 */ -#endif -} -/* Function: stop_time - This function will be called right after ending the timed portion of the benchmark. - - Implementation may be capturing a system timer (as implemented in the example code) - or other system parameters - e.g. reading the current value of cpu cycles counter. -*/ -void stop_time(void) { -#if CALLGRIND_RUN - CALLGRIND_STOP_INSTRUMENTATION -#endif -#if MICA - asm volatile("int3");/*1 */ -#endif - GETMYTIME(&stop_time_val ); -} -/* Function: get_time - Return an abstract "ticks" number that signifies time on the system. - - Actual value returned may be cpu cycles, milliseconds or any other value, - as long as it can be converted to seconds by . - This methodology is taken to accomodate any hardware or simulated platform. - The sample implementation returns millisecs by default, - and the resolution is controlled by -*/ -CORE_TICKS get_time(void) { - CORE_TICKS elapsed=(CORE_TICKS)(MYTIMEDIFF(stop_time_val, start_time_val)); - return elapsed; -} -/* Function: time_in_secs - Convert the value returned by get_time to seconds. - - The type is used to accomodate systems with no support for floating point. - Default implementation implemented by the EE_TICKS_PER_SEC macro above. -*/ -secs_ret time_in_secs(CORE_TICKS ticks) { - secs_ret retval=((secs_ret)ticks) / (secs_ret)EE_TICKS_PER_SEC; - return retval; -} -#else -#error "Please implement timing functionality in core_portme.c" -#endif /* SAMPLE_TIME_IMPLEMENTATION */ - -ee_u32 default_num_contexts=MULTITHREAD; - -/* Function: portable_init - Target specific initialization code - Test for some common mistakes. -*/ -void portable_init(core_portable *p, int *argc, char *argv[]) -{ -#if PRINT_ARGS - int i; - for (i=0; i<*argc; i++) { - ee_printf("Arg[%d]=%s\n",i,argv[i]); - } -#endif - if (sizeof(ee_ptr_int) != sizeof(ee_u8 *)) { - ee_printf("ERROR! Please define ee_ptr_int to a type that holds a pointer!\n"); - } - if (sizeof(ee_u32) != 4) { - ee_printf("ERROR! Please define ee_u32 to a 32b unsigned type!\n"); - } -#if (MAIN_HAS_NOARGC && (SEED_METHOD==SEED_ARG)) - ee_printf("ERROR! Main has no argc, but SEED_METHOD defined to SEED_ARG!\n"); -#endif - -#if (MULTITHREAD>1) && (SEED_METHOD==SEED_ARG) - { - int nargs=*argc,i; - if ((nargs>1) && (*argv[1]=='M')) { - default_num_contexts=parseval(argv[1]+1); - if (default_num_contexts>MULTITHREAD) - default_num_contexts=MULTITHREAD; - /* Shift args since first arg is directed to the portable part and not to coremark main */ - --nargs; - for (i=1; i*/ - p->portable_id=1; -} -/* Function: portable_fini - Target specific final code -*/ -void portable_fini(core_portable *p) -{ - p->portable_id=0; -} - -#if (MULTITHREAD>1) - -/* Function: core_start_parallel - Start benchmarking in a parallel context. - - Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets. - Other implementations using MCAPI or other standards can easily be devised. -*/ -/* Function: core_stop_parallel - Stop a parallel context execution of coremark, and gather the results. - - Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets. - Other implementations using MCAPI or other standards can easily be devised. -*/ -#if USE_PTHREAD -ee_u8 core_start_parallel(core_results *res) { - return (ee_u8)pthread_create(&(res->port.thread),NULL,iterate,(void *)res); -} -ee_u8 core_stop_parallel(core_results *res) { - void *retval; - return (ee_u8)pthread_join(res->port.thread,&retval); -} -#elif USE_FORK -static int key_id=0; -ee_u8 core_start_parallel(core_results *res) { - key_t key=4321+key_id; - key_id++; - res->port.pid=fork(); - res->port.shmid=shmget(key, 8, IPC_CREAT | 0666); - if (res->port.shmid<0) { - ee_printf("ERROR in shmget!\n"); - } - if (res->port.pid==0) { - iterate(res); - res->port.shm=shmat(res->port.shmid, NULL, 0); - /* copy the validation values to the shared memory area and quit*/ - if (res->port.shm == (char *) -1) { - ee_printf("ERROR in child shmat!\n"); - } else { - memcpy(res->port.shm,&(res->crc),8); - shmdt(res->port.shm); - } - exit(0); - } - return 1; -} -ee_u8 core_stop_parallel(core_results *res) { - int status; - pid_t wpid = waitpid(res->port.pid,&status,WUNTRACED); - if (wpid != res->port.pid) { - ee_printf("ERROR waiting for child.\n"); - if (errno == ECHILD) ee_printf("errno=No such child %d\n",res->port.pid); - if (errno == EINTR) ee_printf("errno=Interrupted\n"); - return 0; - } - /* after process is done, get the values from the shared memory area */ - res->port.shm=shmat(res->port.shmid, NULL, 0); - if (res->port.shm == (char *) -1) { - ee_printf("ERROR in parent shmat!\n"); - return 0; - } - memcpy(&(res->crc),res->port.shm,8); - shmdt(res->port.shm); - return 1; -} -#elif USE_SOCKET -static int key_id=0; -ee_u8 core_start_parallel(core_results *res) { - int bound, buffer_length=8; - res->port.sa.sin_family = AF_INET; - res->port.sa.sin_addr.s_addr = htonl(0x7F000001); - res->port.sa.sin_port = htons(7654+key_id); - key_id++; - res->port.pid=fork(); - if (res->port.pid==0) { /* benchmark child */ - iterate(res); - res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); - if (-1 == res->port.sock) /* if socket failed to initialize, exit */ { - ee_printf("Error Creating Socket"); - } else { - int bytes_sent = sendto(res->port.sock, &(res->crc), buffer_length, 0,(struct sockaddr*)&(res->port.sa), sizeof (struct sockaddr_in)); - if (bytes_sent < 0) - ee_printf("Error sending packet: %s\n", strerror(errno)); - close(res->port.sock); /* close the socket */ - } - exit(0); - } - /* parent process, open the socket */ - res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); - bound = bind(res->port.sock,(struct sockaddr*)&(res->port.sa), sizeof(struct sockaddr)); - if (bound < 0) - ee_printf("bind(): %s\n",strerror(errno)); - return 1; -} -ee_u8 core_stop_parallel(core_results *res) { - int status; - int fromlen=sizeof(struct sockaddr); - int recsize = recvfrom(res->port.sock, &(res->crc), 8, 0, (struct sockaddr*)&(res->port.sa), &fromlen); - if (recsize < 0) { - ee_printf("Error in receive: %s\n", strerror(errno)); - return 0; - } - pid_t wpid = waitpid(res->port.pid,&status,WUNTRACED); - if (wpid != res->port.pid) { - ee_printf("ERROR waiting for child.\n"); - if (errno == ECHILD) ee_printf("errno=No such child %d\n",res->port.pid); - if (errno == EINTR) ee_printf("errno=Interrupted\n"); - return 0; - } - return 1; -} -#else /* no standard multicore implementation */ -#error "Please implement multicore functionality in core_portme.c to use multiple contexts." -#endif /* multithread implementations */ -#endif diff --git a/tests/riscv-coremark/coremark/linux/core_portme.h b/tests/riscv-coremark/coremark/linux/core_portme.h deleted file mode 100755 index 2cf4659a4..000000000 --- a/tests/riscv-coremark/coremark/linux/core_portme.h +++ /dev/null @@ -1,290 +0,0 @@ -/* -Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Original Author: Shay Gal-on -*/ - -#ifndef CORE_PORTME_H -#define CORE_PORTME_H -/************************/ -/* Data types and settings */ -/************************/ -/* Configuration: HAS_FLOAT - Define to 1 if the platform supports floating point. -*/ -#ifndef HAS_FLOAT -#define HAS_FLOAT 1 -#endif -/* Configuration: HAS_TIME_H - Define to 1 if platform has the time.h header file, - and implementation of functions thereof. -*/ -#ifndef HAS_TIME_H -#define HAS_TIME_H 1 -#endif -/* Configuration: USE_CLOCK - Define to 1 if platform has the time.h header file, - and implementation of functions thereof. -*/ -#ifndef USE_CLOCK -#define USE_CLOCK 0 -#endif -/* Configuration: HAS_STDIO - Define to 1 if the platform has stdio.h. -*/ -#ifndef HAS_STDIO -#define HAS_STDIO 1 -#endif -/* Configuration: HAS_PRINTF - Define to 1 if the platform has stdio.h and implements the printf function. -*/ -#ifndef HAS_PRINTF -#define HAS_PRINTF 1 -#endif - -/* Configuration: CORE_TICKS - Define type of return from the timing functions. - */ -#if defined(_MSC_VER) -#include -typedef size_t CORE_TICKS; -#elif HAS_TIME_H -#include -typedef clock_t CORE_TICKS; -#else -#error "Please define type of CORE_TICKS and implement start_time, end_time get_time and time_in_secs functions!" -#endif - -/* Definitions: COMPILER_VERSION, COMPILER_FLAGS, MEM_LOCATION - Initialize these strings per platform -*/ -#ifndef COMPILER_VERSION - #ifdef __GNUC__ - #define COMPILER_VERSION "GCC"__VERSION__ - #else - #define COMPILER_VERSION "Please put compiler version here (e.g. gcc 4.1)" - #endif -#endif -#ifndef COMPILER_FLAGS - #define COMPILER_FLAGS FLAGS_STR /* "Please put compiler flags here (e.g. -o3)" */ -#endif -#ifndef MEM_LOCATION - #define MEM_LOCATION "Please put data memory location here\n\t\t\t(e.g. code in flash, data on heap etc)" - #define MEM_LOCATION_UNSPEC 1 -#endif - -/* Data Types: - To avoid compiler issues, define the data types that need ot be used for 8b, 16b and 32b in . - - *Imprtant*: - ee_ptr_int needs to be the data type used to hold pointers, otherwise coremark may fail!!! -*/ -typedef signed short ee_s16; -typedef unsigned short ee_u16; -typedef signed int ee_s32; -typedef double ee_f32; -typedef unsigned char ee_u8; -typedef unsigned int ee_u32; -typedef ee_u32 ee_ptr_int; -typedef size_t ee_size_t; -/* align_mem: - This macro is used to align an offset to point to a 32b value. It is used in the Matrix algorithm to initialize the input memory blocks. -*/ -#define align_mem(x) (void *)(4 + (((ee_ptr_int)(x) - 1) & ~3)) - -/* Configuration: SEED_METHOD - Defines method to get seed values that cannot be computed at compile time. - - Valid values: - SEED_ARG - from command line. - SEED_FUNC - from a system function. - SEED_VOLATILE - from volatile variables. -*/ -#ifndef SEED_METHOD -#define SEED_METHOD SEED_ARG -#endif - -/* Configuration: MEM_METHOD - Defines method to get a block of memry. - - Valid values: - MEM_MALLOC - for platforms that implement malloc and have malloc.h. - MEM_STATIC - to use a static memory array. - MEM_STACK - to allocate the data block on the stack (NYI). -*/ -#ifndef MEM_METHOD -#define MEM_METHOD MEM_MALLOC -#endif - -/* Configuration: MULTITHREAD - Define for parallel execution - - Valid values: - 1 - only one context (default). - N>1 - will execute N copies in parallel. - - Note: - If this flag is defined to more then 1, an implementation for launching parallel contexts must be defined. - - Two sample implementations are provided. Use or to enable them. - - It is valid to have a different implementation of and in , - to fit a particular architecture. -*/ -#ifndef MULTITHREAD -#define MULTITHREAD 1 -#endif - -/* Configuration: USE_PTHREAD - Sample implementation for launching parallel contexts - This implementation uses pthread_thread_create and pthread_join. - - Valid values: - 0 - Do not use pthreads API. - 1 - Use pthreads API - - Note: - This flag only matters if MULTITHREAD has been defined to a value greater then 1. -*/ -#ifndef USE_PTHREAD -#define USE_PTHREAD 0 -#endif - -/* Configuration: USE_FORK - Sample implementation for launching parallel contexts - This implementation uses fork, waitpid, shmget,shmat and shmdt. - - Valid values: - 0 - Do not use fork API. - 1 - Use fork API - - Note: - This flag only matters if MULTITHREAD has been defined to a value greater then 1. -*/ -#ifndef USE_FORK -#define USE_FORK 0 -#endif - -/* Configuration: USE_SOCKET - Sample implementation for launching parallel contexts - This implementation uses fork, socket, sendto and recvfrom - - Valid values: - 0 - Do not use fork and sockets API. - 1 - Use fork and sockets API - - Note: - This flag only matters if MULTITHREAD has been defined to a value greater then 1. -*/ -#ifndef USE_SOCKET -#define USE_SOCKET 0 -#endif - -/* Configuration: MAIN_HAS_NOARGC - Needed if platform does not support getting arguments to main. - - Valid values: - 0 - argc/argv to main is supported - 1 - argc/argv to main is not supported -*/ -#ifndef MAIN_HAS_NOARGC -#define MAIN_HAS_NOARGC 0 -#endif - -/* Configuration: MAIN_HAS_NORETURN - Needed if platform does not support returning a value from main. - - Valid values: - 0 - main returns an int, and return value will be 0. - 1 - platform does not support returning a value from main -*/ -#ifndef MAIN_HAS_NORETURN -#define MAIN_HAS_NORETURN 0 -#endif - -/* Variable: default_num_contexts - Number of contexts to spawn in multicore context. - Override this global value to change number of contexts used. - - Note: - This value may not be set higher then the define. - - To experiment, you can set the define to the highest value expected, and use argc/argv in the to set this value from the command line. -*/ -extern ee_u32 default_num_contexts; - -#if (MULTITHREAD>1) -#if USE_PTHREAD - #include - #define PARALLEL_METHOD "PThreads" -#elif USE_FORK - #include - #include - #include - #include - #include /* for memcpy */ - #define PARALLEL_METHOD "Fork" -#elif USE_SOCKET - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #define PARALLEL_METHOD "Sockets" -#else - #define PARALLEL_METHOD "Proprietary" - #error "Please implement multicore functionality in core_portme.c to use multiple contexts." -#endif /* Method for multithreading */ -#endif /* MULTITHREAD > 1 */ - -typedef struct CORE_PORTABLE_S { -#if (MULTITHREAD>1) - #if USE_PTHREAD - pthread_t thread; - #elif USE_FORK - pid_t pid; - int shmid; - void *shm; - #elif USE_SOCKET - pid_t pid; - int sock; - struct sockaddr_in sa; - #endif /* Method for multithreading */ -#endif /* MULTITHREAD>1 */ - ee_u8 portable_id; -} core_portable; - -/* target specific init/fini */ -void portable_init(core_portable *p, int *argc, char *argv[]); -void portable_fini(core_portable *p); - -#if (SEED_METHOD==SEED_VOLATILE) - #if (VALIDATION_RUN || PERFORMANCE_RUN || PROFILE_RUN) - #define RUN_TYPE_FLAG 1 - #else - #if (TOTAL_DATA_SIZE==1200) - #define PROFILE_RUN 1 - #else - #define PERFORMANCE_RUN 1 - #endif - #endif -#endif /* SEED_METHOD==SEED_VOLATILE */ - -#endif /* CORE_PORTME_H */ diff --git a/tests/riscv-coremark/coremark/linux/core_portme.mak b/tests/riscv-coremark/coremark/linux/core_portme.mak deleted file mode 100644 index 97b6d6ace..000000000 --- a/tests/riscv-coremark/coremark/linux/core_portme.mak +++ /dev/null @@ -1,17 +0,0 @@ -# Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# Original Author: Shay Gal-on - -include posix/core_portme.mak diff --git a/tests/riscv-coremark/coremark/linux64/core_portme.c b/tests/riscv-coremark/coremark/linux64/core_portme.c deleted file mode 100755 index fe8d29983..000000000 --- a/tests/riscv-coremark/coremark/linux64/core_portme.c +++ /dev/null @@ -1,336 +0,0 @@ -/* -Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Original Author: Shay Gal-on -*/ - -#include -#include -#include "coremark.h" -#if CALLGRIND_RUN -#include -#endif - -#if (MEM_METHOD==MEM_MALLOC) -#include -/* Function: portable_malloc - Provide malloc() functionality in a platform specific way. -*/ -void *portable_malloc(size_t size) { - return malloc(size); -} -/* Function: portable_free - Provide free() functionality in a platform specific way. -*/ -void portable_free(void *p) { - free(p); -} -#else -void *portable_malloc(size_t size) { - return NULL; -} -void portable_free(void *p) { - p=NULL; -} -#endif - -#if (SEED_METHOD==SEED_VOLATILE) -#if VALIDATION_RUN - volatile ee_s32 seed1_volatile=0x3415; - volatile ee_s32 seed2_volatile=0x3415; - volatile ee_s32 seed3_volatile=0x66; -#endif -#if PERFORMANCE_RUN - volatile ee_s32 seed1_volatile=0x0; - volatile ee_s32 seed2_volatile=0x0; - volatile ee_s32 seed3_volatile=0x66; -#endif -#if PROFILE_RUN - volatile ee_s32 seed1_volatile=0x8; - volatile ee_s32 seed2_volatile=0x8; - volatile ee_s32 seed3_volatile=0x8; -#endif - volatile ee_s32 seed4_volatile=ITERATIONS; - volatile ee_s32 seed5_volatile=0; -#endif -/* Porting: Timing functions - How to capture time and convert to seconds must be ported to whatever is supported by the platform. - e.g. Read value from on board RTC, read value from cpu clock cycles performance counter etc. - Sample implementation for standard time.h and windows.h definitions included. -*/ -/* Define: TIMER_RES_DIVIDER - Divider to trade off timer resolution and total time that can be measured. - - Use lower values to increase resolution, but make sure that overflow does not occur. - If there are issues with the return value overflowing, increase this value. - */ -#if USE_CLOCK - #define NSECS_PER_SEC CLOCKS_PER_SEC - #define EE_TIMER_TICKER_RATE 1000 - #define CORETIMETYPE clock_t - #define GETMYTIME(_t) (*_t=clock()) - #define MYTIMEDIFF(fin,ini) ((fin)-(ini)) - #define TIMER_RES_DIVIDER 1 - #define SAMPLE_TIME_IMPLEMENTATION 1 -#elif defined(_MSC_VER) - #define NSECS_PER_SEC 10000000 - #define EE_TIMER_TICKER_RATE 1000 - #define CORETIMETYPE FILETIME - #define GETMYTIME(_t) GetSystemTimeAsFileTime(_t) - #define MYTIMEDIFF(fin,ini) (((*(__int64*)&fin)-(*(__int64*)&ini))/TIMER_RES_DIVIDER) - /* setting to millisces resolution by default with MSDEV */ - #ifndef TIMER_RES_DIVIDER - #define TIMER_RES_DIVIDER 1000 - #endif - #define SAMPLE_TIME_IMPLEMENTATION 1 -#elif HAS_TIME_H - #define NSECS_PER_SEC 1000000000 - #define EE_TIMER_TICKER_RATE 1000 - #define CORETIMETYPE struct timespec - #define GETMYTIME(_t) clock_gettime(CLOCK_REALTIME,_t) - #define MYTIMEDIFF(fin,ini) ((fin.tv_sec-ini.tv_sec)*(NSECS_PER_SEC/TIMER_RES_DIVIDER)+(fin.tv_nsec-ini.tv_nsec)/TIMER_RES_DIVIDER) - /* setting to 1/1000 of a second resolution by default with linux */ - #ifndef TIMER_RES_DIVIDER - #define TIMER_RES_DIVIDER 1000000 - #endif - #define SAMPLE_TIME_IMPLEMENTATION 1 -#else - #define SAMPLE_TIME_IMPLEMENTATION 0 -#endif -#define EE_TICKS_PER_SEC (NSECS_PER_SEC / TIMER_RES_DIVIDER) - -#if SAMPLE_TIME_IMPLEMENTATION -/** Define Host specific (POSIX), or target specific global time variables. */ -static CORETIMETYPE start_time_val, stop_time_val; - -/* Function: start_time - This function will be called right before starting the timed portion of the benchmark. - - Implementation may be capturing a system timer (as implemented in the example code) - or zeroing some system parameters - e.g. setting the cpu clocks cycles to 0. -*/ -void start_time(void) { - GETMYTIME(&start_time_val ); -#if CALLGRIND_RUN - CALLGRIND_START_INSTRUMENTATION -#endif -#if MICA - asm volatile("int3");/*1 */ -#endif -} -/* Function: stop_time - This function will be called right after ending the timed portion of the benchmark. - - Implementation may be capturing a system timer (as implemented in the example code) - or other system parameters - e.g. reading the current value of cpu cycles counter. -*/ -void stop_time(void) { -#if CALLGRIND_RUN - CALLGRIND_STOP_INSTRUMENTATION -#endif -#if MICA - asm volatile("int3");/*1 */ -#endif - GETMYTIME(&stop_time_val ); -} -/* Function: get_time - Return an abstract "ticks" number that signifies time on the system. - - Actual value returned may be cpu cycles, milliseconds or any other value, - as long as it can be converted to seconds by . - This methodology is taken to accomodate any hardware or simulated platform. - The sample implementation returns millisecs by default, - and the resolution is controlled by -*/ -CORE_TICKS get_time(void) { - CORE_TICKS elapsed=(CORE_TICKS)(MYTIMEDIFF(stop_time_val, start_time_val)); - return elapsed; -} -/* Function: time_in_secs - Convert the value returned by get_time to seconds. - - The type is used to accomodate systems with no support for floating point. - Default implementation implemented by the EE_TICKS_PER_SEC macro above. -*/ -secs_ret time_in_secs(CORE_TICKS ticks) { - secs_ret retval=((secs_ret)ticks) / (secs_ret)EE_TICKS_PER_SEC; - return retval; -} -#else -#error "Please implement timing functionality in core_portme.c" -#endif /* SAMPLE_TIME_IMPLEMENTATION */ - -ee_u32 default_num_contexts=MULTITHREAD; - -/* Function: portable_init - Target specific initialization code - Test for some common mistakes. -*/ -void portable_init(core_portable *p, int *argc, char *argv[]) -{ -#if PRINT_ARGS - int i; - for (i=0; i<*argc; i++) { - ee_printf("Arg[%d]=%s\n",i,argv[i]); - } -#endif - if (sizeof(ee_ptr_int) != sizeof(ee_u8 *)) { - ee_printf("ERROR! Please define ee_ptr_int to a type that holds a pointer!\n"); - } - if (sizeof(ee_u32) != 4) { - ee_printf("ERROR! Please define ee_u32 to a 32b unsigned type!\n"); - } -#if (MAIN_HAS_NOARGC && (SEED_METHOD==SEED_ARG)) - ee_printf("ERROR! Main has no argc, but SEED_METHOD defined to SEED_ARG!\n"); -#endif - -#if (MULTITHREAD>1) && (SEED_METHOD==SEED_ARG) - int nargs=*argc,i; - if ((nargs>1) && (*argv[1]=='M')) { - default_num_contexts=parseval(argv[1]+1); - if (default_num_contexts>MULTITHREAD) - default_num_contexts=MULTITHREAD; - /* Shift args since first arg is directed to the portable part and not to coremark main */ - --nargs; - for (i=1; i*/ - p->portable_id=1; -} -/* Function: portable_fini - Target specific final code -*/ -void portable_fini(core_portable *p) -{ - p->portable_id=0; -} - -#if (MULTITHREAD>1) - -/* Function: core_start_parallel - Start benchmarking in a parallel context. - - Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets. - Other implementations using MCAPI or other standards can easily be devised. -*/ -/* Function: core_stop_parallel - Stop a parallel context execution of coremark, and gather the results. - - Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets. - Other implementations using MCAPI or other standards can easily be devised. -*/ -#if USE_PTHREAD -ee_u8 core_start_parallel(core_results *res) { - return (ee_u8)pthread_create(&(res->port.thread),NULL,iterate,(void *)res); -} -ee_u8 core_stop_parallel(core_results *res) { - void *retval; - return (ee_u8)pthread_join(res->port.thread,&retval); -} -#elif USE_FORK -static int key_id=0; -ee_u8 core_start_parallel(core_results *res) { - key_t key=4321+key_id; - key_id++; - res->port.pid=fork(); - res->port.shmid=shmget(key, 8, IPC_CREAT | 0666); - if (res->port.shmid<0) { - ee_printf("ERROR in shmget!\n"); - } - if (res->port.pid==0) { - iterate(res); - res->port.shm=shmat(res->port.shmid, NULL, 0); - /* copy the validation values to the shared memory area and quit*/ - if (res->port.shm == (char *) -1) { - ee_printf("ERROR in child shmat!\n"); - } else { - memcpy(res->port.shm,&(res->crc),8); - shmdt(res->port.shm); - } - exit(0); - } - return 1; -} -ee_u8 core_stop_parallel(core_results *res) { - int status; - pid_t wpid = waitpid(res->port.pid,&status,WUNTRACED); - if (wpid != res->port.pid) { - ee_printf("ERROR waiting for child.\n"); - if (errno == ECHILD) ee_printf("errno=No such child %d\n",res->port.pid); - if (errno == EINTR) ee_printf("errno=Interrupted\n"); - return 0; - } - /* after process is done, get the values from the shared memory area */ - res->port.shm=shmat(res->port.shmid, NULL, 0); - if (res->port.shm == (char *) -1) { - ee_printf("ERROR in parent shmat!\n"); - return 0; - } - memcpy(&(res->crc),res->port.shm,8); - shmdt(res->port.shm); - return 1; -} -#elif USE_SOCKET -static int key_id=0; -ee_u8 core_start_parallel(core_results *res) { - int bound, buffer_length=8; - res->port.sa.sin_family = AF_INET; - res->port.sa.sin_addr.s_addr = htonl(0x7F000001); - res->port.sa.sin_port = htons(7654+key_id); - key_id++; - res->port.pid=fork(); - if (res->port.pid==0) { /* benchmark child */ - iterate(res); - res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); - if (-1 == res->port.sock) /* if socket failed to initialize, exit */ { - ee_printf("Error Creating Socket"); - } else { - int bytes_sent = sendto(res->port.sock, &(res->crc), buffer_length, 0,(struct sockaddr*)&(res->port.sa), sizeof (struct sockaddr_in)); - if (bytes_sent < 0) - ee_printf("Error sending packet: %s\n", strerror(errno)); - close(res->port.sock); /* close the socket */ - } - exit(0); - } - /* parent process, open the socket */ - res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); - bound = bind(res->port.sock,(struct sockaddr*)&(res->port.sa), sizeof(struct sockaddr)); - if (bound < 0) - ee_printf("bind(): %s\n",strerror(errno)); - return 1; -} -ee_u8 core_stop_parallel(core_results *res) { - int status; - int fromlen=sizeof(struct sockaddr); - int recsize = recvfrom(res->port.sock, &(res->crc), 8, 0, (struct sockaddr*)&(res->port.sa), &fromlen); - if (recsize < 0) { - ee_printf("Error in receive: %s\n", strerror(errno)); - return 0; - } - pid_t wpid = waitpid(res->port.pid,&status,WUNTRACED); - if (wpid != res->port.pid) { - ee_printf("ERROR waiting for child.\n"); - if (errno == ECHILD) ee_printf("errno=No such child %d\n",res->port.pid); - if (errno == EINTR) ee_printf("errno=Interrupted\n"); - return 0; - } - return 1; -} -#else /* no standard multicore implementation */ -#error "Please implement multicore functionality in core_portme.c to use multiple contexts." -#endif /* multithread implementations */ -#endif diff --git a/tests/riscv-coremark/coremark/linux64/core_portme.h b/tests/riscv-coremark/coremark/linux64/core_portme.h deleted file mode 100755 index 1228a679b..000000000 --- a/tests/riscv-coremark/coremark/linux64/core_portme.h +++ /dev/null @@ -1,291 +0,0 @@ -/* -Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Original Author: Shay Gal-on -*/ - -/* Topic: Description - This file contains configuration constants required to execute on different platforms -*/ -#ifndef CORE_PORTME_H -#define CORE_PORTME_H -/************************/ -/* Data types and settings */ -/************************/ -/* Configuration: HAS_FLOAT - Define to 1 if the platform supports floating point. -*/ -#ifndef HAS_FLOAT -#define HAS_FLOAT 1 -#endif -/* Configuration: HAS_TIME_H - Define to 1 if platform has the time.h header file, - and implementation of functions thereof. -*/ -#ifndef HAS_TIME_H -#define HAS_TIME_H 1 -#endif -/* Configuration: USE_CLOCK - Define to 1 if platform has the time.h header file, - and implementation of functions thereof. -*/ -#ifndef USE_CLOCK -#define USE_CLOCK 0 -#endif -/* Configuration: HAS_STDIO - Define to 1 if the platform has stdio.h. -*/ -#ifndef HAS_STDIO -#define HAS_STDIO 1 -#endif -/* Configuration: HAS_PRINTF - Define to 1 if the platform has stdio.h and implements the printf function. -*/ -#ifndef HAS_PRINTF -#define HAS_PRINTF 1 -#endif - -/* Configuration: CORE_TICKS - Define type of return from the timing functions. - */ -#if defined(_MSC_VER) -#include -typedef size_t CORE_TICKS; -#elif HAS_TIME_H -#include -typedef clock_t CORE_TICKS; -#else -#error "Please define type of CORE_TICKS and implement start_time, end_time get_time and time_in_secs functions!" -#endif - -/* Definitions: COMPILER_VERSION, COMPILER_FLAGS, MEM_LOCATION - Initialize these strings per platform -*/ -#ifndef COMPILER_VERSION - #ifdef __GNUC__ - #define COMPILER_VERSION "GCC"__VERSION__ - #else - #define COMPILER_VERSION "Please put compiler version here (e.g. gcc 4.1)" - #endif -#endif -#ifndef COMPILER_FLAGS - #define COMPILER_FLAGS FLAGS_STR /* "Please put compiler flags here (e.g. -o3)" */ -#endif -#ifndef MEM_LOCATION - #define MEM_LOCATION "Please put data memory location here\n\t\t\t(e.g. code in flash, data on heap etc)" - #define MEM_LOCATION_UNSPEC 1 -#endif - -/* Data Types: - To avoid compiler issues, define the data types that need ot be used for 8b, 16b and 32b in . - - *Imprtant*: - ee_ptr_int needs to be the data type used to hold pointers, otherwise coremark may fail!!! -*/ -typedef signed short ee_s16; -typedef unsigned short ee_u16; -typedef signed int ee_s32; -typedef double ee_f32; -typedef unsigned char ee_u8; -typedef unsigned int ee_u32; -typedef unsigned long long ee_ptr_int; -typedef size_t ee_size_t; -/* align an offset to point to a 32b value */ -#define align_mem(x) (void *)(4 + (((ee_ptr_int)(x) - 1) & ~3)) - -/* Configuration: SEED_METHOD - Defines method to get seed values that cannot be computed at compile time. - - Valid values: - SEED_ARG - from command line. - SEED_FUNC - from a system function. - SEED_VOLATILE - from volatile variables. -*/ -#ifndef SEED_METHOD -#define SEED_METHOD SEED_ARG -#endif - -/* Configuration: MEM_METHOD - Defines method to get a block of memry. - - Valid values: - MEM_MALLOC - for platforms that implement malloc and have malloc.h. - MEM_STATIC - to use a static memory array. - MEM_STACK - to allocate the data block on the stack (NYI). -*/ -#ifndef MEM_METHOD -#define MEM_METHOD MEM_MALLOC -#endif - -/* Configuration: MULTITHREAD - Define for parallel execution - - Valid values: - 1 - only one context (default). - N>1 - will execute N copies in parallel. - - Note: - If this flag is defined to more then 1, an implementation for launching parallel contexts must be defined. - - Two sample implementations are provided. Use or to enable them. - - It is valid to have a different implementation of and in , - to fit a particular architecture. -*/ -#ifndef MULTITHREAD -#define MULTITHREAD 1 -#endif - -/* Configuration: USE_PTHREAD - Sample implementation for launching parallel contexts - This implementation uses pthread_thread_create and pthread_join. - - Valid values: - 0 - Do not use pthreads API. - 1 - Use pthreads API - - Note: - This flag only matters if MULTITHREAD has been defined to a value greater then 1. -*/ -#ifndef USE_PTHREAD -#define USE_PTHREAD 0 -#endif - -/* Configuration: USE_FORK - Sample implementation for launching parallel contexts - This implementation uses fork, waitpid, shmget,shmat and shmdt. - - Valid values: - 0 - Do not use fork API. - 1 - Use fork API - - Note: - This flag only matters if MULTITHREAD has been defined to a value greater then 1. -*/ -#ifndef USE_FORK -#define USE_FORK 0 -#endif - -/* Configuration: USE_SOCKET - Sample implementation for launching parallel contexts - This implementation uses fork, socket, sendto and recvfrom - - Valid values: - 0 - Do not use fork and sockets API. - 1 - Use fork and sockets API - - Note: - This flag only matters if MULTITHREAD has been defined to a value greater then 1. -*/ -#ifndef USE_SOCKET -#define USE_SOCKET 0 -#endif - -/* Configuration: MAIN_HAS_NOARGC - Needed if platform does not support getting arguments to main. - - Valid values: - 0 - argc/argv to main is supported - 1 - argc/argv to main is not supported -*/ -#ifndef MAIN_HAS_NOARGC -#define MAIN_HAS_NOARGC 0 -#endif - -/* Configuration: MAIN_HAS_NORETURN - Needed if platform does not support returning a value from main. - - Valid values: - 0 - main returns an int, and return value will be 0. - 1 - platform does not support returning a value from main -*/ -#ifndef MAIN_HAS_NORETURN -#define MAIN_HAS_NORETURN 0 -#endif - -/* Variable: default_num_contexts - Number of contexts to spawn in multicore context. - Override this global value to change number of contexts used. - - Note: - This value may not be set higher then the define. - - To experiment, you can set the define to the highest value expected, and use argc/argv in the to set this value from the command line. -*/ -extern ee_u32 default_num_contexts; - -#if (MULTITHREAD>1) -#if USE_PTHREAD - #include - #define PARALLEL_METHOD "PThreads" -#elif USE_FORK - #include - #include - #include - #include - #include /* for memcpy */ - #define PARALLEL_METHOD "Fork" -#elif USE_SOCKET - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #define PARALLEL_METHOD "Sockets" -#else - #define PARALLEL_METHOD "Proprietary" - #error "Please implement multicore functionality in core_portme.c to use multiple contexts." -#endif /* Method for multithreading */ -#endif /* MULTITHREAD > 1 */ - -typedef struct CORE_PORTABLE_S { -#if (MULTITHREAD>1) - #if USE_PTHREAD - pthread_t thread; - #elif USE_FORK - pid_t pid; - int shmid; - void *shm; - #elif USE_SOCKET - pid_t pid; - int sock; - struct sockaddr_in sa; - #endif /* Method for multithreading */ -#endif /* MULTITHREAD>1 */ - ee_u8 portable_id; -} core_portable; - -/* target specific init/fini */ -void portable_init(core_portable *p, int *argc, char *argv[]); -void portable_fini(core_portable *p); - -#if (SEED_METHOD==SEED_VOLATILE) - #if (VALIDATION_RUN || PERFORMANCE_RUN || PROFILE_RUN) - #define RUN_TYPE_FLAG 1 - #else - #if (TOTAL_DATA_SIZE==1200) - #define PROFILE_RUN 1 - #else - #define PERFORMANCE_RUN 1 - #endif - #endif -#endif /* SEED_METHOD==SEED_VOLATILE */ - -#endif /* CORE_PORTME_H */ diff --git a/tests/riscv-coremark/coremark/linux64/core_portme.mak b/tests/riscv-coremark/coremark/linux64/core_portme.mak deleted file mode 100755 index 5cfabee32..000000000 --- a/tests/riscv-coremark/coremark/linux64/core_portme.mak +++ /dev/null @@ -1,140 +0,0 @@ -# Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# Original Author: Shay Gal-on - -#File: core_portme.mak - -# Flag: OUTFLAG -# Use this flag to define how to to get an executable (e.g -o) -OUTFLAG= -o -# Flag: CC -# Use this flag to define compiler to use -CC = gcc -# Flag: CFLAGS -# Use this flag to define compiler options. Note, you can add compiler options from the command line using XCFLAGS="other flags" -PORT_CFLAGS = -O2 -FLAGS_STR = "$(PORT_CFLAGS) $(XCFLAGS) $(XLFLAGS) $(LFLAGS_END)" -CFLAGS = $(PORT_CFLAGS) -I$(PORT_DIR) -I. -DFLAGS_STR=\"$(FLAGS_STR)\" -#Flag: LFLAGS_END -# Define any libraries needed for linking or other flags that should come at the end of the link line (e.g. linker scripts). -# Note: On certain platforms, the default clock_gettime implementation is supported but requires linking of librt. -LFLAGS_END += -lrt -# Flag: PORT_SRCS -# Port specific source files can be added here -PORT_SRCS = $(PORT_DIR)/core_portme.c -# Flag: LOAD -# Define this flag if you need to load to a target, as in a cross compile environment. - -# Flag: RUN -# Define this flag if running does not consist of simple invocation of the binary. -# In a cross compile environment, you need to define this. - -#For flashing and using a tera term macro, you could use -#LOAD = flash ADDR -#RUN = ttpmacro coremark.ttl - -#For copying to target and executing via SSH connection, you could use -#LOAD = scp $(OUTFILE) user@target:~ -#RUN = ssh user@target -c - -#For native compilation and execution -LOAD = echo Loading done -RUN = - -OEXT = .o -EXE = .exe - -# Flag: SEPARATE_COMPILE -# Define if you need to separate compilation from link stage. -# In this case, you also need to define below how to create an object file, and how to link. -ifdef SEPARATE_COMPILE - -LD = gcc -OBJOUT = -o -LFLAGS = -OFLAG = -o -COUT = -c -# Flag: PORT_OBJS -# Port specific object files can be added here -PORT_OBJS = $(PORT_DIR)/core_portme$(OEXT) -PORT_CLEAN = *$(OEXT) - -$(OPATH)%$(OEXT) : %.c - $(CC) $(CFLAGS) $(XCFLAGS) $(COUT) $< $(OBJOUT) $@ - -endif - -# Target: port_prebuild -# Generate any files that are needed before actual build starts. -# E.g. generate profile guidance files. Sample PGO generation for gcc enabled with PGO=1 -# - First, check if PGO was defined on the command line, if so, need to add -fprofile-use to compile line. -# - Second, if PGO reference has not yet been generated, add a step to the prebuild that will build a profile-generate version and run it. -# Note - Using REBUILD=1 -# -# Use make PGO=1 to invoke this sample processing. - -ifdef PGO - ifeq (,$(findstring $(PGO),gen)) - PGO_STAGE=build_pgo_gcc - CFLAGS+=-fprofile-use - endif - PORT_CLEAN+=*.gcda *.gcno gmon.out -endif - -.PHONY: port_prebuild -port_prebuild: $(PGO_STAGE) - -.PHONY: build_pgo_gcc -build_pgo_gcc: - $(MAKE) PGO=gen XCFLAGS="$(XCFLAGS) -fprofile-generate -DTOTAL_DATA_SIZE=1200" ITERATIONS=10 gen_pgo_data REBUILD=1 - -# Target: port_postbuild -# Generate any files that are needed after actual build end. -# E.g. change format to srec, bin, zip in order to be able to load into flash -.PHONY: port_postbuild -port_postbuild: - -# Target: port_postrun -# Do platform specific after run stuff. -# E.g. reset the board, backup the logfiles etc. -.PHONY: port_postrun -port_postrun: - -# Target: port_prerun -# Do platform specific after run stuff. -# E.g. reset the board, backup the logfiles etc. -.PHONY: port_prerun -port_prerun: - -# Target: port_postload -# Do platform specific after load stuff. -# E.g. reset the reset power to the flash eraser -.PHONY: port_postload -port_postload: - -# Target: port_preload -# Do platform specific before load stuff. -# E.g. reset the reset power to the flash eraser -.PHONY: port_preload -port_preload: - -# FLAG: OPATH -# Path to the output folder. Default - current folder. -OPATH = ./ -MKDIR = mkdir -p - -# FLAG: PERL -# Define perl executable to calculate the geomean if running separate. -PERL=/usr/bin/perl diff --git a/tests/riscv-coremark/coremark/macos/core_portme.mak b/tests/riscv-coremark/coremark/macos/core_portme.mak deleted file mode 100644 index 6b27c3c41..000000000 --- a/tests/riscv-coremark/coremark/macos/core_portme.mak +++ /dev/null @@ -1,18 +0,0 @@ -# Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# Original Author: Shay Gal-on - -NO_LIBRT = 1 -include posix/core_portme.mak diff --git a/tests/riscv-coremark/coremark/posix/core_portme.c b/tests/riscv-coremark/coremark/posix/core_portme.c deleted file mode 100644 index f5a7f5b3d..000000000 --- a/tests/riscv-coremark/coremark/posix/core_portme.c +++ /dev/null @@ -1,419 +0,0 @@ -/* -Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Original Author: Shay Gal-on -*/ - -#include -#include -#include "coremark.h" -#if CALLGRIND_RUN -#include -#endif - -#if (MEM_METHOD == MEM_MALLOC) -/* Function: portable_malloc - Provide malloc() functionality in a platform specific way. -*/ -void * -portable_malloc(size_t size) -{ - return malloc(size); -} -/* Function: portable_free - Provide free() functionality in a platform specific way. -*/ -void -portable_free(void *p) -{ - free(p); -} -#else -void * -portable_malloc(size_t size) -{ - return NULL; -} -void -portable_free(void *p) -{ - p = NULL; -} -#endif - -#if (SEED_METHOD == SEED_VOLATILE) -#if VALIDATION_RUN -volatile ee_s32 seed1_volatile = 0x3415; -volatile ee_s32 seed2_volatile = 0x3415; -volatile ee_s32 seed3_volatile = 0x66; -#endif -#if PERFORMANCE_RUN -volatile ee_s32 seed1_volatile = 0x0; -volatile ee_s32 seed2_volatile = 0x0; -volatile ee_s32 seed3_volatile = 0x66; -#endif -#if PROFILE_RUN -volatile ee_s32 seed1_volatile = 0x8; -volatile ee_s32 seed2_volatile = 0x8; -volatile ee_s32 seed3_volatile = 0x8; -#endif -volatile ee_s32 seed4_volatile = ITERATIONS; -volatile ee_s32 seed5_volatile = 0; -#endif -/* Porting: Timing functions - How to capture time and convert to seconds must be ported to whatever is - supported by the platform. e.g. Read value from on board RTC, read value from - cpu clock cycles performance counter etc. Sample implementation for standard - time.h and windows.h definitions included. -*/ -/* Define: TIMER_RES_DIVIDER - Divider to trade off timer resolution and total time that can be - measured. - - Use lower values to increase resolution, but make sure that overflow - does not occur. If there are issues with the return value overflowing, - increase this value. - */ -#if USE_CLOCK -#define NSECS_PER_SEC CLOCKS_PER_SEC -#define EE_TIMER_TICKER_RATE 1000 -#define CORETIMETYPE clock_t -#define GETMYTIME(_t) (*_t = clock()) -#define MYTIMEDIFF(fin, ini) ((fin) - (ini)) -#define TIMER_RES_DIVIDER 1 -#define SAMPLE_TIME_IMPLEMENTATION 1 -#elif defined(_MSC_VER) -#define NSECS_PER_SEC 10000000 -#define EE_TIMER_TICKER_RATE 1000 -#define CORETIMETYPE FILETIME -#define GETMYTIME(_t) GetSystemTimeAsFileTime(_t) -#define MYTIMEDIFF(fin, ini) \ - (((*(__int64 *)&fin) - (*(__int64 *)&ini)) / TIMER_RES_DIVIDER) -/* setting to millisces resolution by default with MSDEV */ -#ifndef TIMER_RES_DIVIDER -#define TIMER_RES_DIVIDER 1000 -#endif -#define SAMPLE_TIME_IMPLEMENTATION 1 -#elif HAS_TIME_H -#define NSECS_PER_SEC 1000000000 -#define EE_TIMER_TICKER_RATE 1000 -#define CORETIMETYPE struct timespec -#define GETMYTIME(_t) clock_gettime(CLOCK_REALTIME, _t) -#define MYTIMEDIFF(fin, ini) \ - ((fin.tv_sec - ini.tv_sec) * (NSECS_PER_SEC / TIMER_RES_DIVIDER) \ - + (fin.tv_nsec - ini.tv_nsec) / TIMER_RES_DIVIDER) -/* setting to 1/1000 of a second resolution by default with linux */ -#ifndef TIMER_RES_DIVIDER -#define TIMER_RES_DIVIDER 1000000 -#endif -#define SAMPLE_TIME_IMPLEMENTATION 1 -#else -#define SAMPLE_TIME_IMPLEMENTATION 0 -#endif -#define EE_TICKS_PER_SEC (NSECS_PER_SEC / TIMER_RES_DIVIDER) - -#if SAMPLE_TIME_IMPLEMENTATION -/** Define Host specific (POSIX), or target specific global time variables. */ -static CORETIMETYPE start_time_val, stop_time_val; - -/* Function: start_time - This function will be called right before starting the timed portion of - the benchmark. - - Implementation may be capturing a system timer (as implemented in the - example code) or zeroing some system parameters - e.g. setting the cpu clocks - cycles to 0. -*/ -void -start_time(void) -{ - GETMYTIME(&start_time_val); -#if CALLGRIND_RUN - CALLGRIND_START_INSTRUMENTATION -#endif -#if MICA - asm volatile("int3"); /*1 */ -#endif -} -/* Function: stop_time - This function will be called right after ending the timed portion of the - benchmark. - - Implementation may be capturing a system timer (as implemented in the - example code) or other system parameters - e.g. reading the current value of - cpu cycles counter. -*/ -void -stop_time(void) -{ -#if CALLGRIND_RUN - CALLGRIND_STOP_INSTRUMENTATION -#endif -#if MICA - asm volatile("int3"); /*1 */ -#endif - GETMYTIME(&stop_time_val); -} -/* Function: get_time - Return an abstract "ticks" number that signifies time on the system. - - Actual value returned may be cpu cycles, milliseconds or any other - value, as long as it can be converted to seconds by . This - methodology is taken to accomodate any hardware or simulated platform. The - sample implementation returns millisecs by default, and the resolution is - controlled by -*/ -CORE_TICKS -get_time(void) -{ - CORE_TICKS elapsed - = (CORE_TICKS)(MYTIMEDIFF(stop_time_val, start_time_val)); - return elapsed; -} -/* Function: time_in_secs - Convert the value returned by get_time to seconds. - - The type is used to accomodate systems with no support for - floating point. Default implementation implemented by the EE_TICKS_PER_SEC - macro above. -*/ -secs_ret -time_in_secs(CORE_TICKS ticks) -{ - secs_ret retval = ((secs_ret)ticks) / (secs_ret)EE_TICKS_PER_SEC; - return retval; -} -#else -#error "Please implement timing functionality in core_portme.c" -#endif /* SAMPLE_TIME_IMPLEMENTATION */ - -ee_u32 default_num_contexts = MULTITHREAD; - -/* Function: portable_init - Target specific initialization code - Test for some common mistakes. -*/ -void -portable_init(core_portable *p, int *argc, char *argv[]) -{ -#if PRINT_ARGS - int i; - for (i = 0; i < *argc; i++) - { - ee_printf("Arg[%d]=%s\n", i, argv[i]); - } -#endif - if (sizeof(ee_ptr_int) != sizeof(ee_u8 *)) - { - ee_printf( - "ERROR! Please define ee_ptr_int to a type that holds a " - "pointer!\n"); - } - if (sizeof(ee_u32) != 4) - { - ee_printf("ERROR! Please define ee_u32 to a 32b unsigned type!\n"); - } -#if (MAIN_HAS_NOARGC && (SEED_METHOD == SEED_ARG)) - ee_printf( - "ERROR! Main has no argc, but SEED_METHOD defined to SEED_ARG!\n"); -#endif - -#if (MULTITHREAD > 1) && (SEED_METHOD == SEED_ARG) - int nargs = *argc, i; - if ((nargs > 1) && (*argv[1] == 'M')) - { - default_num_contexts = parseval(argv[1] + 1); - if (default_num_contexts > MULTITHREAD) - default_num_contexts = MULTITHREAD; - /* Shift args since first arg is directed to the portable part and not - * to coremark main */ - --nargs; - for (i = 1; i < nargs; i++) - argv[i] = argv[i + 1]; - *argc = nargs; - } -#endif /* sample of potential platform specific init via command line, reset \ - the number of contexts being used if first argument is M*/ - p->portable_id = 1; -} -/* Function: portable_fini - Target specific final code -*/ -void -portable_fini(core_portable *p) -{ - p->portable_id = 0; -} - -#if (MULTITHREAD > 1) - -/* Function: core_start_parallel - Start benchmarking in a parallel context. - - Three implementations are provided, one using pthreads, one using fork - and shared mem, and one using fork and sockets. Other implementations using - MCAPI or other standards can easily be devised. -*/ -/* Function: core_stop_parallel - Stop a parallel context execution of coremark, and gather the results. - - Three implementations are provided, one using pthreads, one using fork - and shared mem, and one using fork and sockets. Other implementations using - MCAPI or other standards can easily be devised. -*/ -#if USE_PTHREAD -ee_u8 -core_start_parallel(core_results *res) -{ - return (ee_u8)pthread_create( - &(res->port.thread), NULL, iterate, (void *)res); -} -ee_u8 -core_stop_parallel(core_results *res) -{ - void *retval; - return (ee_u8)pthread_join(res->port.thread, &retval); -} -#elif USE_FORK -static int key_id = 0; -ee_u8 -core_start_parallel(core_results *res) -{ - key_t key = 4321 + key_id; - key_id++; - res->port.pid = fork(); - res->port.shmid = shmget(key, 8, IPC_CREAT | 0666); - if (res->port.shmid < 0) - { - ee_printf("ERROR in shmget!\n"); - } - if (res->port.pid == 0) - { - iterate(res); - res->port.shm = shmat(res->port.shmid, NULL, 0); - /* copy the validation values to the shared memory area and quit*/ - if (res->port.shm == (char *)-1) - { - ee_printf("ERROR in child shmat!\n"); - } - else - { - memcpy(res->port.shm, &(res->crc), 8); - shmdt(res->port.shm); - } - exit(0); - } - return 1; -} -ee_u8 -core_stop_parallel(core_results *res) -{ - int status; - pid_t wpid = waitpid(res->port.pid, &status, WUNTRACED); - if (wpid != res->port.pid) - { - ee_printf("ERROR waiting for child.\n"); - if (errno == ECHILD) - ee_printf("errno=No such child %d\n", res->port.pid); - if (errno == EINTR) - ee_printf("errno=Interrupted\n"); - return 0; - } - /* after process is done, get the values from the shared memory area */ - res->port.shm = shmat(res->port.shmid, NULL, 0); - if (res->port.shm == (char *)-1) - { - ee_printf("ERROR in parent shmat!\n"); - return 0; - } - memcpy(&(res->crc), res->port.shm, 8); - shmdt(res->port.shm); - return 1; -} -#elif USE_SOCKET -static int key_id = 0; -ee_u8 -core_start_parallel(core_results *res) -{ - int bound, buffer_length = 8; - res->port.sa.sin_family = AF_INET; - res->port.sa.sin_addr.s_addr = htonl(0x7F000001); - res->port.sa.sin_port = htons(7654 + key_id); - key_id++; - res->port.pid = fork(); - if (res->port.pid == 0) - { /* benchmark child */ - iterate(res); - res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); - if (-1 == res->port.sock) /* if socket failed to initialize, exit */ - { - ee_printf("Error Creating Socket"); - } - else - { - int bytes_sent = sendto(res->port.sock, - &(res->crc), - buffer_length, - 0, - (struct sockaddr *)&(res->port.sa), - sizeof(struct sockaddr_in)); - if (bytes_sent < 0) - ee_printf("Error sending packet: %s\n", strerror(errno)); - close(res->port.sock); /* close the socket */ - } - exit(0); - } - /* parent process, open the socket */ - res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); - bound = bind(res->port.sock, - (struct sockaddr *)&(res->port.sa), - sizeof(struct sockaddr)); - if (bound < 0) - ee_printf("bind(): %s\n", strerror(errno)); - return 1; -} -ee_u8 -core_stop_parallel(core_results *res) -{ - int status; - int fromlen = sizeof(struct sockaddr); - int recsize = recvfrom(res->port.sock, - &(res->crc), - 8, - 0, - (struct sockaddr *)&(res->port.sa), - &fromlen); - if (recsize < 0) - { - ee_printf("Error in receive: %s\n", strerror(errno)); - return 0; - } - pid_t wpid = waitpid(res->port.pid, &status, WUNTRACED); - if (wpid != res->port.pid) - { - ee_printf("ERROR waiting for child.\n"); - if (errno == ECHILD) - ee_printf("errno=No such child %d\n", res->port.pid); - if (errno == EINTR) - ee_printf("errno=Interrupted\n"); - return 0; - } - return 1; -} -#else /* no standard multicore implementation */ -#error \ - "Please implement multicore functionality in core_portme.c to use multiple contexts." -#endif /* multithread implementations */ -#endif diff --git a/tests/riscv-coremark/coremark/posix/core_portme.h b/tests/riscv-coremark/coremark/posix/core_portme.h deleted file mode 100644 index e49e474b1..000000000 --- a/tests/riscv-coremark/coremark/posix/core_portme.h +++ /dev/null @@ -1,314 +0,0 @@ -/* -Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Original Author: Shay Gal-on -*/ - -/* Topic: Description - This file contains configuration constants required to execute on - different platforms -*/ -#ifndef CORE_PORTME_H -#define CORE_PORTME_H - -#include "core_portme_posix_overrides.h" - -/************************/ -/* Data types and settings */ -/************************/ -/* Configuration: HAS_FLOAT - Define to 1 if the platform supports floating point. -*/ -#ifndef HAS_FLOAT -#define HAS_FLOAT 1 -#endif -/* Configuration: HAS_TIME_H - Define to 1 if platform has the time.h header file, - and implementation of functions thereof. -*/ -#ifndef HAS_TIME_H -#define HAS_TIME_H 1 -#endif -/* Configuration: USE_CLOCK - Define to 1 if platform has the time.h header file, - and implementation of functions thereof. -*/ -#ifndef USE_CLOCK -#define USE_CLOCK 0 -#endif -/* Configuration: HAS_STDIO - Define to 1 if the platform has stdio.h. -*/ -#ifndef HAS_STDIO -#define HAS_STDIO 1 -#endif -/* Configuration: HAS_PRINTF - Define to 1 if the platform has stdio.h and implements the printf - function. -*/ -#ifndef HAS_PRINTF -#define HAS_PRINTF 1 -#endif - -/* Configuration: CORE_TICKS - Define type of return from the timing functions. - */ -#if defined(_MSC_VER) -#include -typedef size_t CORE_TICKS; -#elif HAS_TIME_H -#include -typedef clock_t CORE_TICKS; -#else -#error \ - "Please define type of CORE_TICKS and implement start_time, end_time get_time and time_in_secs functions!" -#endif - -/* Definitions: COMPILER_VERSION, COMPILER_FLAGS, MEM_LOCATION - Initialize these strings per platform -*/ -#ifndef COMPILER_VERSION -#ifdef __GNUC__ -#define COMPILER_VERSION "GCC"__VERSION__ -#else -#define COMPILER_VERSION "Please put compiler version here (e.g. gcc 4.1)" -#endif -#endif -#ifndef COMPILER_FLAGS -#define COMPILER_FLAGS \ - FLAGS_STR /* "Please put compiler flags here (e.g. -o3)" */ -#endif -#ifndef MEM_LOCATION -#define MEM_LOCATION \ - "Please put data memory location here\n\t\t\t(e.g. code in flash, data " \ - "on heap etc)" -#define MEM_LOCATION_UNSPEC 1 -#endif - -#include - -/* Data Types: - To avoid compiler issues, define the data types that need ot be used for - 8b, 16b and 32b in . - - *Imprtant*: - ee_ptr_int needs to be the data type used to hold pointers, otherwise - coremark may fail!!! -*/ -typedef signed short ee_s16; -typedef unsigned short ee_u16; -typedef signed int ee_s32; -typedef double ee_f32; -typedef unsigned char ee_u8; -typedef unsigned int ee_u32; -typedef uintptr_t ee_ptr_int; -typedef size_t ee_size_t; -/* align an offset to point to a 32b value */ -#define align_mem(x) (void *)(4 + (((ee_ptr_int)(x)-1) & ~3)) - -/* Configuration: SEED_METHOD - Defines method to get seed values that cannot be computed at compile - time. - - Valid values: - SEED_ARG - from command line. - SEED_FUNC - from a system function. - SEED_VOLATILE - from volatile variables. -*/ -#ifndef SEED_METHOD -#define SEED_METHOD SEED_ARG -#endif - -/* Configuration: MEM_METHOD - Defines method to get a block of memry. - - Valid values: - MEM_MALLOC - for platforms that implement malloc and have malloc.h. - MEM_STATIC - to use a static memory array. - MEM_STACK - to allocate the data block on the stack (NYI). -*/ -#ifndef MEM_METHOD -#define MEM_METHOD MEM_MALLOC -#endif - -/* Configuration: MULTITHREAD - Define for parallel execution - - Valid values: - 1 - only one context (default). - N>1 - will execute N copies in parallel. - - Note: - If this flag is defined to more then 1, an implementation for launching - parallel contexts must be defined. - - Two sample implementations are provided. Use or - to enable them. - - It is valid to have a different implementation of - and in , to fit a particular architecture. -*/ -#ifndef MULTITHREAD -#define MULTITHREAD 1 -#endif - -/* Configuration: USE_PTHREAD - Sample implementation for launching parallel contexts - This implementation uses pthread_thread_create and pthread_join. - - Valid values: - 0 - Do not use pthreads API. - 1 - Use pthreads API - - Note: - This flag only matters if MULTITHREAD has been defined to a value - greater then 1. -*/ -#ifndef USE_PTHREAD -#define USE_PTHREAD 0 -#endif - -/* Configuration: USE_FORK - Sample implementation for launching parallel contexts - This implementation uses fork, waitpid, shmget,shmat and shmdt. - - Valid values: - 0 - Do not use fork API. - 1 - Use fork API - - Note: - This flag only matters if MULTITHREAD has been defined to a value - greater then 1. -*/ -#ifndef USE_FORK -#define USE_FORK 0 -#endif - -/* Configuration: USE_SOCKET - Sample implementation for launching parallel contexts - This implementation uses fork, socket, sendto and recvfrom - - Valid values: - 0 - Do not use fork and sockets API. - 1 - Use fork and sockets API - - Note: - This flag only matters if MULTITHREAD has been defined to a value - greater then 1. -*/ -#ifndef USE_SOCKET -#define USE_SOCKET 0 -#endif - -/* Configuration: MAIN_HAS_NOARGC - Needed if platform does not support getting arguments to main. - - Valid values: - 0 - argc/argv to main is supported - 1 - argc/argv to main is not supported -*/ -#ifndef MAIN_HAS_NOARGC -#define MAIN_HAS_NOARGC 0 -#endif - -/* Configuration: MAIN_HAS_NORETURN - Needed if platform does not support returning a value from main. - - Valid values: - 0 - main returns an int, and return value will be 0. - 1 - platform does not support returning a value from main -*/ -#ifndef MAIN_HAS_NORETURN -#define MAIN_HAS_NORETURN 0 -#endif - -/* Variable: default_num_contexts - Number of contexts to spawn in multicore context. - Override this global value to change number of contexts used. - - Note: - This value may not be set higher then the define. - - To experiment, you can set the define to the highest value - expected, and use argc/argv in the to set this value from the - command line. -*/ -extern ee_u32 default_num_contexts; - -#if (MULTITHREAD > 1) -#if USE_PTHREAD -#include -#define PARALLEL_METHOD "PThreads" -#elif USE_FORK -#include -#include -#include -#include -#include /* for memcpy */ -#define PARALLEL_METHOD "Fork" -#elif USE_SOCKET -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#define PARALLEL_METHOD "Sockets" -#else -#define PARALLEL_METHOD "Proprietary" -#error \ - "Please implement multicore functionality in core_portme.c to use multiple contexts." -#endif /* Method for multithreading */ -#endif /* MULTITHREAD > 1 */ - -typedef struct CORE_PORTABLE_S -{ -#if (MULTITHREAD > 1) -#if USE_PTHREAD - pthread_t thread; -#elif USE_FORK - pid_t pid; - int shmid; - void *shm; -#elif USE_SOCKET - pid_t pid; - int sock; - struct sockaddr_in sa; -#endif /* Method for multithreading */ -#endif /* MULTITHREAD>1 */ - ee_u8 portable_id; -} core_portable; - -/* target specific init/fini */ -void portable_init(core_portable *p, int *argc, char *argv[]); -void portable_fini(core_portable *p); - -#if (SEED_METHOD == SEED_VOLATILE) -#if (VALIDATION_RUN || PERFORMANCE_RUN || PROFILE_RUN) -#define RUN_TYPE_FLAG 1 -#else -#if (TOTAL_DATA_SIZE == 1200) -#define PROFILE_RUN 1 -#else -#define PERFORMANCE_RUN 1 -#endif -#endif -#endif /* SEED_METHOD==SEED_VOLATILE */ - -#endif /* CORE_PORTME_H */ diff --git a/tests/riscv-coremark/coremark/posix/core_portme.mak b/tests/riscv-coremark/coremark/posix/core_portme.mak deleted file mode 100755 index e6be71a7e..000000000 --- a/tests/riscv-coremark/coremark/posix/core_portme.mak +++ /dev/null @@ -1,151 +0,0 @@ -# Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# Original Author: Shay Gal-on - -#File: core_portme.mak - -# Flag: OUTFLAG -# Use this flag to define how to to get an executable (e.g -o) -OUTFLAG= -o -# Flag: CC -# Use this flag to define compiler to use -CC?= cc -# Flag: CFLAGS -# Use this flag to define compiler options. Note, you can add compiler options from the command line using XCFLAGS="other flags" -PORT_CFLAGS = -O2 -FLAGS_STR = "$(PORT_CFLAGS) $(XCFLAGS) $(XLFLAGS) $(LFLAGS_END)" -CFLAGS = $(PORT_CFLAGS) -I$(PORT_DIR) -Iposix -I. -DFLAGS_STR=\"$(FLAGS_STR)\" -# Flag: NO_LIBRT -# Define if the platform does not provide a librt -ifndef NO_LIBRT -#Flag: LFLAGS_END -# Define any libraries needed for linking or other flags that should come at the end of the link line (e.g. linker scripts). -# Note: On certain platforms, the default clock_gettime implementation is supported but requires linking of librt. -LFLAGS_END += -lrt -endif -# Flag: PORT_SRCS -# Port specific source files can be added here -PORT_SRCS = posix/core_portme.c -vpath %.c posix -vpath %.h posix -vpath %.mak posix -# Flag: EXTRA_DEPENDS -# Port specific extra build dependencies. -# Some ports inherit from us, so ensure this Makefile is always a dependency. -EXTRA_DEPENDS += posix/core_portme.mak -# Flag: LOAD -# Define this flag if you need to load to a target, as in a cross compile environment. - -# Flag: RUN -# Define this flag if running does not consist of simple invocation of the binary. -# In a cross compile environment, you need to define this. - -#For flashing and using a tera term macro, you could use -#LOAD = flash ADDR -#RUN = ttpmacro coremark.ttl - -#For copying to target and executing via SSH connection, you could use -#LOAD = scp $(OUTFILE) user@target:~ -#RUN = ssh user@target -c - -#For native compilation and execution -LOAD = echo Loading done -RUN = - -OEXT = .o -EXE = .exe - -# Flag: SEPARATE_COMPILE -# Define if you need to separate compilation from link stage. -# In this case, you also need to define below how to create an object file, and how to link. -ifdef SEPARATE_COMPILE - -LD = gcc -OBJOUT = -o -LFLAGS = -OFLAG = -o -COUT = -c -# Flag: PORT_OBJS -# Port specific object files can be added here -PORT_OBJS = $(PORT_DIR)/core_portme$(OEXT) -PORT_CLEAN = *$(OEXT) - -$(OPATH)%$(OEXT) : %.c - $(CC) $(CFLAGS) $(XCFLAGS) $(COUT) $< $(OBJOUT) $@ - -endif - -# Target: port_prebuild -# Generate any files that are needed before actual build starts. -# E.g. generate profile guidance files. Sample PGO generation for gcc enabled with PGO=1 -# - First, check if PGO was defined on the command line, if so, need to add -fprofile-use to compile line. -# - Second, if PGO reference has not yet been generated, add a step to the prebuild that will build a profile-generate version and run it. -# Note - Using REBUILD=1 -# -# Use make PGO=1 to invoke this sample processing. - -ifdef PGO - ifeq (,$(findstring $(PGO),gen)) - PGO_STAGE=build_pgo_gcc - CFLAGS+=-fprofile-use - endif - PORT_CLEAN+=*.gcda *.gcno gmon.out -endif - -.PHONY: port_prebuild -port_prebuild: $(PGO_STAGE) - -.PHONY: build_pgo_gcc -build_pgo_gcc: - $(MAKE) PGO=gen XCFLAGS="$(XCFLAGS) -fprofile-generate -DTOTAL_DATA_SIZE=1200" ITERATIONS=10 gen_pgo_data REBUILD=1 - -# Target: port_postbuild -# Generate any files that are needed after actual build end. -# E.g. change format to srec, bin, zip in order to be able to load into flash -.PHONY: port_postbuild -port_postbuild: - -# Target: port_postrun -# Do platform specific after run stuff. -# E.g. reset the board, backup the logfiles etc. -.PHONY: port_postrun -port_postrun: - -# Target: port_prerun -# Do platform specific after run stuff. -# E.g. reset the board, backup the logfiles etc. -.PHONY: port_prerun -port_prerun: - -# Target: port_postload -# Do platform specific after load stuff. -# E.g. reset the reset power to the flash eraser -.PHONY: port_postload -port_postload: - -# Target: port_preload -# Do platform specific before load stuff. -# E.g. reset the reset power to the flash eraser -.PHONY: port_preload -port_preload: - -# FLAG: OPATH -# Path to the output folder. Default - current folder. -OPATH = ./ -MKDIR = mkdir -p - -# FLAG: PERL -# Define perl executable to calculate the geomean if running separate. -PERL=/usr/bin/perl diff --git a/tests/riscv-coremark/coremark/posix/core_portme_posix_overrides.h b/tests/riscv-coremark/coremark/posix/core_portme_posix_overrides.h deleted file mode 100644 index c0e998adf..000000000 --- a/tests/riscv-coremark/coremark/posix/core_portme_posix_overrides.h +++ /dev/null @@ -1,28 +0,0 @@ -/* -Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Original Author: Shay Gal-on -*/ - -/* Topic: Description - This file contains additional configuration constants required to execute on - different platforms over and above the POSIX defaults -*/ -#ifndef CORE_PORTME_POSIX_OVERRIDES_H -#define CORE_PORTME_POSIX_OVERRIDES_H - -/* None by default */ - -#endif diff --git a/tests/riscv-coremark/coremark/rtems/core_portme.mak b/tests/riscv-coremark/coremark/rtems/core_portme.mak deleted file mode 100644 index 6b27c3c41..000000000 --- a/tests/riscv-coremark/coremark/rtems/core_portme.mak +++ /dev/null @@ -1,18 +0,0 @@ -# Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# Original Author: Shay Gal-on - -NO_LIBRT = 1 -include posix/core_portme.mak diff --git a/tests/riscv-coremark/coremark/rtems/init.c b/tests/riscv-coremark/coremark/rtems/init.c deleted file mode 100644 index 64d3e59ae..000000000 --- a/tests/riscv-coremark/coremark/rtems/init.c +++ /dev/null @@ -1,63 +0,0 @@ -/*- - * SPDX-License-Identifier: BSD-2-Clause - * - * Copyright (c) 2021 Hesham Almatary - * - * This software was developed by SRI International and the University of - * Cambridge Computer Laboratory (Department of Computer Science and - * Technology) under DARPA contract HR0011-18-C-0016 ("ECATS"), as part of the - * DARPA SSITH research programme. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include -#include - -int main( - int argc, - void **args -); - -rtems_task Init( - rtems_task_argument ignored -); - -rtems_task Init( - rtems_task_argument ignored -) -{ - int ret = main(0, NULL); - exit(ret); -} - -/* configuration information */ -#define CONFIGURE_APPLICATION_NEEDS_SIMPLE_CONSOLE_DRIVER -#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER - -#define CONFIGURE_MAXIMUM_TASKS 20 - -#define CONFIGURE_RTEMS_INIT_TASKS_TABLE - -#define CONFIGURE_INIT - -#include diff --git a/tests/riscv-coremark/coremark/simple/core_portme.c b/tests/riscv-coremark/coremark/simple/core_portme.c deleted file mode 100644 index b95e3b21e..000000000 --- a/tests/riscv-coremark/coremark/simple/core_portme.c +++ /dev/null @@ -1,149 +0,0 @@ -/* -Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Original Author: Shay Gal-on -*/ - -#include -#include -#include "coremark.h" - -#if VALIDATION_RUN -volatile ee_s32 seed1_volatile = 0x3415; -volatile ee_s32 seed2_volatile = 0x3415; -volatile ee_s32 seed3_volatile = 0x66; -#endif -#if PERFORMANCE_RUN -volatile ee_s32 seed1_volatile = 0x0; -volatile ee_s32 seed2_volatile = 0x0; -volatile ee_s32 seed3_volatile = 0x66; -#endif -#if PROFILE_RUN -volatile ee_s32 seed1_volatile = 0x8; -volatile ee_s32 seed2_volatile = 0x8; -volatile ee_s32 seed3_volatile = 0x8; -#endif -volatile ee_s32 seed4_volatile = ITERATIONS; -volatile ee_s32 seed5_volatile = 0; -/* Porting : Timing functions - How to capture time and convert to seconds must be ported to whatever is - supported by the platform. e.g. Read value from on board RTC, read value from - cpu clock cycles performance counter etc. Sample implementation for standard - time.h and windows.h definitions included. -*/ -/* Define : TIMER_RES_DIVIDER - Divider to trade off timer resolution and total time that can be - measured. - - Use lower values to increase resolution, but make sure that overflow - does not occur. If there are issues with the return value overflowing, - increase this value. - */ -#define NSECS_PER_SEC CLOCKS_PER_SEC -#define CORETIMETYPE clock_t -#define GETMYTIME(_t) (*_t = clock()) -#define MYTIMEDIFF(fin, ini) ((fin) - (ini)) -#define TIMER_RES_DIVIDER 1 -#define SAMPLE_TIME_IMPLEMENTATION 1 -#define EE_TICKS_PER_SEC (NSECS_PER_SEC / TIMER_RES_DIVIDER) - -/** Define Host specific (POSIX), or target specific global time variables. */ -static CORETIMETYPE start_time_val, stop_time_val; - -/* Function : start_time - This function will be called right before starting the timed portion of - the benchmark. - - Implementation may be capturing a system timer (as implemented in the - example code) or zeroing some system parameters - e.g. setting the cpu clocks - cycles to 0. -*/ -void -start_time(void) -{ - GETMYTIME(&start_time_val); -} -/* Function : stop_time - This function will be called right after ending the timed portion of the - benchmark. - - Implementation may be capturing a system timer (as implemented in the - example code) or other system parameters - e.g. reading the current value of - cpu cycles counter. -*/ -void -stop_time(void) -{ - GETMYTIME(&stop_time_val); -} -/* Function : get_time - Return an abstract "ticks" number that signifies time on the system. - - Actual value returned may be cpu cycles, milliseconds or any other - value, as long as it can be converted to seconds by . This - methodology is taken to accomodate any hardware or simulated platform. The - sample implementation returns millisecs by default, and the resolution is - controlled by -*/ -CORE_TICKS -get_time(void) -{ - CORE_TICKS elapsed - = (CORE_TICKS)(MYTIMEDIFF(stop_time_val, start_time_val)); - return elapsed; -} -/* Function : time_in_secs - Convert the value returned by get_time to seconds. - - The type is used to accomodate systems with no support for - floating point. Default implementation implemented by the EE_TICKS_PER_SEC - macro above. -*/ -secs_ret -time_in_secs(CORE_TICKS ticks) -{ - secs_ret retval = ((secs_ret)ticks) / (secs_ret)EE_TICKS_PER_SEC; - return retval; -} - -ee_u32 default_num_contexts = 1; - -/* Function : portable_init - Target specific initialization code - Test for some common mistakes. -*/ -void -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 " - "pointer!\n"); - } - if (sizeof(ee_u32) != 4) - { - ee_printf("ERROR! Please define ee_u32 to a 32b unsigned type!\n"); - } - p->portable_id = 1; -} -/* Function : portable_fini - Target specific final code -*/ -void -portable_fini(core_portable *p) -{ - p->portable_id = 0; -} diff --git a/tests/riscv-coremark/coremark/simple/core_portme.h b/tests/riscv-coremark/coremark/simple/core_portme.h deleted file mode 100644 index dfd94cbfc..000000000 --- a/tests/riscv-coremark/coremark/simple/core_portme.h +++ /dev/null @@ -1,208 +0,0 @@ -/* -Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Original Author: Shay Gal-on -*/ - -/* Topic : Description - This file contains configuration constants required to execute on - different platforms -*/ -#ifndef CORE_PORTME_H -#define CORE_PORTME_H -/************************/ -/* Data types and settings */ -/************************/ -/* Configuration : HAS_FLOAT - Define to 1 if the platform supports floating point. -*/ -#ifndef HAS_FLOAT -#define HAS_FLOAT 1 -#endif -/* Configuration : HAS_TIME_H - Define to 1 if platform has the time.h header file, - and implementation of functions thereof. -*/ -#ifndef HAS_TIME_H -#define HAS_TIME_H 1 -#endif -/* Configuration : USE_CLOCK - Define to 1 if platform has the time.h header file, - and implementation of functions thereof. -*/ -#ifndef USE_CLOCK -#define USE_CLOCK 1 -#endif -/* Configuration : HAS_STDIO - Define to 1 if the platform has stdio.h. -*/ -#ifndef HAS_STDIO -#define HAS_STDIO 1 -#endif -/* Configuration : HAS_PRINTF - Define to 1 if the platform has stdio.h and implements the printf - function. -*/ -#ifndef HAS_PRINTF -#define HAS_PRINTF 1 -#endif - -/* Configuration : CORE_TICKS - Define type of return from the timing functions. - */ -#include -typedef clock_t CORE_TICKS; - -/* Definitions : COMPILER_VERSION, COMPILER_FLAGS, MEM_LOCATION - Initialize these strings per platform -*/ -#ifndef COMPILER_VERSION -#ifdef __GNUC__ -#define COMPILER_VERSION "GCC"__VERSION__ -#else -#define COMPILER_VERSION "Please put compiler version here (e.g. gcc 4.1)" -#endif -#endif -#ifndef COMPILER_FLAGS -#define COMPILER_FLAGS \ - FLAGS_STR /* "Please put compiler flags here (e.g. -o3)" */ -#endif -#ifndef MEM_LOCATION -#define MEM_LOCATION "STACK" -#endif - -/* Data Types : - To avoid compiler issues, define the data types that need ot be used for - 8b, 16b and 32b in . - - *Imprtant* : - ee_ptr_int needs to be the data type used to hold pointers, otherwise - coremark may fail!!! -*/ -typedef signed short ee_s16; -typedef unsigned short ee_u16; -typedef signed int ee_s32; -typedef double ee_f32; -typedef unsigned char ee_u8; -typedef unsigned int ee_u32; -typedef ee_u32 ee_ptr_int; -typedef size_t ee_size_t; -/* align_mem : - This macro is used to align an offset to point to a 32b value. It is - used in the Matrix algorithm to initialize the input memory blocks. -*/ -#define align_mem(x) (void *)(4 + (((ee_ptr_int)(x)-1) & ~3)) - -/* Configuration : SEED_METHOD - Defines method to get seed values that cannot be computed at compile - time. - - Valid values : - SEED_ARG - from command line. - SEED_FUNC - from a system function. - SEED_VOLATILE - from volatile variables. -*/ -#ifndef SEED_METHOD -#define SEED_METHOD SEED_VOLATILE -#endif - -/* Configuration : MEM_METHOD - Defines method to get a block of memry. - - Valid values : - MEM_MALLOC - for platforms that implement malloc and have malloc.h. - MEM_STATIC - to use a static memory array. - MEM_STACK - to allocate the data block on the stack (NYI). -*/ -#ifndef MEM_METHOD -#define MEM_METHOD MEM_STACK -#endif - -/* Configuration : MULTITHREAD - Define for parallel execution - - Valid values : - 1 - only one context (default). - N>1 - will execute N copies in parallel. - - Note : - If this flag is defined to more then 1, an implementation for launching - parallel contexts must be defined. - - Two sample implementations are provided. Use or - to enable them. - - It is valid to have a different implementation of - and in , to fit a particular architecture. -*/ -#ifndef MULTITHREAD -#define MULTITHREAD 1 -#define USE_PTHREAD 0 -#define USE_FORK 0 -#define USE_SOCKET 0 -#endif - -/* Configuration : MAIN_HAS_NOARGC - Needed if platform does not support getting arguments to main. - - Valid values : - 0 - argc/argv to main is supported - 1 - argc/argv to main is not supported - - Note : - This flag only matters if MULTITHREAD has been defined to a value - greater then 1. -*/ -#ifndef MAIN_HAS_NOARGC -#define MAIN_HAS_NOARGC 0 -#endif - -/* Configuration : MAIN_HAS_NORETURN - Needed if platform does not support returning a value from main. - - Valid values : - 0 - main returns an int, and return value will be 0. - 1 - platform does not support returning a value from main -*/ -#ifndef MAIN_HAS_NORETURN -#define MAIN_HAS_NORETURN 0 -#endif - -/* Variable : default_num_contexts - Not used for this simple port, must cintain the value 1. -*/ -extern ee_u32 default_num_contexts; - -typedef struct CORE_PORTABLE_S -{ - ee_u8 portable_id; -} core_portable; - -/* target specific init/fini */ -void portable_init(core_portable *p, int *argc, char *argv[]); -void portable_fini(core_portable *p); - -#if !defined(PROFILE_RUN) && !defined(PERFORMANCE_RUN) \ - && !defined(VALIDATION_RUN) -#if (TOTAL_DATA_SIZE == 1200) -#define PROFILE_RUN 1 -#elif (TOTAL_DATA_SIZE == 2000) -#define PERFORMANCE_RUN 1 -#else -#define VALIDATION_RUN 1 -#endif -#endif - -#endif /* CORE_PORTME_H */ diff --git a/tests/riscv-coremark/coremark/simple/core_portme.mak b/tests/riscv-coremark/coremark/simple/core_portme.mak deleted file mode 100755 index 61c3db683..000000000 --- a/tests/riscv-coremark/coremark/simple/core_portme.mak +++ /dev/null @@ -1,60 +0,0 @@ -# Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# Original Author: Shay Gal-on - -#File : core_portme.mak - -# Flag : OUTFLAG -# Use this flag to define how to to get an executable (e.g -o) -OUTFLAG= -o -# Flag : CC -# Use this flag to define compiler to use -CC = gcc -# Flag : CFLAGS -# Use this flag to define compiler options. Note, you can add compiler options from the command line using XCFLAGS="other flags" -PORT_CFLAGS = -O2 -FLAGS_STR = "$(PORT_CFLAGS) $(XCFLAGS) $(XLFLAGS) $(LFLAGS_END)" -CFLAGS = $(PORT_CFLAGS) -I$(PORT_DIR) -I. -DFLAGS_STR=\"$(FLAGS_STR)\" -#Flag : LFLAGS_END -# Define any libraries needed for linking or other flags that should come at the end of the link line (e.g. linker scripts). -# Note : On certain platforms, the default clock_gettime implementation is supported but requires linking of librt. -LFLAGS_END = -# Flag : PORT_SRCS -# Port specific source files can be added here -PORT_SRCS = $(PORT_DIR)/core_portme.c -# Flag : LOAD -# For a simple port, we assume self hosted compile and run, no load needed. - -# Flag : RUN -# For a simple port, we assume self hosted compile and run, simple invocation of the executable - -#For native compilation and execution -LOAD = echo Loading done -RUN = - -OEXT = .o -EXE = .exe - -# Target : port_pre% and port_post% -# For the purpose of this simple port, no pre or post steps needed. - -.PHONY : port_prebuild port_postbuild port_prerun port_postrun port_preload port_postload -port_pre% port_post% : - -# FLAG : OPATH -# Path to the output folder. Default - current folder. -OPATH = ./ -MKDIR = mkdir -p - diff --git a/tests/riscv-coremark/extraPortmes/README.md b/tests/riscv-coremark/extraPortmes/README.md deleted file mode 100644 index 681fc4d8b..000000000 --- a/tests/riscv-coremark/extraPortmes/README.md +++ /dev/null @@ -1,7 +0,0 @@ -This directory is a backup for the portme files associated with cygwin, linux, and linux64 - -This backup is needed in the event that a user replaces the coremark directory with a clean version -from EEMBC's github page (the clean version does not have the cygwin, linux, -and linux64 files that our version does). - -Please do not delete this directory under any circumstance. \ No newline at end of file diff --git a/tests/riscv-coremark/extraPortmes/cygwin/core_portme.c b/tests/riscv-coremark/extraPortmes/cygwin/core_portme.c deleted file mode 100755 index fe8d29983..000000000 --- a/tests/riscv-coremark/extraPortmes/cygwin/core_portme.c +++ /dev/null @@ -1,336 +0,0 @@ -/* -Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Original Author: Shay Gal-on -*/ - -#include -#include -#include "coremark.h" -#if CALLGRIND_RUN -#include -#endif - -#if (MEM_METHOD==MEM_MALLOC) -#include -/* Function: portable_malloc - Provide malloc() functionality in a platform specific way. -*/ -void *portable_malloc(size_t size) { - return malloc(size); -} -/* Function: portable_free - Provide free() functionality in a platform specific way. -*/ -void portable_free(void *p) { - free(p); -} -#else -void *portable_malloc(size_t size) { - return NULL; -} -void portable_free(void *p) { - p=NULL; -} -#endif - -#if (SEED_METHOD==SEED_VOLATILE) -#if VALIDATION_RUN - volatile ee_s32 seed1_volatile=0x3415; - volatile ee_s32 seed2_volatile=0x3415; - volatile ee_s32 seed3_volatile=0x66; -#endif -#if PERFORMANCE_RUN - volatile ee_s32 seed1_volatile=0x0; - volatile ee_s32 seed2_volatile=0x0; - volatile ee_s32 seed3_volatile=0x66; -#endif -#if PROFILE_RUN - volatile ee_s32 seed1_volatile=0x8; - volatile ee_s32 seed2_volatile=0x8; - volatile ee_s32 seed3_volatile=0x8; -#endif - volatile ee_s32 seed4_volatile=ITERATIONS; - volatile ee_s32 seed5_volatile=0; -#endif -/* Porting: Timing functions - How to capture time and convert to seconds must be ported to whatever is supported by the platform. - e.g. Read value from on board RTC, read value from cpu clock cycles performance counter etc. - Sample implementation for standard time.h and windows.h definitions included. -*/ -/* Define: TIMER_RES_DIVIDER - Divider to trade off timer resolution and total time that can be measured. - - Use lower values to increase resolution, but make sure that overflow does not occur. - If there are issues with the return value overflowing, increase this value. - */ -#if USE_CLOCK - #define NSECS_PER_SEC CLOCKS_PER_SEC - #define EE_TIMER_TICKER_RATE 1000 - #define CORETIMETYPE clock_t - #define GETMYTIME(_t) (*_t=clock()) - #define MYTIMEDIFF(fin,ini) ((fin)-(ini)) - #define TIMER_RES_DIVIDER 1 - #define SAMPLE_TIME_IMPLEMENTATION 1 -#elif defined(_MSC_VER) - #define NSECS_PER_SEC 10000000 - #define EE_TIMER_TICKER_RATE 1000 - #define CORETIMETYPE FILETIME - #define GETMYTIME(_t) GetSystemTimeAsFileTime(_t) - #define MYTIMEDIFF(fin,ini) (((*(__int64*)&fin)-(*(__int64*)&ini))/TIMER_RES_DIVIDER) - /* setting to millisces resolution by default with MSDEV */ - #ifndef TIMER_RES_DIVIDER - #define TIMER_RES_DIVIDER 1000 - #endif - #define SAMPLE_TIME_IMPLEMENTATION 1 -#elif HAS_TIME_H - #define NSECS_PER_SEC 1000000000 - #define EE_TIMER_TICKER_RATE 1000 - #define CORETIMETYPE struct timespec - #define GETMYTIME(_t) clock_gettime(CLOCK_REALTIME,_t) - #define MYTIMEDIFF(fin,ini) ((fin.tv_sec-ini.tv_sec)*(NSECS_PER_SEC/TIMER_RES_DIVIDER)+(fin.tv_nsec-ini.tv_nsec)/TIMER_RES_DIVIDER) - /* setting to 1/1000 of a second resolution by default with linux */ - #ifndef TIMER_RES_DIVIDER - #define TIMER_RES_DIVIDER 1000000 - #endif - #define SAMPLE_TIME_IMPLEMENTATION 1 -#else - #define SAMPLE_TIME_IMPLEMENTATION 0 -#endif -#define EE_TICKS_PER_SEC (NSECS_PER_SEC / TIMER_RES_DIVIDER) - -#if SAMPLE_TIME_IMPLEMENTATION -/** Define Host specific (POSIX), or target specific global time variables. */ -static CORETIMETYPE start_time_val, stop_time_val; - -/* Function: start_time - This function will be called right before starting the timed portion of the benchmark. - - Implementation may be capturing a system timer (as implemented in the example code) - or zeroing some system parameters - e.g. setting the cpu clocks cycles to 0. -*/ -void start_time(void) { - GETMYTIME(&start_time_val ); -#if CALLGRIND_RUN - CALLGRIND_START_INSTRUMENTATION -#endif -#if MICA - asm volatile("int3");/*1 */ -#endif -} -/* Function: stop_time - This function will be called right after ending the timed portion of the benchmark. - - Implementation may be capturing a system timer (as implemented in the example code) - or other system parameters - e.g. reading the current value of cpu cycles counter. -*/ -void stop_time(void) { -#if CALLGRIND_RUN - CALLGRIND_STOP_INSTRUMENTATION -#endif -#if MICA - asm volatile("int3");/*1 */ -#endif - GETMYTIME(&stop_time_val ); -} -/* Function: get_time - Return an abstract "ticks" number that signifies time on the system. - - Actual value returned may be cpu cycles, milliseconds or any other value, - as long as it can be converted to seconds by . - This methodology is taken to accomodate any hardware or simulated platform. - The sample implementation returns millisecs by default, - and the resolution is controlled by -*/ -CORE_TICKS get_time(void) { - CORE_TICKS elapsed=(CORE_TICKS)(MYTIMEDIFF(stop_time_val, start_time_val)); - return elapsed; -} -/* Function: time_in_secs - Convert the value returned by get_time to seconds. - - The type is used to accomodate systems with no support for floating point. - Default implementation implemented by the EE_TICKS_PER_SEC macro above. -*/ -secs_ret time_in_secs(CORE_TICKS ticks) { - secs_ret retval=((secs_ret)ticks) / (secs_ret)EE_TICKS_PER_SEC; - return retval; -} -#else -#error "Please implement timing functionality in core_portme.c" -#endif /* SAMPLE_TIME_IMPLEMENTATION */ - -ee_u32 default_num_contexts=MULTITHREAD; - -/* Function: portable_init - Target specific initialization code - Test for some common mistakes. -*/ -void portable_init(core_portable *p, int *argc, char *argv[]) -{ -#if PRINT_ARGS - int i; - for (i=0; i<*argc; i++) { - ee_printf("Arg[%d]=%s\n",i,argv[i]); - } -#endif - if (sizeof(ee_ptr_int) != sizeof(ee_u8 *)) { - ee_printf("ERROR! Please define ee_ptr_int to a type that holds a pointer!\n"); - } - if (sizeof(ee_u32) != 4) { - ee_printf("ERROR! Please define ee_u32 to a 32b unsigned type!\n"); - } -#if (MAIN_HAS_NOARGC && (SEED_METHOD==SEED_ARG)) - ee_printf("ERROR! Main has no argc, but SEED_METHOD defined to SEED_ARG!\n"); -#endif - -#if (MULTITHREAD>1) && (SEED_METHOD==SEED_ARG) - int nargs=*argc,i; - if ((nargs>1) && (*argv[1]=='M')) { - default_num_contexts=parseval(argv[1]+1); - if (default_num_contexts>MULTITHREAD) - default_num_contexts=MULTITHREAD; - /* Shift args since first arg is directed to the portable part and not to coremark main */ - --nargs; - for (i=1; i*/ - p->portable_id=1; -} -/* Function: portable_fini - Target specific final code -*/ -void portable_fini(core_portable *p) -{ - p->portable_id=0; -} - -#if (MULTITHREAD>1) - -/* Function: core_start_parallel - Start benchmarking in a parallel context. - - Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets. - Other implementations using MCAPI or other standards can easily be devised. -*/ -/* Function: core_stop_parallel - Stop a parallel context execution of coremark, and gather the results. - - Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets. - Other implementations using MCAPI or other standards can easily be devised. -*/ -#if USE_PTHREAD -ee_u8 core_start_parallel(core_results *res) { - return (ee_u8)pthread_create(&(res->port.thread),NULL,iterate,(void *)res); -} -ee_u8 core_stop_parallel(core_results *res) { - void *retval; - return (ee_u8)pthread_join(res->port.thread,&retval); -} -#elif USE_FORK -static int key_id=0; -ee_u8 core_start_parallel(core_results *res) { - key_t key=4321+key_id; - key_id++; - res->port.pid=fork(); - res->port.shmid=shmget(key, 8, IPC_CREAT | 0666); - if (res->port.shmid<0) { - ee_printf("ERROR in shmget!\n"); - } - if (res->port.pid==0) { - iterate(res); - res->port.shm=shmat(res->port.shmid, NULL, 0); - /* copy the validation values to the shared memory area and quit*/ - if (res->port.shm == (char *) -1) { - ee_printf("ERROR in child shmat!\n"); - } else { - memcpy(res->port.shm,&(res->crc),8); - shmdt(res->port.shm); - } - exit(0); - } - return 1; -} -ee_u8 core_stop_parallel(core_results *res) { - int status; - pid_t wpid = waitpid(res->port.pid,&status,WUNTRACED); - if (wpid != res->port.pid) { - ee_printf("ERROR waiting for child.\n"); - if (errno == ECHILD) ee_printf("errno=No such child %d\n",res->port.pid); - if (errno == EINTR) ee_printf("errno=Interrupted\n"); - return 0; - } - /* after process is done, get the values from the shared memory area */ - res->port.shm=shmat(res->port.shmid, NULL, 0); - if (res->port.shm == (char *) -1) { - ee_printf("ERROR in parent shmat!\n"); - return 0; - } - memcpy(&(res->crc),res->port.shm,8); - shmdt(res->port.shm); - return 1; -} -#elif USE_SOCKET -static int key_id=0; -ee_u8 core_start_parallel(core_results *res) { - int bound, buffer_length=8; - res->port.sa.sin_family = AF_INET; - res->port.sa.sin_addr.s_addr = htonl(0x7F000001); - res->port.sa.sin_port = htons(7654+key_id); - key_id++; - res->port.pid=fork(); - if (res->port.pid==0) { /* benchmark child */ - iterate(res); - res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); - if (-1 == res->port.sock) /* if socket failed to initialize, exit */ { - ee_printf("Error Creating Socket"); - } else { - int bytes_sent = sendto(res->port.sock, &(res->crc), buffer_length, 0,(struct sockaddr*)&(res->port.sa), sizeof (struct sockaddr_in)); - if (bytes_sent < 0) - ee_printf("Error sending packet: %s\n", strerror(errno)); - close(res->port.sock); /* close the socket */ - } - exit(0); - } - /* parent process, open the socket */ - res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); - bound = bind(res->port.sock,(struct sockaddr*)&(res->port.sa), sizeof(struct sockaddr)); - if (bound < 0) - ee_printf("bind(): %s\n",strerror(errno)); - return 1; -} -ee_u8 core_stop_parallel(core_results *res) { - int status; - int fromlen=sizeof(struct sockaddr); - int recsize = recvfrom(res->port.sock, &(res->crc), 8, 0, (struct sockaddr*)&(res->port.sa), &fromlen); - if (recsize < 0) { - ee_printf("Error in receive: %s\n", strerror(errno)); - return 0; - } - pid_t wpid = waitpid(res->port.pid,&status,WUNTRACED); - if (wpid != res->port.pid) { - ee_printf("ERROR waiting for child.\n"); - if (errno == ECHILD) ee_printf("errno=No such child %d\n",res->port.pid); - if (errno == EINTR) ee_printf("errno=Interrupted\n"); - return 0; - } - return 1; -} -#else /* no standard multicore implementation */ -#error "Please implement multicore functionality in core_portme.c to use multiple contexts." -#endif /* multithread implementations */ -#endif diff --git a/tests/riscv-coremark/extraPortmes/cygwin/core_portme.h b/tests/riscv-coremark/extraPortmes/cygwin/core_portme.h deleted file mode 100755 index 9471b12ec..000000000 --- a/tests/riscv-coremark/extraPortmes/cygwin/core_portme.h +++ /dev/null @@ -1,293 +0,0 @@ -/* -Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Original Author: Shay Gal-on -*/ - -/* Topic: Description - This file contains configuration constants required to execute on different platforms -*/ -#ifndef CORE_PORTME_H -#define CORE_PORTME_H -/************************/ -/* Data types and settings */ -/************************/ -/* Configuration: HAS_FLOAT - Define to 1 if the platform supports floating point. -*/ -#ifndef HAS_FLOAT -#define HAS_FLOAT 1 -#endif -/* Configuration: HAS_TIME_H - Define to 1 if platform has the time.h header file, - and implementation of functions thereof. -*/ -#ifndef HAS_TIME_H -#define HAS_TIME_H 1 -#endif -/* Configuration: USE_CLOCK - Define to 1 if platform has the time.h header file, - and implementation of functions thereof. -*/ -#ifndef USE_CLOCK -#define USE_CLOCK 0 -#endif -/* Configuration: HAS_STDIO - Define to 1 if the platform has stdio.h. -*/ -#ifndef HAS_STDIO -#define HAS_STDIO 1 -#endif -/* Configuration: HAS_PRINTF - Define to 1 if the platform has stdio.h and implements the printf function. -*/ -#ifndef HAS_PRINTF -#define HAS_PRINTF 1 -#endif - -/* Configuration: CORE_TICKS - Define type of return from the timing functions. - */ -#if defined(_MSC_VER) -#include -typedef size_t CORE_TICKS; -#elif HAS_TIME_H -#include -typedef clock_t CORE_TICKS; -#else -#error "Please define type of CORE_TICKS and implement start_time, end_time get_time and time_in_secs functions!" -#endif - -/* Definitions: COMPILER_VERSION, COMPILER_FLAGS, MEM_LOCATION - Initialize these strings per platform -*/ -#ifndef COMPILER_VERSION - #ifdef __GNUC__ - #define COMPILER_VERSION "GCC"__VERSION__ - #else - #define COMPILER_VERSION "Please put compiler version here (e.g. gcc 4.1)" - #endif -#endif -#ifndef COMPILER_FLAGS - #define COMPILER_FLAGS FLAGS_STR /* "Please put compiler flags here (e.g. -o3)" */ -#endif -#ifndef MEM_LOCATION - #define MEM_LOCATION "Please put data memory location here\n\t\t\t(e.g. code in flash, data on heap etc)" - #define MEM_LOCATION_UNSPEC 1 -#endif - -/* Data Types: - To avoid compiler issues, define the data types that need ot be used for 8b, 16b and 32b in . - - *Imprtant*: - ee_ptr_int needs to be the data type used to hold pointers, otherwise coremark may fail!!! -*/ -typedef signed short ee_s16; -typedef unsigned short ee_u16; -typedef signed int ee_s32; -typedef double ee_f32; -typedef unsigned char ee_u8; -typedef unsigned int ee_u32; -typedef ee_u32 ee_ptr_int; -typedef size_t ee_size_t; -/* align_mem: - This macro is used to align an offset to point to a 32b value. It is used in the Matrix algorithm to initialize the input memory blocks. -*/ -#define align_mem(x) (void *)(4 + (((ee_ptr_int)(x) - 1) & ~3)) - -/* Configuration: SEED_METHOD - Defines method to get seed values that cannot be computed at compile time. - - Valid values: - SEED_ARG - from command line. - SEED_FUNC - from a system function. - SEED_VOLATILE - from volatile variables. -*/ -#ifndef SEED_METHOD -#define SEED_METHOD SEED_ARG -#endif - -/* Configuration: MEM_METHOD - Defines method to get a block of memry. - - Valid values: - MEM_MALLOC - for platforms that implement malloc and have malloc.h. - MEM_STATIC - to use a static memory array. - MEM_STACK - to allocate the data block on the stack (NYI). -*/ -#ifndef MEM_METHOD -#define MEM_METHOD MEM_MALLOC -#endif - -/* Configuration: MULTITHREAD - Define for parallel execution - - Valid values: - 1 - only one context (default). - N>1 - will execute N copies in parallel. - - Note: - If this flag is defined to more then 1, an implementation for launching parallel contexts must be defined. - - Two sample implementations are provided. Use or to enable them. - - It is valid to have a different implementation of and in , - to fit a particular architecture. -*/ -#ifndef MULTITHREAD -#define MULTITHREAD 1 -#endif - -/* Configuration: USE_PTHREAD - Sample implementation for launching parallel contexts - This implementation uses pthread_thread_create and pthread_join. - - Valid values: - 0 - Do not use pthreads API. - 1 - Use pthreads API - - Note: - This flag only matters if MULTITHREAD has been defined to a value greater then 1. -*/ -#ifndef USE_PTHREAD -#define USE_PTHREAD 0 -#endif - -/* Configuration: USE_FORK - Sample implementation for launching parallel contexts - This implementation uses fork, waitpid, shmget,shmat and shmdt. - - Valid values: - 0 - Do not use fork API. - 1 - Use fork API - - Note: - This flag only matters if MULTITHREAD has been defined to a value greater then 1. -*/ -#ifndef USE_FORK -#define USE_FORK 0 -#endif - -/* Configuration: USE_SOCKET - Sample implementation for launching parallel contexts - This implementation uses fork, socket, sendto and recvfrom - - Valid values: - 0 - Do not use fork and sockets API. - 1 - Use fork and sockets API - - Note: - This flag only matters if MULTITHREAD has been defined to a value greater then 1. -*/ -#ifndef USE_SOCKET -#define USE_SOCKET 0 -#endif - -/* Configuration: MAIN_HAS_NOARGC - Needed if platform does not support getting arguments to main. - - Valid values: - 0 - argc/argv to main is supported - 1 - argc/argv to main is not supported -*/ -#ifndef MAIN_HAS_NOARGC -#define MAIN_HAS_NOARGC 0 -#endif - -/* Configuration: MAIN_HAS_NORETURN - Needed if platform does not support returning a value from main. - - Valid values: - 0 - main returns an int, and return value will be 0. - 1 - platform does not support returning a value from main -*/ -#ifndef MAIN_HAS_NORETURN -#define MAIN_HAS_NORETURN 0 -#endif - -/* Variable: default_num_contexts - Number of contexts to spawn in multicore context. - Override this global value to change number of contexts used. - - Note: - This value may not be set higher then the define. - - To experiment, you can set the define to the highest value expected, and use argc/argv in the to set this value from the command line. -*/ -extern ee_u32 default_num_contexts; - -#if (MULTITHREAD>1) -#if USE_PTHREAD - #include - #define PARALLEL_METHOD "PThreads" -#elif USE_FORK - #include - #include - #include - #include - #include /* for memcpy */ - #define PARALLEL_METHOD "Fork" -#elif USE_SOCKET - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #define PARALLEL_METHOD "Sockets" -#else - #define PARALLEL_METHOD "Proprietary" - #error "Please implement multicore functionality in core_portme.c to use multiple contexts." -#endif /* Method for multithreading */ -#endif /* MULTITHREAD > 1 */ - -typedef struct CORE_PORTABLE_S { -#if (MULTITHREAD>1) - #if USE_PTHREAD - pthread_t thread; - #elif USE_FORK - pid_t pid; - int shmid; - void *shm; - #elif USE_SOCKET - pid_t pid; - int sock; - struct sockaddr_in sa; - #endif /* Method for multithreading */ -#endif /* MULTITHREAD>1 */ - ee_u8 portable_id; -} core_portable; - -/* target specific init/fini */ -void portable_init(core_portable *p, int *argc, char *argv[]); -void portable_fini(core_portable *p); - -#if (SEED_METHOD==SEED_VOLATILE) - #if (VALIDATION_RUN || PERFORMANCE_RUN || PROFILE_RUN) - #define RUN_TYPE_FLAG 1 - #else - #if (TOTAL_DATA_SIZE==1200) - #define PROFILE_RUN 1 - #else - #define PERFORMANCE_RUN 1 - #endif - #endif -#endif /* SEED_METHOD==SEED_VOLATILE */ - -#endif /* CORE_PORTME_H */ diff --git a/tests/riscv-coremark/extraPortmes/cygwin/core_portme.mak b/tests/riscv-coremark/extraPortmes/cygwin/core_portme.mak deleted file mode 100644 index 97b6d6ace..000000000 --- a/tests/riscv-coremark/extraPortmes/cygwin/core_portme.mak +++ /dev/null @@ -1,17 +0,0 @@ -# Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# Original Author: Shay Gal-on - -include posix/core_portme.mak diff --git a/tests/riscv-coremark/extraPortmes/linux/core_portme.c b/tests/riscv-coremark/extraPortmes/linux/core_portme.c deleted file mode 100755 index 6b63610d1..000000000 --- a/tests/riscv-coremark/extraPortmes/linux/core_portme.c +++ /dev/null @@ -1,338 +0,0 @@ -/* -Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Original Author: Shay Gal-on -*/ - -#include -#include -#include "coremark.h" -#if CALLGRIND_RUN -#include -#endif - -#if (MEM_METHOD==MEM_MALLOC) -#include -/* Function: portable_malloc - Provide malloc() functionality in a platform specific way. -*/ -void *portable_malloc(size_t size) { - return malloc(size); -} -/* Function: portable_free - Provide free() functionality in a platform specific way. -*/ -void portable_free(void *p) { - free(p); -} -#else -void *portable_malloc(size_t size) { - return NULL; -} -void portable_free(void *p) { - p=NULL; -} -#endif - -#if (SEED_METHOD==SEED_VOLATILE) -#if VALIDATION_RUN - volatile ee_s32 seed1_volatile=0x3415; - volatile ee_s32 seed2_volatile=0x3415; - volatile ee_s32 seed3_volatile=0x66; -#endif -#if PERFORMANCE_RUN - volatile ee_s32 seed1_volatile=0x0; - volatile ee_s32 seed2_volatile=0x0; - volatile ee_s32 seed3_volatile=0x66; -#endif -#if PROFILE_RUN - volatile ee_s32 seed1_volatile=0x8; - volatile ee_s32 seed2_volatile=0x8; - volatile ee_s32 seed3_volatile=0x8; -#endif - volatile ee_s32 seed4_volatile=ITERATIONS; - volatile ee_s32 seed5_volatile=0; -#endif -/* Porting: Timing functions - How to capture time and convert to seconds must be ported to whatever is supported by the platform. - e.g. Read value from on board RTC, read value from cpu clock cycles performance counter etc. - Sample implementation for standard time.h and windows.h definitions included. -*/ -/* Define: TIMER_RES_DIVIDER - Divider to trade off timer resolution and total time that can be measured. - - Use lower values to increase resolution, but make sure that overflow does not occur. - If there are issues with the return value overflowing, increase this value. - */ -#if USE_CLOCK - #define NSECS_PER_SEC CLOCKS_PER_SEC - #define EE_TIMER_TICKER_RATE 1000 - #define CORETIMETYPE clock_t - #define GETMYTIME(_t) (*_t=clock()) - #define MYTIMEDIFF(fin,ini) ((fin)-(ini)) - #define TIMER_RES_DIVIDER 1 - #define SAMPLE_TIME_IMPLEMENTATION 1 -#elif defined(_MSC_VER) - #define NSECS_PER_SEC 10000000 - #define EE_TIMER_TICKER_RATE 1000 - #define CORETIMETYPE FILETIME - #define GETMYTIME(_t) GetSystemTimeAsFileTime(_t) - #define MYTIMEDIFF(fin,ini) (((*(__int64*)&fin)-(*(__int64*)&ini))/TIMER_RES_DIVIDER) - /* setting to millisces resolution by default with MSDEV */ - #ifndef TIMER_RES_DIVIDER - #define TIMER_RES_DIVIDER 1000 - #endif - #define SAMPLE_TIME_IMPLEMENTATION 1 -#elif HAS_TIME_H - #define NSECS_PER_SEC 1000000000 - #define EE_TIMER_TICKER_RATE 1000 - #define CORETIMETYPE struct timespec - #define GETMYTIME(_t) clock_gettime(CLOCK_REALTIME,_t) - #define MYTIMEDIFF(fin,ini) ((fin.tv_sec-ini.tv_sec)*(NSECS_PER_SEC/TIMER_RES_DIVIDER)+(fin.tv_nsec-ini.tv_nsec)/TIMER_RES_DIVIDER) - /* setting to 1/1000 of a second resolution by default with linux */ - #ifndef TIMER_RES_DIVIDER - #define TIMER_RES_DIVIDER 1000000 - #endif - #define SAMPLE_TIME_IMPLEMENTATION 1 -#else - #define SAMPLE_TIME_IMPLEMENTATION 0 -#endif -#define EE_TICKS_PER_SEC (NSECS_PER_SEC / TIMER_RES_DIVIDER) - -#if SAMPLE_TIME_IMPLEMENTATION -/** Define Host specific (POSIX), or target specific global time variables. */ -static CORETIMETYPE start_time_val, stop_time_val; - -/* Function: start_time - This function will be called right before starting the timed portion of the benchmark. - - Implementation may be capturing a system timer (as implemented in the example code) - or zeroing some system parameters - e.g. setting the cpu clocks cycles to 0. -*/ -void start_time(void) { - GETMYTIME(&start_time_val ); -#if CALLGRIND_RUN - CALLGRIND_START_INSTRUMENTATION -#endif -#if MICA - asm volatile("int3");/*1 */ -#endif -} -/* Function: stop_time - This function will be called right after ending the timed portion of the benchmark. - - Implementation may be capturing a system timer (as implemented in the example code) - or other system parameters - e.g. reading the current value of cpu cycles counter. -*/ -void stop_time(void) { -#if CALLGRIND_RUN - CALLGRIND_STOP_INSTRUMENTATION -#endif -#if MICA - asm volatile("int3");/*1 */ -#endif - GETMYTIME(&stop_time_val ); -} -/* Function: get_time - Return an abstract "ticks" number that signifies time on the system. - - Actual value returned may be cpu cycles, milliseconds or any other value, - as long as it can be converted to seconds by . - This methodology is taken to accomodate any hardware or simulated platform. - The sample implementation returns millisecs by default, - and the resolution is controlled by -*/ -CORE_TICKS get_time(void) { - CORE_TICKS elapsed=(CORE_TICKS)(MYTIMEDIFF(stop_time_val, start_time_val)); - return elapsed; -} -/* Function: time_in_secs - Convert the value returned by get_time to seconds. - - The type is used to accomodate systems with no support for floating point. - Default implementation implemented by the EE_TICKS_PER_SEC macro above. -*/ -secs_ret time_in_secs(CORE_TICKS ticks) { - secs_ret retval=((secs_ret)ticks) / (secs_ret)EE_TICKS_PER_SEC; - return retval; -} -#else -#error "Please implement timing functionality in core_portme.c" -#endif /* SAMPLE_TIME_IMPLEMENTATION */ - -ee_u32 default_num_contexts=MULTITHREAD; - -/* Function: portable_init - Target specific initialization code - Test for some common mistakes. -*/ -void portable_init(core_portable *p, int *argc, char *argv[]) -{ -#if PRINT_ARGS - int i; - for (i=0; i<*argc; i++) { - ee_printf("Arg[%d]=%s\n",i,argv[i]); - } -#endif - if (sizeof(ee_ptr_int) != sizeof(ee_u8 *)) { - ee_printf("ERROR! Please define ee_ptr_int to a type that holds a pointer!\n"); - } - if (sizeof(ee_u32) != 4) { - ee_printf("ERROR! Please define ee_u32 to a 32b unsigned type!\n"); - } -#if (MAIN_HAS_NOARGC && (SEED_METHOD==SEED_ARG)) - ee_printf("ERROR! Main has no argc, but SEED_METHOD defined to SEED_ARG!\n"); -#endif - -#if (MULTITHREAD>1) && (SEED_METHOD==SEED_ARG) - { - int nargs=*argc,i; - if ((nargs>1) && (*argv[1]=='M')) { - default_num_contexts=parseval(argv[1]+1); - if (default_num_contexts>MULTITHREAD) - default_num_contexts=MULTITHREAD; - /* Shift args since first arg is directed to the portable part and not to coremark main */ - --nargs; - for (i=1; i*/ - p->portable_id=1; -} -/* Function: portable_fini - Target specific final code -*/ -void portable_fini(core_portable *p) -{ - p->portable_id=0; -} - -#if (MULTITHREAD>1) - -/* Function: core_start_parallel - Start benchmarking in a parallel context. - - Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets. - Other implementations using MCAPI or other standards can easily be devised. -*/ -/* Function: core_stop_parallel - Stop a parallel context execution of coremark, and gather the results. - - Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets. - Other implementations using MCAPI or other standards can easily be devised. -*/ -#if USE_PTHREAD -ee_u8 core_start_parallel(core_results *res) { - return (ee_u8)pthread_create(&(res->port.thread),NULL,iterate,(void *)res); -} -ee_u8 core_stop_parallel(core_results *res) { - void *retval; - return (ee_u8)pthread_join(res->port.thread,&retval); -} -#elif USE_FORK -static int key_id=0; -ee_u8 core_start_parallel(core_results *res) { - key_t key=4321+key_id; - key_id++; - res->port.pid=fork(); - res->port.shmid=shmget(key, 8, IPC_CREAT | 0666); - if (res->port.shmid<0) { - ee_printf("ERROR in shmget!\n"); - } - if (res->port.pid==0) { - iterate(res); - res->port.shm=shmat(res->port.shmid, NULL, 0); - /* copy the validation values to the shared memory area and quit*/ - if (res->port.shm == (char *) -1) { - ee_printf("ERROR in child shmat!\n"); - } else { - memcpy(res->port.shm,&(res->crc),8); - shmdt(res->port.shm); - } - exit(0); - } - return 1; -} -ee_u8 core_stop_parallel(core_results *res) { - int status; - pid_t wpid = waitpid(res->port.pid,&status,WUNTRACED); - if (wpid != res->port.pid) { - ee_printf("ERROR waiting for child.\n"); - if (errno == ECHILD) ee_printf("errno=No such child %d\n",res->port.pid); - if (errno == EINTR) ee_printf("errno=Interrupted\n"); - return 0; - } - /* after process is done, get the values from the shared memory area */ - res->port.shm=shmat(res->port.shmid, NULL, 0); - if (res->port.shm == (char *) -1) { - ee_printf("ERROR in parent shmat!\n"); - return 0; - } - memcpy(&(res->crc),res->port.shm,8); - shmdt(res->port.shm); - return 1; -} -#elif USE_SOCKET -static int key_id=0; -ee_u8 core_start_parallel(core_results *res) { - int bound, buffer_length=8; - res->port.sa.sin_family = AF_INET; - res->port.sa.sin_addr.s_addr = htonl(0x7F000001); - res->port.sa.sin_port = htons(7654+key_id); - key_id++; - res->port.pid=fork(); - if (res->port.pid==0) { /* benchmark child */ - iterate(res); - res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); - if (-1 == res->port.sock) /* if socket failed to initialize, exit */ { - ee_printf("Error Creating Socket"); - } else { - int bytes_sent = sendto(res->port.sock, &(res->crc), buffer_length, 0,(struct sockaddr*)&(res->port.sa), sizeof (struct sockaddr_in)); - if (bytes_sent < 0) - ee_printf("Error sending packet: %s\n", strerror(errno)); - close(res->port.sock); /* close the socket */ - } - exit(0); - } - /* parent process, open the socket */ - res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); - bound = bind(res->port.sock,(struct sockaddr*)&(res->port.sa), sizeof(struct sockaddr)); - if (bound < 0) - ee_printf("bind(): %s\n",strerror(errno)); - return 1; -} -ee_u8 core_stop_parallel(core_results *res) { - int status; - int fromlen=sizeof(struct sockaddr); - int recsize = recvfrom(res->port.sock, &(res->crc), 8, 0, (struct sockaddr*)&(res->port.sa), &fromlen); - if (recsize < 0) { - ee_printf("Error in receive: %s\n", strerror(errno)); - return 0; - } - pid_t wpid = waitpid(res->port.pid,&status,WUNTRACED); - if (wpid != res->port.pid) { - ee_printf("ERROR waiting for child.\n"); - if (errno == ECHILD) ee_printf("errno=No such child %d\n",res->port.pid); - if (errno == EINTR) ee_printf("errno=Interrupted\n"); - return 0; - } - return 1; -} -#else /* no standard multicore implementation */ -#error "Please implement multicore functionality in core_portme.c to use multiple contexts." -#endif /* multithread implementations */ -#endif diff --git a/tests/riscv-coremark/extraPortmes/linux/core_portme.h b/tests/riscv-coremark/extraPortmes/linux/core_portme.h deleted file mode 100755 index 2cf4659a4..000000000 --- a/tests/riscv-coremark/extraPortmes/linux/core_portme.h +++ /dev/null @@ -1,290 +0,0 @@ -/* -Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Original Author: Shay Gal-on -*/ - -#ifndef CORE_PORTME_H -#define CORE_PORTME_H -/************************/ -/* Data types and settings */ -/************************/ -/* Configuration: HAS_FLOAT - Define to 1 if the platform supports floating point. -*/ -#ifndef HAS_FLOAT -#define HAS_FLOAT 1 -#endif -/* Configuration: HAS_TIME_H - Define to 1 if platform has the time.h header file, - and implementation of functions thereof. -*/ -#ifndef HAS_TIME_H -#define HAS_TIME_H 1 -#endif -/* Configuration: USE_CLOCK - Define to 1 if platform has the time.h header file, - and implementation of functions thereof. -*/ -#ifndef USE_CLOCK -#define USE_CLOCK 0 -#endif -/* Configuration: HAS_STDIO - Define to 1 if the platform has stdio.h. -*/ -#ifndef HAS_STDIO -#define HAS_STDIO 1 -#endif -/* Configuration: HAS_PRINTF - Define to 1 if the platform has stdio.h and implements the printf function. -*/ -#ifndef HAS_PRINTF -#define HAS_PRINTF 1 -#endif - -/* Configuration: CORE_TICKS - Define type of return from the timing functions. - */ -#if defined(_MSC_VER) -#include -typedef size_t CORE_TICKS; -#elif HAS_TIME_H -#include -typedef clock_t CORE_TICKS; -#else -#error "Please define type of CORE_TICKS and implement start_time, end_time get_time and time_in_secs functions!" -#endif - -/* Definitions: COMPILER_VERSION, COMPILER_FLAGS, MEM_LOCATION - Initialize these strings per platform -*/ -#ifndef COMPILER_VERSION - #ifdef __GNUC__ - #define COMPILER_VERSION "GCC"__VERSION__ - #else - #define COMPILER_VERSION "Please put compiler version here (e.g. gcc 4.1)" - #endif -#endif -#ifndef COMPILER_FLAGS - #define COMPILER_FLAGS FLAGS_STR /* "Please put compiler flags here (e.g. -o3)" */ -#endif -#ifndef MEM_LOCATION - #define MEM_LOCATION "Please put data memory location here\n\t\t\t(e.g. code in flash, data on heap etc)" - #define MEM_LOCATION_UNSPEC 1 -#endif - -/* Data Types: - To avoid compiler issues, define the data types that need ot be used for 8b, 16b and 32b in . - - *Imprtant*: - ee_ptr_int needs to be the data type used to hold pointers, otherwise coremark may fail!!! -*/ -typedef signed short ee_s16; -typedef unsigned short ee_u16; -typedef signed int ee_s32; -typedef double ee_f32; -typedef unsigned char ee_u8; -typedef unsigned int ee_u32; -typedef ee_u32 ee_ptr_int; -typedef size_t ee_size_t; -/* align_mem: - This macro is used to align an offset to point to a 32b value. It is used in the Matrix algorithm to initialize the input memory blocks. -*/ -#define align_mem(x) (void *)(4 + (((ee_ptr_int)(x) - 1) & ~3)) - -/* Configuration: SEED_METHOD - Defines method to get seed values that cannot be computed at compile time. - - Valid values: - SEED_ARG - from command line. - SEED_FUNC - from a system function. - SEED_VOLATILE - from volatile variables. -*/ -#ifndef SEED_METHOD -#define SEED_METHOD SEED_ARG -#endif - -/* Configuration: MEM_METHOD - Defines method to get a block of memry. - - Valid values: - MEM_MALLOC - for platforms that implement malloc and have malloc.h. - MEM_STATIC - to use a static memory array. - MEM_STACK - to allocate the data block on the stack (NYI). -*/ -#ifndef MEM_METHOD -#define MEM_METHOD MEM_MALLOC -#endif - -/* Configuration: MULTITHREAD - Define for parallel execution - - Valid values: - 1 - only one context (default). - N>1 - will execute N copies in parallel. - - Note: - If this flag is defined to more then 1, an implementation for launching parallel contexts must be defined. - - Two sample implementations are provided. Use or to enable them. - - It is valid to have a different implementation of and in , - to fit a particular architecture. -*/ -#ifndef MULTITHREAD -#define MULTITHREAD 1 -#endif - -/* Configuration: USE_PTHREAD - Sample implementation for launching parallel contexts - This implementation uses pthread_thread_create and pthread_join. - - Valid values: - 0 - Do not use pthreads API. - 1 - Use pthreads API - - Note: - This flag only matters if MULTITHREAD has been defined to a value greater then 1. -*/ -#ifndef USE_PTHREAD -#define USE_PTHREAD 0 -#endif - -/* Configuration: USE_FORK - Sample implementation for launching parallel contexts - This implementation uses fork, waitpid, shmget,shmat and shmdt. - - Valid values: - 0 - Do not use fork API. - 1 - Use fork API - - Note: - This flag only matters if MULTITHREAD has been defined to a value greater then 1. -*/ -#ifndef USE_FORK -#define USE_FORK 0 -#endif - -/* Configuration: USE_SOCKET - Sample implementation for launching parallel contexts - This implementation uses fork, socket, sendto and recvfrom - - Valid values: - 0 - Do not use fork and sockets API. - 1 - Use fork and sockets API - - Note: - This flag only matters if MULTITHREAD has been defined to a value greater then 1. -*/ -#ifndef USE_SOCKET -#define USE_SOCKET 0 -#endif - -/* Configuration: MAIN_HAS_NOARGC - Needed if platform does not support getting arguments to main. - - Valid values: - 0 - argc/argv to main is supported - 1 - argc/argv to main is not supported -*/ -#ifndef MAIN_HAS_NOARGC -#define MAIN_HAS_NOARGC 0 -#endif - -/* Configuration: MAIN_HAS_NORETURN - Needed if platform does not support returning a value from main. - - Valid values: - 0 - main returns an int, and return value will be 0. - 1 - platform does not support returning a value from main -*/ -#ifndef MAIN_HAS_NORETURN -#define MAIN_HAS_NORETURN 0 -#endif - -/* Variable: default_num_contexts - Number of contexts to spawn in multicore context. - Override this global value to change number of contexts used. - - Note: - This value may not be set higher then the define. - - To experiment, you can set the define to the highest value expected, and use argc/argv in the to set this value from the command line. -*/ -extern ee_u32 default_num_contexts; - -#if (MULTITHREAD>1) -#if USE_PTHREAD - #include - #define PARALLEL_METHOD "PThreads" -#elif USE_FORK - #include - #include - #include - #include - #include /* for memcpy */ - #define PARALLEL_METHOD "Fork" -#elif USE_SOCKET - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #define PARALLEL_METHOD "Sockets" -#else - #define PARALLEL_METHOD "Proprietary" - #error "Please implement multicore functionality in core_portme.c to use multiple contexts." -#endif /* Method for multithreading */ -#endif /* MULTITHREAD > 1 */ - -typedef struct CORE_PORTABLE_S { -#if (MULTITHREAD>1) - #if USE_PTHREAD - pthread_t thread; - #elif USE_FORK - pid_t pid; - int shmid; - void *shm; - #elif USE_SOCKET - pid_t pid; - int sock; - struct sockaddr_in sa; - #endif /* Method for multithreading */ -#endif /* MULTITHREAD>1 */ - ee_u8 portable_id; -} core_portable; - -/* target specific init/fini */ -void portable_init(core_portable *p, int *argc, char *argv[]); -void portable_fini(core_portable *p); - -#if (SEED_METHOD==SEED_VOLATILE) - #if (VALIDATION_RUN || PERFORMANCE_RUN || PROFILE_RUN) - #define RUN_TYPE_FLAG 1 - #else - #if (TOTAL_DATA_SIZE==1200) - #define PROFILE_RUN 1 - #else - #define PERFORMANCE_RUN 1 - #endif - #endif -#endif /* SEED_METHOD==SEED_VOLATILE */ - -#endif /* CORE_PORTME_H */ diff --git a/tests/riscv-coremark/extraPortmes/linux/core_portme.mak b/tests/riscv-coremark/extraPortmes/linux/core_portme.mak deleted file mode 100644 index 97b6d6ace..000000000 --- a/tests/riscv-coremark/extraPortmes/linux/core_portme.mak +++ /dev/null @@ -1,17 +0,0 @@ -# Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# Original Author: Shay Gal-on - -include posix/core_portme.mak diff --git a/tests/riscv-coremark/extraPortmes/linux64/core_portme.c b/tests/riscv-coremark/extraPortmes/linux64/core_portme.c deleted file mode 100755 index fe8d29983..000000000 --- a/tests/riscv-coremark/extraPortmes/linux64/core_portme.c +++ /dev/null @@ -1,336 +0,0 @@ -/* -Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Original Author: Shay Gal-on -*/ - -#include -#include -#include "coremark.h" -#if CALLGRIND_RUN -#include -#endif - -#if (MEM_METHOD==MEM_MALLOC) -#include -/* Function: portable_malloc - Provide malloc() functionality in a platform specific way. -*/ -void *portable_malloc(size_t size) { - return malloc(size); -} -/* Function: portable_free - Provide free() functionality in a platform specific way. -*/ -void portable_free(void *p) { - free(p); -} -#else -void *portable_malloc(size_t size) { - return NULL; -} -void portable_free(void *p) { - p=NULL; -} -#endif - -#if (SEED_METHOD==SEED_VOLATILE) -#if VALIDATION_RUN - volatile ee_s32 seed1_volatile=0x3415; - volatile ee_s32 seed2_volatile=0x3415; - volatile ee_s32 seed3_volatile=0x66; -#endif -#if PERFORMANCE_RUN - volatile ee_s32 seed1_volatile=0x0; - volatile ee_s32 seed2_volatile=0x0; - volatile ee_s32 seed3_volatile=0x66; -#endif -#if PROFILE_RUN - volatile ee_s32 seed1_volatile=0x8; - volatile ee_s32 seed2_volatile=0x8; - volatile ee_s32 seed3_volatile=0x8; -#endif - volatile ee_s32 seed4_volatile=ITERATIONS; - volatile ee_s32 seed5_volatile=0; -#endif -/* Porting: Timing functions - How to capture time and convert to seconds must be ported to whatever is supported by the platform. - e.g. Read value from on board RTC, read value from cpu clock cycles performance counter etc. - Sample implementation for standard time.h and windows.h definitions included. -*/ -/* Define: TIMER_RES_DIVIDER - Divider to trade off timer resolution and total time that can be measured. - - Use lower values to increase resolution, but make sure that overflow does not occur. - If there are issues with the return value overflowing, increase this value. - */ -#if USE_CLOCK - #define NSECS_PER_SEC CLOCKS_PER_SEC - #define EE_TIMER_TICKER_RATE 1000 - #define CORETIMETYPE clock_t - #define GETMYTIME(_t) (*_t=clock()) - #define MYTIMEDIFF(fin,ini) ((fin)-(ini)) - #define TIMER_RES_DIVIDER 1 - #define SAMPLE_TIME_IMPLEMENTATION 1 -#elif defined(_MSC_VER) - #define NSECS_PER_SEC 10000000 - #define EE_TIMER_TICKER_RATE 1000 - #define CORETIMETYPE FILETIME - #define GETMYTIME(_t) GetSystemTimeAsFileTime(_t) - #define MYTIMEDIFF(fin,ini) (((*(__int64*)&fin)-(*(__int64*)&ini))/TIMER_RES_DIVIDER) - /* setting to millisces resolution by default with MSDEV */ - #ifndef TIMER_RES_DIVIDER - #define TIMER_RES_DIVIDER 1000 - #endif - #define SAMPLE_TIME_IMPLEMENTATION 1 -#elif HAS_TIME_H - #define NSECS_PER_SEC 1000000000 - #define EE_TIMER_TICKER_RATE 1000 - #define CORETIMETYPE struct timespec - #define GETMYTIME(_t) clock_gettime(CLOCK_REALTIME,_t) - #define MYTIMEDIFF(fin,ini) ((fin.tv_sec-ini.tv_sec)*(NSECS_PER_SEC/TIMER_RES_DIVIDER)+(fin.tv_nsec-ini.tv_nsec)/TIMER_RES_DIVIDER) - /* setting to 1/1000 of a second resolution by default with linux */ - #ifndef TIMER_RES_DIVIDER - #define TIMER_RES_DIVIDER 1000000 - #endif - #define SAMPLE_TIME_IMPLEMENTATION 1 -#else - #define SAMPLE_TIME_IMPLEMENTATION 0 -#endif -#define EE_TICKS_PER_SEC (NSECS_PER_SEC / TIMER_RES_DIVIDER) - -#if SAMPLE_TIME_IMPLEMENTATION -/** Define Host specific (POSIX), or target specific global time variables. */ -static CORETIMETYPE start_time_val, stop_time_val; - -/* Function: start_time - This function will be called right before starting the timed portion of the benchmark. - - Implementation may be capturing a system timer (as implemented in the example code) - or zeroing some system parameters - e.g. setting the cpu clocks cycles to 0. -*/ -void start_time(void) { - GETMYTIME(&start_time_val ); -#if CALLGRIND_RUN - CALLGRIND_START_INSTRUMENTATION -#endif -#if MICA - asm volatile("int3");/*1 */ -#endif -} -/* Function: stop_time - This function will be called right after ending the timed portion of the benchmark. - - Implementation may be capturing a system timer (as implemented in the example code) - or other system parameters - e.g. reading the current value of cpu cycles counter. -*/ -void stop_time(void) { -#if CALLGRIND_RUN - CALLGRIND_STOP_INSTRUMENTATION -#endif -#if MICA - asm volatile("int3");/*1 */ -#endif - GETMYTIME(&stop_time_val ); -} -/* Function: get_time - Return an abstract "ticks" number that signifies time on the system. - - Actual value returned may be cpu cycles, milliseconds or any other value, - as long as it can be converted to seconds by . - This methodology is taken to accomodate any hardware or simulated platform. - The sample implementation returns millisecs by default, - and the resolution is controlled by -*/ -CORE_TICKS get_time(void) { - CORE_TICKS elapsed=(CORE_TICKS)(MYTIMEDIFF(stop_time_val, start_time_val)); - return elapsed; -} -/* Function: time_in_secs - Convert the value returned by get_time to seconds. - - The type is used to accomodate systems with no support for floating point. - Default implementation implemented by the EE_TICKS_PER_SEC macro above. -*/ -secs_ret time_in_secs(CORE_TICKS ticks) { - secs_ret retval=((secs_ret)ticks) / (secs_ret)EE_TICKS_PER_SEC; - return retval; -} -#else -#error "Please implement timing functionality in core_portme.c" -#endif /* SAMPLE_TIME_IMPLEMENTATION */ - -ee_u32 default_num_contexts=MULTITHREAD; - -/* Function: portable_init - Target specific initialization code - Test for some common mistakes. -*/ -void portable_init(core_portable *p, int *argc, char *argv[]) -{ -#if PRINT_ARGS - int i; - for (i=0; i<*argc; i++) { - ee_printf("Arg[%d]=%s\n",i,argv[i]); - } -#endif - if (sizeof(ee_ptr_int) != sizeof(ee_u8 *)) { - ee_printf("ERROR! Please define ee_ptr_int to a type that holds a pointer!\n"); - } - if (sizeof(ee_u32) != 4) { - ee_printf("ERROR! Please define ee_u32 to a 32b unsigned type!\n"); - } -#if (MAIN_HAS_NOARGC && (SEED_METHOD==SEED_ARG)) - ee_printf("ERROR! Main has no argc, but SEED_METHOD defined to SEED_ARG!\n"); -#endif - -#if (MULTITHREAD>1) && (SEED_METHOD==SEED_ARG) - int nargs=*argc,i; - if ((nargs>1) && (*argv[1]=='M')) { - default_num_contexts=parseval(argv[1]+1); - if (default_num_contexts>MULTITHREAD) - default_num_contexts=MULTITHREAD; - /* Shift args since first arg is directed to the portable part and not to coremark main */ - --nargs; - for (i=1; i*/ - p->portable_id=1; -} -/* Function: portable_fini - Target specific final code -*/ -void portable_fini(core_portable *p) -{ - p->portable_id=0; -} - -#if (MULTITHREAD>1) - -/* Function: core_start_parallel - Start benchmarking in a parallel context. - - Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets. - Other implementations using MCAPI or other standards can easily be devised. -*/ -/* Function: core_stop_parallel - Stop a parallel context execution of coremark, and gather the results. - - Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets. - Other implementations using MCAPI or other standards can easily be devised. -*/ -#if USE_PTHREAD -ee_u8 core_start_parallel(core_results *res) { - return (ee_u8)pthread_create(&(res->port.thread),NULL,iterate,(void *)res); -} -ee_u8 core_stop_parallel(core_results *res) { - void *retval; - return (ee_u8)pthread_join(res->port.thread,&retval); -} -#elif USE_FORK -static int key_id=0; -ee_u8 core_start_parallel(core_results *res) { - key_t key=4321+key_id; - key_id++; - res->port.pid=fork(); - res->port.shmid=shmget(key, 8, IPC_CREAT | 0666); - if (res->port.shmid<0) { - ee_printf("ERROR in shmget!\n"); - } - if (res->port.pid==0) { - iterate(res); - res->port.shm=shmat(res->port.shmid, NULL, 0); - /* copy the validation values to the shared memory area and quit*/ - if (res->port.shm == (char *) -1) { - ee_printf("ERROR in child shmat!\n"); - } else { - memcpy(res->port.shm,&(res->crc),8); - shmdt(res->port.shm); - } - exit(0); - } - return 1; -} -ee_u8 core_stop_parallel(core_results *res) { - int status; - pid_t wpid = waitpid(res->port.pid,&status,WUNTRACED); - if (wpid != res->port.pid) { - ee_printf("ERROR waiting for child.\n"); - if (errno == ECHILD) ee_printf("errno=No such child %d\n",res->port.pid); - if (errno == EINTR) ee_printf("errno=Interrupted\n"); - return 0; - } - /* after process is done, get the values from the shared memory area */ - res->port.shm=shmat(res->port.shmid, NULL, 0); - if (res->port.shm == (char *) -1) { - ee_printf("ERROR in parent shmat!\n"); - return 0; - } - memcpy(&(res->crc),res->port.shm,8); - shmdt(res->port.shm); - return 1; -} -#elif USE_SOCKET -static int key_id=0; -ee_u8 core_start_parallel(core_results *res) { - int bound, buffer_length=8; - res->port.sa.sin_family = AF_INET; - res->port.sa.sin_addr.s_addr = htonl(0x7F000001); - res->port.sa.sin_port = htons(7654+key_id); - key_id++; - res->port.pid=fork(); - if (res->port.pid==0) { /* benchmark child */ - iterate(res); - res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); - if (-1 == res->port.sock) /* if socket failed to initialize, exit */ { - ee_printf("Error Creating Socket"); - } else { - int bytes_sent = sendto(res->port.sock, &(res->crc), buffer_length, 0,(struct sockaddr*)&(res->port.sa), sizeof (struct sockaddr_in)); - if (bytes_sent < 0) - ee_printf("Error sending packet: %s\n", strerror(errno)); - close(res->port.sock); /* close the socket */ - } - exit(0); - } - /* parent process, open the socket */ - res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); - bound = bind(res->port.sock,(struct sockaddr*)&(res->port.sa), sizeof(struct sockaddr)); - if (bound < 0) - ee_printf("bind(): %s\n",strerror(errno)); - return 1; -} -ee_u8 core_stop_parallel(core_results *res) { - int status; - int fromlen=sizeof(struct sockaddr); - int recsize = recvfrom(res->port.sock, &(res->crc), 8, 0, (struct sockaddr*)&(res->port.sa), &fromlen); - if (recsize < 0) { - ee_printf("Error in receive: %s\n", strerror(errno)); - return 0; - } - pid_t wpid = waitpid(res->port.pid,&status,WUNTRACED); - if (wpid != res->port.pid) { - ee_printf("ERROR waiting for child.\n"); - if (errno == ECHILD) ee_printf("errno=No such child %d\n",res->port.pid); - if (errno == EINTR) ee_printf("errno=Interrupted\n"); - return 0; - } - return 1; -} -#else /* no standard multicore implementation */ -#error "Please implement multicore functionality in core_portme.c to use multiple contexts." -#endif /* multithread implementations */ -#endif diff --git a/tests/riscv-coremark/extraPortmes/linux64/core_portme.h b/tests/riscv-coremark/extraPortmes/linux64/core_portme.h deleted file mode 100755 index 1228a679b..000000000 --- a/tests/riscv-coremark/extraPortmes/linux64/core_portme.h +++ /dev/null @@ -1,291 +0,0 @@ -/* -Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Original Author: Shay Gal-on -*/ - -/* Topic: Description - This file contains configuration constants required to execute on different platforms -*/ -#ifndef CORE_PORTME_H -#define CORE_PORTME_H -/************************/ -/* Data types and settings */ -/************************/ -/* Configuration: HAS_FLOAT - Define to 1 if the platform supports floating point. -*/ -#ifndef HAS_FLOAT -#define HAS_FLOAT 1 -#endif -/* Configuration: HAS_TIME_H - Define to 1 if platform has the time.h header file, - and implementation of functions thereof. -*/ -#ifndef HAS_TIME_H -#define HAS_TIME_H 1 -#endif -/* Configuration: USE_CLOCK - Define to 1 if platform has the time.h header file, - and implementation of functions thereof. -*/ -#ifndef USE_CLOCK -#define USE_CLOCK 0 -#endif -/* Configuration: HAS_STDIO - Define to 1 if the platform has stdio.h. -*/ -#ifndef HAS_STDIO -#define HAS_STDIO 1 -#endif -/* Configuration: HAS_PRINTF - Define to 1 if the platform has stdio.h and implements the printf function. -*/ -#ifndef HAS_PRINTF -#define HAS_PRINTF 1 -#endif - -/* Configuration: CORE_TICKS - Define type of return from the timing functions. - */ -#if defined(_MSC_VER) -#include -typedef size_t CORE_TICKS; -#elif HAS_TIME_H -#include -typedef clock_t CORE_TICKS; -#else -#error "Please define type of CORE_TICKS and implement start_time, end_time get_time and time_in_secs functions!" -#endif - -/* Definitions: COMPILER_VERSION, COMPILER_FLAGS, MEM_LOCATION - Initialize these strings per platform -*/ -#ifndef COMPILER_VERSION - #ifdef __GNUC__ - #define COMPILER_VERSION "GCC"__VERSION__ - #else - #define COMPILER_VERSION "Please put compiler version here (e.g. gcc 4.1)" - #endif -#endif -#ifndef COMPILER_FLAGS - #define COMPILER_FLAGS FLAGS_STR /* "Please put compiler flags here (e.g. -o3)" */ -#endif -#ifndef MEM_LOCATION - #define MEM_LOCATION "Please put data memory location here\n\t\t\t(e.g. code in flash, data on heap etc)" - #define MEM_LOCATION_UNSPEC 1 -#endif - -/* Data Types: - To avoid compiler issues, define the data types that need ot be used for 8b, 16b and 32b in . - - *Imprtant*: - ee_ptr_int needs to be the data type used to hold pointers, otherwise coremark may fail!!! -*/ -typedef signed short ee_s16; -typedef unsigned short ee_u16; -typedef signed int ee_s32; -typedef double ee_f32; -typedef unsigned char ee_u8; -typedef unsigned int ee_u32; -typedef unsigned long long ee_ptr_int; -typedef size_t ee_size_t; -/* align an offset to point to a 32b value */ -#define align_mem(x) (void *)(4 + (((ee_ptr_int)(x) - 1) & ~3)) - -/* Configuration: SEED_METHOD - Defines method to get seed values that cannot be computed at compile time. - - Valid values: - SEED_ARG - from command line. - SEED_FUNC - from a system function. - SEED_VOLATILE - from volatile variables. -*/ -#ifndef SEED_METHOD -#define SEED_METHOD SEED_ARG -#endif - -/* Configuration: MEM_METHOD - Defines method to get a block of memry. - - Valid values: - MEM_MALLOC - for platforms that implement malloc and have malloc.h. - MEM_STATIC - to use a static memory array. - MEM_STACK - to allocate the data block on the stack (NYI). -*/ -#ifndef MEM_METHOD -#define MEM_METHOD MEM_MALLOC -#endif - -/* Configuration: MULTITHREAD - Define for parallel execution - - Valid values: - 1 - only one context (default). - N>1 - will execute N copies in parallel. - - Note: - If this flag is defined to more then 1, an implementation for launching parallel contexts must be defined. - - Two sample implementations are provided. Use or to enable them. - - It is valid to have a different implementation of and in , - to fit a particular architecture. -*/ -#ifndef MULTITHREAD -#define MULTITHREAD 1 -#endif - -/* Configuration: USE_PTHREAD - Sample implementation for launching parallel contexts - This implementation uses pthread_thread_create and pthread_join. - - Valid values: - 0 - Do not use pthreads API. - 1 - Use pthreads API - - Note: - This flag only matters if MULTITHREAD has been defined to a value greater then 1. -*/ -#ifndef USE_PTHREAD -#define USE_PTHREAD 0 -#endif - -/* Configuration: USE_FORK - Sample implementation for launching parallel contexts - This implementation uses fork, waitpid, shmget,shmat and shmdt. - - Valid values: - 0 - Do not use fork API. - 1 - Use fork API - - Note: - This flag only matters if MULTITHREAD has been defined to a value greater then 1. -*/ -#ifndef USE_FORK -#define USE_FORK 0 -#endif - -/* Configuration: USE_SOCKET - Sample implementation for launching parallel contexts - This implementation uses fork, socket, sendto and recvfrom - - Valid values: - 0 - Do not use fork and sockets API. - 1 - Use fork and sockets API - - Note: - This flag only matters if MULTITHREAD has been defined to a value greater then 1. -*/ -#ifndef USE_SOCKET -#define USE_SOCKET 0 -#endif - -/* Configuration: MAIN_HAS_NOARGC - Needed if platform does not support getting arguments to main. - - Valid values: - 0 - argc/argv to main is supported - 1 - argc/argv to main is not supported -*/ -#ifndef MAIN_HAS_NOARGC -#define MAIN_HAS_NOARGC 0 -#endif - -/* Configuration: MAIN_HAS_NORETURN - Needed if platform does not support returning a value from main. - - Valid values: - 0 - main returns an int, and return value will be 0. - 1 - platform does not support returning a value from main -*/ -#ifndef MAIN_HAS_NORETURN -#define MAIN_HAS_NORETURN 0 -#endif - -/* Variable: default_num_contexts - Number of contexts to spawn in multicore context. - Override this global value to change number of contexts used. - - Note: - This value may not be set higher then the define. - - To experiment, you can set the define to the highest value expected, and use argc/argv in the to set this value from the command line. -*/ -extern ee_u32 default_num_contexts; - -#if (MULTITHREAD>1) -#if USE_PTHREAD - #include - #define PARALLEL_METHOD "PThreads" -#elif USE_FORK - #include - #include - #include - #include - #include /* for memcpy */ - #define PARALLEL_METHOD "Fork" -#elif USE_SOCKET - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #define PARALLEL_METHOD "Sockets" -#else - #define PARALLEL_METHOD "Proprietary" - #error "Please implement multicore functionality in core_portme.c to use multiple contexts." -#endif /* Method for multithreading */ -#endif /* MULTITHREAD > 1 */ - -typedef struct CORE_PORTABLE_S { -#if (MULTITHREAD>1) - #if USE_PTHREAD - pthread_t thread; - #elif USE_FORK - pid_t pid; - int shmid; - void *shm; - #elif USE_SOCKET - pid_t pid; - int sock; - struct sockaddr_in sa; - #endif /* Method for multithreading */ -#endif /* MULTITHREAD>1 */ - ee_u8 portable_id; -} core_portable; - -/* target specific init/fini */ -void portable_init(core_portable *p, int *argc, char *argv[]); -void portable_fini(core_portable *p); - -#if (SEED_METHOD==SEED_VOLATILE) - #if (VALIDATION_RUN || PERFORMANCE_RUN || PROFILE_RUN) - #define RUN_TYPE_FLAG 1 - #else - #if (TOTAL_DATA_SIZE==1200) - #define PROFILE_RUN 1 - #else - #define PERFORMANCE_RUN 1 - #endif - #endif -#endif /* SEED_METHOD==SEED_VOLATILE */ - -#endif /* CORE_PORTME_H */ diff --git a/tests/riscv-coremark/extraPortmes/linux64/core_portme.mak b/tests/riscv-coremark/extraPortmes/linux64/core_portme.mak deleted file mode 100755 index 5cfabee32..000000000 --- a/tests/riscv-coremark/extraPortmes/linux64/core_portme.mak +++ /dev/null @@ -1,140 +0,0 @@ -# Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# Original Author: Shay Gal-on - -#File: core_portme.mak - -# Flag: OUTFLAG -# Use this flag to define how to to get an executable (e.g -o) -OUTFLAG= -o -# Flag: CC -# Use this flag to define compiler to use -CC = gcc -# Flag: CFLAGS -# Use this flag to define compiler options. Note, you can add compiler options from the command line using XCFLAGS="other flags" -PORT_CFLAGS = -O2 -FLAGS_STR = "$(PORT_CFLAGS) $(XCFLAGS) $(XLFLAGS) $(LFLAGS_END)" -CFLAGS = $(PORT_CFLAGS) -I$(PORT_DIR) -I. -DFLAGS_STR=\"$(FLAGS_STR)\" -#Flag: LFLAGS_END -# Define any libraries needed for linking or other flags that should come at the end of the link line (e.g. linker scripts). -# Note: On certain platforms, the default clock_gettime implementation is supported but requires linking of librt. -LFLAGS_END += -lrt -# Flag: PORT_SRCS -# Port specific source files can be added here -PORT_SRCS = $(PORT_DIR)/core_portme.c -# Flag: LOAD -# Define this flag if you need to load to a target, as in a cross compile environment. - -# Flag: RUN -# Define this flag if running does not consist of simple invocation of the binary. -# In a cross compile environment, you need to define this. - -#For flashing and using a tera term macro, you could use -#LOAD = flash ADDR -#RUN = ttpmacro coremark.ttl - -#For copying to target and executing via SSH connection, you could use -#LOAD = scp $(OUTFILE) user@target:~ -#RUN = ssh user@target -c - -#For native compilation and execution -LOAD = echo Loading done -RUN = - -OEXT = .o -EXE = .exe - -# Flag: SEPARATE_COMPILE -# Define if you need to separate compilation from link stage. -# In this case, you also need to define below how to create an object file, and how to link. -ifdef SEPARATE_COMPILE - -LD = gcc -OBJOUT = -o -LFLAGS = -OFLAG = -o -COUT = -c -# Flag: PORT_OBJS -# Port specific object files can be added here -PORT_OBJS = $(PORT_DIR)/core_portme$(OEXT) -PORT_CLEAN = *$(OEXT) - -$(OPATH)%$(OEXT) : %.c - $(CC) $(CFLAGS) $(XCFLAGS) $(COUT) $< $(OBJOUT) $@ - -endif - -# Target: port_prebuild -# Generate any files that are needed before actual build starts. -# E.g. generate profile guidance files. Sample PGO generation for gcc enabled with PGO=1 -# - First, check if PGO was defined on the command line, if so, need to add -fprofile-use to compile line. -# - Second, if PGO reference has not yet been generated, add a step to the prebuild that will build a profile-generate version and run it. -# Note - Using REBUILD=1 -# -# Use make PGO=1 to invoke this sample processing. - -ifdef PGO - ifeq (,$(findstring $(PGO),gen)) - PGO_STAGE=build_pgo_gcc - CFLAGS+=-fprofile-use - endif - PORT_CLEAN+=*.gcda *.gcno gmon.out -endif - -.PHONY: port_prebuild -port_prebuild: $(PGO_STAGE) - -.PHONY: build_pgo_gcc -build_pgo_gcc: - $(MAKE) PGO=gen XCFLAGS="$(XCFLAGS) -fprofile-generate -DTOTAL_DATA_SIZE=1200" ITERATIONS=10 gen_pgo_data REBUILD=1 - -# Target: port_postbuild -# Generate any files that are needed after actual build end. -# E.g. change format to srec, bin, zip in order to be able to load into flash -.PHONY: port_postbuild -port_postbuild: - -# Target: port_postrun -# Do platform specific after run stuff. -# E.g. reset the board, backup the logfiles etc. -.PHONY: port_postrun -port_postrun: - -# Target: port_prerun -# Do platform specific after run stuff. -# E.g. reset the board, backup the logfiles etc. -.PHONY: port_prerun -port_prerun: - -# Target: port_postload -# Do platform specific after load stuff. -# E.g. reset the reset power to the flash eraser -.PHONY: port_postload -port_postload: - -# Target: port_preload -# Do platform specific before load stuff. -# E.g. reset the reset power to the flash eraser -.PHONY: port_preload -port_preload: - -# FLAG: OPATH -# Path to the output folder. Default - current folder. -OPATH = ./ -MKDIR = mkdir -p - -# FLAG: PERL -# Define perl executable to calculate the geomean if running separate. -PERL=/usr/bin/perl diff --git a/tests/riscv-coremark/riscv64-baremetal/core_portme.c b/tests/riscv-coremark/riscv64-baremetal/core_portme.c deleted file mode 100755 index c3b30c492..000000000 --- a/tests/riscv-coremark/riscv64-baremetal/core_portme.c +++ /dev/null @@ -1,382 +0,0 @@ -/* -Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Original Author: Shay Gal-on -*/ - -#include -#include -#include "coremark.h" -#if CALLGRIND_RUN -#include -#endif - -#if (MEM_METHOD==MEM_MALLOC) -#include -/* Function: portable_malloc - Provide malloc() functionality in a platform specific way. -*/ -void *portable_malloc(size_t size) { - return malloc(size); -} -/* Function: portable_free - Provide free() functionality in a platform specific way. -*/ -void portable_free(void *p) { - free(p); -} -#else -void *portable_malloc(size_t size) { - return NULL; -} -void portable_free(void *p) { - p=NULL; -} -#endif - -#if (SEED_METHOD==SEED_VOLATILE) -#if VALIDATION_RUN - volatile ee_s32 seed1_volatile=0x3415; - volatile ee_s32 seed2_volatile=0x3415; - volatile ee_s32 seed3_volatile=0x66; -#endif -#if PERFORMANCE_RUN - volatile ee_s32 seed1_volatile=0x0; - volatile ee_s32 seed2_volatile=0x0; - volatile ee_s32 seed3_volatile=0x66; -#endif -#if PROFILE_RUN - volatile ee_s32 seed1_volatile=0x8; - volatile ee_s32 seed2_volatile=0x8; - volatile ee_s32 seed3_volatile=0x8; -#endif - volatile ee_s32 seed4_volatile=ITERATIONS; - volatile ee_s32 seed5_volatile=0; -#endif -/* Porting: Timing functions - How to capture time and convert to seconds must be ported to whatever is supported by the platform. - e.g. Read value from on board RTC, read value from cpu clock cycles performance counter etc. - Sample implementation for standard time.h and windows.h definitions included. -*/ -/* Define: TIMER_RES_DIVIDER - Divider to trade off timer resolution and total time that can be measured. - - Use lower values to increase resolution, but make sure that overflow does not occur. - If there are issues with the return value overflowing, increase this value. - */ -#if USE_CLOCK - #define NSECS_PER_SEC CLOCKS_PER_SEC - #define EE_TIMER_TICKER_RATE 1000 - #define CORETIMETYPE clock_t - #define GETMYTIME(_t) (*_t=clock()) - #define MYTIMEDIFF(fin,ini) ((fin)-(ini)) - #define TIMER_RES_DIVIDER 1 - #define SAMPLE_TIME_IMPLEMENTATION 1 -#elif defined(_MSC_VER) - #define NSECS_PER_SEC 10000000 - #define EE_TIMER_TICKER_RATE 1000 - #define CORETIMETYPE FILETIME - #define GETMYTIME(_t) GetSystemTimeAsFileTime(_t) - #define MYTIMEDIFF(fin,ini) (((*(__int64*)&fin)-(*(__int64*)&ini))/TIMER_RES_DIVIDER) - /* setting to millisces resolution by default with MSDEV */ - #ifndef TIMER_RES_DIVIDER - #define TIMER_RES_DIVIDER 1000 - #endif - #define SAMPLE_TIME_IMPLEMENTATION 1 -#elif HAS_TIME_H - #define NSECS_PER_SEC 1000000000 - #define EE_TIMER_TICKER_RATE 1000 - #define CORETIMETYPE struct timespec - #define GETMYTIME(_t) clock_gettime(CLOCK_REALTIME,_t) - #define MYTIMEDIFF(fin,ini) ((fin.tv_sec-ini.tv_sec)*(NSECS_PER_SEC/TIMER_RES_DIVIDER)+(fin.tv_nsec-ini.tv_nsec)/TIMER_RES_DIVIDER) - /* setting to 1/1000 of a second resolution by default with linux */ - #ifndef TIMER_RES_DIVIDER - #define TIMER_RES_DIVIDER 1000000 - #endif - #define SAMPLE_TIME_IMPLEMENTATION 1 -#else - // Defined for RISCV - #define NSECS_PER_SEC 1000000000 // TODO: What freq are we assuming? - #define EE_TIMER_TICKER_RATE 1000 // TODO: What is this? - #define CORETIMETYPE clock_t - #define read_csr(reg) ({ unsigned long __tmp; \ - asm volatile ("csrr %0, " #reg : "=r"(__tmp)); \ - __tmp; }) - #define GETMYTIME(_t) (_t = *(volatile unsigned long long*)0x0200BFF8) - #define MYTIMEDIFF(fin,ini) ((fin)-(ini)) - // Changing TIMER_RES_DIVIDER to 1000000 sets EE_TICKS_PER_SEC to 1000 (now counting ticks per ms) - #define TIMER_RES_DIVIDER 10000 - #define SAMPLE_TIME_IMPLEMENTATION 1 -#endif -#define EE_TICKS_PER_SEC (NSECS_PER_SEC / TIMER_RES_DIVIDER) - -#if SAMPLE_TIME_IMPLEMENTATION -/** Define Host specific (POSIX), or target specific global time variables. */ -static CORETIMETYPE start_time_val, stop_time_val; -static unsigned long start_instr_val, stop_instr_val; - -/* Function: minstretFunc - This function will count the number of instructions. -*/ -unsigned long minstretFunc(void) -{ - unsigned long minstretRead = read_csr(minstret); - //ee_printf("Minstret is %lu\n", minstretRead); - return minstretRead; -} - -/* Function: minstretDiff - This function will take the difference between the first and second reads from the - MINSTRET csr to determine the number of machine instructions retired between two points - of time -*/ -unsigned long minstretDiff(void) -{ - unsigned long minstretDifference = MYTIMEDIFF(stop_instr_val, start_instr_val); - return minstretDifference; -} - -/* Function: start_time - This function will be called right before starting the timed portion of the benchmark. - - Implementation may be capturing a system timer (as implemented in the example code) - or zeroing some system parameters - e.g. setting the cpu clocks cycles to 0. -*/ -void start_time(void) { - start_instr_val = minstretFunc(); - GETMYTIME(start_time_val); - //ee_printf("Timer started\n"); - //ee_printf(" MTIME: %u\n", start_time_val); -#if CALLGRIND_RUN - CALLGRIND_START_INSTRUMENTATION -#endif -#if MICA - asm volatile("int3");/*1 */ -#endif -} -/* Function: stop_time - This function will be called right after ending the timed portion of the benchmark. - - Implementation may be capturing a system timer (as implemented in the example code) - or other system parameters - e.g. reading the current value of cpu cycles counter. -*/ -void stop_time(void) { -#if CALLGRIND_RUN - CALLGRIND_STOP_INSTRUMENTATION -#endif -#if MICA - asm volatile("int3");/*1 */ -#endif - GETMYTIME(stop_time_val); - stop_instr_val = minstretFunc(); - //ee_printf("Timer stopped\n"); - //ee_printf(" MTIME: %u\n", stop_time_val); -} -/* Function: get_time - Return an abstract "ticks" number that signifies time on the system. - - Actual value returned may be cpu cycles, milliseconds or any other value, - as long as it can be converted to seconds by . - This methodology is taken to accomodate any hardware or simulated platform. - The sample implementation returns millisecs by default, - and the resolution is controlled by -*/ -CORE_TICKS get_time(void) { - CORE_TICKS elapsed=(CORE_TICKS)(MYTIMEDIFF(stop_time_val, start_time_val)); - unsigned long instructions = minstretDiff(); - double CPI = elapsed / instructions; - ee_printf(" Elapsed MTIME: %u\n", elapsed); - ee_printf(" Elapsed MINSTRET: %lu\n", instructions); - ee_printf(" CPI: %lf", CPI); - return elapsed; -} -/* Function: time_in_secs - Convert the value returned by get_time to seconds. - - The type is used to accomodate systems with no support for floating point. - Default implementation implemented by the EE_TICKS_PER_SEC macro above. -*/ -secs_ret time_in_secs(CORE_TICKS ticks) { - secs_ret retval=((secs_ret)ticks) / (secs_ret)EE_TICKS_PER_SEC; - int retvalint = (int)retval; - //ee_printf("RETURN VALUE FROM TIME IN SECS FUNCTION: %d\n", retvalint); - return retval; -} -#else -#error "Please implement timing functionality in core_portme.c" -#endif /* SAMPLE_TIME_IMPLEMENTATION */ - -ee_u32 default_num_contexts = MULTITHREAD; - -/* Function: portable_init - Target specific initialization code - Test for some common mistakes. -*/ -void portable_init(core_portable *p, int *argc, char *argv[]) -{ -#if PRINT_ARGS - int i; - for (i=0; i<*argc; i++) { - ee_printf("Arg[%d]=%s\n",i,argv[i]); - } -#endif - if (sizeof(ee_ptr_int) != sizeof(ee_u8 *)) { - ee_printf("ERROR! Please define ee_ptr_int to a type that holds a pointer!\n"); - } - if (sizeof(ee_u32) != 4) { - ee_printf("ERROR! Please define ee_u32 to a 32b unsigned type!\n"); - } -#if (MAIN_HAS_NOARGC && (SEED_METHOD==SEED_ARG)) - ee_printf("ERROR! Main has no argc, but SEED_METHOD defined to SEED_ARG!\n"); -#endif - -#if (MULTITHREAD>1) && (SEED_METHOD==SEED_ARG) - int nargs=*argc,i; - if ((nargs>1) && (*argv[1]=='M')) { - default_num_contexts=parseval(argv[1]+1); - if (default_num_contexts>MULTITHREAD) - default_num_contexts=MULTITHREAD; - /* Shift args since first arg is directed to the portable part and not to coremark main */ - --nargs; - for (i=1; i*/ - p->portable_id=1; -} -/* Function: portable_fini - Target specific final code -*/ -void portable_fini(core_portable *p) -{ - p->portable_id=0; -} - -#if (MULTITHREAD>1) - -/* Function: core_start_parallel - Start benchmarking in a parallel context. - - Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets. - Other implementations using MCAPI or other standards can easily be devised. -*/ -/* Function: core_stop_parallel - Stop a parallel context execution of coremark, and gather the results. - - Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets. - Other implementations using MCAPI or other standards can easily be devised. -*/ -#if USE_PTHREAD -ee_u8 core_start_parallel(core_results *res) { - return (ee_u8)pthread_create(&(res->port.thread),NULL,iterate,(void *)res); -} -ee_u8 core_stop_parallel(core_results *res) { - void *retval; - return (ee_u8)pthread_join(res->port.thread,&retval); -} -#elif USE_FORK -static int key_id=0; -ee_u8 core_start_parallel(core_results *res) { - key_t key=4321+key_id; - key_id++; - res->port.pid=fork(); - res->port.shmid=shmget(key, 8, IPC_CREAT | 0666); - if (res->port.shmid<0) { - ee_printf("ERROR in shmget!\n"); - } - if (res->port.pid==0) { - iterate(res); - res->port.shm=shmat(res->port.shmid, NULL, 0); - /* copy the validation values to the shared memory area and quit*/ - if (res->port.shm == (char *) -1) { - ee_printf("ERROR in child shmat!\n"); - } else { - memcpy(res->port.shm,&(res->crc),8); - shmdt(res->port.shm); - } - exit(0); - } - return 1; -} -ee_u8 core_stop_parallel(core_results *res) { - int status; - pid_t wpid = waitpid(res->port.pid,&status,WUNTRACED); - if (wpid != res->port.pid) { - ee_printf("ERROR waiting for child.\n"); - if (errno == ECHILD) ee_printf("errno=No such child %d\n",res->port.pid); - if (errno == EINTR) ee_printf("errno=Interrupted\n"); - return 0; - } - /* after process is done, get the values from the shared memory area */ - res->port.shm=shmat(res->port.shmid, NULL, 0); - if (res->port.shm == (char *) -1) { - ee_printf("ERROR in parent shmat!\n"); - return 0; - } - memcpy(&(res->crc),res->port.shm,8); - shmdt(res->port.shm); - return 1; -} -#elif USE_SOCKET -static int key_id=0; -ee_u8 core_start_parallel(core_results *res) { - int bound, buffer_length=8; - res->port.sa.sin_family = AF_INET; - res->port.sa.sin_addr.s_addr = htonl(0x7F000001); - res->port.sa.sin_port = htons(7654+key_id); - key_id++; - res->port.pid=fork(); - if (res->port.pid==0) { /* benchmark child */ - iterate(res); - res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); - if (-1 == res->port.sock) /* if socket failed to initialize, exit */ { - ee_printf("Error Creating Socket"); - } else { - int bytes_sent = sendto(res->port.sock, &(res->crc), buffer_length, 0,(struct sockaddr*)&(res->port.sa), sizeof (struct sockaddr_in)); - if (bytes_sent < 0) - ee_printf("Error sending packet: %s\n", strerror(errno)); - close(res->port.sock); /* close the socket */ - } - exit(0); - } - /* parent process, open the socket */ - res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); - bound = bind(res->port.sock,(struct sockaddr*)&(res->port.sa), sizeof(struct sockaddr)); - if (bound < 0) - ee_printf("bind(): %s\n",strerror(errno)); - return 1; -} -ee_u8 core_stop_parallel(core_results *res) { - int status; - int fromlen=sizeof(struct sockaddr); - int recsize = recvfrom(res->port.sock, &(res->crc), 8, 0, (struct sockaddr*)&(res->port.sa), &fromlen); - if (recsize < 0) { - ee_printf("Error in receive: %s\n", strerror(errno)); - return 0; - } - pid_t wpid = waitpid(res->port.pid,&status,WUNTRACED); - if (wpid != res->port.pid) { - ee_printf("ERROR waiting for child.\n"); - if (errno == ECHILD) ee_printf("errno=No such child %d\n",res->port.pid); - if (errno == EINTR) ee_printf("errno=Interrupted\n"); - return 0; - } - return 1; -} -#else /* no standard multicore implementation */ -#error "Please implement multicore functionality in core_portme.c to use multiple contexts." -#endif /* multithread implementations */ -#endif diff --git a/tests/riscv-coremark/riscv64-baremetal/core_portme.h b/tests/riscv-coremark/riscv64-baremetal/core_portme.h deleted file mode 100755 index ef26e88ad..000000000 --- a/tests/riscv-coremark/riscv64-baremetal/core_portme.h +++ /dev/null @@ -1,296 +0,0 @@ -/* -Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Original Author: Shay Gal-on -*/ - -/* Topic: Description - This file contains configuration constants required to execute on different platforms -*/ -#ifndef CORE_PORTME_H -#define CORE_PORTME_H -/************************/ -/* Data types and settings */ -/************************/ -/* Configuration: HAS_FLOAT - Define to 1 if the platform supports floating point. -*/ -#ifndef HAS_FLOAT -#define HAS_FLOAT 1 -#endif -/* Configuration: HAS_TIME_H - Define to 1 if platform has the time.h header file, - and implementation of functions thereof. -*/ -#ifndef HAS_TIME_H -#define HAS_TIME_H 0 -#endif -/* Configuration: USE_CLOCK - Define to 1 if platform has the time.h header file, - and implementation of functions thereof. -*/ -#ifndef USE_CLOCK -#define USE_CLOCK 0 -#endif -/* Configuration: HAS_STDIO - Define to 1 if the platform has stdio.h. -*/ -#ifndef HAS_STDIO -#define HAS_STDIO 1 -#endif -/* Configuration: HAS_PRINTF - Define to 1 if the platform has stdio.h and implements the printf function. -*/ -#ifndef HAS_PRINTF -#define HAS_PRINTF 1 -#endif - -/* Configuration: CORE_TICKS - Define type of return from the timing functions. - */ -#if defined(_MSC_VER) -#include -typedef size_t CORE_TICKS; -#elif HAS_TIME_H -#include -typedef clock_t CORE_TICKS; -#else -/* Configuration: size_t and clock_t - Note these need to match the size of the clock output and the xLen the processor supports - */ -typedef unsigned long int size_t; -typedef unsigned long int clock_t; -typedef clock_t CORE_TICKS; -#endif - -/* Definitions: COMPILER_VERSION, COMPILER_FLAGS, MEM_LOCATION - Initialize these strings per platform -*/ -#ifndef COMPILER_VERSION - #ifdef __GNUC__ - #define COMPILER_VERSION "GCC"__VERSION__ - #else - #define COMPILER_VERSION "Please put compiler version here (e.g. gcc 4.1)" - #endif -#endif -#ifndef COMPILER_FLAGS - #define COMPILER_FLAGS FLAGS_STR /* "Please put compiler flags here (e.g. -o3)" */ -#endif -#ifndef MEM_LOCATION - #define MEM_LOCATION "Please put data memory location here\n\t\t\t(e.g. code in flash, data on heap etc)" - #define MEM_LOCATION_UNSPEC 1 -#endif - -/* Data Types: - To avoid compiler issues, define the data types that need ot be used for 8b, 16b and 32b in . - - *Imprtant*: - ee_ptr_int needs to be the data type used to hold pointers, otherwise coremark may fail!!! -*/ -typedef signed short ee_s16; -typedef unsigned short ee_u16; -typedef signed int ee_s32; -typedef double ee_f32; -typedef unsigned char ee_u8; -typedef unsigned int ee_u32; -typedef unsigned long long ee_ptr_int; -typedef size_t ee_size_t; -/* align an offset to point to a 32b value */ -#define align_mem(x) (void *)(4 + (((ee_ptr_int)(x) - 1) & ~3)) - -/* Configuration: SEED_METHOD - Defines method to get seed values that cannot be computed at compile time. - - Valid values: - SEED_ARG - from command line. - SEED_FUNC - from a system function. - SEED_VOLATILE - from volatile variables. -*/ -#ifndef SEED_METHOD -#define SEED_METHOD SEED_VOLATILE -#endif - -/* Configuration: MEM_METHOD - Defines method to get a block of memry. - - Valid values: - MEM_MALLOC - for platforms that implement malloc and have malloc.h. - MEM_STATIC - to use a static memory array. - MEM_STACK - to allocate the data block on the stack (NYI). -*/ -#ifndef MEM_METHOD -#define MEM_METHOD MEM_STATIC -#endif - -/* Configuration: MULTITHREAD - Define for parallel execution - - Valid values: - 1 - only one context (default). - N>1 - will execute N copies in parallel. - - Note: - If this flag is defined to more then 1, an implementation for launching parallel contexts must be defined. - - Two sample implementations are provided. Use or to enable them. - - It is valid to have a different implementation of and in , - to fit a particular architecture. -*/ -#ifndef MULTITHREAD -#define MULTITHREAD 1 -#endif - -/* Configuration: USE_PTHREAD - Sample implementation for launching parallel contexts - This implementation uses pthread_thread_create and pthread_join. - - Valid values: - 0 - Do not use pthreads API. - 1 - Use pthreads API - - Note: - This flag only matters if MULTITHREAD has been defined to a value greater then 1. -*/ -#ifndef USE_PTHREAD -#define USE_PTHREAD 0 -#endif - -/* Configuration: USE_FORK - Sample implementation for launching parallel contexts - This implementation uses fork, waitpid, shmget,shmat and shmdt. - - Valid values: - 0 - Do not use fork API. - 1 - Use fork API - - Note: - This flag only matters if MULTITHREAD has been defined to a value greater then 1. -*/ -#ifndef USE_FORK -#define USE_FORK 0 -#endif - -/* Configuration: USE_SOCKET - Sample implementation for launching parallel contexts - This implementation uses fork, socket, sendto and recvfrom - - Valid values: - 0 - Do not use fork and sockets API. - 1 - Use fork and sockets API - - Note: - This flag only matters if MULTITHREAD has been defined to a value greater then 1. -*/ -#ifndef USE_SOCKET -#define USE_SOCKET 0 -#endif - -/* Configuration: MAIN_HAS_NOARGC - Needed if platform does not support getting arguments to main. - - Valid values: - 0 - argc/argv to main is supported - 1 - argc/argv to main is not supported -*/ -#ifndef MAIN_HAS_NOARGC -#define MAIN_HAS_NOARGC 1 -#endif - -/* Configuration: MAIN_HAS_NORETURN - Needed if platform does not support returning a value from main. - - Valid values: - 0 - main returns an int, and return value will be 0. - 1 - platform does not support returning a value from main -*/ -#ifndef MAIN_HAS_NORETURN -#define MAIN_HAS_NORETURN 0 -#endif - -/* Variable: default_num_contexts - Number of contexts to spawn in multicore context. - Override this global value to change number of contexts used. - - Note: - This value may not be set higher then the define. - - To experiment, you can set the define to the highest value expected, and use argc/argv in the to set this value from the command line. -*/ -extern ee_u32 default_num_contexts; - -#if (MULTITHREAD>1) -#if USE_PTHREAD - #include - #define PARALLEL_METHOD "PThreads" -#elif USE_FORK - #include - #include - #include - #include - #include /* for memcpy */ - #define PARALLEL_METHOD "Fork" -#elif USE_SOCKET - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #define PARALLEL_METHOD "Sockets" -#else - #define PARALLEL_METHOD "Proprietary" - #error "Please implement multicore functionality in core_portme.c to use multiple contexts." -#endif /* Method for multithreading */ -#endif /* MULTITHREAD > 1 */ - -typedef struct CORE_PORTABLE_S { -#if (MULTITHREAD>1) - #if USE_PTHREAD - pthread_t thread; - #elif USE_FORK - pid_t pid; - int shmid; - void *shm; - #elif USE_SOCKET - pid_t pid; - int sock; - struct sockaddr_in sa; - #endif /* Method for multithreading */ -#endif /* MULTITHREAD>1 */ - ee_u8 portable_id; -} core_portable; - -/* target specific init/fini */ -void portable_init(core_portable *p, int *argc, char *argv[]); -void portable_fini(core_portable *p); - -#if (SEED_METHOD==SEED_VOLATILE) - #if (VALIDATION_RUN || PERFORMANCE_RUN || PROFILE_RUN) - #define RUN_TYPE_FLAG 1 - #else - #if (TOTAL_DATA_SIZE==1200) - #define PROFILE_RUN 1 - #else - #define PERFORMANCE_RUN 1 - #endif - #endif -#endif /* SEED_METHOD==SEED_VOLATILE */ - -#endif /* CORE_PORTME_H */ diff --git a/tests/riscv-coremark/riscv64-baremetal/core_portme.mak b/tests/riscv-coremark/riscv64-baremetal/core_portme.mak deleted file mode 100755 index 8600ce0a0..000000000 --- a/tests/riscv-coremark/riscv64-baremetal/core_portme.mak +++ /dev/null @@ -1,147 +0,0 @@ -# Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# Original Author: Shay Gal-on - -#File: core_portme.mak - -# Flag: RISCVTOOLS -# Use this flag to point to your RISCV tools -RISCVTOOLS=$(RISCV) -# Flag: RISCVTYPE -# Type of toolchain to use -RISCVTYPE=riscv64-unknown-elf -# Flag: OUTFLAG -# Use this flag to define how to to get an executable (e.g -o) -OUTFLAG= -o -# Flag: CC -# Use this flag to define compiler to use -CC = $(RISCVTOOLS)/bin/$(RISCVTYPE)-gcc -# Flag: CFLAGS -# Use this flag to define compiler options. Note, you can add compiler options from the command line using XCFLAGS="other flags" -#PORT_CFLAGS = -O2 -static -std=gnu99 -PORT_CFLAGS = -O2 -mcmodel=medany -static -fno-tree-loop-distribute-patterns -std=gnu99 -fno-common -nostartfiles -lm -lgcc -T $(PORT_DIR)/link.ld -FLAGS_STR = "$(PORT_CFLAGS) $(XCFLAGS) $(XLFLAGS) $(LFLAGS_END)" -CFLAGS = $(PORT_CFLAGS) -I$(PORT_DIR) -I. -DFLAGS_STR=\"$(FLAGS_STR)\" -#Flag: LFLAGS_END -# Define any libraries needed for linking or other flags that should come at the end of the link line (e.g. linker scripts). -# Note: On certain platforms, the default clock_gettime implementation is supported but requires linking of librt. -LFLAGS_END += -# Flag: PORT_SRCS -# Port specific source files can be added here -PORT_SRCS = $(PORT_DIR)/core_portme.c $(PORT_DIR)/syscalls.c $(PORT_DIR)/crt.S -# Flag: LOAD -# Define this flag if you need to load to a target, as in a cross compile environment. - -# Flag: RUN -# Define this flag if running does not consist of simple invocation of the binary. -# In a cross compile environment, you need to define this. - -#For flashing and using a tera term macro, you could use -#LOAD = flash ADDR -#RUN = ttpmacro coremark.ttl - -#For copying to target and executing via SSH connection, you could use -#LOAD = scp $(OUTFILE) user@target:~ -#RUN = ssh user@target -c - -#For native compilation and execution -LOAD = echo Loading done -RUN = spike pk - -OEXT = .o -EXE = .bare.riscv - -# Flag: SEPARATE_COMPILE -# Define if you need to separate compilation from link stage. -# In this case, you also need to define below how to create an object file, and how to link. -ifdef SEPARATE_COMPILE - -LD = $(RISCVTOOLS)/bin/$(RISCVTYPE)-gcc -OBJOUT = -o -LFLAGS = -OFLAG = -o -COUT = -c -# Flag: PORT_OBJS -# Port specific object files can be added here -PORT_OBJS = $(PORT_DIR)/core_portme$(OEXT) -PORT_CLEAN = *$(OEXT) - -$(OPATH)%$(OEXT) : %.c - $(CC) $(CFLAGS) $(XCFLAGS) $(COUT) $< $(OBJOUT) $@ - -endif - -# Target: port_prebuild -# Generate any files that are needed before actual build starts. -# E.g. generate profile guidance files. Sample PGO generation for gcc enabled with PGO=1 -# - First, check if PGO was defined on the command line, if so, need to add -fprofile-use to compile line. -# - Second, if PGO reference has not yet been generated, add a step to the prebuild that will build a profile-generate version and run it. -# Note - Using REBUILD=1 -# -# Use make PGO=1 to invoke this sample processing. - -ifdef PGO - ifeq (,$(findstring $(PGO),gen)) - PGO_STAGE=build_pgo_gcc - CFLAGS+=-fprofile-use - endif - PORT_CLEAN+=*.gcda *.gcno gmon.out -endif - -.PHONY: port_prebuild -port_prebuild: $(PGO_STAGE) - -.PHONY: build_pgo_gcc -build_pgo_gcc: - $(MAKE) PGO=gen XCFLAGS="$(XCFLAGS) -fprofile-generate -DTOTAL_DATA_SIZE=1200" ITERATIONS=10 gen_pgo_data REBUILD=1 - -# Target: port_postbuild -# Generate any files that are needed after actual build end. -# E.g. change format to srec, bin, zip in order to be able to load into flash -.PHONY: port_postbuild -port_postbuild: - -# Target: port_postrun -# Do platform specific after run stuff. -# E.g. reset the board, backup the logfiles etc. -.PHONY: port_postrun -port_postrun: - -# Target: port_prerun -# Do platform specific after run stuff. -# E.g. reset the board, backup the logfiles etc. -.PHONY: port_prerun -port_prerun: - -# Target: port_postload -# Do platform specific after load stuff. -# E.g. reset the reset power to the flash eraser -.PHONY: port_postload -port_postload: - -# Target: port_preload -# Do platform specific before load stuff. -# E.g. reset the reset power to the flash eraser -.PHONY: port_preload -port_preload: - -# FLAG: OPATH -# Path to the output folder. Default - current folder. -OPATH = ./ -MKDIR = mkdir -p - -# FLAG: PERL -# Define perl executable to calculate the geomean if running separate. -PERL=/usr/bin/perl diff --git a/tests/riscv-coremark/riscv64-baremetal/crt.S b/tests/riscv-coremark/riscv64-baremetal/crt.S deleted file mode 100644 index d75e81e06..000000000 --- a/tests/riscv-coremark/riscv64-baremetal/crt.S +++ /dev/null @@ -1,237 +0,0 @@ -# See LICENSE for license details. - -#include "encoding.h" - -#if __riscv_xlen == 64 -# define LREG ld -# define SREG sd -# define REGBYTES 8 -#else -# define LREG lw -# define SREG sw -# define REGBYTES 4 -#endif - - .section ".text.init" - .globl _start -_start: - li x1, 0 - li x2, 0 - li x3, 0 - li x4, 0 - li x5, 0 - li x6, 0 - li x7, 0 - li x8, 0 - li x9, 0 - li x10,0 - li x11,0 - li x12,0 - li x13,0 - li x14,0 - li x15,0 - li x16,0 - li x17,0 - li x18,0 - li x19,0 - li x20,0 - li x21,0 - li x22,0 - li x23,0 - li x24,0 - li x25,0 - li x26,0 - li x27,0 - li x28,0 - li x29,0 - li x30,0 - li x31,0 - - # enable FPU and accelerator if present - li t0, MSTATUS_FS | MSTATUS_XS - csrs mstatus, t0 - - # make sure XLEN agrees with compilation choice - li t0, 1 - slli t0, t0, 31 -#if __riscv_xlen == 64 - bgez t0, 1f -#else - bltz t0, 1f -#endif -2: - li a0, 1 - sw a0, tohost, t0 - j 2b -1: - -#ifdef __riscv_flen - # initialize FPU if we have one - la t0, 1f - csrw mtvec, t0 - - fssr x0 - fmv.s.x f0, x0 - fmv.s.x f1, x0 - fmv.s.x f2, x0 - fmv.s.x f3, x0 - fmv.s.x f4, x0 - fmv.s.x f5, x0 - fmv.s.x f6, x0 - fmv.s.x f7, x0 - fmv.s.x f8, x0 - fmv.s.x f9, x0 - fmv.s.x f10,x0 - fmv.s.x f11,x0 - fmv.s.x f12,x0 - fmv.s.x f13,x0 - fmv.s.x f14,x0 - fmv.s.x f15,x0 - fmv.s.x f16,x0 - fmv.s.x f17,x0 - fmv.s.x f18,x0 - fmv.s.x f19,x0 - fmv.s.x f20,x0 - fmv.s.x f21,x0 - fmv.s.x f22,x0 - fmv.s.x f23,x0 - fmv.s.x f24,x0 - fmv.s.x f25,x0 - fmv.s.x f26,x0 - fmv.s.x f27,x0 - fmv.s.x f28,x0 - fmv.s.x f29,x0 - fmv.s.x f30,x0 - fmv.s.x f31,x0 -1: -#endif - - # initialize trap vector - la t0, trap_entry - csrw mtvec, t0 - - # initialize global pointer -.option push -.option norelax - la gp, __global_pointer$ -.option pop - - la tp, _end + 63 - and tp, tp, -64 - - # get core id - csrr a0, mhartid - # for now, assume only 1 core - li a1, 1 -1:bgeu a0, a1, 1b - - # give each core 128KB of stack + TLS -#define STKSHIFT 17 - sll a2, a0, STKSHIFT - add tp, tp, a2 - add sp, a0, 1 - sll sp, sp, STKSHIFT - add sp, sp, tp - - j _init - - .align 2 -trap_entry: - addi sp, sp, -272 - - SREG x1, 1*REGBYTES(sp) - SREG x2, 2*REGBYTES(sp) - SREG x3, 3*REGBYTES(sp) - SREG x4, 4*REGBYTES(sp) - SREG x5, 5*REGBYTES(sp) - SREG x6, 6*REGBYTES(sp) - SREG x7, 7*REGBYTES(sp) - SREG x8, 8*REGBYTES(sp) - SREG x9, 9*REGBYTES(sp) - SREG x10, 10*REGBYTES(sp) - SREG x11, 11*REGBYTES(sp) - SREG x12, 12*REGBYTES(sp) - SREG x13, 13*REGBYTES(sp) - SREG x14, 14*REGBYTES(sp) - SREG x15, 15*REGBYTES(sp) - SREG x16, 16*REGBYTES(sp) - SREG x17, 17*REGBYTES(sp) - SREG x18, 18*REGBYTES(sp) - SREG x19, 19*REGBYTES(sp) - SREG x20, 20*REGBYTES(sp) - SREG x21, 21*REGBYTES(sp) - SREG x22, 22*REGBYTES(sp) - SREG x23, 23*REGBYTES(sp) - SREG x24, 24*REGBYTES(sp) - SREG x25, 25*REGBYTES(sp) - SREG x26, 26*REGBYTES(sp) - SREG x27, 27*REGBYTES(sp) - SREG x28, 28*REGBYTES(sp) - SREG x29, 29*REGBYTES(sp) - SREG x30, 30*REGBYTES(sp) - SREG x31, 31*REGBYTES(sp) - - csrr a0, mcause - csrr a1, mepc - mv a2, sp - jal handle_trap - csrw mepc, a0 - - # Remain in M-mode after eret - li t0, MSTATUS_MPP - csrs mstatus, t0 - - LREG x1, 1*REGBYTES(sp) - LREG x2, 2*REGBYTES(sp) - LREG x3, 3*REGBYTES(sp) - LREG x4, 4*REGBYTES(sp) - LREG x5, 5*REGBYTES(sp) - LREG x6, 6*REGBYTES(sp) - LREG x7, 7*REGBYTES(sp) - LREG x8, 8*REGBYTES(sp) - LREG x9, 9*REGBYTES(sp) - LREG x10, 10*REGBYTES(sp) - LREG x11, 11*REGBYTES(sp) - LREG x12, 12*REGBYTES(sp) - LREG x13, 13*REGBYTES(sp) - LREG x14, 14*REGBYTES(sp) - LREG x15, 15*REGBYTES(sp) - LREG x16, 16*REGBYTES(sp) - LREG x17, 17*REGBYTES(sp) - LREG x18, 18*REGBYTES(sp) - LREG x19, 19*REGBYTES(sp) - LREG x20, 20*REGBYTES(sp) - LREG x21, 21*REGBYTES(sp) - LREG x22, 22*REGBYTES(sp) - LREG x23, 23*REGBYTES(sp) - LREG x24, 24*REGBYTES(sp) - LREG x25, 25*REGBYTES(sp) - LREG x26, 26*REGBYTES(sp) - LREG x27, 27*REGBYTES(sp) - LREG x28, 28*REGBYTES(sp) - LREG x29, 29*REGBYTES(sp) - LREG x30, 30*REGBYTES(sp) - LREG x31, 31*REGBYTES(sp) - - addi sp, sp, 272 - mret - -.section ".tdata.begin" -.globl _tdata_begin -_tdata_begin: - -.section ".tdata.end" -.globl _tdata_end -_tdata_end: - -.section ".tbss.end" -.globl _tbss_end -_tbss_end: - -.section ".tohost","aw",@progbits -.align 6 -.globl tohost -tohost: .dword 0 -.align 6 -.globl fromhost -fromhost: .dword 0 diff --git a/tests/riscv-coremark/riscv64-baremetal/encoding.h b/tests/riscv-coremark/riscv64-baremetal/encoding.h deleted file mode 100644 index c109ce189..000000000 --- a/tests/riscv-coremark/riscv64-baremetal/encoding.h +++ /dev/null @@ -1,1471 +0,0 @@ -// See LICENSE for license details. - -#ifndef RISCV_CSR_ENCODING_H -#define RISCV_CSR_ENCODING_H - -#define MSTATUS_UIE 0x00000001 -#define MSTATUS_SIE 0x00000002 -#define MSTATUS_HIE 0x00000004 -#define MSTATUS_MIE 0x00000008 -#define MSTATUS_UPIE 0x00000010 -#define MSTATUS_SPIE 0x00000020 -#define MSTATUS_HPIE 0x00000040 -#define MSTATUS_MPIE 0x00000080 -#define MSTATUS_SPP 0x00000100 -#define MSTATUS_HPP 0x00000600 -#define MSTATUS_MPP 0x00001800 -#define MSTATUS_FS 0x00006000 -#define MSTATUS_XS 0x00018000 -#define MSTATUS_MPRV 0x00020000 -#define MSTATUS_SUM 0x00040000 -#define MSTATUS_MXR 0x00080000 -#define MSTATUS_TVM 0x00100000 -#define MSTATUS_TW 0x00200000 -#define MSTATUS_TSR 0x00400000 -#define MSTATUS32_SD 0x80000000 -#define MSTATUS_UXL 0x0000000300000000 -#define MSTATUS_SXL 0x0000000C00000000 -#define MSTATUS64_SD 0x8000000000000000 - -#define SSTATUS_UIE 0x00000001 -#define SSTATUS_SIE 0x00000002 -#define SSTATUS_UPIE 0x00000010 -#define SSTATUS_SPIE 0x00000020 -#define SSTATUS_SPP 0x00000100 -#define SSTATUS_FS 0x00006000 -#define SSTATUS_XS 0x00018000 -#define SSTATUS_SUM 0x00040000 -#define SSTATUS_MXR 0x00080000 -#define SSTATUS32_SD 0x80000000 -#define SSTATUS_UXL 0x0000000300000000 -#define SSTATUS64_SD 0x8000000000000000 - -#define DCSR_XDEBUGVER (3U<<30) -#define DCSR_NDRESET (1<<29) -#define DCSR_FULLRESET (1<<28) -#define DCSR_EBREAKM (1<<15) -#define DCSR_EBREAKH (1<<14) -#define DCSR_EBREAKS (1<<13) -#define DCSR_EBREAKU (1<<12) -#define DCSR_STOPCYCLE (1<<10) -#define DCSR_STOPTIME (1<<9) -#define DCSR_CAUSE (7<<6) -#define DCSR_DEBUGINT (1<<5) -#define DCSR_HALT (1<<3) -#define DCSR_STEP (1<<2) -#define DCSR_PRV (3<<0) - -#define DCSR_CAUSE_NONE 0 -#define DCSR_CAUSE_SWBP 1 -#define DCSR_CAUSE_HWBP 2 -#define DCSR_CAUSE_DEBUGINT 3 -#define DCSR_CAUSE_STEP 4 -#define DCSR_CAUSE_HALT 5 - -#define MCONTROL_TYPE(xlen) (0xfULL<<((xlen)-4)) -#define MCONTROL_DMODE(xlen) (1ULL<<((xlen)-5)) -#define MCONTROL_MASKMAX(xlen) (0x3fULL<<((xlen)-11)) - -#define MCONTROL_SELECT (1<<19) -#define MCONTROL_TIMING (1<<18) -#define MCONTROL_ACTION (0x3f<<12) -#define MCONTROL_CHAIN (1<<11) -#define MCONTROL_MATCH (0xf<<7) -#define MCONTROL_M (1<<6) -#define MCONTROL_H (1<<5) -#define MCONTROL_S (1<<4) -#define MCONTROL_U (1<<3) -#define MCONTROL_EXECUTE (1<<2) -#define MCONTROL_STORE (1<<1) -#define MCONTROL_LOAD (1<<0) - -#define MCONTROL_TYPE_NONE 0 -#define MCONTROL_TYPE_MATCH 2 - -#define MCONTROL_ACTION_DEBUG_EXCEPTION 0 -#define MCONTROL_ACTION_DEBUG_MODE 1 -#define MCONTROL_ACTION_TRACE_START 2 -#define MCONTROL_ACTION_TRACE_STOP 3 -#define MCONTROL_ACTION_TRACE_EMIT 4 - -#define MCONTROL_MATCH_EQUAL 0 -#define MCONTROL_MATCH_NAPOT 1 -#define MCONTROL_MATCH_GE 2 -#define MCONTROL_MATCH_LT 3 -#define MCONTROL_MATCH_MASK_LOW 4 -#define MCONTROL_MATCH_MASK_HIGH 5 - -#define MIP_SSIP (1 << IRQ_S_SOFT) -#define MIP_HSIP (1 << IRQ_H_SOFT) -#define MIP_MSIP (1 << IRQ_M_SOFT) -#define MIP_STIP (1 << IRQ_S_TIMER) -#define MIP_HTIP (1 << IRQ_H_TIMER) -#define MIP_MTIP (1 << IRQ_M_TIMER) -#define MIP_SEIP (1 << IRQ_S_EXT) -#define MIP_HEIP (1 << IRQ_H_EXT) -#define MIP_MEIP (1 << IRQ_M_EXT) - -#define SIP_SSIP MIP_SSIP -#define SIP_STIP MIP_STIP - -#define PRV_U 0 -#define PRV_S 1 -#define PRV_H 2 -#define PRV_M 3 - -#define SATP32_MODE 0x80000000 -#define SATP32_ASID 0x7FC00000 -#define SATP32_PPN 0x003FFFFF -#define SATP64_MODE 0xF000000000000000 -#define SATP64_ASID 0x0FFFF00000000000 -#define SATP64_PPN 0x00000FFFFFFFFFFF - -#define SATP_MODE_OFF 0 -#define SATP_MODE_SV32 1 -#define SATP_MODE_SV39 8 -#define SATP_MODE_SV48 9 -#define SATP_MODE_SV57 10 -#define SATP_MODE_SV64 11 - -#define PMP_R 0x01 -#define PMP_W 0x02 -#define PMP_X 0x04 -#define PMP_A 0x18 -#define PMP_L 0x80 -#define PMP_SHIFT 2 - -#define PMP_TOR 0x08 -#define PMP_NA4 0x10 -#define PMP_NAPOT 0x18 - -#define IRQ_S_SOFT 1 -#define IRQ_H_SOFT 2 -#define IRQ_M_SOFT 3 -#define IRQ_S_TIMER 5 -#define IRQ_H_TIMER 6 -#define IRQ_M_TIMER 7 -#define IRQ_S_EXT 9 -#define IRQ_H_EXT 10 -#define IRQ_M_EXT 11 -#define IRQ_COP 12 -#define IRQ_HOST 13 - -#define DEFAULT_RSTVEC 0x00001000 -#define CLINT_BASE 0x02000000 -#define CLINT_SIZE 0x000c0000 -#define EXT_IO_BASE 0x40000000 -#define DRAM_BASE 0x80000000 - -// page table entry (PTE) fields -#define PTE_V 0x001 // Valid -#define PTE_R 0x002 // Read -#define PTE_W 0x004 // Write -#define PTE_X 0x008 // Execute -#define PTE_U 0x010 // User -#define PTE_G 0x020 // Global -#define PTE_A 0x040 // Accessed -#define PTE_D 0x080 // Dirty -#define PTE_SOFT 0x300 // Reserved for Software - -#define PTE_PPN_SHIFT 10 - -#define PTE_TABLE(PTE) (((PTE) & (PTE_V | PTE_R | PTE_W | PTE_X)) == PTE_V) - -#ifdef __riscv - -#if __riscv_xlen == 64 -# define MSTATUS_SD MSTATUS64_SD -# define SSTATUS_SD SSTATUS64_SD -# define RISCV_PGLEVEL_BITS 9 -# define SATP_MODE SATP64_MODE -#else -# define MSTATUS_SD MSTATUS32_SD -# define SSTATUS_SD SSTATUS32_SD -# define RISCV_PGLEVEL_BITS 10 -# define SATP_MODE SATP32_MODE -#endif -#define RISCV_PGSHIFT 12 -#define RISCV_PGSIZE (1 << RISCV_PGSHIFT) - -#ifndef __ASSEMBLER__ - -#ifdef __GNUC__ - -#define read_csr(reg) ({ unsigned long __tmp; \ - asm volatile ("csrr %0, " #reg : "=r"(__tmp)); \ - __tmp; }) - -#define write_csr(reg, val) ({ \ - asm volatile ("csrw " #reg ", %0" :: "rK"(val)); }) - -#define swap_csr(reg, val) ({ unsigned long __tmp; \ - asm volatile ("csrrw %0, " #reg ", %1" : "=r"(__tmp) : "rK"(val)); \ - __tmp; }) - -#define set_csr(reg, bit) ({ unsigned long __tmp; \ - asm volatile ("csrrs %0, " #reg ", %1" : "=r"(__tmp) : "rK"(bit)); \ - __tmp; }) - -#define clear_csr(reg, bit) ({ unsigned long __tmp; \ - asm volatile ("csrrc %0, " #reg ", %1" : "=r"(__tmp) : "rK"(bit)); \ - __tmp; }) - -#define rdtime() read_csr(time) -#define rdcycle() read_csr(cycle) -#define rdinstret() read_csr(instret) - -#endif - -#endif - -#endif - -#endif -/* Automatically generated by parse-opcodes. */ -#ifndef RISCV_ENCODING_H -#define RISCV_ENCODING_H -#define MATCH_BEQ 0x63 -#define MASK_BEQ 0x707f -#define MATCH_BNE 0x1063 -#define MASK_BNE 0x707f -#define MATCH_BLT 0x4063 -#define MASK_BLT 0x707f -#define MATCH_BGE 0x5063 -#define MASK_BGE 0x707f -#define MATCH_BLTU 0x6063 -#define MASK_BLTU 0x707f -#define MATCH_BGEU 0x7063 -#define MASK_BGEU 0x707f -#define MATCH_JALR 0x67 -#define MASK_JALR 0x707f -#define MATCH_JAL 0x6f -#define MASK_JAL 0x7f -#define MATCH_LUI 0x37 -#define MASK_LUI 0x7f -#define MATCH_AUIPC 0x17 -#define MASK_AUIPC 0x7f -#define MATCH_ADDI 0x13 -#define MASK_ADDI 0x707f -#define MATCH_SLLI 0x1013 -#define MASK_SLLI 0xfc00707f -#define MATCH_SLTI 0x2013 -#define MASK_SLTI 0x707f -#define MATCH_SLTIU 0x3013 -#define MASK_SLTIU 0x707f -#define MATCH_XORI 0x4013 -#define MASK_XORI 0x707f -#define MATCH_SRLI 0x5013 -#define MASK_SRLI 0xfc00707f -#define MATCH_SRAI 0x40005013 -#define MASK_SRAI 0xfc00707f -#define MATCH_ORI 0x6013 -#define MASK_ORI 0x707f -#define MATCH_ANDI 0x7013 -#define MASK_ANDI 0x707f -#define MATCH_ADD 0x33 -#define MASK_ADD 0xfe00707f -#define MATCH_SUB 0x40000033 -#define MASK_SUB 0xfe00707f -#define MATCH_SLL 0x1033 -#define MASK_SLL 0xfe00707f -#define MATCH_SLT 0x2033 -#define MASK_SLT 0xfe00707f -#define MATCH_SLTU 0x3033 -#define MASK_SLTU 0xfe00707f -#define MATCH_XOR 0x4033 -#define MASK_XOR 0xfe00707f -#define MATCH_SRL 0x5033 -#define MASK_SRL 0xfe00707f -#define MATCH_SRA 0x40005033 -#define MASK_SRA 0xfe00707f -#define MATCH_OR 0x6033 -#define MASK_OR 0xfe00707f -#define MATCH_AND 0x7033 -#define MASK_AND 0xfe00707f -#define MATCH_ADDIW 0x1b -#define MASK_ADDIW 0x707f -#define MATCH_SLLIW 0x101b -#define MASK_SLLIW 0xfe00707f -#define MATCH_SRLIW 0x501b -#define MASK_SRLIW 0xfe00707f -#define MATCH_SRAIW 0x4000501b -#define MASK_SRAIW 0xfe00707f -#define MATCH_ADDW 0x3b -#define MASK_ADDW 0xfe00707f -#define MATCH_SUBW 0x4000003b -#define MASK_SUBW 0xfe00707f -#define MATCH_SLLW 0x103b -#define MASK_SLLW 0xfe00707f -#define MATCH_SRLW 0x503b -#define MASK_SRLW 0xfe00707f -#define MATCH_SRAW 0x4000503b -#define MASK_SRAW 0xfe00707f -#define MATCH_LB 0x3 -#define MASK_LB 0x707f -#define MATCH_LH 0x1003 -#define MASK_LH 0x707f -#define MATCH_LW 0x2003 -#define MASK_LW 0x707f -#define MATCH_LD 0x3003 -#define MASK_LD 0x707f -#define MATCH_LBU 0x4003 -#define MASK_LBU 0x707f -#define MATCH_LHU 0x5003 -#define MASK_LHU 0x707f -#define MATCH_LWU 0x6003 -#define MASK_LWU 0x707f -#define MATCH_SB 0x23 -#define MASK_SB 0x707f -#define MATCH_SH 0x1023 -#define MASK_SH 0x707f -#define MATCH_SW 0x2023 -#define MASK_SW 0x707f -#define MATCH_SD 0x3023 -#define MASK_SD 0x707f -#define MATCH_FENCE 0xf -#define MASK_FENCE 0x707f -#define MATCH_FENCE_I 0x100f -#define MASK_FENCE_I 0x707f -#define MATCH_MUL 0x2000033 -#define MASK_MUL 0xfe00707f -#define MATCH_MULH 0x2001033 -#define MASK_MULH 0xfe00707f -#define MATCH_MULHSU 0x2002033 -#define MASK_MULHSU 0xfe00707f -#define MATCH_MULHU 0x2003033 -#define MASK_MULHU 0xfe00707f -#define MATCH_DIV 0x2004033 -#define MASK_DIV 0xfe00707f -#define MATCH_DIVU 0x2005033 -#define MASK_DIVU 0xfe00707f -#define MATCH_REM 0x2006033 -#define MASK_REM 0xfe00707f -#define MATCH_REMU 0x2007033 -#define MASK_REMU 0xfe00707f -#define MATCH_MULW 0x200003b -#define MASK_MULW 0xfe00707f -#define MATCH_DIVW 0x200403b -#define MASK_DIVW 0xfe00707f -#define MATCH_DIVUW 0x200503b -#define MASK_DIVUW 0xfe00707f -#define MATCH_REMW 0x200603b -#define MASK_REMW 0xfe00707f -#define MATCH_REMUW 0x200703b -#define MASK_REMUW 0xfe00707f -#define MATCH_AMOADD_W 0x202f -#define MASK_AMOADD_W 0xf800707f -#define MATCH_AMOXOR_W 0x2000202f -#define MASK_AMOXOR_W 0xf800707f -#define MATCH_AMOOR_W 0x4000202f -#define MASK_AMOOR_W 0xf800707f -#define MATCH_AMOAND_W 0x6000202f -#define MASK_AMOAND_W 0xf800707f -#define MATCH_AMOMIN_W 0x8000202f -#define MASK_AMOMIN_W 0xf800707f -#define MATCH_AMOMAX_W 0xa000202f -#define MASK_AMOMAX_W 0xf800707f -#define MATCH_AMOMINU_W 0xc000202f -#define MASK_AMOMINU_W 0xf800707f -#define MATCH_AMOMAXU_W 0xe000202f -#define MASK_AMOMAXU_W 0xf800707f -#define MATCH_AMOSWAP_W 0x800202f -#define MASK_AMOSWAP_W 0xf800707f -#define MATCH_LR_W 0x1000202f -#define MASK_LR_W 0xf9f0707f -#define MATCH_SC_W 0x1800202f -#define MASK_SC_W 0xf800707f -#define MATCH_AMOADD_D 0x302f -#define MASK_AMOADD_D 0xf800707f -#define MATCH_AMOXOR_D 0x2000302f -#define MASK_AMOXOR_D 0xf800707f -#define MATCH_AMOOR_D 0x4000302f -#define MASK_AMOOR_D 0xf800707f -#define MATCH_AMOAND_D 0x6000302f -#define MASK_AMOAND_D 0xf800707f -#define MATCH_AMOMIN_D 0x8000302f -#define MASK_AMOMIN_D 0xf800707f -#define MATCH_AMOMAX_D 0xa000302f -#define MASK_AMOMAX_D 0xf800707f -#define MATCH_AMOMINU_D 0xc000302f -#define MASK_AMOMINU_D 0xf800707f -#define MATCH_AMOMAXU_D 0xe000302f -#define MASK_AMOMAXU_D 0xf800707f -#define MATCH_AMOSWAP_D 0x800302f -#define MASK_AMOSWAP_D 0xf800707f -#define MATCH_LR_D 0x1000302f -#define MASK_LR_D 0xf9f0707f -#define MATCH_SC_D 0x1800302f -#define MASK_SC_D 0xf800707f -#define MATCH_ECALL 0x73 -#define MASK_ECALL 0xffffffff -#define MATCH_EBREAK 0x100073 -#define MASK_EBREAK 0xffffffff -#define MATCH_URET 0x200073 -#define MASK_URET 0xffffffff -#define MATCH_SRET 0x10200073 -#define MASK_SRET 0xffffffff -#define MATCH_MRET 0x30200073 -#define MASK_MRET 0xffffffff -#define MATCH_DRET 0x7b200073 -#define MASK_DRET 0xffffffff -#define MATCH_SFENCE_VMA 0x12000073 -#define MASK_SFENCE_VMA 0xfe007fff -#define MATCH_WFI 0x10500073 -#define MASK_WFI 0xffffffff -#define MATCH_CSRRW 0x1073 -#define MASK_CSRRW 0x707f -#define MATCH_CSRRS 0x2073 -#define MASK_CSRRS 0x707f -#define MATCH_CSRRC 0x3073 -#define MASK_CSRRC 0x707f -#define MATCH_CSRRWI 0x5073 -#define MASK_CSRRWI 0x707f -#define MATCH_CSRRSI 0x6073 -#define MASK_CSRRSI 0x707f -#define MATCH_CSRRCI 0x7073 -#define MASK_CSRRCI 0x707f -#define MATCH_FADD_S 0x53 -#define MASK_FADD_S 0xfe00007f -#define MATCH_FSUB_S 0x8000053 -#define MASK_FSUB_S 0xfe00007f -#define MATCH_FMUL_S 0x10000053 -#define MASK_FMUL_S 0xfe00007f -#define MATCH_FDIV_S 0x18000053 -#define MASK_FDIV_S 0xfe00007f -#define MATCH_FSGNJ_S 0x20000053 -#define MASK_FSGNJ_S 0xfe00707f -#define MATCH_FSGNJN_S 0x20001053 -#define MASK_FSGNJN_S 0xfe00707f -#define MATCH_FSGNJX_S 0x20002053 -#define MASK_FSGNJX_S 0xfe00707f -#define MATCH_FMIN_S 0x28000053 -#define MASK_FMIN_S 0xfe00707f -#define MATCH_FMAX_S 0x28001053 -#define MASK_FMAX_S 0xfe00707f -#define MATCH_FSQRT_S 0x58000053 -#define MASK_FSQRT_S 0xfff0007f -#define MATCH_FADD_D 0x2000053 -#define MASK_FADD_D 0xfe00007f -#define MATCH_FSUB_D 0xa000053 -#define MASK_FSUB_D 0xfe00007f -#define MATCH_FMUL_D 0x12000053 -#define MASK_FMUL_D 0xfe00007f -#define MATCH_FDIV_D 0x1a000053 -#define MASK_FDIV_D 0xfe00007f -#define MATCH_FSGNJ_D 0x22000053 -#define MASK_FSGNJ_D 0xfe00707f -#define MATCH_FSGNJN_D 0x22001053 -#define MASK_FSGNJN_D 0xfe00707f -#define MATCH_FSGNJX_D 0x22002053 -#define MASK_FSGNJX_D 0xfe00707f -#define MATCH_FMIN_D 0x2a000053 -#define MASK_FMIN_D 0xfe00707f -#define MATCH_FMAX_D 0x2a001053 -#define MASK_FMAX_D 0xfe00707f -#define MATCH_FCVT_S_D 0x40100053 -#define MASK_FCVT_S_D 0xfff0007f -#define MATCH_FCVT_D_S 0x42000053 -#define MASK_FCVT_D_S 0xfff0007f -#define MATCH_FSQRT_D 0x5a000053 -#define MASK_FSQRT_D 0xfff0007f -#define MATCH_FADD_Q 0x6000053 -#define MASK_FADD_Q 0xfe00007f -#define MATCH_FSUB_Q 0xe000053 -#define MASK_FSUB_Q 0xfe00007f -#define MATCH_FMUL_Q 0x16000053 -#define MASK_FMUL_Q 0xfe00007f -#define MATCH_FDIV_Q 0x1e000053 -#define MASK_FDIV_Q 0xfe00007f -#define MATCH_FSGNJ_Q 0x26000053 -#define MASK_FSGNJ_Q 0xfe00707f -#define MATCH_FSGNJN_Q 0x26001053 -#define MASK_FSGNJN_Q 0xfe00707f -#define MATCH_FSGNJX_Q 0x26002053 -#define MASK_FSGNJX_Q 0xfe00707f -#define MATCH_FMIN_Q 0x2e000053 -#define MASK_FMIN_Q 0xfe00707f -#define MATCH_FMAX_Q 0x2e001053 -#define MASK_FMAX_Q 0xfe00707f -#define MATCH_FCVT_S_Q 0x40300053 -#define MASK_FCVT_S_Q 0xfff0007f -#define MATCH_FCVT_Q_S 0x46000053 -#define MASK_FCVT_Q_S 0xfff0007f -#define MATCH_FCVT_D_Q 0x42300053 -#define MASK_FCVT_D_Q 0xfff0007f -#define MATCH_FCVT_Q_D 0x46100053 -#define MASK_FCVT_Q_D 0xfff0007f -#define MATCH_FSQRT_Q 0x5e000053 -#define MASK_FSQRT_Q 0xfff0007f -#define MATCH_FLE_S 0xa0000053 -#define MASK_FLE_S 0xfe00707f -#define MATCH_FLT_S 0xa0001053 -#define MASK_FLT_S 0xfe00707f -#define MATCH_FEQ_S 0xa0002053 -#define MASK_FEQ_S 0xfe00707f -#define MATCH_FLE_D 0xa2000053 -#define MASK_FLE_D 0xfe00707f -#define MATCH_FLT_D 0xa2001053 -#define MASK_FLT_D 0xfe00707f -#define MATCH_FEQ_D 0xa2002053 -#define MASK_FEQ_D 0xfe00707f -#define MATCH_FLE_Q 0xa6000053 -#define MASK_FLE_Q 0xfe00707f -#define MATCH_FLT_Q 0xa6001053 -#define MASK_FLT_Q 0xfe00707f -#define MATCH_FEQ_Q 0xa6002053 -#define MASK_FEQ_Q 0xfe00707f -#define MATCH_FCVT_W_S 0xc0000053 -#define MASK_FCVT_W_S 0xfff0007f -#define MATCH_FCVT_WU_S 0xc0100053 -#define MASK_FCVT_WU_S 0xfff0007f -#define MATCH_FCVT_L_S 0xc0200053 -#define MASK_FCVT_L_S 0xfff0007f -#define MATCH_FCVT_LU_S 0xc0300053 -#define MASK_FCVT_LU_S 0xfff0007f -#define MATCH_FMV_X_W 0xe0000053 -#define MASK_FMV_X_W 0xfff0707f -#define MATCH_FCLASS_S 0xe0001053 -#define MASK_FCLASS_S 0xfff0707f -#define MATCH_FCVT_W_D 0xc2000053 -#define MASK_FCVT_W_D 0xfff0007f -#define MATCH_FCVT_WU_D 0xc2100053 -#define MASK_FCVT_WU_D 0xfff0007f -#define MATCH_FCVT_L_D 0xc2200053 -#define MASK_FCVT_L_D 0xfff0007f -#define MATCH_FCVT_LU_D 0xc2300053 -#define MASK_FCVT_LU_D 0xfff0007f -#define MATCH_FMV_X_D 0xe2000053 -#define MASK_FMV_X_D 0xfff0707f -#define MATCH_FCLASS_D 0xe2001053 -#define MASK_FCLASS_D 0xfff0707f -#define MATCH_FCVT_W_Q 0xc6000053 -#define MASK_FCVT_W_Q 0xfff0007f -#define MATCH_FCVT_WU_Q 0xc6100053 -#define MASK_FCVT_WU_Q 0xfff0007f -#define MATCH_FCVT_L_Q 0xc6200053 -#define MASK_FCVT_L_Q 0xfff0007f -#define MATCH_FCVT_LU_Q 0xc6300053 -#define MASK_FCVT_LU_Q 0xfff0007f -#define MATCH_FMV_X_Q 0xe6000053 -#define MASK_FMV_X_Q 0xfff0707f -#define MATCH_FCLASS_Q 0xe6001053 -#define MASK_FCLASS_Q 0xfff0707f -#define MATCH_FCVT_S_W 0xd0000053 -#define MASK_FCVT_S_W 0xfff0007f -#define MATCH_FCVT_S_WU 0xd0100053 -#define MASK_FCVT_S_WU 0xfff0007f -#define MATCH_FCVT_S_L 0xd0200053 -#define MASK_FCVT_S_L 0xfff0007f -#define MATCH_FCVT_S_LU 0xd0300053 -#define MASK_FCVT_S_LU 0xfff0007f -#define MATCH_FMV_W_X 0xf0000053 -#define MASK_FMV_W_X 0xfff0707f -#define MATCH_FCVT_D_W 0xd2000053 -#define MASK_FCVT_D_W 0xfff0007f -#define MATCH_FCVT_D_WU 0xd2100053 -#define MASK_FCVT_D_WU 0xfff0007f -#define MATCH_FCVT_D_L 0xd2200053 -#define MASK_FCVT_D_L 0xfff0007f -#define MATCH_FCVT_D_LU 0xd2300053 -#define MASK_FCVT_D_LU 0xfff0007f -#define MATCH_FMV_D_X 0xf2000053 -#define MASK_FMV_D_X 0xfff0707f -#define MATCH_FCVT_Q_W 0xd6000053 -#define MASK_FCVT_Q_W 0xfff0007f -#define MATCH_FCVT_Q_WU 0xd6100053 -#define MASK_FCVT_Q_WU 0xfff0007f -#define MATCH_FCVT_Q_L 0xd6200053 -#define MASK_FCVT_Q_L 0xfff0007f -#define MATCH_FCVT_Q_LU 0xd6300053 -#define MASK_FCVT_Q_LU 0xfff0007f -#define MATCH_FMV_Q_X 0xf6000053 -#define MASK_FMV_Q_X 0xfff0707f -#define MATCH_FLW 0x2007 -#define MASK_FLW 0x707f -#define MATCH_FLD 0x3007 -#define MASK_FLD 0x707f -#define MATCH_FLQ 0x4007 -#define MASK_FLQ 0x707f -#define MATCH_FSW 0x2027 -#define MASK_FSW 0x707f -#define MATCH_FSD 0x3027 -#define MASK_FSD 0x707f -#define MATCH_FSQ 0x4027 -#define MASK_FSQ 0x707f -#define MATCH_FMADD_S 0x43 -#define MASK_FMADD_S 0x600007f -#define MATCH_FMSUB_S 0x47 -#define MASK_FMSUB_S 0x600007f -#define MATCH_FNMSUB_S 0x4b -#define MASK_FNMSUB_S 0x600007f -#define MATCH_FNMADD_S 0x4f -#define MASK_FNMADD_S 0x600007f -#define MATCH_FMADD_D 0x2000043 -#define MASK_FMADD_D 0x600007f -#define MATCH_FMSUB_D 0x2000047 -#define MASK_FMSUB_D 0x600007f -#define MATCH_FNMSUB_D 0x200004b -#define MASK_FNMSUB_D 0x600007f -#define MATCH_FNMADD_D 0x200004f -#define MASK_FNMADD_D 0x600007f -#define MATCH_FMADD_Q 0x6000043 -#define MASK_FMADD_Q 0x600007f -#define MATCH_FMSUB_Q 0x6000047 -#define MASK_FMSUB_Q 0x600007f -#define MATCH_FNMSUB_Q 0x600004b -#define MASK_FNMSUB_Q 0x600007f -#define MATCH_FNMADD_Q 0x600004f -#define MASK_FNMADD_Q 0x600007f -#define MATCH_C_NOP 0x1 -#define MASK_C_NOP 0xffff -#define MATCH_C_ADDI16SP 0x6101 -#define MASK_C_ADDI16SP 0xef83 -#define MATCH_C_JR 0x8002 -#define MASK_C_JR 0xf07f -#define MATCH_C_JALR 0x9002 -#define MASK_C_JALR 0xf07f -#define MATCH_C_EBREAK 0x9002 -#define MASK_C_EBREAK 0xffff -#define MATCH_C_LD 0x6000 -#define MASK_C_LD 0xe003 -#define MATCH_C_SD 0xe000 -#define MASK_C_SD 0xe003 -#define MATCH_C_ADDIW 0x2001 -#define MASK_C_ADDIW 0xe003 -#define MATCH_C_LDSP 0x6002 -#define MASK_C_LDSP 0xe003 -#define MATCH_C_SDSP 0xe002 -#define MASK_C_SDSP 0xe003 -#define MATCH_C_ADDI4SPN 0x0 -#define MASK_C_ADDI4SPN 0xe003 -#define MATCH_C_FLD 0x2000 -#define MASK_C_FLD 0xe003 -#define MATCH_C_LW 0x4000 -#define MASK_C_LW 0xe003 -#define MATCH_C_FLW 0x6000 -#define MASK_C_FLW 0xe003 -#define MATCH_C_FSD 0xa000 -#define MASK_C_FSD 0xe003 -#define MATCH_C_SW 0xc000 -#define MASK_C_SW 0xe003 -#define MATCH_C_FSW 0xe000 -#define MASK_C_FSW 0xe003 -#define MATCH_C_ADDI 0x1 -#define MASK_C_ADDI 0xe003 -#define MATCH_C_JAL 0x2001 -#define MASK_C_JAL 0xe003 -#define MATCH_C_LI 0x4001 -#define MASK_C_LI 0xe003 -#define MATCH_C_LUI 0x6001 -#define MASK_C_LUI 0xe003 -#define MATCH_C_SRLI 0x8001 -#define MASK_C_SRLI 0xec03 -#define MATCH_C_SRAI 0x8401 -#define MASK_C_SRAI 0xec03 -#define MATCH_C_ANDI 0x8801 -#define MASK_C_ANDI 0xec03 -#define MATCH_C_SUB 0x8c01 -#define MASK_C_SUB 0xfc63 -#define MATCH_C_XOR 0x8c21 -#define MASK_C_XOR 0xfc63 -#define MATCH_C_OR 0x8c41 -#define MASK_C_OR 0xfc63 -#define MATCH_C_AND 0x8c61 -#define MASK_C_AND 0xfc63 -#define MATCH_C_SUBW 0x9c01 -#define MASK_C_SUBW 0xfc63 -#define MATCH_C_ADDW 0x9c21 -#define MASK_C_ADDW 0xfc63 -#define MATCH_C_J 0xa001 -#define MASK_C_J 0xe003 -#define MATCH_C_BEQZ 0xc001 -#define MASK_C_BEQZ 0xe003 -#define MATCH_C_BNEZ 0xe001 -#define MASK_C_BNEZ 0xe003 -#define MATCH_C_SLLI 0x2 -#define MASK_C_SLLI 0xe003 -#define MATCH_C_FLDSP 0x2002 -#define MASK_C_FLDSP 0xe003 -#define MATCH_C_LWSP 0x4002 -#define MASK_C_LWSP 0xe003 -#define MATCH_C_FLWSP 0x6002 -#define MASK_C_FLWSP 0xe003 -#define MATCH_C_MV 0x8002 -#define MASK_C_MV 0xf003 -#define MATCH_C_ADD 0x9002 -#define MASK_C_ADD 0xf003 -#define MATCH_C_FSDSP 0xa002 -#define MASK_C_FSDSP 0xe003 -#define MATCH_C_SWSP 0xc002 -#define MASK_C_SWSP 0xe003 -#define MATCH_C_FSWSP 0xe002 -#define MASK_C_FSWSP 0xe003 -#define MATCH_CUSTOM0 0xb -#define MASK_CUSTOM0 0x707f -#define MATCH_CUSTOM0_RS1 0x200b -#define MASK_CUSTOM0_RS1 0x707f -#define MATCH_CUSTOM0_RS1_RS2 0x300b -#define MASK_CUSTOM0_RS1_RS2 0x707f -#define MATCH_CUSTOM0_RD 0x400b -#define MASK_CUSTOM0_RD 0x707f -#define MATCH_CUSTOM0_RD_RS1 0x600b -#define MASK_CUSTOM0_RD_RS1 0x707f -#define MATCH_CUSTOM0_RD_RS1_RS2 0x700b -#define MASK_CUSTOM0_RD_RS1_RS2 0x707f -#define MATCH_CUSTOM1 0x2b -#define MASK_CUSTOM1 0x707f -#define MATCH_CUSTOM1_RS1 0x202b -#define MASK_CUSTOM1_RS1 0x707f -#define MATCH_CUSTOM1_RS1_RS2 0x302b -#define MASK_CUSTOM1_RS1_RS2 0x707f -#define MATCH_CUSTOM1_RD 0x402b -#define MASK_CUSTOM1_RD 0x707f -#define MATCH_CUSTOM1_RD_RS1 0x602b -#define MASK_CUSTOM1_RD_RS1 0x707f -#define MATCH_CUSTOM1_RD_RS1_RS2 0x702b -#define MASK_CUSTOM1_RD_RS1_RS2 0x707f -#define MATCH_CUSTOM2 0x5b -#define MASK_CUSTOM2 0x707f -#define MATCH_CUSTOM2_RS1 0x205b -#define MASK_CUSTOM2_RS1 0x707f -#define MATCH_CUSTOM2_RS1_RS2 0x305b -#define MASK_CUSTOM2_RS1_RS2 0x707f -#define MATCH_CUSTOM2_RD 0x405b -#define MASK_CUSTOM2_RD 0x707f -#define MATCH_CUSTOM2_RD_RS1 0x605b -#define MASK_CUSTOM2_RD_RS1 0x707f -#define MATCH_CUSTOM2_RD_RS1_RS2 0x705b -#define MASK_CUSTOM2_RD_RS1_RS2 0x707f -#define MATCH_CUSTOM3 0x7b -#define MASK_CUSTOM3 0x707f -#define MATCH_CUSTOM3_RS1 0x207b -#define MASK_CUSTOM3_RS1 0x707f -#define MATCH_CUSTOM3_RS1_RS2 0x307b -#define MASK_CUSTOM3_RS1_RS2 0x707f -#define MATCH_CUSTOM3_RD 0x407b -#define MASK_CUSTOM3_RD 0x707f -#define MATCH_CUSTOM3_RD_RS1 0x607b -#define MASK_CUSTOM3_RD_RS1 0x707f -#define MATCH_CUSTOM3_RD_RS1_RS2 0x707b -#define MASK_CUSTOM3_RD_RS1_RS2 0x707f -#define CSR_FFLAGS 0x1 -#define CSR_FRM 0x2 -#define CSR_FCSR 0x3 -#define CSR_CYCLE 0xc00 -#define CSR_TIME 0xc01 -#define CSR_INSTRET 0xc02 -#define CSR_HPMCOUNTER3 0xc03 -#define CSR_HPMCOUNTER4 0xc04 -#define CSR_HPMCOUNTER5 0xc05 -#define CSR_HPMCOUNTER6 0xc06 -#define CSR_HPMCOUNTER7 0xc07 -#define CSR_HPMCOUNTER8 0xc08 -#define CSR_HPMCOUNTER9 0xc09 -#define CSR_HPMCOUNTER10 0xc0a -#define CSR_HPMCOUNTER11 0xc0b -#define CSR_HPMCOUNTER12 0xc0c -#define CSR_HPMCOUNTER13 0xc0d -#define CSR_HPMCOUNTER14 0xc0e -#define CSR_HPMCOUNTER15 0xc0f -#define CSR_HPMCOUNTER16 0xc10 -#define CSR_HPMCOUNTER17 0xc11 -#define CSR_HPMCOUNTER18 0xc12 -#define CSR_HPMCOUNTER19 0xc13 -#define CSR_HPMCOUNTER20 0xc14 -#define CSR_HPMCOUNTER21 0xc15 -#define CSR_HPMCOUNTER22 0xc16 -#define CSR_HPMCOUNTER23 0xc17 -#define CSR_HPMCOUNTER24 0xc18 -#define CSR_HPMCOUNTER25 0xc19 -#define CSR_HPMCOUNTER26 0xc1a -#define CSR_HPMCOUNTER27 0xc1b -#define CSR_HPMCOUNTER28 0xc1c -#define CSR_HPMCOUNTER29 0xc1d -#define CSR_HPMCOUNTER30 0xc1e -#define CSR_HPMCOUNTER31 0xc1f -#define CSR_SSTATUS 0x100 -#define CSR_SIE 0x104 -#define CSR_STVEC 0x105 -#define CSR_SCOUNTEREN 0x106 -#define CSR_SSCRATCH 0x140 -#define CSR_SEPC 0x141 -#define CSR_SCAUSE 0x142 -#define CSR_STVAL 0x143 -#define CSR_SIP 0x144 -#define CSR_SATP 0x180 -#define CSR_MSTATUS 0x300 -#define CSR_MISA 0x301 -#define CSR_MEDELEG 0x302 -#define CSR_MIDELEG 0x303 -#define CSR_MIE 0x304 -#define CSR_MTVEC 0x305 -#define CSR_MCOUNTEREN 0x306 -#define CSR_MSCRATCH 0x340 -#define CSR_MEPC 0x341 -#define CSR_MCAUSE 0x342 -#define CSR_MTVAL 0x343 -#define CSR_MIP 0x344 -#define CSR_PMPCFG0 0x3a0 -#define CSR_PMPCFG1 0x3a1 -#define CSR_PMPCFG2 0x3a2 -#define CSR_PMPCFG3 0x3a3 -#define CSR_PMPADDR0 0x3b0 -#define CSR_PMPADDR1 0x3b1 -#define CSR_PMPADDR2 0x3b2 -#define CSR_PMPADDR3 0x3b3 -#define CSR_PMPADDR4 0x3b4 -#define CSR_PMPADDR5 0x3b5 -#define CSR_PMPADDR6 0x3b6 -#define CSR_PMPADDR7 0x3b7 -#define CSR_PMPADDR8 0x3b8 -#define CSR_PMPADDR9 0x3b9 -#define CSR_PMPADDR10 0x3ba -#define CSR_PMPADDR11 0x3bb -#define CSR_PMPADDR12 0x3bc -#define CSR_PMPADDR13 0x3bd -#define CSR_PMPADDR14 0x3be -#define CSR_PMPADDR15 0x3bf -#define CSR_TSELECT 0x7a0 -#define CSR_TDATA1 0x7a1 -#define CSR_TDATA2 0x7a2 -#define CSR_TDATA3 0x7a3 -#define CSR_DCSR 0x7b0 -#define CSR_DPC 0x7b1 -#define CSR_DSCRATCH 0x7b2 -#define CSR_MCYCLE 0xb00 -#define CSR_MINSTRET 0xb02 -#define CSR_MHPMCOUNTER3 0xb03 -#define CSR_MHPMCOUNTER4 0xb04 -#define CSR_MHPMCOUNTER5 0xb05 -#define CSR_MHPMCOUNTER6 0xb06 -#define CSR_MHPMCOUNTER7 0xb07 -#define CSR_MHPMCOUNTER8 0xb08 -#define CSR_MHPMCOUNTER9 0xb09 -#define CSR_MHPMCOUNTER10 0xb0a -#define CSR_MHPMCOUNTER11 0xb0b -#define CSR_MHPMCOUNTER12 0xb0c -#define CSR_MHPMCOUNTER13 0xb0d -#define CSR_MHPMCOUNTER14 0xb0e -#define CSR_MHPMCOUNTER15 0xb0f -#define CSR_MHPMCOUNTER16 0xb10 -#define CSR_MHPMCOUNTER17 0xb11 -#define CSR_MHPMCOUNTER18 0xb12 -#define CSR_MHPMCOUNTER19 0xb13 -#define CSR_MHPMCOUNTER20 0xb14 -#define CSR_MHPMCOUNTER21 0xb15 -#define CSR_MHPMCOUNTER22 0xb16 -#define CSR_MHPMCOUNTER23 0xb17 -#define CSR_MHPMCOUNTER24 0xb18 -#define CSR_MHPMCOUNTER25 0xb19 -#define CSR_MHPMCOUNTER26 0xb1a -#define CSR_MHPMCOUNTER27 0xb1b -#define CSR_MHPMCOUNTER28 0xb1c -#define CSR_MHPMCOUNTER29 0xb1d -#define CSR_MHPMCOUNTER30 0xb1e -#define CSR_MHPMCOUNTER31 0xb1f -#define CSR_MHPMEVENT3 0x323 -#define CSR_MHPMEVENT4 0x324 -#define CSR_MHPMEVENT5 0x325 -#define CSR_MHPMEVENT6 0x326 -#define CSR_MHPMEVENT7 0x327 -#define CSR_MHPMEVENT8 0x328 -#define CSR_MHPMEVENT9 0x329 -#define CSR_MHPMEVENT10 0x32a -#define CSR_MHPMEVENT11 0x32b -#define CSR_MHPMEVENT12 0x32c -#define CSR_MHPMEVENT13 0x32d -#define CSR_MHPMEVENT14 0x32e -#define CSR_MHPMEVENT15 0x32f -#define CSR_MHPMEVENT16 0x330 -#define CSR_MHPMEVENT17 0x331 -#define CSR_MHPMEVENT18 0x332 -#define CSR_MHPMEVENT19 0x333 -#define CSR_MHPMEVENT20 0x334 -#define CSR_MHPMEVENT21 0x335 -#define CSR_MHPMEVENT22 0x336 -#define CSR_MHPMEVENT23 0x337 -#define CSR_MHPMEVENT24 0x338 -#define CSR_MHPMEVENT25 0x339 -#define CSR_MHPMEVENT26 0x33a -#define CSR_MHPMEVENT27 0x33b -#define CSR_MHPMEVENT28 0x33c -#define CSR_MHPMEVENT29 0x33d -#define CSR_MHPMEVENT30 0x33e -#define CSR_MHPMEVENT31 0x33f -#define CSR_MVENDORID 0xf11 -#define CSR_MARCHID 0xf12 -#define CSR_MIMPID 0xf13 -#define CSR_MHARTID 0xf14 -#define CSR_CYCLEH 0xc80 -#define CSR_TIMEH 0xc81 -#define CSR_INSTRETH 0xc82 -#define CSR_HPMCOUNTER3H 0xc83 -#define CSR_HPMCOUNTER4H 0xc84 -#define CSR_HPMCOUNTER5H 0xc85 -#define CSR_HPMCOUNTER6H 0xc86 -#define CSR_HPMCOUNTER7H 0xc87 -#define CSR_HPMCOUNTER8H 0xc88 -#define CSR_HPMCOUNTER9H 0xc89 -#define CSR_HPMCOUNTER10H 0xc8a -#define CSR_HPMCOUNTER11H 0xc8b -#define CSR_HPMCOUNTER12H 0xc8c -#define CSR_HPMCOUNTER13H 0xc8d -#define CSR_HPMCOUNTER14H 0xc8e -#define CSR_HPMCOUNTER15H 0xc8f -#define CSR_HPMCOUNTER16H 0xc90 -#define CSR_HPMCOUNTER17H 0xc91 -#define CSR_HPMCOUNTER18H 0xc92 -#define CSR_HPMCOUNTER19H 0xc93 -#define CSR_HPMCOUNTER20H 0xc94 -#define CSR_HPMCOUNTER21H 0xc95 -#define CSR_HPMCOUNTER22H 0xc96 -#define CSR_HPMCOUNTER23H 0xc97 -#define CSR_HPMCOUNTER24H 0xc98 -#define CSR_HPMCOUNTER25H 0xc99 -#define CSR_HPMCOUNTER26H 0xc9a -#define CSR_HPMCOUNTER27H 0xc9b -#define CSR_HPMCOUNTER28H 0xc9c -#define CSR_HPMCOUNTER29H 0xc9d -#define CSR_HPMCOUNTER30H 0xc9e -#define CSR_HPMCOUNTER31H 0xc9f -#define CSR_MCYCLEH 0xb80 -#define CSR_MINSTRETH 0xb82 -#define CSR_MHPMCOUNTER3H 0xb83 -#define CSR_MHPMCOUNTER4H 0xb84 -#define CSR_MHPMCOUNTER5H 0xb85 -#define CSR_MHPMCOUNTER6H 0xb86 -#define CSR_MHPMCOUNTER7H 0xb87 -#define CSR_MHPMCOUNTER8H 0xb88 -#define CSR_MHPMCOUNTER9H 0xb89 -#define CSR_MHPMCOUNTER10H 0xb8a -#define CSR_MHPMCOUNTER11H 0xb8b -#define CSR_MHPMCOUNTER12H 0xb8c -#define CSR_MHPMCOUNTER13H 0xb8d -#define CSR_MHPMCOUNTER14H 0xb8e -#define CSR_MHPMCOUNTER15H 0xb8f -#define CSR_MHPMCOUNTER16H 0xb90 -#define CSR_MHPMCOUNTER17H 0xb91 -#define CSR_MHPMCOUNTER18H 0xb92 -#define CSR_MHPMCOUNTER19H 0xb93 -#define CSR_MHPMCOUNTER20H 0xb94 -#define CSR_MHPMCOUNTER21H 0xb95 -#define CSR_MHPMCOUNTER22H 0xb96 -#define CSR_MHPMCOUNTER23H 0xb97 -#define CSR_MHPMCOUNTER24H 0xb98 -#define CSR_MHPMCOUNTER25H 0xb99 -#define CSR_MHPMCOUNTER26H 0xb9a -#define CSR_MHPMCOUNTER27H 0xb9b -#define CSR_MHPMCOUNTER28H 0xb9c -#define CSR_MHPMCOUNTER29H 0xb9d -#define CSR_MHPMCOUNTER30H 0xb9e -#define CSR_MHPMCOUNTER31H 0xb9f -#define CAUSE_MISALIGNED_FETCH 0x0 -#define CAUSE_FETCH_ACCESS 0x1 -#define CAUSE_ILLEGAL_INSTRUCTION 0x2 -#define CAUSE_BREAKPOINT 0x3 -#define CAUSE_MISALIGNED_LOAD 0x4 -#define CAUSE_LOAD_ACCESS 0x5 -#define CAUSE_MISALIGNED_STORE 0x6 -#define CAUSE_STORE_ACCESS 0x7 -#define CAUSE_USER_ECALL 0x8 -#define CAUSE_SUPERVISOR_ECALL 0x9 -#define CAUSE_HYPERVISOR_ECALL 0xa -#define CAUSE_MACHINE_ECALL 0xb -#define CAUSE_FETCH_PAGE_FAULT 0xc -#define CAUSE_LOAD_PAGE_FAULT 0xd -#define CAUSE_STORE_PAGE_FAULT 0xf -#endif -#ifdef DECLARE_INSN -DECLARE_INSN(beq, MATCH_BEQ, MASK_BEQ) -DECLARE_INSN(bne, MATCH_BNE, MASK_BNE) -DECLARE_INSN(blt, MATCH_BLT, MASK_BLT) -DECLARE_INSN(bge, MATCH_BGE, MASK_BGE) -DECLARE_INSN(bltu, MATCH_BLTU, MASK_BLTU) -DECLARE_INSN(bgeu, MATCH_BGEU, MASK_BGEU) -DECLARE_INSN(jalr, MATCH_JALR, MASK_JALR) -DECLARE_INSN(jal, MATCH_JAL, MASK_JAL) -DECLARE_INSN(lui, MATCH_LUI, MASK_LUI) -DECLARE_INSN(auipc, MATCH_AUIPC, MASK_AUIPC) -DECLARE_INSN(addi, MATCH_ADDI, MASK_ADDI) -DECLARE_INSN(slli, MATCH_SLLI, MASK_SLLI) -DECLARE_INSN(slti, MATCH_SLTI, MASK_SLTI) -DECLARE_INSN(sltiu, MATCH_SLTIU, MASK_SLTIU) -DECLARE_INSN(xori, MATCH_XORI, MASK_XORI) -DECLARE_INSN(srli, MATCH_SRLI, MASK_SRLI) -DECLARE_INSN(srai, MATCH_SRAI, MASK_SRAI) -DECLARE_INSN(ori, MATCH_ORI, MASK_ORI) -DECLARE_INSN(andi, MATCH_ANDI, MASK_ANDI) -DECLARE_INSN(add, MATCH_ADD, MASK_ADD) -DECLARE_INSN(sub, MATCH_SUB, MASK_SUB) -DECLARE_INSN(sll, MATCH_SLL, MASK_SLL) -DECLARE_INSN(slt, MATCH_SLT, MASK_SLT) -DECLARE_INSN(sltu, MATCH_SLTU, MASK_SLTU) -DECLARE_INSN(xor, MATCH_XOR, MASK_XOR) -DECLARE_INSN(srl, MATCH_SRL, MASK_SRL) -DECLARE_INSN(sra, MATCH_SRA, MASK_SRA) -DECLARE_INSN(or, MATCH_OR, MASK_OR) -DECLARE_INSN(and, MATCH_AND, MASK_AND) -DECLARE_INSN(addiw, MATCH_ADDIW, MASK_ADDIW) -DECLARE_INSN(slliw, MATCH_SLLIW, MASK_SLLIW) -DECLARE_INSN(srliw, MATCH_SRLIW, MASK_SRLIW) -DECLARE_INSN(sraiw, MATCH_SRAIW, MASK_SRAIW) -DECLARE_INSN(addw, MATCH_ADDW, MASK_ADDW) -DECLARE_INSN(subw, MATCH_SUBW, MASK_SUBW) -DECLARE_INSN(sllw, MATCH_SLLW, MASK_SLLW) -DECLARE_INSN(srlw, MATCH_SRLW, MASK_SRLW) -DECLARE_INSN(sraw, MATCH_SRAW, MASK_SRAW) -DECLARE_INSN(lb, MATCH_LB, MASK_LB) -DECLARE_INSN(lh, MATCH_LH, MASK_LH) -DECLARE_INSN(lw, MATCH_LW, MASK_LW) -DECLARE_INSN(ld, MATCH_LD, MASK_LD) -DECLARE_INSN(lbu, MATCH_LBU, MASK_LBU) -DECLARE_INSN(lhu, MATCH_LHU, MASK_LHU) -DECLARE_INSN(lwu, MATCH_LWU, MASK_LWU) -DECLARE_INSN(sb, MATCH_SB, MASK_SB) -DECLARE_INSN(sh, MATCH_SH, MASK_SH) -DECLARE_INSN(sw, MATCH_SW, MASK_SW) -DECLARE_INSN(sd, MATCH_SD, MASK_SD) -DECLARE_INSN(fence, MATCH_FENCE, MASK_FENCE) -DECLARE_INSN(fence_i, MATCH_FENCE_I, MASK_FENCE_I) -DECLARE_INSN(mul, MATCH_MUL, MASK_MUL) -DECLARE_INSN(mulh, MATCH_MULH, MASK_MULH) -DECLARE_INSN(mulhsu, MATCH_MULHSU, MASK_MULHSU) -DECLARE_INSN(mulhu, MATCH_MULHU, MASK_MULHU) -DECLARE_INSN(div, MATCH_DIV, MASK_DIV) -DECLARE_INSN(divu, MATCH_DIVU, MASK_DIVU) -DECLARE_INSN(rem, MATCH_REM, MASK_REM) -DECLARE_INSN(remu, MATCH_REMU, MASK_REMU) -DECLARE_INSN(mulw, MATCH_MULW, MASK_MULW) -DECLARE_INSN(divw, MATCH_DIVW, MASK_DIVW) -DECLARE_INSN(divuw, MATCH_DIVUW, MASK_DIVUW) -DECLARE_INSN(remw, MATCH_REMW, MASK_REMW) -DECLARE_INSN(remuw, MATCH_REMUW, MASK_REMUW) -DECLARE_INSN(amoadd_w, MATCH_AMOADD_W, MASK_AMOADD_W) -DECLARE_INSN(amoxor_w, MATCH_AMOXOR_W, MASK_AMOXOR_W) -DECLARE_INSN(amoor_w, MATCH_AMOOR_W, MASK_AMOOR_W) -DECLARE_INSN(amoand_w, MATCH_AMOAND_W, MASK_AMOAND_W) -DECLARE_INSN(amomin_w, MATCH_AMOMIN_W, MASK_AMOMIN_W) -DECLARE_INSN(amomax_w, MATCH_AMOMAX_W, MASK_AMOMAX_W) -DECLARE_INSN(amominu_w, MATCH_AMOMINU_W, MASK_AMOMINU_W) -DECLARE_INSN(amomaxu_w, MATCH_AMOMAXU_W, MASK_AMOMAXU_W) -DECLARE_INSN(amoswap_w, MATCH_AMOSWAP_W, MASK_AMOSWAP_W) -DECLARE_INSN(lr_w, MATCH_LR_W, MASK_LR_W) -DECLARE_INSN(sc_w, MATCH_SC_W, MASK_SC_W) -DECLARE_INSN(amoadd_d, MATCH_AMOADD_D, MASK_AMOADD_D) -DECLARE_INSN(amoxor_d, MATCH_AMOXOR_D, MASK_AMOXOR_D) -DECLARE_INSN(amoor_d, MATCH_AMOOR_D, MASK_AMOOR_D) -DECLARE_INSN(amoand_d, MATCH_AMOAND_D, MASK_AMOAND_D) -DECLARE_INSN(amomin_d, MATCH_AMOMIN_D, MASK_AMOMIN_D) -DECLARE_INSN(amomax_d, MATCH_AMOMAX_D, MASK_AMOMAX_D) -DECLARE_INSN(amominu_d, MATCH_AMOMINU_D, MASK_AMOMINU_D) -DECLARE_INSN(amomaxu_d, MATCH_AMOMAXU_D, MASK_AMOMAXU_D) -DECLARE_INSN(amoswap_d, MATCH_AMOSWAP_D, MASK_AMOSWAP_D) -DECLARE_INSN(lr_d, MATCH_LR_D, MASK_LR_D) -DECLARE_INSN(sc_d, MATCH_SC_D, MASK_SC_D) -DECLARE_INSN(ecall, MATCH_ECALL, MASK_ECALL) -DECLARE_INSN(ebreak, MATCH_EBREAK, MASK_EBREAK) -DECLARE_INSN(uret, MATCH_URET, MASK_URET) -DECLARE_INSN(sret, MATCH_SRET, MASK_SRET) -DECLARE_INSN(mret, MATCH_MRET, MASK_MRET) -DECLARE_INSN(dret, MATCH_DRET, MASK_DRET) -DECLARE_INSN(sfence_vma, MATCH_SFENCE_VMA, MASK_SFENCE_VMA) -DECLARE_INSN(wfi, MATCH_WFI, MASK_WFI) -DECLARE_INSN(csrrw, MATCH_CSRRW, MASK_CSRRW) -DECLARE_INSN(csrrs, MATCH_CSRRS, MASK_CSRRS) -DECLARE_INSN(csrrc, MATCH_CSRRC, MASK_CSRRC) -DECLARE_INSN(csrrwi, MATCH_CSRRWI, MASK_CSRRWI) -DECLARE_INSN(csrrsi, MATCH_CSRRSI, MASK_CSRRSI) -DECLARE_INSN(csrrci, MATCH_CSRRCI, MASK_CSRRCI) -DECLARE_INSN(fadd_s, MATCH_FADD_S, MASK_FADD_S) -DECLARE_INSN(fsub_s, MATCH_FSUB_S, MASK_FSUB_S) -DECLARE_INSN(fmul_s, MATCH_FMUL_S, MASK_FMUL_S) -DECLARE_INSN(fdiv_s, MATCH_FDIV_S, MASK_FDIV_S) -DECLARE_INSN(fsgnj_s, MATCH_FSGNJ_S, MASK_FSGNJ_S) -DECLARE_INSN(fsgnjn_s, MATCH_FSGNJN_S, MASK_FSGNJN_S) -DECLARE_INSN(fsgnjx_s, MATCH_FSGNJX_S, MASK_FSGNJX_S) -DECLARE_INSN(fmin_s, MATCH_FMIN_S, MASK_FMIN_S) -DECLARE_INSN(fmax_s, MATCH_FMAX_S, MASK_FMAX_S) -DECLARE_INSN(fsqrt_s, MATCH_FSQRT_S, MASK_FSQRT_S) -DECLARE_INSN(fadd_d, MATCH_FADD_D, MASK_FADD_D) -DECLARE_INSN(fsub_d, MATCH_FSUB_D, MASK_FSUB_D) -DECLARE_INSN(fmul_d, MATCH_FMUL_D, MASK_FMUL_D) -DECLARE_INSN(fdiv_d, MATCH_FDIV_D, MASK_FDIV_D) -DECLARE_INSN(fsgnj_d, MATCH_FSGNJ_D, MASK_FSGNJ_D) -DECLARE_INSN(fsgnjn_d, MATCH_FSGNJN_D, MASK_FSGNJN_D) -DECLARE_INSN(fsgnjx_d, MATCH_FSGNJX_D, MASK_FSGNJX_D) -DECLARE_INSN(fmin_d, MATCH_FMIN_D, MASK_FMIN_D) -DECLARE_INSN(fmax_d, MATCH_FMAX_D, MASK_FMAX_D) -DECLARE_INSN(fcvt_s_d, MATCH_FCVT_S_D, MASK_FCVT_S_D) -DECLARE_INSN(fcvt_d_s, MATCH_FCVT_D_S, MASK_FCVT_D_S) -DECLARE_INSN(fsqrt_d, MATCH_FSQRT_D, MASK_FSQRT_D) -DECLARE_INSN(fadd_q, MATCH_FADD_Q, MASK_FADD_Q) -DECLARE_INSN(fsub_q, MATCH_FSUB_Q, MASK_FSUB_Q) -DECLARE_INSN(fmul_q, MATCH_FMUL_Q, MASK_FMUL_Q) -DECLARE_INSN(fdiv_q, MATCH_FDIV_Q, MASK_FDIV_Q) -DECLARE_INSN(fsgnj_q, MATCH_FSGNJ_Q, MASK_FSGNJ_Q) -DECLARE_INSN(fsgnjn_q, MATCH_FSGNJN_Q, MASK_FSGNJN_Q) -DECLARE_INSN(fsgnjx_q, MATCH_FSGNJX_Q, MASK_FSGNJX_Q) -DECLARE_INSN(fmin_q, MATCH_FMIN_Q, MASK_FMIN_Q) -DECLARE_INSN(fmax_q, MATCH_FMAX_Q, MASK_FMAX_Q) -DECLARE_INSN(fcvt_s_q, MATCH_FCVT_S_Q, MASK_FCVT_S_Q) -DECLARE_INSN(fcvt_q_s, MATCH_FCVT_Q_S, MASK_FCVT_Q_S) -DECLARE_INSN(fcvt_d_q, MATCH_FCVT_D_Q, MASK_FCVT_D_Q) -DECLARE_INSN(fcvt_q_d, MATCH_FCVT_Q_D, MASK_FCVT_Q_D) -DECLARE_INSN(fsqrt_q, MATCH_FSQRT_Q, MASK_FSQRT_Q) -DECLARE_INSN(fle_s, MATCH_FLE_S, MASK_FLE_S) -DECLARE_INSN(flt_s, MATCH_FLT_S, MASK_FLT_S) -DECLARE_INSN(feq_s, MATCH_FEQ_S, MASK_FEQ_S) -DECLARE_INSN(fle_d, MATCH_FLE_D, MASK_FLE_D) -DECLARE_INSN(flt_d, MATCH_FLT_D, MASK_FLT_D) -DECLARE_INSN(feq_d, MATCH_FEQ_D, MASK_FEQ_D) -DECLARE_INSN(fle_q, MATCH_FLE_Q, MASK_FLE_Q) -DECLARE_INSN(flt_q, MATCH_FLT_Q, MASK_FLT_Q) -DECLARE_INSN(feq_q, MATCH_FEQ_Q, MASK_FEQ_Q) -DECLARE_INSN(fcvt_w_s, MATCH_FCVT_W_S, MASK_FCVT_W_S) -DECLARE_INSN(fcvt_wu_s, MATCH_FCVT_WU_S, MASK_FCVT_WU_S) -DECLARE_INSN(fcvt_l_s, MATCH_FCVT_L_S, MASK_FCVT_L_S) -DECLARE_INSN(fcvt_lu_s, MATCH_FCVT_LU_S, MASK_FCVT_LU_S) -DECLARE_INSN(fmv_x_w, MATCH_FMV_X_W, MASK_FMV_X_W) -DECLARE_INSN(fclass_s, MATCH_FCLASS_S, MASK_FCLASS_S) -DECLARE_INSN(fcvt_w_d, MATCH_FCVT_W_D, MASK_FCVT_W_D) -DECLARE_INSN(fcvt_wu_d, MATCH_FCVT_WU_D, MASK_FCVT_WU_D) -DECLARE_INSN(fcvt_l_d, MATCH_FCVT_L_D, MASK_FCVT_L_D) -DECLARE_INSN(fcvt_lu_d, MATCH_FCVT_LU_D, MASK_FCVT_LU_D) -DECLARE_INSN(fmv_x_d, MATCH_FMV_X_D, MASK_FMV_X_D) -DECLARE_INSN(fclass_d, MATCH_FCLASS_D, MASK_FCLASS_D) -DECLARE_INSN(fcvt_w_q, MATCH_FCVT_W_Q, MASK_FCVT_W_Q) -DECLARE_INSN(fcvt_wu_q, MATCH_FCVT_WU_Q, MASK_FCVT_WU_Q) -DECLARE_INSN(fcvt_l_q, MATCH_FCVT_L_Q, MASK_FCVT_L_Q) -DECLARE_INSN(fcvt_lu_q, MATCH_FCVT_LU_Q, MASK_FCVT_LU_Q) -DECLARE_INSN(fmv_x_q, MATCH_FMV_X_Q, MASK_FMV_X_Q) -DECLARE_INSN(fclass_q, MATCH_FCLASS_Q, MASK_FCLASS_Q) -DECLARE_INSN(fcvt_s_w, MATCH_FCVT_S_W, MASK_FCVT_S_W) -DECLARE_INSN(fcvt_s_wu, MATCH_FCVT_S_WU, MASK_FCVT_S_WU) -DECLARE_INSN(fcvt_s_l, MATCH_FCVT_S_L, MASK_FCVT_S_L) -DECLARE_INSN(fcvt_s_lu, MATCH_FCVT_S_LU, MASK_FCVT_S_LU) -DECLARE_INSN(fmv_w_x, MATCH_FMV_W_X, MASK_FMV_W_X) -DECLARE_INSN(fcvt_d_w, MATCH_FCVT_D_W, MASK_FCVT_D_W) -DECLARE_INSN(fcvt_d_wu, MATCH_FCVT_D_WU, MASK_FCVT_D_WU) -DECLARE_INSN(fcvt_d_l, MATCH_FCVT_D_L, MASK_FCVT_D_L) -DECLARE_INSN(fcvt_d_lu, MATCH_FCVT_D_LU, MASK_FCVT_D_LU) -DECLARE_INSN(fmv_d_x, MATCH_FMV_D_X, MASK_FMV_D_X) -DECLARE_INSN(fcvt_q_w, MATCH_FCVT_Q_W, MASK_FCVT_Q_W) -DECLARE_INSN(fcvt_q_wu, MATCH_FCVT_Q_WU, MASK_FCVT_Q_WU) -DECLARE_INSN(fcvt_q_l, MATCH_FCVT_Q_L, MASK_FCVT_Q_L) -DECLARE_INSN(fcvt_q_lu, MATCH_FCVT_Q_LU, MASK_FCVT_Q_LU) -DECLARE_INSN(fmv_q_x, MATCH_FMV_Q_X, MASK_FMV_Q_X) -DECLARE_INSN(flw, MATCH_FLW, MASK_FLW) -DECLARE_INSN(fld, MATCH_FLD, MASK_FLD) -DECLARE_INSN(flq, MATCH_FLQ, MASK_FLQ) -DECLARE_INSN(fsw, MATCH_FSW, MASK_FSW) -DECLARE_INSN(fsd, MATCH_FSD, MASK_FSD) -DECLARE_INSN(fsq, MATCH_FSQ, MASK_FSQ) -DECLARE_INSN(fmadd_s, MATCH_FMADD_S, MASK_FMADD_S) -DECLARE_INSN(fmsub_s, MATCH_FMSUB_S, MASK_FMSUB_S) -DECLARE_INSN(fnmsub_s, MATCH_FNMSUB_S, MASK_FNMSUB_S) -DECLARE_INSN(fnmadd_s, MATCH_FNMADD_S, MASK_FNMADD_S) -DECLARE_INSN(fmadd_d, MATCH_FMADD_D, MASK_FMADD_D) -DECLARE_INSN(fmsub_d, MATCH_FMSUB_D, MASK_FMSUB_D) -DECLARE_INSN(fnmsub_d, MATCH_FNMSUB_D, MASK_FNMSUB_D) -DECLARE_INSN(fnmadd_d, MATCH_FNMADD_D, MASK_FNMADD_D) -DECLARE_INSN(fmadd_q, MATCH_FMADD_Q, MASK_FMADD_Q) -DECLARE_INSN(fmsub_q, MATCH_FMSUB_Q, MASK_FMSUB_Q) -DECLARE_INSN(fnmsub_q, MATCH_FNMSUB_Q, MASK_FNMSUB_Q) -DECLARE_INSN(fnmadd_q, MATCH_FNMADD_Q, MASK_FNMADD_Q) -DECLARE_INSN(c_nop, MATCH_C_NOP, MASK_C_NOP) -DECLARE_INSN(c_addi16sp, MATCH_C_ADDI16SP, MASK_C_ADDI16SP) -DECLARE_INSN(c_jr, MATCH_C_JR, MASK_C_JR) -DECLARE_INSN(c_jalr, MATCH_C_JALR, MASK_C_JALR) -DECLARE_INSN(c_ebreak, MATCH_C_EBREAK, MASK_C_EBREAK) -DECLARE_INSN(c_ld, MATCH_C_LD, MASK_C_LD) -DECLARE_INSN(c_sd, MATCH_C_SD, MASK_C_SD) -DECLARE_INSN(c_addiw, MATCH_C_ADDIW, MASK_C_ADDIW) -DECLARE_INSN(c_ldsp, MATCH_C_LDSP, MASK_C_LDSP) -DECLARE_INSN(c_sdsp, MATCH_C_SDSP, MASK_C_SDSP) -DECLARE_INSN(c_addi4spn, MATCH_C_ADDI4SPN, MASK_C_ADDI4SPN) -DECLARE_INSN(c_fld, MATCH_C_FLD, MASK_C_FLD) -DECLARE_INSN(c_lw, MATCH_C_LW, MASK_C_LW) -DECLARE_INSN(c_flw, MATCH_C_FLW, MASK_C_FLW) -DECLARE_INSN(c_fsd, MATCH_C_FSD, MASK_C_FSD) -DECLARE_INSN(c_sw, MATCH_C_SW, MASK_C_SW) -DECLARE_INSN(c_fsw, MATCH_C_FSW, MASK_C_FSW) -DECLARE_INSN(c_addi, MATCH_C_ADDI, MASK_C_ADDI) -DECLARE_INSN(c_jal, MATCH_C_JAL, MASK_C_JAL) -DECLARE_INSN(c_li, MATCH_C_LI, MASK_C_LI) -DECLARE_INSN(c_lui, MATCH_C_LUI, MASK_C_LUI) -DECLARE_INSN(c_srli, MATCH_C_SRLI, MASK_C_SRLI) -DECLARE_INSN(c_srai, MATCH_C_SRAI, MASK_C_SRAI) -DECLARE_INSN(c_andi, MATCH_C_ANDI, MASK_C_ANDI) -DECLARE_INSN(c_sub, MATCH_C_SUB, MASK_C_SUB) -DECLARE_INSN(c_xor, MATCH_C_XOR, MASK_C_XOR) -DECLARE_INSN(c_or, MATCH_C_OR, MASK_C_OR) -DECLARE_INSN(c_and, MATCH_C_AND, MASK_C_AND) -DECLARE_INSN(c_subw, MATCH_C_SUBW, MASK_C_SUBW) -DECLARE_INSN(c_addw, MATCH_C_ADDW, MASK_C_ADDW) -DECLARE_INSN(c_j, MATCH_C_J, MASK_C_J) -DECLARE_INSN(c_beqz, MATCH_C_BEQZ, MASK_C_BEQZ) -DECLARE_INSN(c_bnez, MATCH_C_BNEZ, MASK_C_BNEZ) -DECLARE_INSN(c_slli, MATCH_C_SLLI, MASK_C_SLLI) -DECLARE_INSN(c_fldsp, MATCH_C_FLDSP, MASK_C_FLDSP) -DECLARE_INSN(c_lwsp, MATCH_C_LWSP, MASK_C_LWSP) -DECLARE_INSN(c_flwsp, MATCH_C_FLWSP, MASK_C_FLWSP) -DECLARE_INSN(c_mv, MATCH_C_MV, MASK_C_MV) -DECLARE_INSN(c_add, MATCH_C_ADD, MASK_C_ADD) -DECLARE_INSN(c_fsdsp, MATCH_C_FSDSP, MASK_C_FSDSP) -DECLARE_INSN(c_swsp, MATCH_C_SWSP, MASK_C_SWSP) -DECLARE_INSN(c_fswsp, MATCH_C_FSWSP, MASK_C_FSWSP) -DECLARE_INSN(custom0, MATCH_CUSTOM0, MASK_CUSTOM0) -DECLARE_INSN(custom0_rs1, MATCH_CUSTOM0_RS1, MASK_CUSTOM0_RS1) -DECLARE_INSN(custom0_rs1_rs2, MATCH_CUSTOM0_RS1_RS2, MASK_CUSTOM0_RS1_RS2) -DECLARE_INSN(custom0_rd, MATCH_CUSTOM0_RD, MASK_CUSTOM0_RD) -DECLARE_INSN(custom0_rd_rs1, MATCH_CUSTOM0_RD_RS1, MASK_CUSTOM0_RD_RS1) -DECLARE_INSN(custom0_rd_rs1_rs2, MATCH_CUSTOM0_RD_RS1_RS2, MASK_CUSTOM0_RD_RS1_RS2) -DECLARE_INSN(custom1, MATCH_CUSTOM1, MASK_CUSTOM1) -DECLARE_INSN(custom1_rs1, MATCH_CUSTOM1_RS1, MASK_CUSTOM1_RS1) -DECLARE_INSN(custom1_rs1_rs2, MATCH_CUSTOM1_RS1_RS2, MASK_CUSTOM1_RS1_RS2) -DECLARE_INSN(custom1_rd, MATCH_CUSTOM1_RD, MASK_CUSTOM1_RD) -DECLARE_INSN(custom1_rd_rs1, MATCH_CUSTOM1_RD_RS1, MASK_CUSTOM1_RD_RS1) -DECLARE_INSN(custom1_rd_rs1_rs2, MATCH_CUSTOM1_RD_RS1_RS2, MASK_CUSTOM1_RD_RS1_RS2) -DECLARE_INSN(custom2, MATCH_CUSTOM2, MASK_CUSTOM2) -DECLARE_INSN(custom2_rs1, MATCH_CUSTOM2_RS1, MASK_CUSTOM2_RS1) -DECLARE_INSN(custom2_rs1_rs2, MATCH_CUSTOM2_RS1_RS2, MASK_CUSTOM2_RS1_RS2) -DECLARE_INSN(custom2_rd, MATCH_CUSTOM2_RD, MASK_CUSTOM2_RD) -DECLARE_INSN(custom2_rd_rs1, MATCH_CUSTOM2_RD_RS1, MASK_CUSTOM2_RD_RS1) -DECLARE_INSN(custom2_rd_rs1_rs2, MATCH_CUSTOM2_RD_RS1_RS2, MASK_CUSTOM2_RD_RS1_RS2) -DECLARE_INSN(custom3, MATCH_CUSTOM3, MASK_CUSTOM3) -DECLARE_INSN(custom3_rs1, MATCH_CUSTOM3_RS1, MASK_CUSTOM3_RS1) -DECLARE_INSN(custom3_rs1_rs2, MATCH_CUSTOM3_RS1_RS2, MASK_CUSTOM3_RS1_RS2) -DECLARE_INSN(custom3_rd, MATCH_CUSTOM3_RD, MASK_CUSTOM3_RD) -DECLARE_INSN(custom3_rd_rs1, MATCH_CUSTOM3_RD_RS1, MASK_CUSTOM3_RD_RS1) -DECLARE_INSN(custom3_rd_rs1_rs2, MATCH_CUSTOM3_RD_RS1_RS2, MASK_CUSTOM3_RD_RS1_RS2) -#endif -#ifdef DECLARE_CSR -DECLARE_CSR(fflags, CSR_FFLAGS) -DECLARE_CSR(frm, CSR_FRM) -DECLARE_CSR(fcsr, CSR_FCSR) -DECLARE_CSR(cycle, CSR_CYCLE) -DECLARE_CSR(time, CSR_TIME) -DECLARE_CSR(instret, CSR_INSTRET) -DECLARE_CSR(hpmcounter3, CSR_HPMCOUNTER3) -DECLARE_CSR(hpmcounter4, CSR_HPMCOUNTER4) -DECLARE_CSR(hpmcounter5, CSR_HPMCOUNTER5) -DECLARE_CSR(hpmcounter6, CSR_HPMCOUNTER6) -DECLARE_CSR(hpmcounter7, CSR_HPMCOUNTER7) -DECLARE_CSR(hpmcounter8, CSR_HPMCOUNTER8) -DECLARE_CSR(hpmcounter9, CSR_HPMCOUNTER9) -DECLARE_CSR(hpmcounter10, CSR_HPMCOUNTER10) -DECLARE_CSR(hpmcounter11, CSR_HPMCOUNTER11) -DECLARE_CSR(hpmcounter12, CSR_HPMCOUNTER12) -DECLARE_CSR(hpmcounter13, CSR_HPMCOUNTER13) -DECLARE_CSR(hpmcounter14, CSR_HPMCOUNTER14) -DECLARE_CSR(hpmcounter15, CSR_HPMCOUNTER15) -DECLARE_CSR(hpmcounter16, CSR_HPMCOUNTER16) -DECLARE_CSR(hpmcounter17, CSR_HPMCOUNTER17) -DECLARE_CSR(hpmcounter18, CSR_HPMCOUNTER18) -DECLARE_CSR(hpmcounter19, CSR_HPMCOUNTER19) -DECLARE_CSR(hpmcounter20, CSR_HPMCOUNTER20) -DECLARE_CSR(hpmcounter21, CSR_HPMCOUNTER21) -DECLARE_CSR(hpmcounter22, CSR_HPMCOUNTER22) -DECLARE_CSR(hpmcounter23, CSR_HPMCOUNTER23) -DECLARE_CSR(hpmcounter24, CSR_HPMCOUNTER24) -DECLARE_CSR(hpmcounter25, CSR_HPMCOUNTER25) -DECLARE_CSR(hpmcounter26, CSR_HPMCOUNTER26) -DECLARE_CSR(hpmcounter27, CSR_HPMCOUNTER27) -DECLARE_CSR(hpmcounter28, CSR_HPMCOUNTER28) -DECLARE_CSR(hpmcounter29, CSR_HPMCOUNTER29) -DECLARE_CSR(hpmcounter30, CSR_HPMCOUNTER30) -DECLARE_CSR(hpmcounter31, CSR_HPMCOUNTER31) -DECLARE_CSR(sstatus, CSR_SSTATUS) -DECLARE_CSR(sie, CSR_SIE) -DECLARE_CSR(stvec, CSR_STVEC) -DECLARE_CSR(scounteren, CSR_SCOUNTEREN) -DECLARE_CSR(sscratch, CSR_SSCRATCH) -DECLARE_CSR(sepc, CSR_SEPC) -DECLARE_CSR(scause, CSR_SCAUSE) -DECLARE_CSR(stval, CSR_STVAL) -DECLARE_CSR(sip, CSR_SIP) -DECLARE_CSR(satp, CSR_SATP) -DECLARE_CSR(mstatus, CSR_MSTATUS) -DECLARE_CSR(misa, CSR_MISA) -DECLARE_CSR(medeleg, CSR_MEDELEG) -DECLARE_CSR(mideleg, CSR_MIDELEG) -DECLARE_CSR(mie, CSR_MIE) -DECLARE_CSR(mtvec, CSR_MTVEC) -DECLARE_CSR(mcounteren, CSR_MCOUNTEREN) -DECLARE_CSR(mscratch, CSR_MSCRATCH) -DECLARE_CSR(mepc, CSR_MEPC) -DECLARE_CSR(mcause, CSR_MCAUSE) -DECLARE_CSR(mtval, CSR_MTVAL) -DECLARE_CSR(mip, CSR_MIP) -DECLARE_CSR(pmpcfg0, CSR_PMPCFG0) -DECLARE_CSR(pmpcfg1, CSR_PMPCFG1) -DECLARE_CSR(pmpcfg2, CSR_PMPCFG2) -DECLARE_CSR(pmpcfg3, CSR_PMPCFG3) -DECLARE_CSR(pmpaddr0, CSR_PMPADDR0) -DECLARE_CSR(pmpaddr1, CSR_PMPADDR1) -DECLARE_CSR(pmpaddr2, CSR_PMPADDR2) -DECLARE_CSR(pmpaddr3, CSR_PMPADDR3) -DECLARE_CSR(pmpaddr4, CSR_PMPADDR4) -DECLARE_CSR(pmpaddr5, CSR_PMPADDR5) -DECLARE_CSR(pmpaddr6, CSR_PMPADDR6) -DECLARE_CSR(pmpaddr7, CSR_PMPADDR7) -DECLARE_CSR(pmpaddr8, CSR_PMPADDR8) -DECLARE_CSR(pmpaddr9, CSR_PMPADDR9) -DECLARE_CSR(pmpaddr10, CSR_PMPADDR10) -DECLARE_CSR(pmpaddr11, CSR_PMPADDR11) -DECLARE_CSR(pmpaddr12, CSR_PMPADDR12) -DECLARE_CSR(pmpaddr13, CSR_PMPADDR13) -DECLARE_CSR(pmpaddr14, CSR_PMPADDR14) -DECLARE_CSR(pmpaddr15, CSR_PMPADDR15) -DECLARE_CSR(tselect, CSR_TSELECT) -DECLARE_CSR(tdata1, CSR_TDATA1) -DECLARE_CSR(tdata2, CSR_TDATA2) -DECLARE_CSR(tdata3, CSR_TDATA3) -DECLARE_CSR(dcsr, CSR_DCSR) -DECLARE_CSR(dpc, CSR_DPC) -DECLARE_CSR(dscratch, CSR_DSCRATCH) -DECLARE_CSR(mcycle, CSR_MCYCLE) -DECLARE_CSR(minstret, CSR_MINSTRET) -DECLARE_CSR(mhpmcounter3, CSR_MHPMCOUNTER3) -DECLARE_CSR(mhpmcounter4, CSR_MHPMCOUNTER4) -DECLARE_CSR(mhpmcounter5, CSR_MHPMCOUNTER5) -DECLARE_CSR(mhpmcounter6, CSR_MHPMCOUNTER6) -DECLARE_CSR(mhpmcounter7, CSR_MHPMCOUNTER7) -DECLARE_CSR(mhpmcounter8, CSR_MHPMCOUNTER8) -DECLARE_CSR(mhpmcounter9, CSR_MHPMCOUNTER9) -DECLARE_CSR(mhpmcounter10, CSR_MHPMCOUNTER10) -DECLARE_CSR(mhpmcounter11, CSR_MHPMCOUNTER11) -DECLARE_CSR(mhpmcounter12, CSR_MHPMCOUNTER12) -DECLARE_CSR(mhpmcounter13, CSR_MHPMCOUNTER13) -DECLARE_CSR(mhpmcounter14, CSR_MHPMCOUNTER14) -DECLARE_CSR(mhpmcounter15, CSR_MHPMCOUNTER15) -DECLARE_CSR(mhpmcounter16, CSR_MHPMCOUNTER16) -DECLARE_CSR(mhpmcounter17, CSR_MHPMCOUNTER17) -DECLARE_CSR(mhpmcounter18, CSR_MHPMCOUNTER18) -DECLARE_CSR(mhpmcounter19, CSR_MHPMCOUNTER19) -DECLARE_CSR(mhpmcounter20, CSR_MHPMCOUNTER20) -DECLARE_CSR(mhpmcounter21, CSR_MHPMCOUNTER21) -DECLARE_CSR(mhpmcounter22, CSR_MHPMCOUNTER22) -DECLARE_CSR(mhpmcounter23, CSR_MHPMCOUNTER23) -DECLARE_CSR(mhpmcounter24, CSR_MHPMCOUNTER24) -DECLARE_CSR(mhpmcounter25, CSR_MHPMCOUNTER25) -DECLARE_CSR(mhpmcounter26, CSR_MHPMCOUNTER26) -DECLARE_CSR(mhpmcounter27, CSR_MHPMCOUNTER27) -DECLARE_CSR(mhpmcounter28, CSR_MHPMCOUNTER28) -DECLARE_CSR(mhpmcounter29, CSR_MHPMCOUNTER29) -DECLARE_CSR(mhpmcounter30, CSR_MHPMCOUNTER30) -DECLARE_CSR(mhpmcounter31, CSR_MHPMCOUNTER31) -DECLARE_CSR(mhpmevent3, CSR_MHPMEVENT3) -DECLARE_CSR(mhpmevent4, CSR_MHPMEVENT4) -DECLARE_CSR(mhpmevent5, CSR_MHPMEVENT5) -DECLARE_CSR(mhpmevent6, CSR_MHPMEVENT6) -DECLARE_CSR(mhpmevent7, CSR_MHPMEVENT7) -DECLARE_CSR(mhpmevent8, CSR_MHPMEVENT8) -DECLARE_CSR(mhpmevent9, CSR_MHPMEVENT9) -DECLARE_CSR(mhpmevent10, CSR_MHPMEVENT10) -DECLARE_CSR(mhpmevent11, CSR_MHPMEVENT11) -DECLARE_CSR(mhpmevent12, CSR_MHPMEVENT12) -DECLARE_CSR(mhpmevent13, CSR_MHPMEVENT13) -DECLARE_CSR(mhpmevent14, CSR_MHPMEVENT14) -DECLARE_CSR(mhpmevent15, CSR_MHPMEVENT15) -DECLARE_CSR(mhpmevent16, CSR_MHPMEVENT16) -DECLARE_CSR(mhpmevent17, CSR_MHPMEVENT17) -DECLARE_CSR(mhpmevent18, CSR_MHPMEVENT18) -DECLARE_CSR(mhpmevent19, CSR_MHPMEVENT19) -DECLARE_CSR(mhpmevent20, CSR_MHPMEVENT20) -DECLARE_CSR(mhpmevent21, CSR_MHPMEVENT21) -DECLARE_CSR(mhpmevent22, CSR_MHPMEVENT22) -DECLARE_CSR(mhpmevent23, CSR_MHPMEVENT23) -DECLARE_CSR(mhpmevent24, CSR_MHPMEVENT24) -DECLARE_CSR(mhpmevent25, CSR_MHPMEVENT25) -DECLARE_CSR(mhpmevent26, CSR_MHPMEVENT26) -DECLARE_CSR(mhpmevent27, CSR_MHPMEVENT27) -DECLARE_CSR(mhpmevent28, CSR_MHPMEVENT28) -DECLARE_CSR(mhpmevent29, CSR_MHPMEVENT29) -DECLARE_CSR(mhpmevent30, CSR_MHPMEVENT30) -DECLARE_CSR(mhpmevent31, CSR_MHPMEVENT31) -DECLARE_CSR(mvendorid, CSR_MVENDORID) -DECLARE_CSR(marchid, CSR_MARCHID) -DECLARE_CSR(mimpid, CSR_MIMPID) -DECLARE_CSR(mhartid, CSR_MHARTID) -DECLARE_CSR(cycleh, CSR_CYCLEH) -DECLARE_CSR(timeh, CSR_TIMEH) -DECLARE_CSR(instreth, CSR_INSTRETH) -DECLARE_CSR(hpmcounter3h, CSR_HPMCOUNTER3H) -DECLARE_CSR(hpmcounter4h, CSR_HPMCOUNTER4H) -DECLARE_CSR(hpmcounter5h, CSR_HPMCOUNTER5H) -DECLARE_CSR(hpmcounter6h, CSR_HPMCOUNTER6H) -DECLARE_CSR(hpmcounter7h, CSR_HPMCOUNTER7H) -DECLARE_CSR(hpmcounter8h, CSR_HPMCOUNTER8H) -DECLARE_CSR(hpmcounter9h, CSR_HPMCOUNTER9H) -DECLARE_CSR(hpmcounter10h, CSR_HPMCOUNTER10H) -DECLARE_CSR(hpmcounter11h, CSR_HPMCOUNTER11H) -DECLARE_CSR(hpmcounter12h, CSR_HPMCOUNTER12H) -DECLARE_CSR(hpmcounter13h, CSR_HPMCOUNTER13H) -DECLARE_CSR(hpmcounter14h, CSR_HPMCOUNTER14H) -DECLARE_CSR(hpmcounter15h, CSR_HPMCOUNTER15H) -DECLARE_CSR(hpmcounter16h, CSR_HPMCOUNTER16H) -DECLARE_CSR(hpmcounter17h, CSR_HPMCOUNTER17H) -DECLARE_CSR(hpmcounter18h, CSR_HPMCOUNTER18H) -DECLARE_CSR(hpmcounter19h, CSR_HPMCOUNTER19H) -DECLARE_CSR(hpmcounter20h, CSR_HPMCOUNTER20H) -DECLARE_CSR(hpmcounter21h, CSR_HPMCOUNTER21H) -DECLARE_CSR(hpmcounter22h, CSR_HPMCOUNTER22H) -DECLARE_CSR(hpmcounter23h, CSR_HPMCOUNTER23H) -DECLARE_CSR(hpmcounter24h, CSR_HPMCOUNTER24H) -DECLARE_CSR(hpmcounter25h, CSR_HPMCOUNTER25H) -DECLARE_CSR(hpmcounter26h, CSR_HPMCOUNTER26H) -DECLARE_CSR(hpmcounter27h, CSR_HPMCOUNTER27H) -DECLARE_CSR(hpmcounter28h, CSR_HPMCOUNTER28H) -DECLARE_CSR(hpmcounter29h, CSR_HPMCOUNTER29H) -DECLARE_CSR(hpmcounter30h, CSR_HPMCOUNTER30H) -DECLARE_CSR(hpmcounter31h, CSR_HPMCOUNTER31H) -DECLARE_CSR(mcycleh, CSR_MCYCLEH) -DECLARE_CSR(minstreth, CSR_MINSTRETH) -DECLARE_CSR(mhpmcounter3h, CSR_MHPMCOUNTER3H) -DECLARE_CSR(mhpmcounter4h, CSR_MHPMCOUNTER4H) -DECLARE_CSR(mhpmcounter5h, CSR_MHPMCOUNTER5H) -DECLARE_CSR(mhpmcounter6h, CSR_MHPMCOUNTER6H) -DECLARE_CSR(mhpmcounter7h, CSR_MHPMCOUNTER7H) -DECLARE_CSR(mhpmcounter8h, CSR_MHPMCOUNTER8H) -DECLARE_CSR(mhpmcounter9h, CSR_MHPMCOUNTER9H) -DECLARE_CSR(mhpmcounter10h, CSR_MHPMCOUNTER10H) -DECLARE_CSR(mhpmcounter11h, CSR_MHPMCOUNTER11H) -DECLARE_CSR(mhpmcounter12h, CSR_MHPMCOUNTER12H) -DECLARE_CSR(mhpmcounter13h, CSR_MHPMCOUNTER13H) -DECLARE_CSR(mhpmcounter14h, CSR_MHPMCOUNTER14H) -DECLARE_CSR(mhpmcounter15h, CSR_MHPMCOUNTER15H) -DECLARE_CSR(mhpmcounter16h, CSR_MHPMCOUNTER16H) -DECLARE_CSR(mhpmcounter17h, CSR_MHPMCOUNTER17H) -DECLARE_CSR(mhpmcounter18h, CSR_MHPMCOUNTER18H) -DECLARE_CSR(mhpmcounter19h, CSR_MHPMCOUNTER19H) -DECLARE_CSR(mhpmcounter20h, CSR_MHPMCOUNTER20H) -DECLARE_CSR(mhpmcounter21h, CSR_MHPMCOUNTER21H) -DECLARE_CSR(mhpmcounter22h, CSR_MHPMCOUNTER22H) -DECLARE_CSR(mhpmcounter23h, CSR_MHPMCOUNTER23H) -DECLARE_CSR(mhpmcounter24h, CSR_MHPMCOUNTER24H) -DECLARE_CSR(mhpmcounter25h, CSR_MHPMCOUNTER25H) -DECLARE_CSR(mhpmcounter26h, CSR_MHPMCOUNTER26H) -DECLARE_CSR(mhpmcounter27h, CSR_MHPMCOUNTER27H) -DECLARE_CSR(mhpmcounter28h, CSR_MHPMCOUNTER28H) -DECLARE_CSR(mhpmcounter29h, CSR_MHPMCOUNTER29H) -DECLARE_CSR(mhpmcounter30h, CSR_MHPMCOUNTER30H) -DECLARE_CSR(mhpmcounter31h, CSR_MHPMCOUNTER31H) -#endif -#ifdef DECLARE_CAUSE -DECLARE_CAUSE("misaligned fetch", CAUSE_MISALIGNED_FETCH) -DECLARE_CAUSE("fetch access", CAUSE_FETCH_ACCESS) -DECLARE_CAUSE("illegal instruction", CAUSE_ILLEGAL_INSTRUCTION) -DECLARE_CAUSE("breakpoint", CAUSE_BREAKPOINT) -DECLARE_CAUSE("misaligned load", CAUSE_MISALIGNED_LOAD) -DECLARE_CAUSE("load access", CAUSE_LOAD_ACCESS) -DECLARE_CAUSE("misaligned store", CAUSE_MISALIGNED_STORE) -DECLARE_CAUSE("store access", CAUSE_STORE_ACCESS) -DECLARE_CAUSE("user_ecall", CAUSE_USER_ECALL) -DECLARE_CAUSE("supervisor_ecall", CAUSE_SUPERVISOR_ECALL) -DECLARE_CAUSE("hypervisor_ecall", CAUSE_HYPERVISOR_ECALL) -DECLARE_CAUSE("machine_ecall", CAUSE_MACHINE_ECALL) -DECLARE_CAUSE("fetch page fault", CAUSE_FETCH_PAGE_FAULT) -DECLARE_CAUSE("load page fault", CAUSE_LOAD_PAGE_FAULT) -DECLARE_CAUSE("store page fault", CAUSE_STORE_PAGE_FAULT) -#endif diff --git a/tests/riscv-coremark/riscv64-baremetal/link.ld b/tests/riscv-coremark/riscv64-baremetal/link.ld deleted file mode 100644 index 4f8892ee2..000000000 --- a/tests/riscv-coremark/riscv64-baremetal/link.ld +++ /dev/null @@ -1,66 +0,0 @@ -/*======================================================================*/ -/* Proxy kernel linker script */ -/*======================================================================*/ -/* This is the linker script used when building the proxy kernel. */ - -/*----------------------------------------------------------------------*/ -/* Setup */ -/*----------------------------------------------------------------------*/ - -/* The OUTPUT_ARCH command specifies the machine architecture where the - argument is one of the names used in the BFD library. More - specifically one of the entires in bfd/cpu-mips.c */ - -OUTPUT_ARCH( "riscv" ) -ENTRY(_start) - -/*----------------------------------------------------------------------*/ -/* Sections */ -/*----------------------------------------------------------------------*/ - -SECTIONS -{ - - /* text: test code section */ - . = 0x80000000; - .text.init : { *(.text.init) } - - . = ALIGN(0x1000); - .tohost : { *(.tohost) } - - .text : { *(.text) } - - /* data segment */ - .data : { *(.data) } - - .sdata : { - __global_pointer$ = . + 0x800; - *(.srodata.cst16) *(.srodata.cst8) *(.srodata.cst4) *(.srodata.cst2) *(.srodata*) - *(.sdata .sdata.* .gnu.linkonce.s.*) - } - - /* bss segment */ - .sbss : { - *(.sbss .sbss.* .gnu.linkonce.sb.*) - *(.scommon) - } - .bss : { *(.bss) } - - /* thread-local data segment */ - .tdata : - { - _tls_data = .; - *(.tdata.begin) - *(.tdata) - *(.tdata.end) - } - .tbss : - { - *(.tbss) - *(.tbss.end) - } - - /* End of uninitalized data segement */ - _end = .; -} - diff --git a/tests/riscv-coremark/riscv64-baremetal/syscallbackup.c b/tests/riscv-coremark/riscv64-baremetal/syscallbackup.c deleted file mode 100644 index e4322563c..000000000 --- a/tests/riscv-coremark/riscv64-baremetal/syscallbackup.c +++ /dev/null @@ -1,1072 +0,0 @@ -// See LICENSE for license details. - -#include -#include -#include -#include -#include -#include -#include "util.h" -#undef printf -#define SYS_write 64 -#define ZEROPAD (1<<0) /* Pad with zero */ -#define SIGN (1<<1) /* Unsigned/signed long */ -#define PLUS (1<<2) /* Show plus */ -#define SPACE (1<<3) /* Spacer */ -#define LEFT (1<<4) /* Left justified */ -#define HEX_PREP (1<<5) /* 0x */ -#define UPPERCASE (1<<6) /* 'ABCDEF' */ -typedef size_t ee_size_t; -#define is_digit(c) ((c) >= '0' && (c) <= '9') -/*static ee_size_t strnlen(const char *s, ee_size_t count);*/ -#undef strcmp -static char *digits = "0123456789abcdefghijklmnopqrstuvwxyz"; -static char *upper_digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; -char *ecvtbuf(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); -extern volatile uint64_t tohost; -extern volatile uint64_t fromhost; -ee_size_t strnlen(const char *s, ee_size_t count) -{ - const char *sc; - for (sc = s; *sc != '\0' && count--; ++sc); - return sc - s; -} -static char *number(char *str, long num, int base, int size, int precision, int type) -{ - char c, sign, tmp[66]; - char *dig = digits; - int i; - - if (type & UPPERCASE) dig = upper_digits; - if (type & LEFT) type &= ~ZEROPAD; - if (base < 2 || base > 36) return 0; - - c = (type & ZEROPAD) ? '0' : ' '; - sign = 0; - if (type & SIGN) - { - if (num < 0) - { - sign = '-'; - num = -num; - size--; - } - else if (type & PLUS) - { - sign = '+'; - size--; - } - else if (type & SPACE) - { - sign = ' '; - size--; - } - } - - if (type & HEX_PREP) - { - if (base == 16) - size -= 2; - else if (base == 8) - size--; - } - - i = 0; - - if (num == 0) - tmp[i++] = '0'; - else - { - while (num != 0) - { - tmp[i++] = dig[((unsigned long) num) % (unsigned) base]; - num = ((unsigned long) num) / (unsigned) base; - } - } - - if (i > precision) precision = i; - size -= precision; - if (!(type & (ZEROPAD | LEFT))) while (size-- > 0) *str++ = ' '; - if (sign) *str++ = sign; - - if (type & HEX_PREP) - { - if (base == 8) - *str++ = '0'; - else if (base == 16) - { - *str++ = '0'; - *str++ = digits[33]; - } - } - - if (!(type & LEFT)) while (size-- > 0) *str++ = c; - while (i < precision--) *str++ = '0'; - while (i-- > 0) *str++ = tmp[i]; - while (size-- > 0) *str++ = ' '; - - return str; -} - -static char *eaddr(char *str, unsigned char *addr, int size, int precision, int type) -{ - char tmp[24]; - char *dig = digits; - int i, len; - - if (type & UPPERCASE) dig = upper_digits; - len = 0; - for (i = 0; i < 6; i++) - { - if (i != 0) tmp[len++] = ':'; - tmp[len++] = dig[addr[i] >> 4]; - tmp[len++] = dig[addr[i] & 0x0F]; - } - - if (!(type & LEFT)) while (len < size--) *str++ = ' '; - for (i = 0; i < len; ++i) *str++ = tmp[i]; - while (len < size--) *str++ = ' '; - - return str; -} -static int skip_atoi(const char **s) -{ - int i = 0; - while (is_digit(**s)) i = i*10 + *((*s)++) - '0'; - return i; -} -static char *iaddr(char *str, unsigned char *addr, int size, int precision, int type) -{ - char tmp[24]; - int i, n, len; - - len = 0; - for (i = 0; i < 4; i++) - { - if (i != 0) tmp[len++] = '.'; - n = addr[i]; - - if (n == 0) - tmp[len++] = digits[0]; - else - { - if (n >= 100) - { - tmp[len++] = digits[n / 100]; - n = n % 100; - tmp[len++] = digits[n / 10]; - n = n % 10; - } - else if (n >= 10) - { - tmp[len++] = digits[n / 10]; - n = n % 10; - } - - tmp[len++] = digits[n]; - } - } - - if (!(type & LEFT)) while (len < size--) *str++ = ' '; - for (i = 0; i < len; ++i) *str++ = tmp[i]; - while (len < size--) *str++ = ' '; - - return str; -} - -void ee_bufcpy(char *pd, char *ps, int count) { - char *pe=ps+count; - while (ps!=pe) - *pd++=*ps++; -} - -#if HAS_FLOAT - - - -static void parse_float(double value, char *buffer, char fmt, int precision) -{ - int decpt, sign, exp, pos; - char *digits = NULL; - char cvtbuf[80]; - int capexp = 0; - int magnitude; - - if (fmt == 'G' || fmt == 'E') - { - capexp = 1; - fmt += 'a' - 'A'; - } - - if (fmt == 'g') - { - digits = ecvtbuf(value, precision, &decpt, &sign, cvtbuf); - magnitude = decpt - 1; - if (magnitude < -4 || magnitude > precision - 1) - { - fmt = 'e'; - precision -= 1; - } - else - { - fmt = 'f'; - precision -= decpt; - } - } - - if (fmt == 'e') - { - digits = ecvtbuf(value, precision + 1, &decpt, &sign, cvtbuf); - - if (sign) *buffer++ = '-'; - *buffer++ = *digits; - if (precision > 0) *buffer++ = '.'; - ee_bufcpy(buffer, digits + 1, precision); - buffer += precision; - *buffer++ = capexp ? 'E' : 'e'; - - if (decpt == 0) - { - if (value == 0.0) - exp = 0; - else - exp = -1; - } - else - exp = decpt - 1; - - if (exp < 0) - { - *buffer++ = '-'; - exp = -exp; - } - else - *buffer++ = '+'; - - buffer[2] = (exp % 10) + '0'; - exp = exp / 10; - buffer[1] = (exp % 10) + '0'; - exp = exp / 10; - buffer[0] = (exp % 10) + '0'; - buffer += 3; - } - else if (fmt == 'f') - { - digits = fcvtbuf(value, precision, &decpt, &sign, cvtbuf); - if (sign) *buffer++ = '-'; - if (*digits) - { - if (decpt <= 0) - { - *buffer++ = '0'; - *buffer++ = '.'; - for (pos = 0; pos < -decpt; pos++) *buffer++ = '0'; - while (*digits) *buffer++ = *digits++; - } - else - { - pos = 0; - while (*digits) - { - if (pos++ == decpt) *buffer++ = '.'; - *buffer++ = *digits++; - } - } - } - else - { - *buffer++ = '0'; - if (precision > 0) - { - *buffer++ = '.'; - for (pos = 0; pos < precision; pos++) *buffer++ = '0'; - } - } - } - - *buffer = '\0'; -} - - -static char *flt(char *str, double num, int size, int precision, char fmt, int flags) -{ - char tmp[80]; - char c, sign; - int n, i; - - // Left align means no zero padding - if (flags & LEFT) flags &= ~ZEROPAD; - - // Determine padding and sign char - c = (flags & ZEROPAD) ? '0' : ' '; - sign = 0; - if (flags & SIGN) - { - if (num < 0.0) - { - sign = '-'; - num = -num; - size--; - } - else if (flags & PLUS) - { - sign = '+'; - size--; - } - else if (flags & SPACE) - { - sign = ' '; - size--; - } - } - - // Compute the precision value - if (precision < 0) - precision = 6; // Default precision: 6 - - // Convert floating point number to text - parse_float(num, tmp, fmt, precision); - - if ((flags & HEX_PREP) && precision == 0) decimal_point(tmp); - if (fmt == 'g' && !(flags & HEX_PREP)) cropzeros(tmp); - - n = strnlen(tmp,256); - - // Output number with alignment and padding - size -= n; - if (!(flags & (ZEROPAD | LEFT))) while (size-- > 0) *str++ = ' '; - if (sign) *str++ = sign; - if (!(flags & LEFT)) while (size-- > 0) *str++ = c; - for (i = 0; i < n; i++) *str++ = tmp[i]; - while (size-- > 0) *str++ = ' '; - - return str; -} - - -#endif -static void decimal_point(char *buffer) -{ - while (*buffer) - { - if (*buffer == '.') return; - if (*buffer == 'e' || *buffer == 'E') break; - buffer++; - } - - if (*buffer) - { - int n = strnlen(buffer,256); - while (n > 0) - { - buffer[n + 1] = buffer[n]; - n--; - } - - *buffer = '.'; - } - else - { - *buffer++ = '.'; - *buffer = '\0'; - } -} - -static void cropzeros(char *buffer) -{ - char *stop; - - while (*buffer && *buffer != '.') buffer++; - if (*buffer++) - { - while (*buffer && *buffer != 'e' && *buffer != 'E') buffer++; - stop = buffer--; - while (*buffer == '0') buffer--; - if (*buffer == '.') buffer--; - while (buffer!=stop) - *++buffer=0; - } -} - -static int ee_vsprintf(char *buf, const char *fmt, va_list args) -{ - int len; - unsigned long num; - int i, base; - char *str; - char *s; - - int flags; // Flags to number() - - int field_width; // Width of output field - int precision; // Min. # of digits for integers; max number of chars for from string - int qualifier; // 'h', 'l', or 'L' for integer fields - - for (str = buf; *fmt; fmt++) - { - if (*fmt != '%') - { - *str++ = *fmt; - continue; - } - - // Process flags - flags = 0; -repeat: - fmt++; // This also skips first '%' - switch (*fmt) - { - case '-': flags |= LEFT; goto repeat; - case '+': flags |= PLUS; goto repeat; - case ' ': flags |= SPACE; goto repeat; - case '#': flags |= HEX_PREP; goto repeat; - case '0': flags |= ZEROPAD; goto repeat; - } - - // Get field width - field_width = -1; - if (is_digit(*fmt)) - field_width = skip_atoi(&fmt); - else if (*fmt == '*') - { - fmt++; - field_width = va_arg(args, int); - if (field_width < 0) - { - field_width = -field_width; - flags |= LEFT; - } - } - - // Get the precision - precision = -1; - if (*fmt == '.') - { - ++fmt; - if (is_digit(*fmt)) - precision = skip_atoi(&fmt); - else if (*fmt == '*') - { - ++fmt; - precision = va_arg(args, int); - } - if (precision < 0) precision = 0; - } - - // Get the conversion qualifier - qualifier = -1; - if (*fmt == 'l' || *fmt == 'L') - { - qualifier = *fmt; - fmt++; - } - - // Default base - base = 10; - - switch (*fmt) - { - case 'c': - if (!(flags & LEFT)) while (--field_width > 0) *str++ = ' '; - *str++ = (unsigned char) va_arg(args, int); - while (--field_width > 0) *str++ = ' '; - continue; - - case 's': - s = va_arg(args, char *); - if (!s) s = ""; - len = strnlen(s, precision); - if (!(flags & LEFT)) while (len < field_width--) *str++ = ' '; - for (i = 0; i < len; ++i) *str++ = *s++; - while (len < field_width--) *str++ = ' '; - continue; - - case 'p': - if (field_width == -1) - { - field_width = 2 * sizeof(void *); - flags |= ZEROPAD; - } - str = number(str, (unsigned long) va_arg(args, void *), 16, field_width, precision, flags); - continue; - - case 'A': - flags |= UPPERCASE; - - case 'a': - if (qualifier == 'l') - str = eaddr(str, va_arg(args, unsigned char *), field_width, precision, flags); - else - str = iaddr(str, va_arg(args, unsigned char *), field_width, precision, flags); - continue; - - // Integer number formats - set up the flags and "break" - case 'o': - base = 8; - break; - - case 'X': - flags |= UPPERCASE; - - case 'x': - base = 16; - break; - - case 'd': - case 'i': - flags |= SIGN; - - case 'u': - break; - -#if HAS_FLOAT - - case 'f': - str = flt(str, va_arg(args, double), field_width, precision, *fmt, flags | SIGN); - continue; - -#endif - - default: - if (*fmt != '%') *str++ = '%'; - if (*fmt) - *str++ = *fmt; - else - --fmt; - continue; - } - - if (qualifier == 'l') - num = va_arg(args, unsigned long); - else if (flags & SIGN) - num = va_arg(args, int); - else - num = va_arg(args, unsigned int); - - str = number(str, num, base, field_width, precision, flags); - } - - *str = '\0'; - return str - buf; -} - -static uintptr_t syscall(uintptr_t which, uint64_t arg0, uint64_t arg1, uint64_t arg2) -{ - volatile uint64_t magic_mem[8] __attribute__((aligned(64))); - magic_mem[0] = which; - magic_mem[1] = arg0; - magic_mem[2] = arg1; - magic_mem[3] = arg2; - __sync_synchronize(); - - tohost = (uintptr_t)magic_mem; - while (fromhost == 0) - ; - fromhost = 0; - - __sync_synchronize(); - return magic_mem[0]; -} - -#define NUM_COUNTERS 2 -static uintptr_t counters[NUM_COUNTERS]; -static char* counter_names[NUM_COUNTERS]; - -void setStats(int enable) -{ - int i = 0; -#define READ_CTR(name) do { \ - while (i >= NUM_COUNTERS) ; \ - uintptr_t csr = read_csr(name); \ - if (!enable) { csr -= counters[i]; counter_names[i] = #name; } \ - counters[i++] = csr; \ - } while (0) - - READ_CTR(mcycle); - READ_CTR(minstret); - -#undef READ_CTR -} - -/*void __attribute__((noreturn)) tohost_exit(uintptr_t code) -{ - tohost = (code << 1) | 1; - while (1); -}*/ -void __attribute__((noreturn))tohost_exit(uintptr_t code){ - tohost=(code<<1)|1; - asm ("ecall"); - } - - -uintptr_t __attribute__((weak)) handle_trap(uintptr_t cause, uintptr_t epc, uintptr_t regs[32]) -{ - tohost_exit(1337); -} - -void exit(int code) -{ - tohost_exit(code); -} - -void abort() -{ - exit(128 + SIGABRT); -} - -void printstr(const char* s) -{ - syscall(SYS_write, 1, (uintptr_t)s, strlen(s)); -} - -void __attribute__((weak)) thread_entry(int cid, int nc) -{ - // multi-threaded programs override this function. - // for the case of single-threaded programs, only let core 0 proceed. - while (cid != 0); -} - -int __attribute__((weak)) main(int argc, char** argv) -{ - // single-threaded programs override this function. - printstr("Implement main(), foo!\n"); - return -1; -} - -static void init_tls() -{ - register void* thread_pointer asm("tp"); - extern char _tls_data; - extern __thread char _tdata_begin, _tdata_end, _tbss_end; - size_t tdata_size = &_tdata_end - &_tdata_begin; - memcpy(thread_pointer, &_tls_data, tdata_size); - size_t tbss_size = &_tbss_end - &_tdata_end; - memset(thread_pointer + tdata_size, 0, tbss_size); -} - -void _init(int cid, int nc) -{ - init_tls(); - thread_entry(cid, nc); - - // only single-threaded programs should ever get here. - int ret = main(0, 0); - - char buf[NUM_COUNTERS * 32] __attribute__((aligned(64))); - char* pbuf = buf; - for (int i = 0; i < NUM_COUNTERS; i++) - if (counters[i]) - pbuf += sprintf(pbuf, "%s = %d\n", counter_names[i], counters[i]); - if (pbuf != buf) - printstr(buf); - - exit(ret); -} - -#undef putchar -int putchar(int ch) -{ - static __thread char buf[64] __attribute__((aligned(64))); - static __thread int buflen = 0; - - buf[buflen++] = ch; - - if (ch == '\n' || buflen == sizeof(buf)) - { - syscall(SYS_write, 1, (uintptr_t)buf, buflen); - buflen = 0; - } - - return 0; -} - -void printhex(uint64_t x) -{ - char str[17]; - int i; - for (i = 0; i < 16; i++) - { - str[15-i] = (x & 0xF) + ((x & 0xF) < 10 ? '0' : 'a'-10); - x >>= 4; - } - str[16] = 0; - - printstr(str); -} - -static inline void printnum(void (*putch)(int, void**), void **putdat, - unsigned long long num, unsigned base, int width, int padc) -{ - unsigned digs[sizeof(num)*CHAR_BIT]; - int pos = 0; - - while (1) - { - digs[pos++] = num % base; - if (num < base) - break; - num /= base; - } - - while (width-- > pos) - putch(padc, putdat); - - while (pos-- > 0) - putch(digs[pos] + (digs[pos] >= 10 ? 'a' - 10 : '0'), putdat); -} - -static unsigned long long getuint(va_list *ap, int lflag) -{ - if (lflag >= 2) - return va_arg(*ap, unsigned long long); - else if (lflag) - return va_arg(*ap, unsigned long); - else - return va_arg(*ap, unsigned int); -} - -static long long getint(va_list *ap, int lflag) -{ - if (lflag >= 2) - return va_arg(*ap, long long); - else if (lflag) - return va_arg(*ap, long); - else - return va_arg(*ap, int); -} - -static void vprintfmt(void (*putch)(int, void**), void **putdat, const char *fmt, va_list ap) -{ - register const char* p; - const char* last_fmt; - register int ch, err; - unsigned long long num; - int base, lflag, width, precision, altflag; - char padc; - - while (1) { - while ((ch = *(unsigned char *) fmt) != '%') { - if (ch == '\0') - return; - fmt++; - putch(ch, putdat); - } - fmt++; - - // Process a %-escape sequence - last_fmt = fmt; - padc = ' '; - width = -1; - precision = -1; - lflag = 0; - altflag = 0; - reswitch: - switch (ch = *(unsigned char *) fmt++) { - - // flag to pad on the right - case '-': - padc = '-'; - goto reswitch; - - // flag to pad with 0's instead of spaces - case '0': - padc = '0'; - goto reswitch; - - // width field - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - for (precision = 0; ; ++fmt) { - precision = precision * 10 + ch - '0'; - ch = *fmt; - if (ch < '0' || ch > '9') - break; - } - goto process_precision; - - case '*': - precision = va_arg(ap, int); - goto process_precision; - - case '.': - if (width < 0) - width = 0; - goto reswitch; - - case '#': - altflag = 1; - goto reswitch; - - process_precision: - if (width < 0) - width = precision, precision = -1; - goto reswitch; - - // long flag (doubled for long long) - case 'l': - lflag++; - goto reswitch; - - // character - case 'c': - putch(va_arg(ap, int), putdat); - break; - - // string - case 's': - if ((p = va_arg(ap, char *)) == NULL) - p = "(null)"; - if (width > 0 && padc != '-') - for (width -= strnlen(p, precision); width > 0; width--) - putch(padc, putdat); - for (; (ch = *p) != '\0' && (precision < 0 || --precision >= 0); width--) { - putch(ch, putdat); - p++; - } - for (; width > 0; width--) - putch(' ', putdat); - break; - - // (signed) decimal - case 'd': - num = getint(&ap, lflag); - if ((long long) num < 0) { - putch('-', putdat); - num = -(long long) num; - } - base = 10; - goto signed_number; - - // unsigned decimal - case 'u': - base = 10; - goto unsigned_number; - - // (unsigned) octal - case 'o': - // should do something with padding so it's always 3 octits - base = 8; - goto unsigned_number; - - // pointer - case 'p': - static_assert(sizeof(long) == sizeof(void*)); - lflag = 1; - putch('0', putdat); - putch('x', putdat); - /* fall through to 'x' */ - - // (unsigned) hexadecimal - case 'X': - case 'x': - base = 16; - unsigned_number: - num = getuint(&ap, lflag); - signed_number: - printnum(putch, putdat, num, base, width, padc); - break; - - // escaped '%' character - case '%': - putch(ch, putdat); - break; - - // unrecognized escape sequence - just print it literally - default: - putch('%', putdat); - fmt = last_fmt; - break; - } - } -} -/* -int printf(const char* fmt, ...) -{ - va_list ap; - va_start(ap, fmt); - - vprintfmt((void*)putchar, 0, fmt, ap); - - va_end(ap); - return 0; // incorrect return value, but who cares, anyway? -}*/ - - -void _send_char(char c) { -/*#error "You must implement the method _send_char to use this file!\n"; -*/ -volatile unsigned char *THR=(unsigned char *)0x10000000; -volatile unsigned char *LSR=(unsigned char *)0x10000005; - -while(!(*LSR&0b100000)); -*THR=c; -while(!(*LSR&0b100000)); -} - - -int sprintf(char* str, const char* fmt, ...) -{ - va_list ap; - char* str0 = str; - va_start(ap, fmt); - - void sprintf_putch(int ch, void** data) - { - char** pstr = (char**)data; - **pstr = ch; - (*pstr)++; - } - - vprintfmt(sprintf_putch, (void**)&str, fmt, ap); - *str = 0; - - va_end(ap); - return str - str0; -} - -void* memcpy(void* dest, const void* src, size_t len) -{ - if ((((uintptr_t)dest | (uintptr_t)src | len) & (sizeof(uintptr_t)-1)) == 0) { - const uintptr_t* s = src; - uintptr_t *d = dest; - while (d < (uintptr_t*)(dest + len)) - *d++ = *s++; - } else { - const char* s = src; - char *d = dest; - while (d < (char*)(dest + len)) - *d++ = *s++; - } - return dest; -} - -void* memset(void* dest, int byte, size_t len) -{ - if ((((uintptr_t)dest | len) & (sizeof(uintptr_t)-1)) == 0) { - uintptr_t word = byte & 0xFF; - word |= word << 8; - word |= word << 16; - word |= word << 16 << 16; - - uintptr_t *d = dest; - while (d < (uintptr_t*)(dest + len)){ - *d = word; - d++;} - } else { - char *d = dest; - while (d < (char*)(dest + len)){ - *d = byte; - d++;} - } - return dest; -} -//recompile pls -size_t strlen(const char *s) -{ - const char *p = s; - while (*p) - p++; - return p - s; -} - -/*size_t strnlen(const char *s, size_t n) -{ - const char *p = s; - while (n-- && *p) - p++; - return p - s; -}*/ - -int strcmp(const char* s1, const char* s2) -{ - unsigned char c1, c2; - - do { - c1 = *s1++; - c2 = *s2++; - } while (c1 != 0 && c1 == c2); - - return c1 - c2; -} - -char* strcpy(char* dest, const char* src) -{ - char* d = dest; - while ((*d++ = *src++)) - ; - return dest; -} - -long atol(const char* str) -{ - long res = 0; - int sign = 0; - - while (*str == ' ') - str++; - - if (*str == '-' || *str == '+') { - sign = *str == '-'; - str++; - } - - while (*str) { - res *= 10; - res += *str++ - '0'; - } - - return sign ? -res : res; -} - -int sendstring(const char *p){ - int n=0; - while (*p) { - _send_char(*p); - n++; - p++; - } - - return n; -} -int gg_printf(const char *fmt, ...) -{ - char buf[256],*p; - va_list args; - int n=0; - - va_start(args, fmt); - ee_vsprintf(buf, fmt, args); - va_end(args); - p=buf; - /* while (*p) { - _send_char(*p); - n++; - p++; - } -*/ -n=sendstring(p); - return n; -} - - -int puts(const char* s) -{ - gg_printf(s); - gg_printf("\n"); - return 0; // incorrect return value, but who cares, anyway? -} - -unsigned long getTimer(void){ - unsigned long *MTIME = (unsigned long*)0x0200BFF8; - return *MTIME; - -} diff --git a/tests/riscv-coremark/riscv64-baremetal/syscalls.c b/tests/riscv-coremark/riscv64-baremetal/syscalls.c deleted file mode 100644 index c1824954f..000000000 --- a/tests/riscv-coremark/riscv64-baremetal/syscalls.c +++ /dev/null @@ -1,505 +0,0 @@ -// See LICENSE for license details. - -#include -#include -#include -#include -#include -#include -#include "util.h" - -#define SYS_write 64 - -#undef strcmp - -extern volatile uint64_t tohost; -extern volatile uint64_t fromhost; - - -void _send_char(char c) { -/*#error "You must implement the method _send_char to use this file!\n"; -*/ -volatile unsigned char *THR=(unsigned char *)0x10000000; -volatile unsigned char *LSR=(unsigned char *)0x10000005; - -while(!(*LSR&0b100000)); -*THR=c; -while(!(*LSR&0b100000)); -} - -int sendstring(const char *p){ - int n=0; - while (*p) { - _send_char(*p); - n++; - p++; - } - - return n; -} - -static uintptr_t syscall(uintptr_t which, uint64_t arg0, uint64_t arg1, uint64_t arg2) -{ - volatile uint64_t magic_mem[8] __attribute__((aligned(64))); - magic_mem[0] = which; - magic_mem[1] = arg0; - magic_mem[2] = arg1; - magic_mem[3] = arg2; - __sync_synchronize(); - - tohost = (uintptr_t)magic_mem; - while (fromhost == 0) - ; - fromhost = 0; - - __sync_synchronize(); - return magic_mem[0]; -} - -#define NUM_COUNTERS 2 -static uintptr_t counters[NUM_COUNTERS]; -static char* counter_names[NUM_COUNTERS]; - -void setStats(int enable) -{ - int i = 0; -#define READ_CTR(name) do { \ - while (i >= NUM_COUNTERS) ; \ - uintptr_t csr = read_csr(name); \ - if (!enable) { csr -= counters[i]; counter_names[i] = #name; } \ - counters[i++] = csr; \ - } while (0) - - READ_CTR(mcycle); - READ_CTR(minstret); - -#undef READ_CTR -} - -void __attribute__((noreturn)) tohost_exit(uintptr_t code) -{ - tohost = (code << 1) | 1; - asm ("ecall"); -} - -uintptr_t __attribute__((weak)) handle_trap(uintptr_t cause, uintptr_t epc, uintptr_t regs[32]) -{ - tohost_exit(1337); -} - -void exit(int code) -{ - tohost_exit(code); -} - -void abort() -{ - exit(128 + SIGABRT); -} - -void printstr(const char* s) -{ - syscall(SYS_write, 1, (uintptr_t)s, strlen(s)); -} - -void __attribute__((weak)) thread_entry(int cid, int nc) -{ - // multi-threaded programs override this function. - // for the case of single-threaded programs, only let core 0 proceed. - while (cid != 0); -} - -int __attribute__((weak)) main(int argc, char** argv) -{ - // single-threaded programs override this function. - printstr("Implement main(), foo!\n"); - return -1; -} - -static void init_tls() -{ - register void* thread_pointer asm("tp"); - extern char _tls_data; - extern __thread char _tdata_begin, _tdata_end, _tbss_end; - size_t tdata_size = &_tdata_end - &_tdata_begin; - memcpy(thread_pointer, &_tls_data, tdata_size); - size_t tbss_size = &_tbss_end - &_tdata_end; - memset(thread_pointer + tdata_size, 0, tbss_size); -} - -void _init(int cid, int nc) -{ - init_tls(); - thread_entry(cid, nc); - - // only single-threaded programs should ever get here. - int ret = main(0, 0); - - char buf[NUM_COUNTERS * 32] __attribute__((aligned(64))); - char* pbuf = buf; - for (int i = 0; i < NUM_COUNTERS; i++) - if (counters[i]) - pbuf += sprintf(pbuf, "%s = %d\n", counter_names[i], counters[i]); - if (pbuf != buf) - printstr(buf); - - exit(ret); -} - -#undef putchar -int putchar(int ch) -{ - /*static __thread char buf[64] __attribute__((aligned(64))); - static __thread int buflen = 0; - - buf[buflen++] = ch; - - if (ch == '\n' || buflen == sizeof(buf)) - { - syscall(SYS_write, 1, (uintptr_t)buf, buflen); - buflen = 0; - } - - return 0;*/ - _send_char(ch); - return 0; - -} - -void printhex(uint64_t x) -{ - char str[17]; - int i; - for (i = 0; i < 16; i++) - { - str[15-i] = (x & 0xF) + ((x & 0xF) < 10 ? '0' : 'a'-10); - x >>= 4; - } - str[16] = 0; - - printstr(str); -} - -static inline void printnum(void (*putch)(int, void**), void **putdat, - unsigned long long num, unsigned base, int width, int padc) -{ - unsigned digs[sizeof(num)*CHAR_BIT]; - int pos = 0; - - while (1) - { - digs[pos++] = num % base; - if (num < base) - break; - num /= base; - } - - while (width-- > pos) - putch(padc, putdat); - - while (pos-- > 0) - putch(digs[pos] + (digs[pos] >= 10 ? 'a' - 10 : '0'), putdat); -} - -static unsigned long long getuint(va_list *ap, int lflag) -{ - if (lflag >= 2) - return va_arg(*ap, unsigned long long); - else if (lflag) - return va_arg(*ap, unsigned long); - else - return va_arg(*ap, unsigned int); -} - -static long long getint(va_list *ap, int lflag) -{ - if (lflag >= 2) - return va_arg(*ap, long long); - else if (lflag) - return va_arg(*ap, long); - else - return va_arg(*ap, int); -} - -static void vprintfmt(void (*putch)(int, void**), void **putdat, const char *fmt, va_list ap) -{ - register const char* p; - const char* last_fmt; - register int ch, err; - unsigned long long num; - int base, lflag, width, precision, altflag; - char padc; - - while (1) { - while ((ch = *(unsigned char *) fmt) != '%') { - if (ch == '\0') - return; - fmt++; - putch(ch, putdat); - } - fmt++; - - // Process a %-escape sequence - last_fmt = fmt; - padc = ' '; - width = -1; - precision = -1; - lflag = 0; - altflag = 0; - reswitch: - switch (ch = *(unsigned char *) fmt++) { - - // flag to pad on the right - case '-': - padc = '-'; - goto reswitch; - - // flag to pad with 0's instead of spaces - case '0': - padc = '0'; - goto reswitch; - - // width field - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - for (precision = 0; ; ++fmt) { - precision = precision * 10 + ch - '0'; - ch = *fmt; - if (ch < '0' || ch > '9') - break; - } - goto process_precision; - - case '*': - precision = va_arg(ap, int); - goto process_precision; - - case '.': - if (width < 0) - width = 0; - goto reswitch; - - case '#': - altflag = 1; - goto reswitch; - - process_precision: - if (width < 0) - width = precision, precision = -1; - goto reswitch; - - // long flag (doubled for long long) - case 'l': - lflag++; - goto reswitch; - - // character - case 'c': - putch(va_arg(ap, int), putdat); - break; - - // string - case 's': - if ((p = va_arg(ap, char *)) == NULL) - p = "(null)"; - if (width > 0 && padc != '-') - for (width -= strnlen(p, precision); width > 0; width--) - putch(padc, putdat); - for (; (ch = *p) != '\0' && (precision < 0 || --precision >= 0); width--) { - putch(ch, putdat); - p++; - } - for (; width > 0; width--) - putch(' ', putdat); - break; - - // (signed) decimal - case 'd': - num = getint(&ap, lflag); - if ((long long) num < 0) { - putch('-', putdat); - num = -(long long) num; - } - base = 10; - goto signed_number; - - // unsigned decimal - case 'u': - base = 10; - goto unsigned_number; - - // (unsigned) octal - case 'o': - // should do something with padding so it's always 3 octits - base = 8; - goto unsigned_number; - - // pointer - case 'p': - static_assert(sizeof(long) == sizeof(void*)); - lflag = 1; - putch('0', putdat); - putch('x', putdat); - /* fall through to 'x' */ - - // (unsigned) hexadecimal - case 'X': - case 'x': - base = 16; - unsigned_number: - num = getuint(&ap, lflag); - signed_number: - printnum(putch, putdat, num, base, width, padc); - break; - - // escaped '%' character - case '%': - putch(ch, putdat); - break; - - // unrecognized escape sequence - just print it literally - default: - putch('%', putdat); - fmt = last_fmt; - break; - } - } -} - -int printf(const char* fmt, ...) -{ - va_list ap; - va_start(ap, fmt); - - vprintfmt((void*)putchar, 0, fmt, ap); - - va_end(ap); - return 0; // incorrect return value, but who cares, anyway? -} - -int puts(const char* s) -{ - printf(s); - printf("\n"); - return 0; // incorrect return value, but who cares, anyway? -} - -int sprintf(char* str, const char* fmt, ...) -{ - va_list ap; - char* str0 = str; - va_start(ap, fmt); - - void sprintf_putch(int ch, void** data) - { - char** pstr = (char**)data; - **pstr = ch; - (*pstr)++; - } - - vprintfmt(sprintf_putch, (void**)&str, fmt, ap); - *str = 0; - - va_end(ap); - return str - str0; -} - -void* memcpy(void* dest, const void* src, size_t len) -{ - if ((((uintptr_t)dest | (uintptr_t)src | len) & (sizeof(uintptr_t)-1)) == 0) { - const uintptr_t* s = src; - uintptr_t *d = dest; - while (d < (uintptr_t*)(dest + len)) - *d++ = *s++; - } else { - const char* s = src; - char *d = dest; - while (d < (char*)(dest + len)) - *d++ = *s++; - } - return dest; -} -void* memset(void* dest, int byte, size_t len) -{ - if ((((uintptr_t)dest | len) & (sizeof(uintptr_t)-1)) == 0) { - uintptr_t word = byte & 0xFF; - word |= word << 8; - word |= word << 16; - word |= word << 16 << 16; - - uintptr_t *d = dest; - while (d < (uintptr_t*)(dest + len)){ - *d = word; - d++;} - } else { - char *d = dest; - while (d < (char*)(dest + len)){ - *d = byte; - d++;} - } - return dest; -} - -size_t strlen(const char *s) -{ - const char *p = s; - while (*p) - p++; - return p - s; -} - -size_t strnlen(const char *s, size_t n) -{ - const char *p = s; - while (n-- && *p) - p++; - return p - s; -} - -int strcmp(const char* s1, const char* s2) -{ - unsigned char c1, c2; - - do { - c1 = *s1++; - c2 = *s2++; - } while (c1 != 0 && c1 == c2); - - return c1 - c2; -} - -char* strcpy(char* dest, const char* src) -{ - char* d = dest; - while ((*d++ = *src++)) - ; - return dest; -} - -long atol(const char* str) -{ - long res = 0; - int sign = 0; - - while (*str == ' ') - str++; - - if (*str == '-' || *str == '+') { - sign = *str == '-'; - str++; - } - - while (*str) { - res *= 10; - res += *str++ - '0'; - } - - return sign ? -res : res; -} diff --git a/tests/riscv-coremark/riscv64-baremetal/util.h b/tests/riscv-coremark/riscv64-baremetal/util.h deleted file mode 100644 index 081cfd634..000000000 --- a/tests/riscv-coremark/riscv64-baremetal/util.h +++ /dev/null @@ -1,90 +0,0 @@ -// See LICENSE for license details. - -#ifndef __UTIL_H -#define __UTIL_H - -extern void setStats(int enable); - -#include - -#define static_assert(cond) switch(0) { case 0: case !!(long)(cond): ; } - -static int verify(int n, const volatile int* test, const int* verify) -{ - int i; - // Unrolled for faster verification - for (i = 0; i < n/2*2; i+=2) - { - int t0 = test[i], t1 = test[i+1]; - int v0 = verify[i], v1 = verify[i+1]; - if (t0 != v0) return i+1; - if (t1 != v1) return i+2; - } - if (n % 2 != 0 && test[n-1] != verify[n-1]) - return n; - return 0; -} - -static int verifyDouble(int n, const volatile double* test, const double* verify) -{ - int i; - // Unrolled for faster verification - for (i = 0; i < n/2*2; i+=2) - { - double t0 = test[i], t1 = test[i+1]; - double v0 = verify[i], v1 = verify[i+1]; - int eq1 = t0 == v0, eq2 = t1 == v1; - if (!(eq1 & eq2)) return i+1+eq1; - } - if (n % 2 != 0 && test[n-1] != verify[n-1]) - return n; - return 0; -} - -static void __attribute__((noinline)) barrier(int ncores) -{ - static volatile int sense; - static volatile int count; - static __thread int threadsense; - - __sync_synchronize(); - - threadsense = !threadsense; - if (__sync_fetch_and_add(&count, 1) == ncores-1) - { - count = 0; - sense = threadsense; - } - else while(sense != threadsense) - ; - - __sync_synchronize(); -} - -static uint64_t lfsr(uint64_t x) -{ - uint64_t bit = (x ^ (x >> 1)) & 1; - return (x >> 1) | (bit << 62); -} - -static uintptr_t insn_len(uintptr_t pc) -{ - return (*(unsigned short*)pc & 3) ? 4 : 2; -} - -#ifdef __riscv -#include "encoding.h" -#endif - -#define stringify_1(s) #s -#define stringify(s) stringify_1(s) -#define stats(code, iter) do { \ - unsigned long _c = -read_csr(mcycle), _i = -read_csr(minstret); \ - code; \ - _c += read_csr(mcycle), _i += read_csr(minstret); \ - if (cid == 0) \ - printf("\n%s: %ld cycles, %ld.%ld cycles/iter, %ld.%ld CPI\n", \ - stringify(code), _c, _c/iter, 10*_c/iter%10, _c/_i, 10*_c/_i%10); \ - } while(0) - -#endif //__UTIL_H diff --git a/tests/riscv-coremark/riscv64/core_portme.c b/tests/riscv-coremark/riscv64/core_portme.c deleted file mode 100755 index 8f17cb8bd..000000000 --- a/tests/riscv-coremark/riscv64/core_portme.c +++ /dev/null @@ -1,346 +0,0 @@ -/* -Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Original Author: Shay Gal-on -*/ - -#include -#include -#include "coremark.h" -#if CALLGRIND_RUN -#include -#endif - -#if (MEM_METHOD==MEM_MALLOC) -#include -/* Function: portable_malloc - Provide malloc() functionality in a platform specific way. -*/ -void *portable_malloc(size_t size) { - return malloc(size); -} -/* Function: portable_free - Provide free() functionality in a platform specific way. -*/ -void portable_free(void *p) { - free(p); -} -#else -void *portable_malloc(size_t size) { - return NULL; -} -void portable_free(void *p) { - p=NULL; -} -#endif - -#if (SEED_METHOD==SEED_VOLATILE) -#if VALIDATION_RUN - volatile ee_s32 seed1_volatile=0x3415; - volatile ee_s32 seed2_volatile=0x3415; - volatile ee_s32 seed3_volatile=0x66; -#endif -#if PERFORMANCE_RUN - volatile ee_s32 seed1_volatile=0x0; - volatile ee_s32 seed2_volatile=0x0; - volatile ee_s32 seed3_volatile=0x66; -#endif -#if PROFILE_RUN - volatile ee_s32 seed1_volatile=0x8; - volatile ee_s32 seed2_volatile=0x8; - volatile ee_s32 seed3_volatile=0x8; -#endif - volatile ee_s32 seed4_volatile=ITERATIONS; - volatile ee_s32 seed5_volatile=0; -#endif -/* Porting: Timing functions - How to capture time and convert to seconds must be ported to whatever is supported by the platform. - e.g. Read value from on board RTC, read value from cpu clock cycles performance counter etc. - Sample implementation for standard time.h and windows.h definitions included. -*/ -/* Define: TIMER_RES_DIVIDER - Divider to trade off timer resolution and total time that can be measured. - - Use lower values to increase resolution, but make sure that overflow does not occur. - If there are issues with the return value overflowing, increase this value. - */ -#if USE_CLOCK - #define NSECS_PER_SEC CLOCKS_PER_SEC - #define EE_TIMER_TICKER_RATE 1000 - #define CORETIMETYPE clock_t - #define GETMYTIME(_t) (*_t=clock()) - #define MYTIMEDIFF(fin,ini) ((fin)-(ini)) - #define TIMER_RES_DIVIDER 1 - #define SAMPLE_TIME_IMPLEMENTATION 1 -#elif defined(_MSC_VER) - #define NSECS_PER_SEC 10000000 - #define EE_TIMER_TICKER_RATE 1000 - #define CORETIMETYPE FILETIME - #define GETMYTIME(_t) GetSystemTimeAsFileTime(_t) - #define MYTIMEDIFF(fin,ini) (((*(__int64*)&fin)-(*(__int64*)&ini))/TIMER_RES_DIVIDER) - /* setting to millisces resolution by default with MSDEV */ - #ifndef TIMER_RES_DIVIDER - #define TIMER_RES_DIVIDER 1000 - #endif - #define SAMPLE_TIME_IMPLEMENTATION 1 -#elif HAS_TIME_H - #define NSECS_PER_SEC 1000000000 - #define EE_TIMER_TICKER_RATE 1000 - #define CORETIMETYPE struct timespec - #define GETMYTIME(_t) clock_gettime(CLOCK_REALTIME,_t) - #define MYTIMEDIFF(fin,ini) ((fin.tv_sec-ini.tv_sec)*(NSECS_PER_SEC/TIMER_RES_DIVIDER)+(fin.tv_nsec-ini.tv_nsec)/TIMER_RES_DIVIDER) - /* setting to 1/1000 of a second resolution by default with linux */ - #ifndef TIMER_RES_DIVIDER - #define TIMER_RES_DIVIDER 1000000 - #endif - #define SAMPLE_TIME_IMPLEMENTATION 1 -#else - // Defined for RISCV - #define NSECS_PER_SEC 1000000000 // TODO: What freq are we assuming? - #define EE_TIMER_TICKER_RATE 1000 // TODO: What is this? - #define CORETIMETYPE clock_t - #define read_csr(reg) ({ unsigned long __tmp; \ - asm volatile ("csrr %0, " #reg : "=r"(__tmp)); \ - __tmp; }) - #define GETMYTIME(_t) (*_t=read_csr(cycle)) - #define MYTIMEDIFF(fin,ini) ((fin)-(ini)) - #define TIMER_RES_DIVIDER 1 - #define SAMPLE_TIME_IMPLEMENTATION 1 -#endif -#define EE_TICKS_PER_SEC (NSECS_PER_SEC / TIMER_RES_DIVIDER) - -#if SAMPLE_TIME_IMPLEMENTATION -/** Define Host specific (POSIX), or target specific global time variables. */ -static CORETIMETYPE start_time_val, stop_time_val; - -/* Function: start_time - This function will be called right before starting the timed portion of the benchmark. - - Implementation may be capturing a system timer (as implemented in the example code) - or zeroing some system parameters - e.g. setting the cpu clocks cycles to 0. -*/ -void start_time(void) { - GETMYTIME(&start_time_val ); -#if CALLGRIND_RUN - CALLGRIND_START_INSTRUMENTATION -#endif -#if MICA - asm volatile("int3");/*1 */ -#endif -} -/* Function: stop_time - This function will be called right after ending the timed portion of the benchmark. - - Implementation may be capturing a system timer (as implemented in the example code) - or other system parameters - e.g. reading the current value of cpu cycles counter. -*/ -void stop_time(void) { -#if CALLGRIND_RUN - CALLGRIND_STOP_INSTRUMENTATION -#endif -#if MICA - asm volatile("int3");/*1 */ -#endif - GETMYTIME(&stop_time_val ); -} -/* Function: get_time - Return an abstract "ticks" number that signifies time on the system. - - Actual value returned may be cpu cycles, milliseconds or any other value, - as long as it can be converted to seconds by . - This methodology is taken to accomodate any hardware or simulated platform. - The sample implementation returns millisecs by default, - and the resolution is controlled by -*/ -CORE_TICKS get_time(void) { - CORE_TICKS elapsed=(CORE_TICKS)(MYTIMEDIFF(stop_time_val, start_time_val)); - return elapsed; -} -/* Function: time_in_secs - Convert the value returned by get_time to seconds. - - The type is used to accomodate systems with no support for floating point. - Default implementation implemented by the EE_TICKS_PER_SEC macro above. -*/ -secs_ret time_in_secs(CORE_TICKS ticks) { - secs_ret retval=((secs_ret)ticks) / (secs_ret)EE_TICKS_PER_SEC; - return retval; -} -#else -#error "Please implement timing functionality in core_portme.c" -#endif /* SAMPLE_TIME_IMPLEMENTATION */ - -ee_u32 default_num_contexts=MULTITHREAD; - -/* Function: portable_init - Target specific initialization code - Test for some common mistakes. -*/ -void portable_init(core_portable *p, int *argc, char *argv[]) -{ -#if PRINT_ARGS - int i; - for (i=0; i<*argc; i++) { - ee_printf("Arg[%d]=%s\n",i,argv[i]); - } -#endif - if (sizeof(ee_ptr_int) != sizeof(ee_u8 *)) { - ee_printf("ERROR! Please define ee_ptr_int to a type that holds a pointer!\n"); - } - if (sizeof(ee_u32) != 4) { - ee_printf("ERROR! Please define ee_u32 to a 32b unsigned type!\n"); - } -#if (MAIN_HAS_NOARGC && (SEED_METHOD==SEED_ARG)) - ee_printf("ERROR! Main has no argc, but SEED_METHOD defined to SEED_ARG!\n"); -#endif - -#if (MULTITHREAD>1) && (SEED_METHOD==SEED_ARG) - int nargs=*argc,i; - if ((nargs>1) && (*argv[1]=='M')) { - default_num_contexts=parseval(argv[1]+1); - if (default_num_contexts>MULTITHREAD) - default_num_contexts=MULTITHREAD; - /* Shift args since first arg is directed to the portable part and not to coremark main */ - --nargs; - for (i=1; i*/ - p->portable_id=1; -} -/* Function: portable_fini - Target specific final code -*/ -void portable_fini(core_portable *p) -{ - p->portable_id=0; -} - -#if (MULTITHREAD>1) - -/* Function: core_start_parallel - Start benchmarking in a parallel context. - - Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets. - Other implementations using MCAPI or other standards can easily be devised. -*/ -/* Function: core_stop_parallel - Stop a parallel context execution of coremark, and gather the results. - - Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets. - Other implementations using MCAPI or other standards can easily be devised. -*/ -#if USE_PTHREAD -ee_u8 core_start_parallel(core_results *res) { - return (ee_u8)pthread_create(&(res->port.thread),NULL,iterate,(void *)res); -} -ee_u8 core_stop_parallel(core_results *res) { - void *retval; - return (ee_u8)pthread_join(res->port.thread,&retval); -} -#elif USE_FORK -static int key_id=0; -ee_u8 core_start_parallel(core_results *res) { - key_t key=4321+key_id; - key_id++; - res->port.pid=fork(); - res->port.shmid=shmget(key, 8, IPC_CREAT | 0666); - if (res->port.shmid<0) { - ee_printf("ERROR in shmget!\n"); - } - if (res->port.pid==0) { - iterate(res); - res->port.shm=shmat(res->port.shmid, NULL, 0); - /* copy the validation values to the shared memory area and quit*/ - if (res->port.shm == (char *) -1) { - ee_printf("ERROR in child shmat!\n"); - } else { - memcpy(res->port.shm,&(res->crc),8); - shmdt(res->port.shm); - } - exit(0); - } - return 1; -} -ee_u8 core_stop_parallel(core_results *res) { - int status; - pid_t wpid = waitpid(res->port.pid,&status,WUNTRACED); - if (wpid != res->port.pid) { - ee_printf("ERROR waiting for child.\n"); - if (errno == ECHILD) ee_printf("errno=No such child %d\n",res->port.pid); - if (errno == EINTR) ee_printf("errno=Interrupted\n"); - return 0; - } - /* after process is done, get the values from the shared memory area */ - res->port.shm=shmat(res->port.shmid, NULL, 0); - if (res->port.shm == (char *) -1) { - ee_printf("ERROR in parent shmat!\n"); - return 0; - } - memcpy(&(res->crc),res->port.shm,8); - shmdt(res->port.shm); - return 1; -} -#elif USE_SOCKET -static int key_id=0; -ee_u8 core_start_parallel(core_results *res) { - int bound, buffer_length=8; - res->port.sa.sin_family = AF_INET; - res->port.sa.sin_addr.s_addr = htonl(0x7F000001); - res->port.sa.sin_port = htons(7654+key_id); - key_id++; - res->port.pid=fork(); - if (res->port.pid==0) { /* benchmark child */ - iterate(res); - res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); - if (-1 == res->port.sock) /* if socket failed to initialize, exit */ { - ee_printf("Error Creating Socket"); - } else { - int bytes_sent = sendto(res->port.sock, &(res->crc), buffer_length, 0,(struct sockaddr*)&(res->port.sa), sizeof (struct sockaddr_in)); - if (bytes_sent < 0) - ee_printf("Error sending packet: %s\n", strerror(errno)); - close(res->port.sock); /* close the socket */ - } - exit(0); - } - /* parent process, open the socket */ - res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); - bound = bind(res->port.sock,(struct sockaddr*)&(res->port.sa), sizeof(struct sockaddr)); - if (bound < 0) - ee_printf("bind(): %s\n",strerror(errno)); - return 1; -} -ee_u8 core_stop_parallel(core_results *res) { - int status; - int fromlen=sizeof(struct sockaddr); - int recsize = recvfrom(res->port.sock, &(res->crc), 8, 0, (struct sockaddr*)&(res->port.sa), &fromlen); - if (recsize < 0) { - ee_printf("Error in receive: %s\n", strerror(errno)); - return 0; - } - pid_t wpid = waitpid(res->port.pid,&status,WUNTRACED); - if (wpid != res->port.pid) { - ee_printf("ERROR waiting for child.\n"); - if (errno == ECHILD) ee_printf("errno=No such child %d\n",res->port.pid); - if (errno == EINTR) ee_printf("errno=Interrupted\n"); - return 0; - } - return 1; -} -#else /* no standard multicore implementation */ -#error "Please implement multicore functionality in core_portme.c to use multiple contexts." -#endif /* multithread implementations */ -#endif diff --git a/tests/riscv-coremark/riscv64/core_portme.h b/tests/riscv-coremark/riscv64/core_portme.h deleted file mode 100755 index 4e28afd36..000000000 --- a/tests/riscv-coremark/riscv64/core_portme.h +++ /dev/null @@ -1,296 +0,0 @@ -/* -Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Original Author: Shay Gal-on -*/ - -/* Topic: Description - This file contains configuration constants required to execute on different platforms -*/ -#ifndef CORE_PORTME_H -#define CORE_PORTME_H -/************************/ -/* Data types and settings */ -/************************/ -/* Configuration: HAS_FLOAT - Define to 1 if the platform supports floating point. -*/ -#ifndef HAS_FLOAT -#define HAS_FLOAT 1 -#endif -/* Configuration: HAS_TIME_H - Define to 1 if platform has the time.h header file, - and implementation of functions thereof. -*/ -#ifndef HAS_TIME_H -#define HAS_TIME_H 0 -#endif -/* Configuration: USE_CLOCK - Define to 1 if platform has the time.h header file, - and implementation of functions thereof. -*/ -#ifndef USE_CLOCK -#define USE_CLOCK 0 -#endif -/* Configuration: HAS_STDIO - Define to 1 if the platform has stdio.h. -*/ -#ifndef HAS_STDIO -#define HAS_STDIO 1 -#endif -/* Configuration: HAS_PRINTF - Define to 1 if the platform has stdio.h and implements the printf function. -*/ -#ifndef HAS_PRINTF -#define HAS_PRINTF 1 -#endif - -/* Configuration: CORE_TICKS - Define type of return from the timing functions. - */ -#if defined(_MSC_VER) -#include -typedef size_t CORE_TICKS; -#elif HAS_TIME_H -#include -typedef clock_t CORE_TICKS; -#else -/* Configuration: size_t and clock_t - Note these need to match the size of the clock output and the xLen the processor supports - */ -typedef unsigned long int size_t; -typedef unsigned long int clock_t; -typedef clock_t CORE_TICKS; -#endif - -/* Definitions: COMPILER_VERSION, COMPILER_FLAGS, MEM_LOCATION - Initialize these strings per platform -*/ -#ifndef COMPILER_VERSION - #ifdef __GNUC__ - #define COMPILER_VERSION "GCC"__VERSION__ - #else - #define COMPILER_VERSION "Please put compiler version here (e.g. gcc 4.1)" - #endif -#endif -#ifndef COMPILER_FLAGS - #define COMPILER_FLAGS FLAGS_STR /* "Please put compiler flags here (e.g. -o3)" */ -#endif -#ifndef MEM_LOCATION - #define MEM_LOCATION "Please put data memory location here\n\t\t\t(e.g. code in flash, data on heap etc)" - #define MEM_LOCATION_UNSPEC 1 -#endif - -/* Data Types: - To avoid compiler issues, define the data types that need ot be used for 8b, 16b and 32b in . - - *Imprtant*: - ee_ptr_int needs to be the data type used to hold pointers, otherwise coremark may fail!!! -*/ -typedef signed short ee_s16; -typedef unsigned short ee_u16; -typedef signed int ee_s32; -typedef double ee_f32; -typedef unsigned char ee_u8; -typedef unsigned int ee_u32; -typedef unsigned long long ee_ptr_int; -typedef size_t ee_size_t; -/* align an offset to point to a 32b value */ -#define align_mem(x) (void *)(4 + (((ee_ptr_int)(x) - 1) & ~3)) - -/* Configuration: SEED_METHOD - Defines method to get seed values that cannot be computed at compile time. - - Valid values: - SEED_ARG - from command line. - SEED_FUNC - from a system function. - SEED_VOLATILE - from volatile variables. -*/ -#ifndef SEED_METHOD -#define SEED_METHOD SEED_ARG -#endif - -/* Configuration: MEM_METHOD - Defines method to get a block of memry. - - Valid values: - MEM_MALLOC - for platforms that implement malloc and have malloc.h. - MEM_STATIC - to use a static memory array. - MEM_STACK - to allocate the data block on the stack (NYI). -*/ -#ifndef MEM_METHOD -#define MEM_METHOD MEM_MALLOC -#endif - -/* Configuration: MULTITHREAD - Define for parallel execution - - Valid values: - 1 - only one context (default). - N>1 - will execute N copies in parallel. - - Note: - If this flag is defined to more then 1, an implementation for launching parallel contexts must be defined. - - Two sample implementations are provided. Use or to enable them. - - It is valid to have a different implementation of and in , - to fit a particular architecture. -*/ -#ifndef MULTITHREAD -#define MULTITHREAD 1 -#endif - -/* Configuration: USE_PTHREAD - Sample implementation for launching parallel contexts - This implementation uses pthread_thread_create and pthread_join. - - Valid values: - 0 - Do not use pthreads API. - 1 - Use pthreads API - - Note: - This flag only matters if MULTITHREAD has been defined to a value greater then 1. -*/ -#ifndef USE_PTHREAD -#define USE_PTHREAD 0 -#endif - -/* Configuration: USE_FORK - Sample implementation for launching parallel contexts - This implementation uses fork, waitpid, shmget,shmat and shmdt. - - Valid values: - 0 - Do not use fork API. - 1 - Use fork API - - Note: - This flag only matters if MULTITHREAD has been defined to a value greater then 1. -*/ -#ifndef USE_FORK -#define USE_FORK 0 -#endif - -/* Configuration: USE_SOCKET - Sample implementation for launching parallel contexts - This implementation uses fork, socket, sendto and recvfrom - - Valid values: - 0 - Do not use fork and sockets API. - 1 - Use fork and sockets API - - Note: - This flag only matters if MULTITHREAD has been defined to a value greater then 1. -*/ -#ifndef USE_SOCKET -#define USE_SOCKET 0 -#endif - -/* Configuration: MAIN_HAS_NOARGC - Needed if platform does not support getting arguments to main. - - Valid values: - 0 - argc/argv to main is supported - 1 - argc/argv to main is not supported -*/ -#ifndef MAIN_HAS_NOARGC -#define MAIN_HAS_NOARGC 0 -#endif - -/* Configuration: MAIN_HAS_NORETURN - Needed if platform does not support returning a value from main. - - Valid values: - 0 - main returns an int, and return value will be 0. - 1 - platform does not support returning a value from main -*/ -#ifndef MAIN_HAS_NORETURN -#define MAIN_HAS_NORETURN 0 -#endif - -/* Variable: default_num_contexts - Number of contexts to spawn in multicore context. - Override this global value to change number of contexts used. - - Note: - This value may not be set higher then the define. - - To experiment, you can set the define to the highest value expected, and use argc/argv in the to set this value from the command line. -*/ -extern ee_u32 default_num_contexts; - -#if (MULTITHREAD>1) -#if USE_PTHREAD - #include - #define PARALLEL_METHOD "PThreads" -#elif USE_FORK - #include - #include - #include - #include - #include /* for memcpy */ - #define PARALLEL_METHOD "Fork" -#elif USE_SOCKET - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #define PARALLEL_METHOD "Sockets" -#else - #define PARALLEL_METHOD "Proprietary" - #error "Please implement multicore functionality in core_portme.c to use multiple contexts." -#endif /* Method for multithreading */ -#endif /* MULTITHREAD > 1 */ - -typedef struct CORE_PORTABLE_S { -#if (MULTITHREAD>1) - #if USE_PTHREAD - pthread_t thread; - #elif USE_FORK - pid_t pid; - int shmid; - void *shm; - #elif USE_SOCKET - pid_t pid; - int sock; - struct sockaddr_in sa; - #endif /* Method for multithreading */ -#endif /* MULTITHREAD>1 */ - ee_u8 portable_id; -} core_portable; - -/* target specific init/fini */ -void portable_init(core_portable *p, int *argc, char *argv[]); -void portable_fini(core_portable *p); - -#if (SEED_METHOD==SEED_VOLATILE) - #if (VALIDATION_RUN || PERFORMANCE_RUN || PROFILE_RUN) - #define RUN_TYPE_FLAG 1 - #else - #if (TOTAL_DATA_SIZE==1200) - #define PROFILE_RUN 1 - #else - #define PERFORMANCE_RUN 1 - #endif - #endif -#endif /* SEED_METHOD==SEED_VOLATILE */ - -#endif /* CORE_PORTME_H */ diff --git a/tests/riscv-coremark/riscv64/core_portme.mak b/tests/riscv-coremark/riscv64/core_portme.mak deleted file mode 100755 index edc341abc..000000000 --- a/tests/riscv-coremark/riscv64/core_portme.mak +++ /dev/null @@ -1,147 +0,0 @@ -# Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# Original Author: Shay Gal-on - -#File: core_portme.mak - -# Flag: RISCVTOOLS -# Use this flag to point to your RISCV tools -RISCVTOOLS=$(RISCV) -# Flag: RISCVTYPE -# Type of toolchain to use -RISCVTYPE=riscv64-unknown-elf -# Flag: OUTFLAG -# Use this flag to define how to to get an executable (e.g -o) -OUTFLAG= -o -# Flag: CC -# Use this flag to define compiler to use -CC = $(RISCVTOOLS)/bin/$(RISCVTYPE)-gcc -# Flag: CFLAGS -# Use this flag to define compiler options. Note, you can add compiler options from the command line using XCFLAGS="other flags" -#PORT_CFLAGS = -O2 -static -std=gnu99 -PORT_CFLAGS = -O2 -FLAGS_STR = "$(PORT_CFLAGS) $(XCFLAGS) $(XLFLAGS) $(LFLAGS_END)" -CFLAGS = $(PORT_CFLAGS) -I$(PORT_DIR) -I. -DFLAGS_STR=\"$(FLAGS_STR)\" -#Flag: LFLAGS_END -# Define any libraries needed for linking or other flags that should come at the end of the link line (e.g. linker scripts). -# Note: On certain platforms, the default clock_gettime implementation is supported but requires linking of librt. -LFLAGS_END += -# Flag: PORT_SRCS -# Port specific source files can be added here -PORT_SRCS = $(PORT_DIR)/core_portme.c -# Flag: LOAD -# Define this flag if you need to load to a target, as in a cross compile environment. - -# Flag: RUN -# Define this flag if running does not consist of simple invocation of the binary. -# In a cross compile environment, you need to define this. - -#For flashing and using a tera term macro, you could use -#LOAD = flash ADDR -#RUN = ttpmacro coremark.ttl - -#For copying to target and executing via SSH connection, you could use -#LOAD = scp $(OUTFILE) user@target:~ -#RUN = ssh user@target -c - -#For native compilation and execution -LOAD = echo Loading done -RUN = spike pk - -OEXT = .o -EXE = .riscv - -# Flag: SEPARATE_COMPILE -# Define if you need to separate compilation from link stage. -# In this case, you also need to define below how to create an object file, and how to link. -ifdef SEPARATE_COMPILE - -LD = $(RISCVTOOLS)/bin/$(RISCVTYPE)-gcc -OBJOUT = -o -LFLAGS = -OFLAG = -o -COUT = -c -# Flag: PORT_OBJS -# Port specific object files can be added here -PORT_OBJS = $(PORT_DIR)/core_portme$(OEXT) -PORT_CLEAN = *$(OEXT) - -$(OPATH)%$(OEXT) : %.c - $(CC) $(CFLAGS) $(XCFLAGS) $(COUT) $< $(OBJOUT) $@ - -endif - -# Target: port_prebuild -# Generate any files that are needed before actual build starts. -# E.g. generate profile guidance files. Sample PGO generation for gcc enabled with PGO=1 -# - First, check if PGO was defined on the command line, if so, need to add -fprofile-use to compile line. -# - Second, if PGO reference has not yet been generated, add a step to the prebuild that will build a profile-generate version and run it. -# Note - Using REBUILD=1 -# -# Use make PGO=1 to invoke this sample processing. - -ifdef PGO - ifeq (,$(findstring $(PGO),gen)) - PGO_STAGE=build_pgo_gcc - CFLAGS+=-fprofile-use - endif - PORT_CLEAN+=*.gcda *.gcno gmon.out -endif - -.PHONY: port_prebuild -port_prebuild: $(PGO_STAGE) - -.PHONY: build_pgo_gcc -build_pgo_gcc: - $(MAKE) PGO=gen XCFLAGS="$(XCFLAGS) -fprofile-generate -DTOTAL_DATA_SIZE=1200" ITERATIONS=10 gen_pgo_data REBUILD=1 - -# Target: port_postbuild -# Generate any files that are needed after actual build end. -# E.g. change format to srec, bin, zip in order to be able to load into flash -.PHONY: port_postbuild -port_postbuild: - -# Target: port_postrun -# Do platform specific after run stuff. -# E.g. reset the board, backup the logfiles etc. -.PHONY: port_postrun -port_postrun: - -# Target: port_prerun -# Do platform specific after run stuff. -# E.g. reset the board, backup the logfiles etc. -.PHONY: port_prerun -port_prerun: - -# Target: port_postload -# Do platform specific after load stuff. -# E.g. reset the reset power to the flash eraser -.PHONY: port_postload -port_postload: - -# Target: port_preload -# Do platform specific before load stuff. -# E.g. reset the reset power to the flash eraser -.PHONY: port_preload -port_preload: - -# FLAG: OPATH -# Path to the output folder. Default - current folder. -OPATH = ./ -MKDIR = mkdir -p - -# FLAG: PERL -# Define perl executable to calculate the geomean if running separate. -PERL=/usr/bin/perl diff --git a/tests/riscv-coremark/trace b/tests/riscv-coremark/trace deleted file mode 100644 index 7c76d0bfa..000000000 --- a/tests/riscv-coremark/trace +++ /dev/null @@ -1,48 +0,0 @@ -Imperas riscvOVPsimPlus - - -riscvOVPsimPlus (64-Bit) v20210329.0 Open Virtual Platform simulator from www.IMPERAS.com. -Copyright (c) 2005-2021 Imperas Software Ltd. Contains Imperas Proprietary Information. -Licensed Software, All Rights Reserved. -Visit www.IMPERAS.com for multicore debug, verification and analysis solutions. - -riscvOVPsimPlus started: Wed May 12 17:55:33 2021 - - -Info (GDBT_PORT) Host: Tera.Eng.HMC.Edu, Port: 55460 -Info (DBC_LGDB) Starting Debugger /cad/riscv/imperas-riscv-tests/riscv-ovpsim-plus/bin/Linux64/riscv-none-embed-gdb -Info (GDBT_WAIT) Waiting for remote debugger to connect... -Info (OR_OF) Target 'riscvOVPsim/cpu' has object file read from 'coremark.bare.riscv' -Info (OR_PH) Program Headers: -Info (OR_PH) Type Offset VirtAddr PhysAddr -Info (OR_PH) FileSiz MemSiz Flags Align -Info (OR_PD) LOAD 0x0000000000001000 0x0000000080000000 0x0000000080000000 -Info (OR_PD) 0x0000000000000204 0x0000000000000204 R-E 1000 -Info (OR_PD) LOAD 0x0000000000002000 0x0000000080001000 0x0000000080001000 -Info (OR_PD) 0x00000000000047e0 0x0000000000004ff0 RWE 1000 -Info (GDBT_CONNECTED) Client connected -Info (GDBT_GON) Client disappeared 'riscvOVPsim/cpu' -Info -Info --------------------------------------------------- -Info CPU 'riscvOVPsim/cpu' STATISTICS -Info Type : riscv (RV64GC) -Info Nominal MIPS : 100 -Info Final program counter : 0x80003558 -Info Simulated instructions: 1,455,608 -Info Simulated MIPS : 0.0 -Info --------------------------------------------------- -Info -Info --------------------------------------------------- -Info SIMULATION TIME STATISTICS -Info Simulated time : 0.02 seconds -Info User time : 99.23 seconds -Info System time : 254.08 seconds -Info Elapsed time : 1107.49 seconds -Info --------------------------------------------------- - -riscvOVPsimPlus finished: Wed May 12 18:14:04 2021 - - -riscvOVPsimPlus (64-Bit) v20210329.0 Open Virtual Platform simulator from www.IMPERAS.com. -Visit www.IMPERAS.com for multicore debug, verification and analysis solutions. - diff --git a/tests/riscv-coremark/transferobjdump.sh b/tests/riscv-coremark/transferobjdump.sh deleted file mode 100755 index 69578566a..000000000 --- a/tests/riscv-coremark/transferobjdump.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env bash -./build-coremark.sh - -riscv64-unknown-elf-objdump -D coremark.bare.riscv > coremarkcodemod.bare.riscv.objdump -cp coremarkcodemod.bare.riscv.objdump ~/riscv-wally/tests/imperas-riscv-tests/riscv-ovpsim-plus/examples/CoreMark/. -pushd ~/riscv-wally/tests/imperas-riscv-tests/riscv-ovpsim-plus/examples/CoreMark -./exe2memfile.pl coremarkcodemod.bare.riscv -popd diff --git a/wally-pipelined/testbench/testbench-coremark_bare.sv b/wally-pipelined/testbench/testbench-coremark_bare.sv index 86311b9a7..0b4590aaf 100644 --- a/wally-pipelined/testbench/testbench-coremark_bare.sv +++ b/wally-pipelined/testbench/testbench-coremark_bare.sv @@ -48,7 +48,8 @@ module testbench(); // pick tests based on modes supported initial - tests = {"../../tests/imperas-riscv-tests/riscv-ovpsim-plus/examples/CoreMark/coremarkcodemod.bare.riscv.memfile", "1000"}; +// tests = {"../../tests/imperas-riscv-tests/riscv-ovpsim-plus/examples/CoreMark/coremarkcodemod.bare.riscv.memfile", "1000"}; + tests = {"../../benchmarks/riscv-coremark/coremark.bare.riscv.memfile", "1000"}; string signame, memfilename; logic [31:0] GPIOPinsIn, GPIOPinsOut, GPIOPinsEn; logic UARTSin, UARTSout; From 069ea52ac094fe4a22d3c2ae1a5316cb09860220 Mon Sep 17 00:00:00 2001 From: David Harris Date: Thu, 18 Nov 2021 20:23:55 -0800 Subject: [PATCH 119/132] CoreMark cleanup --- benchmarks/riscv-coremark/.gitignore | 2 + benchmarks/riscv-coremark/.gitmodules | 3 + benchmarks/riscv-coremark/LICENSE | 29 + benchmarks/riscv-coremark/Makefile | 21 + benchmarks/riscv-coremark/README.md | 23 + benchmarks/riscv-coremark/build-coremark.sh | 15 + benchmarks/riscv-coremark/coremark/LICENSE.md | 100 ++ benchmarks/riscv-coremark/coremark/Makefile | 139 ++ benchmarks/riscv-coremark/coremark/README.md | 398 +++++ .../coremark/barebones/core_portme.c | 153 ++ .../coremark/barebones/core_portme.h | 210 +++ .../coremark/barebones/core_portme.mak | 87 + .../riscv-coremark/coremark/barebones/cvt.c | 127 ++ .../coremark/barebones/ee_printf.c | 700 ++++++++ .../riscv-coremark/coremark/core_list_join.c | 580 +++++++ .../riscv-coremark/coremark/core_main.c | 447 +++++ .../riscv-coremark/coremark/core_matrix.c | 359 ++++ .../riscv-coremark/coremark/core_state.c | 330 ++++ .../riscv-coremark/coremark/core_util.c | 249 +++ .../riscv-coremark/coremark/coremark.exe | Bin 0 -> 23200 bytes benchmarks/riscv-coremark/coremark/coremark.h | 183 ++ .../riscv-coremark/coremark/coremark.md5 | 6 + .../coremark/cygwin/core_portme.c | 336 ++++ .../coremark/cygwin/core_portme.h | 293 ++++ .../coremark/cygwin/core_portme.mak | 17 + .../riscv-coremark/coremark/docs/READM.md | 1 + .../coremark/docs/balance_O0_joined.png | Bin 0 -> 48672 bytes .../html/files/PIC32/core_portme-mak.html | 68 + .../docs/html/files/core_list_join-c.html | 58 + .../coremark/docs/html/files/core_main-c.html | 42 + .../docs/html/files/core_matrix-c.html | 56 + .../docs/html/files/core_state-c.html | 46 + .../coremark/docs/html/files/core_util-c.html | 42 + .../coremark/docs/html/files/coremark-h.html | 46 + .../docs/html/files/docs/core_state.png | Bin 0 -> 72093 bytes .../docs/html/files/linux/core_portme-c.html | 58 + .../docs/html/files/linux/core_portme-h.html | 72 + .../html/files/linux/core_portme-mak.html | 76 + .../coremark/docs/html/files/readme-txt.html | 71 + .../docs/html/files/release_notes-txt.html | 56 + .../coremark/docs/html/index.html | 1 + .../docs/html/index/BuildTargets.html | 31 + .../docs/html/index/Configuration.html | 51 + .../docs/html/index/Configurations.html | 45 + .../coremark/docs/html/index/Files.html | 35 + .../coremark/docs/html/index/Functions.html | 55 + .../coremark/docs/html/index/General.html | 75 + .../coremark/docs/html/index/General2.html | 47 + .../coremark/docs/html/index/Types.html | 31 + .../coremark/docs/html/index/Variables.html | 55 + .../coremark/docs/html/javascript/main.js | 836 ++++++++++ .../docs/html/javascript/searchdata.js | 212 +++ .../docs/html/search/BuildTargetsP.html | 18 + .../docs/html/search/ConfigurationC.html | 18 + .../docs/html/search/ConfigurationH.html | 18 + .../docs/html/search/ConfigurationM.html | 18 + .../docs/html/search/ConfigurationS.html | 18 + .../docs/html/search/ConfigurationT.html | 18 + .../docs/html/search/ConfigurationU.html | 18 + .../docs/html/search/ConfigurationsH.html | 20 + .../docs/html/search/ConfigurationsM.html | 20 + .../docs/html/search/ConfigurationsS.html | 20 + .../docs/html/search/ConfigurationsT.html | 20 + .../coremark/docs/html/search/FilesC.html | 18 + .../coremark/docs/html/search/FilesR.html | 18 + .../coremark/docs/html/search/FunctionsC.html | 18 + .../coremark/docs/html/search/FunctionsG.html | 18 + .../coremark/docs/html/search/FunctionsI.html | 18 + .../coremark/docs/html/search/FunctionsM.html | 18 + .../coremark/docs/html/search/FunctionsP.html | 18 + .../coremark/docs/html/search/FunctionsS.html | 18 + .../coremark/docs/html/search/FunctionsT.html | 18 + .../coremark/docs/html/search/GeneralB.html | 18 + .../coremark/docs/html/search/GeneralC.html | 18 + .../coremark/docs/html/search/GeneralD.html | 18 + .../coremark/docs/html/search/GeneralF.html | 18 + .../coremark/docs/html/search/GeneralG.html | 18 + .../coremark/docs/html/search/GeneralH.html | 18 + .../coremark/docs/html/search/GeneralI.html | 18 + .../coremark/docs/html/search/GeneralL.html | 18 + .../coremark/docs/html/search/GeneralM.html | 18 + .../coremark/docs/html/search/GeneralO.html | 18 + .../coremark/docs/html/search/GeneralP.html | 18 + .../coremark/docs/html/search/GeneralR.html | 18 + .../coremark/docs/html/search/GeneralS.html | 18 + .../coremark/docs/html/search/GeneralT.html | 18 + .../coremark/docs/html/search/GeneralU.html | 18 + .../coremark/docs/html/search/GeneralV.html | 18 + .../coremark/docs/html/search/GeneralW.html | 18 + .../coremark/docs/html/search/NoResults.html | 13 + .../coremark/docs/html/search/TypesS.html | 18 + .../coremark/docs/html/search/VariablesC.html | 18 + .../coremark/docs/html/search/VariablesD.html | 18 + .../coremark/docs/html/search/VariablesL.html | 18 + .../coremark/docs/html/search/VariablesO.html | 18 + .../coremark/docs/html/search/VariablesP.html | 18 + .../coremark/docs/html/search/VariablesR.html | 18 + .../coremark/docs/html/search/VariablesS.html | 18 + .../coremark/docs/html/styles/1.css | 767 +++++++++ .../coremark/docs/html/styles/2.css | 6 + .../coremark/docs/html/styles/main.css | 2 + .../coremark/freebsd/core_portme.mak | 17 + .../coremark/linux/core_portme.c | 338 ++++ .../coremark/linux/core_portme.h | 290 ++++ .../coremark/linux/core_portme.mak | 17 + .../coremark/linux64/core_portme.c | 336 ++++ .../coremark/linux64/core_portme.h | 291 ++++ .../coremark/linux64/core_portme.mak | 140 ++ .../coremark/macos/core_portme.mak | 18 + .../coremark/posix/core_portme.c | 419 +++++ .../coremark/posix/core_portme.h | 314 ++++ .../coremark/posix/core_portme.mak | 151 ++ .../posix/core_portme_posix_overrides.h | 28 + .../coremark/rtems/core_portme.mak | 18 + .../riscv-coremark/coremark/rtems/init.c | 63 + .../coremark/simple/core_portme.c | 149 ++ .../coremark/simple/core_portme.h | 208 +++ .../coremark/simple/core_portme.mak | 60 + .../riscv-coremark/extraPortmes/README.md | 7 + .../extraPortmes/cygwin/core_portme.c | 336 ++++ .../extraPortmes/cygwin/core_portme.h | 293 ++++ .../extraPortmes/cygwin/core_portme.mak | 17 + .../extraPortmes/linux/core_portme.c | 338 ++++ .../extraPortmes/linux/core_portme.h | 290 ++++ .../extraPortmes/linux/core_portme.mak | 17 + .../extraPortmes/linux64/core_portme.c | 336 ++++ .../extraPortmes/linux64/core_portme.h | 291 ++++ .../extraPortmes/linux64/core_portme.mak | 140 ++ .../riscv64-baremetal/core_portme.c | 382 +++++ .../riscv64-baremetal/core_portme.h | 296 ++++ .../riscv64-baremetal/core_portme.mak | 147 ++ .../riscv-coremark/riscv64-baremetal/crt.S | 237 +++ .../riscv64-baremetal/encoding.h | 1471 +++++++++++++++++ .../riscv-coremark/riscv64-baremetal/link.ld | 66 + .../riscv64-baremetal/syscallbackup.c | 1072 ++++++++++++ .../riscv64-baremetal/syscalls.c | 505 ++++++ .../riscv-coremark/riscv64-baremetal/util.h | 90 + .../riscv-coremark/riscv64/core_portme.c | 346 ++++ .../riscv-coremark/riscv64/core_portme.h | 296 ++++ .../riscv-coremark/riscv64/core_portme.mak | 147 ++ benchmarks/riscv-coremark/trace | 48 + benchmarks/riscv-coremark/transferobjdump.sh | 8 + 142 files changed, 18612 insertions(+) create mode 100644 benchmarks/riscv-coremark/.gitignore create mode 100644 benchmarks/riscv-coremark/.gitmodules create mode 100644 benchmarks/riscv-coremark/LICENSE create mode 100644 benchmarks/riscv-coremark/Makefile create mode 100644 benchmarks/riscv-coremark/README.md create mode 100755 benchmarks/riscv-coremark/build-coremark.sh create mode 100644 benchmarks/riscv-coremark/coremark/LICENSE.md create mode 100644 benchmarks/riscv-coremark/coremark/Makefile create mode 100644 benchmarks/riscv-coremark/coremark/README.md create mode 100644 benchmarks/riscv-coremark/coremark/barebones/core_portme.c create mode 100644 benchmarks/riscv-coremark/coremark/barebones/core_portme.h create mode 100755 benchmarks/riscv-coremark/coremark/barebones/core_portme.mak create mode 100644 benchmarks/riscv-coremark/coremark/barebones/cvt.c create mode 100644 benchmarks/riscv-coremark/coremark/barebones/ee_printf.c create mode 100644 benchmarks/riscv-coremark/coremark/core_list_join.c create mode 100644 benchmarks/riscv-coremark/coremark/core_main.c create mode 100644 benchmarks/riscv-coremark/coremark/core_matrix.c create mode 100644 benchmarks/riscv-coremark/coremark/core_state.c create mode 100644 benchmarks/riscv-coremark/coremark/core_util.c create mode 100755 benchmarks/riscv-coremark/coremark/coremark.exe create mode 100644 benchmarks/riscv-coremark/coremark/coremark.h create mode 100644 benchmarks/riscv-coremark/coremark/coremark.md5 create mode 100755 benchmarks/riscv-coremark/coremark/cygwin/core_portme.c create mode 100755 benchmarks/riscv-coremark/coremark/cygwin/core_portme.h create mode 100644 benchmarks/riscv-coremark/coremark/cygwin/core_portme.mak create mode 100644 benchmarks/riscv-coremark/coremark/docs/READM.md create mode 100644 benchmarks/riscv-coremark/coremark/docs/balance_O0_joined.png create mode 100644 benchmarks/riscv-coremark/coremark/docs/html/files/PIC32/core_portme-mak.html create mode 100644 benchmarks/riscv-coremark/coremark/docs/html/files/core_list_join-c.html create mode 100644 benchmarks/riscv-coremark/coremark/docs/html/files/core_main-c.html create mode 100644 benchmarks/riscv-coremark/coremark/docs/html/files/core_matrix-c.html create mode 100644 benchmarks/riscv-coremark/coremark/docs/html/files/core_state-c.html create mode 100644 benchmarks/riscv-coremark/coremark/docs/html/files/core_util-c.html create mode 100644 benchmarks/riscv-coremark/coremark/docs/html/files/coremark-h.html create mode 100644 benchmarks/riscv-coremark/coremark/docs/html/files/docs/core_state.png create mode 100644 benchmarks/riscv-coremark/coremark/docs/html/files/linux/core_portme-c.html create mode 100644 benchmarks/riscv-coremark/coremark/docs/html/files/linux/core_portme-h.html create mode 100644 benchmarks/riscv-coremark/coremark/docs/html/files/linux/core_portme-mak.html create mode 100644 benchmarks/riscv-coremark/coremark/docs/html/files/readme-txt.html create mode 100644 benchmarks/riscv-coremark/coremark/docs/html/files/release_notes-txt.html create mode 100644 benchmarks/riscv-coremark/coremark/docs/html/index.html create mode 100644 benchmarks/riscv-coremark/coremark/docs/html/index/BuildTargets.html create mode 100644 benchmarks/riscv-coremark/coremark/docs/html/index/Configuration.html create mode 100644 benchmarks/riscv-coremark/coremark/docs/html/index/Configurations.html create mode 100644 benchmarks/riscv-coremark/coremark/docs/html/index/Files.html create mode 100644 benchmarks/riscv-coremark/coremark/docs/html/index/Functions.html create mode 100644 benchmarks/riscv-coremark/coremark/docs/html/index/General.html create mode 100644 benchmarks/riscv-coremark/coremark/docs/html/index/General2.html create mode 100644 benchmarks/riscv-coremark/coremark/docs/html/index/Types.html create mode 100644 benchmarks/riscv-coremark/coremark/docs/html/index/Variables.html create mode 100644 benchmarks/riscv-coremark/coremark/docs/html/javascript/main.js create mode 100644 benchmarks/riscv-coremark/coremark/docs/html/javascript/searchdata.js create mode 100644 benchmarks/riscv-coremark/coremark/docs/html/search/BuildTargetsP.html create mode 100644 benchmarks/riscv-coremark/coremark/docs/html/search/ConfigurationC.html create mode 100644 benchmarks/riscv-coremark/coremark/docs/html/search/ConfigurationH.html create mode 100644 benchmarks/riscv-coremark/coremark/docs/html/search/ConfigurationM.html create mode 100644 benchmarks/riscv-coremark/coremark/docs/html/search/ConfigurationS.html create mode 100644 benchmarks/riscv-coremark/coremark/docs/html/search/ConfigurationT.html create mode 100644 benchmarks/riscv-coremark/coremark/docs/html/search/ConfigurationU.html create mode 100644 benchmarks/riscv-coremark/coremark/docs/html/search/ConfigurationsH.html create mode 100644 benchmarks/riscv-coremark/coremark/docs/html/search/ConfigurationsM.html create mode 100644 benchmarks/riscv-coremark/coremark/docs/html/search/ConfigurationsS.html create mode 100644 benchmarks/riscv-coremark/coremark/docs/html/search/ConfigurationsT.html create mode 100644 benchmarks/riscv-coremark/coremark/docs/html/search/FilesC.html create mode 100644 benchmarks/riscv-coremark/coremark/docs/html/search/FilesR.html create mode 100644 benchmarks/riscv-coremark/coremark/docs/html/search/FunctionsC.html create mode 100644 benchmarks/riscv-coremark/coremark/docs/html/search/FunctionsG.html create mode 100644 benchmarks/riscv-coremark/coremark/docs/html/search/FunctionsI.html create mode 100644 benchmarks/riscv-coremark/coremark/docs/html/search/FunctionsM.html create mode 100644 benchmarks/riscv-coremark/coremark/docs/html/search/FunctionsP.html create mode 100644 benchmarks/riscv-coremark/coremark/docs/html/search/FunctionsS.html create mode 100644 benchmarks/riscv-coremark/coremark/docs/html/search/FunctionsT.html create mode 100644 benchmarks/riscv-coremark/coremark/docs/html/search/GeneralB.html create mode 100644 benchmarks/riscv-coremark/coremark/docs/html/search/GeneralC.html create mode 100644 benchmarks/riscv-coremark/coremark/docs/html/search/GeneralD.html create mode 100644 benchmarks/riscv-coremark/coremark/docs/html/search/GeneralF.html create mode 100644 benchmarks/riscv-coremark/coremark/docs/html/search/GeneralG.html create mode 100644 benchmarks/riscv-coremark/coremark/docs/html/search/GeneralH.html create mode 100644 benchmarks/riscv-coremark/coremark/docs/html/search/GeneralI.html create mode 100644 benchmarks/riscv-coremark/coremark/docs/html/search/GeneralL.html create mode 100644 benchmarks/riscv-coremark/coremark/docs/html/search/GeneralM.html create mode 100644 benchmarks/riscv-coremark/coremark/docs/html/search/GeneralO.html create mode 100644 benchmarks/riscv-coremark/coremark/docs/html/search/GeneralP.html create mode 100644 benchmarks/riscv-coremark/coremark/docs/html/search/GeneralR.html create mode 100644 benchmarks/riscv-coremark/coremark/docs/html/search/GeneralS.html create mode 100644 benchmarks/riscv-coremark/coremark/docs/html/search/GeneralT.html create mode 100644 benchmarks/riscv-coremark/coremark/docs/html/search/GeneralU.html create mode 100644 benchmarks/riscv-coremark/coremark/docs/html/search/GeneralV.html create mode 100644 benchmarks/riscv-coremark/coremark/docs/html/search/GeneralW.html create mode 100644 benchmarks/riscv-coremark/coremark/docs/html/search/NoResults.html create mode 100644 benchmarks/riscv-coremark/coremark/docs/html/search/TypesS.html create mode 100644 benchmarks/riscv-coremark/coremark/docs/html/search/VariablesC.html create mode 100644 benchmarks/riscv-coremark/coremark/docs/html/search/VariablesD.html create mode 100644 benchmarks/riscv-coremark/coremark/docs/html/search/VariablesL.html create mode 100644 benchmarks/riscv-coremark/coremark/docs/html/search/VariablesO.html create mode 100644 benchmarks/riscv-coremark/coremark/docs/html/search/VariablesP.html create mode 100644 benchmarks/riscv-coremark/coremark/docs/html/search/VariablesR.html create mode 100644 benchmarks/riscv-coremark/coremark/docs/html/search/VariablesS.html create mode 100644 benchmarks/riscv-coremark/coremark/docs/html/styles/1.css create mode 100644 benchmarks/riscv-coremark/coremark/docs/html/styles/2.css create mode 100644 benchmarks/riscv-coremark/coremark/docs/html/styles/main.css create mode 100644 benchmarks/riscv-coremark/coremark/freebsd/core_portme.mak create mode 100755 benchmarks/riscv-coremark/coremark/linux/core_portme.c create mode 100755 benchmarks/riscv-coremark/coremark/linux/core_portme.h create mode 100644 benchmarks/riscv-coremark/coremark/linux/core_portme.mak create mode 100755 benchmarks/riscv-coremark/coremark/linux64/core_portme.c create mode 100755 benchmarks/riscv-coremark/coremark/linux64/core_portme.h create mode 100755 benchmarks/riscv-coremark/coremark/linux64/core_portme.mak create mode 100644 benchmarks/riscv-coremark/coremark/macos/core_portme.mak create mode 100644 benchmarks/riscv-coremark/coremark/posix/core_portme.c create mode 100644 benchmarks/riscv-coremark/coremark/posix/core_portme.h create mode 100755 benchmarks/riscv-coremark/coremark/posix/core_portme.mak create mode 100644 benchmarks/riscv-coremark/coremark/posix/core_portme_posix_overrides.h create mode 100644 benchmarks/riscv-coremark/coremark/rtems/core_portme.mak create mode 100644 benchmarks/riscv-coremark/coremark/rtems/init.c create mode 100644 benchmarks/riscv-coremark/coremark/simple/core_portme.c create mode 100644 benchmarks/riscv-coremark/coremark/simple/core_portme.h create mode 100755 benchmarks/riscv-coremark/coremark/simple/core_portme.mak create mode 100644 benchmarks/riscv-coremark/extraPortmes/README.md create mode 100755 benchmarks/riscv-coremark/extraPortmes/cygwin/core_portme.c create mode 100755 benchmarks/riscv-coremark/extraPortmes/cygwin/core_portme.h create mode 100644 benchmarks/riscv-coremark/extraPortmes/cygwin/core_portme.mak create mode 100755 benchmarks/riscv-coremark/extraPortmes/linux/core_portme.c create mode 100755 benchmarks/riscv-coremark/extraPortmes/linux/core_portme.h create mode 100644 benchmarks/riscv-coremark/extraPortmes/linux/core_portme.mak create mode 100755 benchmarks/riscv-coremark/extraPortmes/linux64/core_portme.c create mode 100755 benchmarks/riscv-coremark/extraPortmes/linux64/core_portme.h create mode 100755 benchmarks/riscv-coremark/extraPortmes/linux64/core_portme.mak create mode 100755 benchmarks/riscv-coremark/riscv64-baremetal/core_portme.c create mode 100755 benchmarks/riscv-coremark/riscv64-baremetal/core_portme.h create mode 100755 benchmarks/riscv-coremark/riscv64-baremetal/core_portme.mak create mode 100644 benchmarks/riscv-coremark/riscv64-baremetal/crt.S create mode 100644 benchmarks/riscv-coremark/riscv64-baremetal/encoding.h create mode 100644 benchmarks/riscv-coremark/riscv64-baremetal/link.ld create mode 100644 benchmarks/riscv-coremark/riscv64-baremetal/syscallbackup.c create mode 100644 benchmarks/riscv-coremark/riscv64-baremetal/syscalls.c create mode 100644 benchmarks/riscv-coremark/riscv64-baremetal/util.h create mode 100755 benchmarks/riscv-coremark/riscv64/core_portme.c create mode 100755 benchmarks/riscv-coremark/riscv64/core_portme.h create mode 100755 benchmarks/riscv-coremark/riscv64/core_portme.mak create mode 100644 benchmarks/riscv-coremark/trace create mode 100755 benchmarks/riscv-coremark/transferobjdump.sh diff --git a/benchmarks/riscv-coremark/.gitignore b/benchmarks/riscv-coremark/.gitignore new file mode 100644 index 000000000..0f2251abe --- /dev/null +++ b/benchmarks/riscv-coremark/.gitignore @@ -0,0 +1,2 @@ +coremark.riscv +coremark.bare.riscv \ No newline at end of file diff --git a/benchmarks/riscv-coremark/.gitmodules b/benchmarks/riscv-coremark/.gitmodules new file mode 100644 index 000000000..938028cb7 --- /dev/null +++ b/benchmarks/riscv-coremark/.gitmodules @@ -0,0 +1,3 @@ +[submodule "coremark"] + path = coremark + url = https://github.com/eembc/coremark diff --git a/benchmarks/riscv-coremark/LICENSE b/benchmarks/riscv-coremark/LICENSE new file mode 100644 index 000000000..860ca9cc6 --- /dev/null +++ b/benchmarks/riscv-coremark/LICENSE @@ -0,0 +1,29 @@ +BSD 3-Clause License + +Copyright (c) 2017, Christopher Celio +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/benchmarks/riscv-coremark/Makefile b/benchmarks/riscv-coremark/Makefile new file mode 100644 index 000000000..b66b8cb75 --- /dev/null +++ b/benchmarks/riscv-coremark/Makefile @@ -0,0 +1,21 @@ +coremark.bare.riscv.memfile: coremark.bare.riscv.objdump + exe2memfile.pl coremark.bare.riscv + +coremark.bare.riscv.objdump: coremark.bare.riscv + riscv64-unknown-elf-objdump -D coremark.bare.riscv > coremark.bare.riscv.objdump + +coremark.bare.riscv: + BASEDIR=${CUR_DIR} + RISCV=/courses/e190ax/riscvcompiler + CMPATH=coremark + #pushd ../../addins/coremark + # run the compile + echo "Start compilation" + + make -C ${CMPATH} PORT_DIR=${BASEDIR}/riscv64-baremetal compile RISCV=/courses/e190ax/riscvcompiler XCFLAGS=-march=rv64im + mv ${CMPATH}/coremark.bare.riscv . + +.PHONY: clean + +clean: + rm coremark.bare.riscv* \ No newline at end of file diff --git a/benchmarks/riscv-coremark/README.md b/benchmarks/riscv-coremark/README.md new file mode 100644 index 000000000..7c02eb1bf --- /dev/null +++ b/benchmarks/riscv-coremark/README.md @@ -0,0 +1,23 @@ +Coremark EEMBC Wrapper +====================== + +This repository provides the utility files to port [CoreMark EEMBC](https://www.eembc.org/coremark/) to RISC-V. + +### Requirements + + - You must have installed the RISC-V tools + +### Setup + + - `git submodule update --init` + - Run the `./build-coremark.sh` script that does the following + - Builds a version of Coremark for Linux or pk (coremark.riscv) + - Builds a version of Coremark for bare-metal (coremark.bare.riscv) + - Copies the output binaries into this directory + +### Default Files + +The default files target **RV64GC** and use minimal amount of compilation flags. Additionally, the `*.mak` file in the `riscv64` +folder setups `spike pk` as the default `run` rule. + +Feel free to change these to suit your needs. diff --git a/benchmarks/riscv-coremark/build-coremark.sh b/benchmarks/riscv-coremark/build-coremark.sh new file mode 100755 index 000000000..78c3d709c --- /dev/null +++ b/benchmarks/riscv-coremark/build-coremark.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +set -e + +BASEDIR=$PWD + +# run the compile +echo "Start compilation" + +#make -C ../../addins/coremark PORT_DIR=$BASEDIR/riscv64-baremetal compile RISCV=/courses/e190ax/riscvcompiler XCFLAGS="-march=rv64im" +#mv ../../addins/coremark/coremark.bare.riscv $BASEDIR +make -C coremark PORT_DIR=$BASEDIR/riscv64-baremetal compile RISCV=/courses/e190ax/riscvcompiler XCFLAGS="-march=rv64im" +mv coremark/coremark.bare.riscv $BASEDIR +riscv64-unknown-elf-objdump -D coremark.bare.riscv > coremark.bare.riscv.objdump #> coremarkcodemod.bare.riscv.objdump +exe2memfile.pl coremark.bare.riscv diff --git a/benchmarks/riscv-coremark/coremark/LICENSE.md b/benchmarks/riscv-coremark/coremark/LICENSE.md new file mode 100644 index 000000000..14e53e9ee --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/LICENSE.md @@ -0,0 +1,100 @@ +# COREMARK® ACCEPTABLE USE AGREEMENT + +This ACCEPTABLE USE AGREEMENT (this “Agreementâ€) is offered by Embedded Microprocessor Benchmark Consortium, a California nonprofit corporation (“Licensorâ€), to users of its CoreMark® software (“Licenseeâ€) exclusively on the following terms. + +Licensor offers benchmarking software (“Softwareâ€) pursuant to an open source license, but carefully controls use of its benchmarks and their associated goodwill. Licensor has registered its trademark in one of the benchmarks available through the Software, COREMARK, Ser. No. 85/487,290; Reg. No. 4,179,307 (the “Trademarkâ€), and promotes the use of a standard metric as a benchmark for assessing the performance of embedded systems. Solely on the terms described herein, Licensee may use and display the Trademark in connection with the generation of data regarding measurement and analysis of computer and embedded system benchmarking via the Software (the “Licensed Useâ€). + +## Article 1 – License Grant. +1.1. License. Subject to the terms and conditions of this Agreement, Licensor hereby grants to Licensee, and Licensee hereby accepts from Licensor, a personal, non-exclusive, royalty-free, revocable right and license to use and display the Trademark during the term of this Agreement (the “Termâ€), solely and exclusively in connection with the Licensed Use. During the Term, Licensee (i) shall not modify or otherwise create derivative works of the Trademark, and (ii) may use the Trademark only to the extent permitted under this License. Neither Licensee nor any affiliate or agent thereof shall otherwise use the Trademark without the prior express written consent of Licensor, which may be withheld in its sole and absolute discretion. All rights not expressly granted to Licensee hereunder shall remain the exclusive property of Licensor. + +1.2. Modifications to the Software. Licensee shall not use the Trademark in connection with any use of a modified, derivative, or otherwise altered copy of the Software. + +1.3. Licensor’s Use. Nothing in this Agreement shall preclude Licensor or any of its successors or assigns from using or permitting other entities to use the Trademark, whether or not such entity directly or indirectly competes or conflicts with Licensee’s Licensed Use in any manner. + +1.4. Term and Termination. This Agreement is perpetual unless terminated by either of the parties. Licensee may terminate this Agreement for convenience, without cause or liability, for any reason or for no reason whatsoever, upon ten (10) business days written notice. Licensor may terminate this Agreement effective immediately upon notice of breach. Upon termination, Licensee shall immediately remove all implementations of the Trademark from the Licensed Use, and delete all digitals files and records of all materials related to the Trademark. + +## Article 2 – Ownership. +2.1. Ownership. Licensee acknowledges and agrees that Licensor is the owner of all right, title, and interest in and to the Trademark, and all such right, title, and interest shall remain with Licensor. Licensee shall not contest, dispute, challenge, oppose, or seek to cancel Licensor’s right, title, and interest in and to the Trademark. Licensee shall not prosecute any application for registration of the Trademark. Licensee shall display appropriate notices regarding ownership of the Trademark in connection with the Licensed Use. + +2.2. Goodwill. Licensee acknowledges that Licensee shall not acquire any right, title, or interest in the Trademark by virtue of this Agreement other than the license granted hereunder, and disclaims any such right, title, interest, or ownership. All goodwill and reputation generated by Licensee’s use of the Trademark shall inure to the exclusive benefit of Licensor. Licensee shall not by any act or omission use the Trademark in any manner that disparages or reflects adversely on Licensor or its Licensed Use or reputation. Licensee shall not take any action that would interfere with or prejudice Licensor’s ownership or registration of the Trademark, the validity of the Trademark or the validity of the license granted by this Agreement. If Licensor determines and notifies Licensee that any act taken in connection with the Licensed Use (i) is inaccurate, unlawful or offensive to good taste; (ii) fails to provide for proper trademark notices, or (iii) otherwise violates Licensee’s obligations under this Agreement, the license granted under this Agreement shall terminate. + +## Article 3 – Indemnification. +3.1. Indemnification Generally. Licensee agrees to indemnify, defend, and hold harmless (collectively “indemnify†or “indemnificationâ€) Licensor, including Licensor’s members, managers, officers, and employees (collectively “Related Personsâ€), from and against, and pay or reimburse Licensor and such Related Persons for, any and all third-party actions, claims, demands, proceedings, investigations, inquiries (collectively, “Claimsâ€), and any and all liabilities, obligations, fines, deficiencies, costs, expenses, royalties, losses, and damages (including reasonable outside counsel fees and expenses) associated with such Claims, to the extent that such Claim arises out of (i) Licensee’s material breach of this Agreement, or (ii) any allegation(s) that Licensee’s actions infringe or violate any third-party intellectual property right, including without limitation, any U.S. copyright, patent, or trademark, or are otherwise found to be tortious or criminal (whether or not such indemnified person is a named party in a legal proceeding). + +3.2. Notice and Defense of Claims. Licensor shall promptly notify Licensee of any Claim for which indemnification is sought, following actual knowledge of such Claim, provided however that the failure to give such notice shall not relieve Licensee of its obligations hereunder except to the extent that Licensee is materially prejudiced by such failure. In the event that any third-party Claim is brought, Licensee shall have the right and option to undertake and control the defense of such action with counsel of its choice, provided however that (i) Licensor at its own expense may participate and appear on an equal footing with Licensee in the defense of any such Claim, (ii) Licensor may undertake and control such defense in the event of the material failure of Licensee to undertake and control the same; and (iii) the defense of any Claim relating to the intellectual property rights of Licensor or its licensors and any related counterclaims shall be solely controlled by Licensor with counsel of its choice. Licensee shall not consent to judgment or concede or settle or compromise any Claim without the prior written approval of Licensor (whose approval shall not be unreasonably withheld), unless such concession or settlement or compromise includes a full and unconditional release of Licensor and any applicable Related Persons from all liabilities in respect of such Claim. + +## Article 4 – Miscellaneous. +4.1. Relationship of the Parties. This Agreement does not create a partnership, franchise, joint venture, agency, fiduciary, or employment relationship between the parties. + +4.2. No Third-Party Beneficiaries. Except for the rights of Related Persons under Article 3 (Indemnification), there are no third-party beneficiaries to this Agreement. + +4.3. Assignment. Licensee’s rights hereunder are non-assignable, and may not be sublicensed. + +4.4. Equitable Relief. Licensee acknowledges that the remedies available at law for any breach of this Agreement will, by their nature, be inadequate. Accordingly, Licensor may obtain injunctive relief or other equitable relief to restrain a breach or threatened breach of this Agreement or to specifically enforce this Agreement, without proving that any monetary damages have been sustained, and without the requirement of posting of a bond prior to obtaining such equitable relief. + +4.5. Governing Law. This Agreement will be interpreted, construed, and enforced in all respects in accordance with the laws of the State of California, without reference to its conflict of law principles. + +4.6. Attorneys’ Fees. If any legal action, arbitration or other proceeding is brought for the enforcement of this Agreement, or because of an alleged dispute, breach, default, or misrepresentation in connection with any of the provisions of this Agreement, the successful or prevailing party shall be entitled to recover its reasonable attorneys’ fees and other reasonable costs incurred in that action or proceeding, in addition to any other relief to which it may be entitled. + +4.7. Amendment; Waiver. This Agreement may not be amended, nor may any rights under it be waived, except in writing by Licensor. + +4.8. Severability. If any provision of this Agreement is held by a court of competent jurisdiction to be contrary to law, the provision shall be modified by the court and interpreted so as best to accomplish the objectives of the original provision to the fullest extent +permitted by law, and the remaining provisions of this Agreement shall remain in effect. + +4.9. Entire Agreement. This Agreement constitutes the entire agreement between the parties and supersedes all prior and contemporaneous agreements, proposals or representations, written or oral, concerning its subject matter. + + +# Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ + +## TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + You must give any other recipients of the Work or Derivative Works a copy of this License; and + You must cause any modified files to carry prominent notices stating that You changed the files; and + You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS diff --git a/benchmarks/riscv-coremark/coremark/Makefile b/benchmarks/riscv-coremark/coremark/Makefile new file mode 100644 index 000000000..51760d1dd --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/Makefile @@ -0,0 +1,139 @@ +# Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Original Author: Shay Gal-on + +# Make sure the default target is to simply build and run the benchmark. +RSTAMP = v1.0 + +.PHONY: run score +run: $(OUTFILE) rerun score + +score: + @echo "Check run1.log and run2.log for results." + @echo "See README.md for run and reporting rules." + +ifndef PORT_DIR +# Ports for a couple of common self hosted platforms +UNAME=$(shell if command -v uname 2> /dev/null; then uname ; fi) +ifneq (,$(findstring CYGWIN,$(UNAME))) +PORT_DIR=cygwin +endif +ifneq (,$(findstring Linux,$(UNAME))) +MACHINE=$(shell uname -m) +ifneq (,$(findstring 64,$(MACHINE))) +PORT_DIR=linux64 +else +PORT_DIR=linux +endif +endif +endif +ifndef PORT_DIR +$(error PLEASE define PORT_DIR! (e.g. make PORT_DIR=simple)) +endif +vpath %.c $(PORT_DIR) +vpath %.h $(PORT_DIR) +vpath %.mak $(PORT_DIR) +include $(PORT_DIR)/core_portme.mak + +ifndef $(ITERATIONS) +ITERATIONS=0 +endif +ifdef REBUILD +FORCE_REBUILD=force_rebuild +endif + +CFLAGS += -DITERATIONS=$(ITERATIONS) + +CORE_FILES = core_list_join core_main core_matrix core_state core_util +ORIG_SRCS = $(addsuffix .c,$(CORE_FILES)) +SRCS = $(ORIG_SRCS) $(PORT_SRCS) +OBJS = $(addprefix $(OPATH),$(addsuffix $(OEXT),$(CORE_FILES)) $(PORT_OBJS)) +OUTNAME = coremark$(EXE) +OUTFILE = $(OPATH)$(OUTNAME) +LOUTCMD = $(OFLAG) $(OUTFILE) $(LFLAGS_END) +OUTCMD = $(OUTFLAG) $(OUTFILE) $(LFLAGS_END) + +HEADERS = coremark.h +CHECK_FILES = $(ORIG_SRCS) $(HEADERS) + +$(OPATH): + $(MKDIR) $(OPATH) + +.PHONY: compile link +ifdef SEPARATE_COMPILE +$(OPATH)$(PORT_DIR): + $(MKDIR) $(OPATH)$(PORT_DIR) + +compile: $(OPATH) $(OPATH)$(PORT_DIR) $(OBJS) $(HEADERS) +link: compile + $(LD) $(LFLAGS) $(XLFLAGS) $(OBJS) $(LOUTCMD) + +else + +compile: $(OPATH) $(SRCS) $(HEADERS) + $(CC) $(CFLAGS) $(XCFLAGS) $(SRCS) $(OUTCMD) +link: compile + @echo "Link performed along with compile" + +endif + +$(OUTFILE): $(SRCS) $(HEADERS) Makefile core_portme.mak $(FORCE_REBUILD) + $(MAKE) port_prebuild + $(MAKE) link + $(MAKE) port_postbuild + +.PHONY: rerun +rerun: + $(MAKE) XCFLAGS="$(XCFLAGS) -DPERFORMANCE_RUN=1" load run1.log + $(MAKE) XCFLAGS="$(XCFLAGS) -DVALIDATION_RUN=1" load run2.log + +PARAM1=$(PORT_PARAMS) 0x0 0x0 0x66 $(ITERATIONS) +PARAM2=$(PORT_PARAMS) 0x3415 0x3415 0x66 $(ITERATIONS) +PARAM3=$(PORT_PARAMS) 8 8 8 $(ITERATIONS) + +run1.log-PARAM=$(PARAM1) 7 1 2000 +run2.log-PARAM=$(PARAM2) 7 1 2000 +run3.log-PARAM=$(PARAM3) 7 1 1200 + +run1.log run2.log run3.log: load + $(MAKE) port_prerun + $(RUN) $(OUTFILE) $($(@)-PARAM) > $(OPATH)$@ + $(MAKE) port_postrun + +.PHONY: gen_pgo_data +gen_pgo_data: run3.log + +.PHONY: load +load: $(OUTFILE) + $(MAKE) port_preload + $(LOAD) $(OUTFILE) + $(MAKE) port_postload + +.PHONY: clean +clean: + rm -f $(OUTFILE) $(OPATH)*.log *.info $(OPATH)index.html $(PORT_CLEAN) + +.PHONY: force_rebuild +force_rebuild: + echo "Forcing Rebuild" + +.PHONY: check +check: + md5sum -c coremark.md5 + +ifdef ETC +# Targets related to testing and releasing CoreMark. Not part of the general release! +include Makefile.internal +endif diff --git a/benchmarks/riscv-coremark/coremark/README.md b/benchmarks/riscv-coremark/coremark/README.md new file mode 100644 index 000000000..16b54b7b3 --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/README.md @@ -0,0 +1,398 @@ + +# Introduction + +CoreMark's primary goals are simplicity and providing a method for testing only a processor's core features. For more information about EEMBC's comprehensive embedded benchmark suites, please see www.eembc.org. + +For a more compute-intensive version of CoreMark that uses larger datasets and execution loops taken from common applications, please check out EEMBC's [CoreMark-PRO](https://www.github.com/eembc/coremark-pro) benchmark, also on GitHub. + +# Building and Running + +To build and run the benchmark, type + +`> make` + +Full results are available in the files `run1.log` and `run2.log`. CoreMark result can be found in `run1.log`. + +## Cross Compiling + +For cross compile platforms please adjust `core_portme.mak`, `core_portme.h` (and possibly `core_portme.c`) according to the specific platform used. When porting to a new platform, it is recommended to copy one of the default port folders (e.g. `mkdir && cp linux/* `), adjust the porting files, and run: +~~~ +% make PORT_DIR= +~~~ + +## Make Targets +`run` - Default target, creates `run1.log` and `run2.log`. +`run1.log` - Run the benchmark with performance parameters, and output to `run1.log` +`run2.log` - Run the benchmark with validation parameters, and output to `run2.log` +`run3.log` - Run the benchmark with profile generation parameters, and output to `run3.log` +`compile` - compile the benchmark executable +`link` - link the benchmark executable +`check` - test MD5 of sources that may not be modified +`clean` - clean temporary files + +### Make flag: `ITERATIONS` +By default, the benchmark will run between 10-100 seconds. To override, use `ITERATIONS=N` +~~~ +% make ITERATIONS=10 +~~~ +Will run the benchmark for 10 iterations. It is recommended to set a specific number of iterations in certain situations e.g.: + +* Running with a simulator +* Measuring power/energy +* Timing cannot be restarted + +Minimum required run time: **Results are only valid for reporting if the benchmark ran for at least 10 secs!** + +### Make flag: `XCFLAGS` +To add compiler flags from the command line, use `XCFLAGS` e.g.: + +~~~ +% make XCFLAGS="-g -DMULTITHREAD=4 -DUSE_FORK=1" +~~~ + +### Make flag: `CORE_DEBUG` + +Define to compile for a debug run if you get incorrect CRC. + +~~~ +% make XCFLAGS="-DCORE_DEBUG=1" +~~~ + +### Make flag: `REBUILD` + +Force a rebuild of the executable. + +## Systems Without `make` +The following files need to be compiled: +* `core_list_join.c` +* `core_main.c` +* `core_matrix.c` +* `core_state.c` +* `core_util.c` +* `PORT_DIR/core_portme.c` + +For example: +~~~ +% gcc -O2 -o coremark.exe core_list_join.c core_main.c core_matrix.c core_state.c core_util.c simple/core_portme.c -DPERFORMANCE_RUN=1 -DITERATIONS=1000 +% ./coremark.exe > run1.log +~~~ +The above will compile the benchmark for a performance run and 1000 iterations. Output is redirected to `run1.log`. + +# Parallel Execution +Use `XCFLAGS=-DMULTITHREAD=N` where N is number of threads to run in parallel. Several implementations are available to execute in multiple contexts, or you can implement your own in `core_portme.c`. + +~~~ +% make XCFLAGS="-DMULTITHREAD=4 -DUSE_PTHREAD" +~~~ + +The above will compile the benchmark for execution on 4 cores, using POSIX Threads API. + +Note: linking may fail on the previous command if your linker does not automatically add the `pthread` library. If you encounter `undefined reference` errors, please modify the `core_portme.mak` file for your platform, (e.g. `linux/core_portme.mak`) and add `-lpthread` to the `LFLAGS_END` parameter. + +# Run Parameters for the Benchmark Executable +CoreMark's executable takes several parameters as follows (but only if `main()` accepts arguments): +1st - A seed value used for initialization of data. +2nd - A seed value used for initialization of data. +3rd - A seed value used for initialization of data. +4th - Number of iterations (0 for auto : default value) +5th - Reserved for internal use. +6th - Reserved for internal use. +7th - For malloc users only, ovreride the size of the input data buffer. + +The run target from make will run coremark with 2 different data initialization seeds. + +## Alternative parameters: +If not using `malloc` or command line arguments are not supported, the buffer size +for the algorithms must be defined via the compiler define `TOTAL_DATA_SIZE`. +`TOTAL_DATA_SIZE` must be set to 2000 bytes (default) for standard runs. +The default for such a target when testing different configurations could be: + +~~~ +% make XCFLAGS="-DTOTAL_DATA_SIZE=6000 -DMAIN_HAS_NOARGC=1" +~~~ + +# Submitting Results + +CoreMark results can be submitted on the web. Open a web browser and go to the [submission page](https://www.eembc.org/coremark/submit.php). After registering an account you may enter a score. + +# Run Rules +What is and is not allowed. + +## Required +1. The benchmark needs to run for at least 10 seconds. +2. All validation must succeed for seeds `0,0,0x66` and `0x3415,0x3415,0x66`, buffer size of 2000 bytes total. + * If not using command line arguments to main: +~~~ + % make XCFLAGS="-DPERFORMANCE_RUN=1" REBUILD=1 run1.log + % make XCFLAGS="-DVALIDATION_RUN=1" REBUILD=1 run2.log +~~~ +3. If using profile guided optimization, profile must be generated using seeds of `8,8,8`, and buffer size of 1200 bytes total. +~~~ + % make XCFLAGS="-DTOTAL_DATA_SIZE=1200 -DPROFILE_RUN=1" REBUILD=1 run3.log +~~~ +4. All source files must be compiled with the same flags. +5. All data type sizes must match size in bits such that: + * `ee_u8` is an unsigned 8-bit datatype. + * `ee_s16` is a signed 16-bit datatype. + * `ee_u16` is an unsigned 16-bit datatype. + * `ee_s32` is a signed 32-bit datatype. + * `ee_u32` is an unsigned 32-bit datatype. + +## Allowed + +1. Changing number of iterations +2. Changing toolchain and build/load/run options +3. Changing method of acquiring a data memory block +5. Changing the method of acquiring seed values +6. Changing implementation `in core_portme.c` +7. Changing configuration values in `core_portme.h` +8. Changing `core_portme.mak` + +## NOT ALLOWED +1. Changing of source file other then `core_portme*` (use `make check` to validate) + +# Reporting rules +Use the following syntax to report results on a data sheet: + +CoreMark 1.0 : N / C [/ P] [/ M] + +N - Number of iterations per second with seeds 0,0,0x66,size=2000) + +C - Compiler version and flags + +P - Parameters such as data and code allocation specifics + +* This parameter *may* be omitted if all data was allocated on the heap in RAM. +* This parameter *may not* be omitted when reporting CoreMark/MHz + +M - Type of parallel execution (if used) and number of contexts +* This parameter may be omitted if parallel execution was not used. + +e.g.: + +~~~ +CoreMark 1.0 : 128 / GCC 4.1.2 -O2 -fprofile-use / Heap in TCRAM / FORK:2 +~~~ +or +~~~ +CoreMark 1.0 : 1400 / GCC 3.4 -O4 +~~~ + +If reporting scaling results, the results must be reported as follows: + +CoreMark/MHz 1.0 : N / C / P [/ M] + +P - When reporting scaling results, memory parameter must also indicate memory frequency:core frequency ratio. +1. If the core has cache and cache frequency to core frequency ratio is configurable, that must also be included. + +e.g.: + +~~~ +CoreMark/MHz 1.0 : 1.47 / GCC 4.1.2 -O2 / DDR3(Heap) 30:1 Memory 1:1 Cache +~~~ + +# Log File Format +The log files have the following format + +~~~ +2K performance run parameters for coremark. (Run type) +CoreMark Size : 666 (Buffer size) +Total ticks : 25875 (platform dependent value) +Total time (secs) : 25.875000 (actual time in seconds) +Iterations/Sec : 3864.734300 (Performance value to report) +Iterations : 100000 (number of iterations used) +Compiler version : GCC3.4.4 (Compiler and version) +Compiler flags : -O2 (Compiler and linker flags) +Memory location : Code in flash, data in on chip RAM +seedcrc : 0xe9f5 (identifier for the input seeds) +[0]crclist : 0xe714 (validation for list part) +[0]crcmatrix : 0x1fd7 (validation for matrix part) +[0]crcstate : 0x8e3a (validation for state part) +[0]crcfinal : 0x33ff (iteration dependent output) +Correct operation validated. See README.md for run and reporting rules. (*Only when run is successful*) +CoreMark 1.0 : 6508.490622 / GCC3.4.4 -O2 / Heap (*Only on a successful performance run*) +~~~ + +# Theory of Operation + +This section describes the initial goals of CoreMark and their implementation. + +## Small and easy to understand + +* X number of source code lines for timed portion of the benchmark. +* Meaningful names for variables and functions. +* Comments for each block of code more than 10 lines long. + +## Portability + +A thin abstraction layer will be provided for I/O and timing in a separate file. All I/O and timing of the benchmark will be done through this layer. + +### Code / data size + +* Compile with gcc on x86 and make sure all sizes are according to requirements. +* If dynamic memory allocation is used, take total memory allocated into account as well. +* Avoid recursive functions and keep track of stack usage. +* Use the same memory block as data site for all algorithms, and initialize the data before each algorithm – while this means that initialization with data happens during the timed portion, it will only happen once during the timed portion and so have negligible effect on the results. + +## Controlled output + +This may be the most difficult goal. Compilers are constantly improving and getting better at analyzing code. To create work that cannot be computed at compile time and must be computed at run time, we will rely on two assumptions: + +* Some system functions (e.g. time, scanf) and parameters cannot be computed at compile time. In most cases, marking a variable volatile means the compiler is force to read this variable every time it is read. This will be used to introduce a factor into the input that cannot be precomputed at compile time. Since the results are input dependent, that will make sure that computation has to happen at run time. + +* Either a system function or I/O (e.g. scanf) or command line parameters or volatile variables will be used before the timed portion to generate data which is not available at compile time. Specific method used is not relevant as long as it can be controlled, and that it cannot be computed or eliminated by the compiler at compile time. E.g. if the clock() functions is a compiler stub, it may not be used. The derived values will be reported on the output so that verification can be done on a different machine. + +* We cannot rely on command line parameters since some embedded systems do not have the capability to provide command line parameters. All 3 methods above will be implemented (time based, scanf and command line parameters) and all 3 are valid if the compiler cannot determine the value at compile time. + +* It is important to note that The actual values that are to be supplied at run time will be standardized. The methodology is not intended to provide random data, but simply to provide controlled data that cannot be precomputed at compile time. + +* Printed results must be valid at run time. This will be used to make sure the computation has been executed. + +* Some embedded systems do not provide “printf†or other I/O functionality. All I/O will be done through a thin abstraction interface to allow execution on such systems (e.g. allow output via JTAG). + +## Key Algorithms + +### Linked List + +The following linked list structure will be used: + +~~~ +typedef struct list_data_s { + ee_s16 data16; + ee_s16 idx; +} list_data; + +typedef struct list_head_s { + struct list_head_s *next; + struct list_data_s *info; +} list_head; +~~~ + +While adding a level of indirection accessing the data, this structure is realistic and used in many embedded applications for small to medium lists. + +The list itself will be initialized on a block of memory that will be passed in to the initialization function. While in general linked lists use malloc for new nodes, embedded applications sometime control the memory for small data structures such as arrays and lists directly to avoid the overhead of system calls, so this approach is realistic. + +The linked list will be initialized such that 1/4 of the list pointers point to sequential areas in memory, and 3/4 of the list pointers are distributed in a non sequential manner. This is done to emulate a linked list that had add/remove happen for a while disrupting the neat order, and then a series of adds that are likely to come from sequential memory locations. + +For the benchmark itself: +- Multiple find operations are going to be performed. These find operations may result in the whole list being traversed. The result of each find will become part of the output chain. +- The list will be sorted using merge sort based on the data16 value, and then derive CRC of the data16 item in order for part of the list. The CRC will become part of the output chain. +- The list will be sorted again using merge sort based on the idx value. This sort will guarantee that the list is returned to the primary state before leaving the function, so that multiple iterations of the function will have the same result. CRC of the data16 for part of the list will again be calculated and become part of the output chain. + +The actual `data16` in each cell will be pseudo random based on a single 16b input that cannot be determined at compile time. In addition, the part of the list which is used for CRC will also be passed to the function, and determined based on an input that cannot be determined at run time. + +### Matrix Multiply + +This very simple algorithm forms the basis of many more complex algorithms. The tight inner loop is the focus of many optimizations (compiler as well as hardware based) and is thus relevant for embedded processing. + +The total available data space will be divided to 3 parts: +1. NxN matrix A. +2. NxN matrix B. +3. NxN matrix C. + +E.g. for 2K we will have 3 12x12 matrices (assuming data type of 32b 12(len)*12(wid)*4(size)*3(num) =1728 bytes). + +Matrix A will be initialized with small values (upper 3/4 of the bits all zero). +Matrix B will be initialized with medium values (upper half of the bits all zero). +Matrix C will be used for the result. + +For the benchmark itself: +- Multiple A by a constant into C, add the upper bits of each of the values in the result matrix. The result will become part of the output chain. +- Multiple A by column X of B into C, add the upper bits of each of the values in the result matrix. The result will become part of the output chain. +- Multiple A by B into C, add the upper bits of each of the values in the result matrix. The result will become part of the output chain. + +The actual values for A and B must be derived based on input that is not available at compile time. + +### State Machine + +This part of the code needs to exercise switch and if statements. As such, we will use a small Moore state machine. In particular, this will be a state machine that identifies string input as numbers and divides them according to format. + +The state machine will parse the input string until either a “,†separator or end of input is encountered. An invalid number will cause the state machine to return invalid state and a valid number will cause the state machine to return with type of number format (int/float/scientific). + +This code will perform a realistic task, be small enough to easily understand, and exercise the required functionality. The other option used in embedded systems is a mealy based state machine, which is driven by a table. The table then determines the number of states and complexity of transitions. This approach, however, tests mainly the load/store and function call mechanisms and less the handling of branches. If analysis of the final results shows that the load/store functionality of the processor is not exercised thoroughly, it may be a good addition to the benchmark (codesize allowing). + +For input, the memory block will be initialized with comma separated values of mixed formats, as well as invalid inputs. + +For the benchmark itself: +- Invoke the state machine on all of the input and count final states and state transitions. CRC of all final states and transitions will become part of the output chain. +- Modify the input at intervals (inject errors) and repeat the state machine operation. +- Modify the input back to original form. + +The actual input must be initialized based on data that cannot be determined at compile time. In addition the intervals for modification of the input and the actual modification must be based on input that cannot be determined at compile time. + +# Validation + +This release was tested on the following platforms: +* x86 cygwin and gcc 3.4 (Quad, dual and single core systems) +* x86 linux (Ubuntu/Fedora) and gcc (4.2/4.1) (Quad and single core systems) +* MIPS64 BE linux and gcc 3.4 16 cores system +* MIPS32 BE linux with CodeSourcery compiler 4.2-177 on Malta/Linux with a 1004K 3-core system +* PPC simulator with gcc 4.2.2 (No OS) +* PPC 64b BE linux (yellowdog) with gcc 3.4 and 4.1 (Dual core system) +* BF533 with VDSP50 +* Renesas R8C/H8 MCU with HEW 4.05 +* NXP LPC1700 armcc v4.0.0.524 +* NEC 78K with IAR v4.61 +* ARM simulator with armcc v4 + +# Memory Analysis + +Valgrind 3.4.0 used and no errors reported. + +# Balance Analysis + +Number of instructions executed for each function tested with cachegrind and found balanced with gcc and -O0. + +# Statistics + +Lines: +~~~ +Lines Blank Cmnts Source AESL +===== ===== ===== ===== ========== ======================================= + 469 66 170 251 627.5 core_list_join.c (C) + 330 18 54 268 670.0 core_main.c (C) + 256 32 80 146 365.0 core_matrix.c (C) + 240 16 51 186 465.0 core_state.c (C) + 165 11 20 134 335.0 core_util.c (C) + 150 23 36 98 245.0 coremark.h (C) + 1610 166 411 1083 2707.5 ----- Benchmark ----- (6 files) + 293 15 74 212 530.0 linux/core_portme.c (C) + 235 30 104 104 260.0 linux/core_portme.h (C) + 528 45 178 316 790.0 ----- Porting ----- (2 files) + +* For comparison, here are the stats for Dhrystone +Lines Blank Cmnts Source AESL +===== ===== ===== ===== ========== ======================================= + 311 15 242 54 135.0 dhry.h (C) + 789 132 119 553 1382.5 dhry_1.c (C) + 186 26 68 107 267.5 dhry_2.c (C) + 1286 173 429 714 1785.0 ----- C ----- (3 files) +~~~ + +# Credits +Many thanks to all of the individuals who helped with the development or testing of CoreMark including (Sorted by company name; note that company names may no longer be accurate as this was written in 2009). +* Alan Anderson, ADI +* Adhikary Rajiv, ADI +* Elena Stohr, ARM +* Ian Rickards, ARM +* Andrew Pickard, ARM +* Trent Parker, CAVIUM +* Shay Gal-On, EEMBC +* Markus Levy, EEMBC +* Peter Torelli, EEMBC +* Ron Olson, IBM +* Eyal Barzilay, MIPS +* Jens Eltze, NEC +* Hirohiko Ono, NEC +* Ulrich Drees, NEC +* Frank Roscheda, NEC +* Rob Cosaro, NXP +* Shumpei Kawasaki, RENESAS + +# Legal +Please refer to LICENSE.md in this reposity for a description of your rights to use this code. + +# Copyright +Copyright © 2009 EEMBC All rights reserved. +CoreMark is a trademark of EEMBC and EEMBC is a registered trademark of the Embedded Microprocessor Benchmark Consortium. + diff --git a/benchmarks/riscv-coremark/coremark/barebones/core_portme.c b/benchmarks/riscv-coremark/coremark/barebones/core_portme.c new file mode 100644 index 000000000..18967676b --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/barebones/core_portme.c @@ -0,0 +1,153 @@ +/* +Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +Original Author: Shay Gal-on +*/ +#include "coremark.h" +#include "core_portme.h" + +#if VALIDATION_RUN +volatile ee_s32 seed1_volatile = 0x3415; +volatile ee_s32 seed2_volatile = 0x3415; +volatile ee_s32 seed3_volatile = 0x66; +#endif +#if PERFORMANCE_RUN +volatile ee_s32 seed1_volatile = 0x0; +volatile ee_s32 seed2_volatile = 0x0; +volatile ee_s32 seed3_volatile = 0x66; +#endif +#if PROFILE_RUN +volatile ee_s32 seed1_volatile = 0x8; +volatile ee_s32 seed2_volatile = 0x8; +volatile ee_s32 seed3_volatile = 0x8; +#endif +volatile ee_s32 seed4_volatile = ITERATIONS; +volatile ee_s32 seed5_volatile = 0; +/* Porting : Timing functions + How to capture time and convert to seconds must be ported to whatever is + supported by the platform. e.g. Read value from on board RTC, read value from + cpu clock cycles performance counter etc. Sample implementation for standard + time.h and windows.h definitions included. +*/ +CORETIMETYPE +barebones_clock() +{ +#error \ + "You must implement a method to measure time in barebones_clock()! This function should return current time.\n" +} +/* Define : TIMER_RES_DIVIDER + Divider to trade off timer resolution and total time that can be + measured. + + Use lower values to increase resolution, but make sure that overflow + does not occur. If there are issues with the return value overflowing, + increase this value. + */ +#define GETMYTIME(_t) (*_t = barebones_clock()) +#define MYTIMEDIFF(fin, ini) ((fin) - (ini)) +#define TIMER_RES_DIVIDER 1 +#define SAMPLE_TIME_IMPLEMENTATION 1 +#define EE_TICKS_PER_SEC (CLOCKS_PER_SEC / TIMER_RES_DIVIDER) + +/** Define Host specific (POSIX), or target specific global time variables. */ +static CORETIMETYPE start_time_val, stop_time_val; + +/* Function : start_time + This function will be called right before starting the timed portion of + the benchmark. + + Implementation may be capturing a system timer (as implemented in the + example code) or zeroing some system parameters - e.g. setting the cpu clocks + cycles to 0. +*/ +void +start_time(void) +{ + GETMYTIME(&start_time_val); +} +/* Function : stop_time + This function will be called right after ending the timed portion of the + benchmark. + + Implementation may be capturing a system timer (as implemented in the + example code) or other system parameters - e.g. reading the current value of + cpu cycles counter. +*/ +void +stop_time(void) +{ + GETMYTIME(&stop_time_val); +} +/* Function : get_time + Return an abstract "ticks" number that signifies time on the system. + + Actual value returned may be cpu cycles, milliseconds or any other + value, as long as it can be converted to seconds by . This + methodology is taken to accomodate any hardware or simulated platform. The + sample implementation returns millisecs by default, and the resolution is + controlled by +*/ +CORE_TICKS +get_time(void) +{ + CORE_TICKS elapsed + = (CORE_TICKS)(MYTIMEDIFF(stop_time_val, start_time_val)); + return elapsed; +} +/* Function : time_in_secs + Convert the value returned by get_time to seconds. + + The type is used to accomodate systems with no support for + floating point. Default implementation implemented by the EE_TICKS_PER_SEC + macro above. +*/ +secs_ret +time_in_secs(CORE_TICKS ticks) +{ + secs_ret retval = ((secs_ret)ticks) / (secs_ret)EE_TICKS_PER_SEC; + return retval; +} + +ee_u32 default_num_contexts = 1; + +/* Function : portable_init + Target specific initialization code + Test for some common mistakes. +*/ +void +portable_init(core_portable *p, int *argc, char *argv[]) +{ +#error \ + "Call board initialization routines in portable init (if needed), in particular initialize UART!\n" + if (sizeof(ee_ptr_int) != sizeof(ee_u8 *)) + { + ee_printf( + "ERROR! Please define ee_ptr_int to a type that holds a " + "pointer!\n"); + } + if (sizeof(ee_u32) != 4) + { + ee_printf("ERROR! Please define ee_u32 to a 32b unsigned type!\n"); + } + p->portable_id = 1; +} +/* Function : portable_fini + Target specific final code +*/ +void +portable_fini(core_portable *p) +{ + p->portable_id = 0; +} diff --git a/benchmarks/riscv-coremark/coremark/barebones/core_portme.h b/benchmarks/riscv-coremark/coremark/barebones/core_portme.h new file mode 100644 index 000000000..55f643bf3 --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/barebones/core_portme.h @@ -0,0 +1,210 @@ +/* +Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +Original Author: Shay Gal-on +*/ +/* Topic : Description + This file contains configuration constants required to execute on + different platforms +*/ +#ifndef CORE_PORTME_H +#define CORE_PORTME_H +/************************/ +/* Data types and settings */ +/************************/ +/* Configuration : HAS_FLOAT + Define to 1 if the platform supports floating point. +*/ +#ifndef HAS_FLOAT +#define HAS_FLOAT 1 +#endif +/* Configuration : HAS_TIME_H + Define to 1 if platform has the time.h header file, + and implementation of functions thereof. +*/ +#ifndef HAS_TIME_H +#define HAS_TIME_H 1 +#endif +/* Configuration : USE_CLOCK + Define to 1 if platform has the time.h header file, + and implementation of functions thereof. +*/ +#ifndef USE_CLOCK +#define USE_CLOCK 1 +#endif +/* Configuration : HAS_STDIO + Define to 1 if the platform has stdio.h. +*/ +#ifndef HAS_STDIO +#define HAS_STDIO 0 +#endif +/* Configuration : HAS_PRINTF + Define to 1 if the platform has stdio.h and implements the printf + function. +*/ +#ifndef HAS_PRINTF +#define HAS_PRINTF 0 +#endif + +/* Definitions : COMPILER_VERSION, COMPILER_FLAGS, MEM_LOCATION + Initialize these strings per platform +*/ +#ifndef COMPILER_VERSION +#ifdef __GNUC__ +#define COMPILER_VERSION "GCC"__VERSION__ +#else +#define COMPILER_VERSION "Please put compiler version here (e.g. gcc 4.1)" +#endif +#endif +#ifndef COMPILER_FLAGS +#define COMPILER_FLAGS \ + FLAGS_STR /* "Please put compiler flags here (e.g. -o3)" */ +#endif +#ifndef MEM_LOCATION +#define MEM_LOCATION "STACK" +#endif + +/* Data Types : + To avoid compiler issues, define the data types that need ot be used for + 8b, 16b and 32b in . + + *Imprtant* : + ee_ptr_int needs to be the data type used to hold pointers, otherwise + coremark may fail!!! +*/ +typedef signed short ee_s16; +typedef unsigned short ee_u16; +typedef signed int ee_s32; +typedef double ee_f32; +typedef unsigned char ee_u8; +typedef unsigned int ee_u32; +typedef ee_u32 ee_ptr_int; +typedef size_t ee_size_t; +#define NULL ((void *)0) +/* align_mem : + This macro is used to align an offset to point to a 32b value. It is + used in the Matrix algorithm to initialize the input memory blocks. +*/ +#define align_mem(x) (void *)(4 + (((ee_ptr_int)(x)-1) & ~3)) + +/* Configuration : CORE_TICKS + Define type of return from the timing functions. + */ +#define CORETIMETYPE ee_u32 +typedef ee_u32 CORE_TICKS; + +/* Configuration : SEED_METHOD + Defines method to get seed values that cannot be computed at compile + time. + + Valid values : + SEED_ARG - from command line. + SEED_FUNC - from a system function. + SEED_VOLATILE - from volatile variables. +*/ +#ifndef SEED_METHOD +#define SEED_METHOD SEED_VOLATILE +#endif + +/* Configuration : MEM_METHOD + Defines method to get a block of memry. + + Valid values : + MEM_MALLOC - for platforms that implement malloc and have malloc.h. + MEM_STATIC - to use a static memory array. + MEM_STACK - to allocate the data block on the stack (NYI). +*/ +#ifndef MEM_METHOD +#define MEM_METHOD MEM_STACK +#endif + +/* Configuration : MULTITHREAD + Define for parallel execution + + Valid values : + 1 - only one context (default). + N>1 - will execute N copies in parallel. + + Note : + If this flag is defined to more then 1, an implementation for launching + parallel contexts must be defined. + + Two sample implementations are provided. Use or + to enable them. + + It is valid to have a different implementation of + and in , to fit a particular architecture. +*/ +#ifndef MULTITHREAD +#define MULTITHREAD 1 +#define USE_PTHREAD 0 +#define USE_FORK 0 +#define USE_SOCKET 0 +#endif + +/* Configuration : MAIN_HAS_NOARGC + Needed if platform does not support getting arguments to main. + + Valid values : + 0 - argc/argv to main is supported + 1 - argc/argv to main is not supported + + Note : + This flag only matters if MULTITHREAD has been defined to a value + greater then 1. +*/ +#ifndef MAIN_HAS_NOARGC +#define MAIN_HAS_NOARGC 0 +#endif + +/* Configuration : MAIN_HAS_NORETURN + Needed if platform does not support returning a value from main. + + Valid values : + 0 - main returns an int, and return value will be 0. + 1 - platform does not support returning a value from main +*/ +#ifndef MAIN_HAS_NORETURN +#define MAIN_HAS_NORETURN 0 +#endif + +/* Variable : default_num_contexts + Not used for this simple port, must cintain the value 1. +*/ +extern ee_u32 default_num_contexts; + +typedef struct CORE_PORTABLE_S +{ + ee_u8 portable_id; +} core_portable; + +/* target specific init/fini */ +void portable_init(core_portable *p, int *argc, char *argv[]); +void portable_fini(core_portable *p); + +#if !defined(PROFILE_RUN) && !defined(PERFORMANCE_RUN) \ + && !defined(VALIDATION_RUN) +#if (TOTAL_DATA_SIZE == 1200) +#define PROFILE_RUN 1 +#elif (TOTAL_DATA_SIZE == 2000) +#define PERFORMANCE_RUN 1 +#else +#define VALIDATION_RUN 1 +#endif +#endif + +int ee_printf(const char *fmt, ...); + +#endif /* CORE_PORTME_H */ diff --git a/benchmarks/riscv-coremark/coremark/barebones/core_portme.mak b/benchmarks/riscv-coremark/coremark/barebones/core_portme.mak new file mode 100755 index 000000000..81594697d --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/barebones/core_portme.mak @@ -0,0 +1,87 @@ +# Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Original Author: Shay Gal-on + +#File : core_portme.mak + +# Flag : OUTFLAG +# Use this flag to define how to to get an executable (e.g -o) +OUTFLAG= -o +# Flag : CC +# Use this flag to define compiler to use +CC = gcc +# Flag : LD +# Use this flag to define compiler to use +LD = gld +# Flag : AS +# Use this flag to define compiler to use +AS = gas +# Flag : CFLAGS +# Use this flag to define compiler options. Note, you can add compiler options from the command line using XCFLAGS="other flags" +PORT_CFLAGS = -O0 -g +FLAGS_STR = "$(PORT_CFLAGS) $(XCFLAGS) $(XLFLAGS) $(LFLAGS_END)" +CFLAGS = $(PORT_CFLAGS) -I$(PORT_DIR) -I. -DFLAGS_STR=\"$(FLAGS_STR)\" +#Flag : LFLAGS_END +# Define any libraries needed for linking or other flags that should come at the end of the link line (e.g. linker scripts). +# Note : On certain platforms, the default clock_gettime implementation is supported but requires linking of librt. +SEPARATE_COMPILE=1 +# Flag : SEPARATE_COMPILE +# You must also define below how to create an object file, and how to link. +OBJOUT = -o +LFLAGS = +ASFLAGS = +OFLAG = -o +COUT = -c + +LFLAGS_END = +# Flag : PORT_SRCS +# Port specific source files can be added here +# You may also need cvt.c if the fcvt functions are not provided as intrinsics by your compiler! +PORT_SRCS = $(PORT_DIR)/core_portme.c $(PORT_DIR)/ee_printf.c +vpath %.c $(PORT_DIR) +vpath %.s $(PORT_DIR) + +# Flag : LOAD +# For a simple port, we assume self hosted compile and run, no load needed. + +# Flag : RUN +# For a simple port, we assume self hosted compile and run, simple invocation of the executable + +LOAD = echo "Please set LOAD to the process of loading the executable to the flash" +RUN = echo "Please set LOAD to the process of running the executable (e.g. via jtag, or board reset)" + +OEXT = .o +EXE = .bin + +$(OPATH)$(PORT_DIR)/%$(OEXT) : %.c + $(CC) $(CFLAGS) $(XCFLAGS) $(COUT) $< $(OBJOUT) $@ + +$(OPATH)%$(OEXT) : %.c + $(CC) $(CFLAGS) $(XCFLAGS) $(COUT) $< $(OBJOUT) $@ + +$(OPATH)$(PORT_DIR)/%$(OEXT) : %.s + $(AS) $(ASFLAGS) $< $(OBJOUT) $@ + +# Target : port_pre% and port_post% +# For the purpose of this simple port, no pre or post steps needed. + +.PHONY : port_prebuild port_postbuild port_prerun port_postrun port_preload port_postload +port_pre% port_post% : + +# FLAG : OPATH +# Path to the output folder. Default - current folder. +OPATH = ./ +MKDIR = mkdir -p + diff --git a/benchmarks/riscv-coremark/coremark/barebones/cvt.c b/benchmarks/riscv-coremark/coremark/barebones/cvt.c new file mode 100644 index 000000000..333e8ead2 --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/barebones/cvt.c @@ -0,0 +1,127 @@ +/* +Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ +#include +#define CVTBUFSIZE 80 +static char CVTBUF[CVTBUFSIZE]; + +static char * +cvt(double arg, int ndigits, int *decpt, int *sign, char *buf, int eflag) +{ + int r2; + double fi, fj; + char * p, *p1; + + if (ndigits < 0) + ndigits = 0; + if (ndigits >= CVTBUFSIZE - 1) + ndigits = CVTBUFSIZE - 2; + r2 = 0; + *sign = 0; + p = &buf[0]; + if (arg < 0) + { + *sign = 1; + arg = -arg; + } + arg = modf(arg, &fi); + p1 = &buf[CVTBUFSIZE]; + + if (fi != 0) + { + p1 = &buf[CVTBUFSIZE]; + while (fi != 0) + { + fj = modf(fi / 10, &fi); + *--p1 = (int)((fj + .03) * 10) + '0'; + r2++; + } + while (p1 < &buf[CVTBUFSIZE]) + *p++ = *p1++; + } + else if (arg > 0) + { + while ((fj = arg * 10) < 1) + { + arg = fj; + r2--; + } + } + p1 = &buf[ndigits]; + if (eflag == 0) + p1 += r2; + *decpt = r2; + if (p1 < &buf[0]) + { + buf[0] = '\0'; + return buf; + } + while (p <= p1 && p < &buf[CVTBUFSIZE]) + { + arg *= 10; + arg = modf(arg, &fj); + *p++ = (int)fj + '0'; + } + if (p1 >= &buf[CVTBUFSIZE]) + { + buf[CVTBUFSIZE - 1] = '\0'; + return buf; + } + p = p1; + *p1 += 5; + while (*p1 > '9') + { + *p1 = '0'; + if (p1 > buf) + ++*--p1; + else + { + *p1 = '1'; + (*decpt)++; + if (eflag == 0) + { + if (p > buf) + *p = '0'; + p++; + } + } + } + *p = '\0'; + return buf; +} + +char * +ecvt(double arg, int ndigits, int *decpt, int *sign) +{ + return cvt(arg, ndigits, decpt, sign, CVTBUF, 1); +} + +char * +ecvtbuf(double arg, int ndigits, int *decpt, int *sign, char *buf) +{ + return cvt(arg, ndigits, decpt, sign, buf, 1); +} + +char * +fcvt(double arg, int ndigits, int *decpt, int *sign) +{ + return cvt(arg, ndigits, decpt, sign, CVTBUF, 0); +} + +char * +fcvtbuf(double arg, int ndigits, int *decpt, int *sign, char *buf) +{ + return cvt(arg, ndigits, decpt, sign, buf, 0); +} diff --git a/benchmarks/riscv-coremark/coremark/barebones/ee_printf.c b/benchmarks/riscv-coremark/coremark/barebones/ee_printf.c new file mode 100644 index 000000000..f2d362dc0 --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/barebones/ee_printf.c @@ -0,0 +1,700 @@ +/* +Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +#include +#include + +#define ZEROPAD (1 << 0) /* Pad with zero */ +#define SIGN (1 << 1) /* Unsigned/signed long */ +#define PLUS (1 << 2) /* Show plus */ +#define SPACE (1 << 3) /* Spacer */ +#define LEFT (1 << 4) /* Left justified */ +#define HEX_PREP (1 << 5) /* 0x */ +#define UPPERCASE (1 << 6) /* 'ABCDEF' */ + +#define is_digit(c) ((c) >= '0' && (c) <= '9') + +static char * 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) +{ + const char *sc; + for (sc = s; *sc != '\0' && count--; ++sc) + ; + return sc - s; +} + +static int +skip_atoi(const char **s) +{ + int i = 0; + while (is_digit(**s)) + i = i * 10 + *((*s)++) - '0'; + return i; +} + +static char * +number(char *str, long num, int base, int size, int precision, int type) +{ + char c, sign, tmp[66]; + char *dig = digits; + int i; + + if (type & UPPERCASE) + dig = upper_digits; + if (type & LEFT) + type &= ~ZEROPAD; + if (base < 2 || base > 36) + return 0; + + c = (type & ZEROPAD) ? '0' : ' '; + sign = 0; + if (type & SIGN) + { + if (num < 0) + { + sign = '-'; + num = -num; + size--; + } + else if (type & PLUS) + { + sign = '+'; + size--; + } + else if (type & SPACE) + { + sign = ' '; + size--; + } + } + + if (type & HEX_PREP) + { + if (base == 16) + size -= 2; + else if (base == 8) + size--; + } + + i = 0; + + if (num == 0) + tmp[i++] = '0'; + else + { + while (num != 0) + { + tmp[i++] = dig[((unsigned long)num) % (unsigned)base]; + num = ((unsigned long)num) / (unsigned)base; + } + } + + if (i > precision) + precision = i; + size -= precision; + if (!(type & (ZEROPAD | LEFT))) + while (size-- > 0) + *str++ = ' '; + if (sign) + *str++ = sign; + + if (type & HEX_PREP) + { + if (base == 8) + *str++ = '0'; + else if (base == 16) + { + *str++ = '0'; + *str++ = digits[33]; + } + } + + if (!(type & LEFT)) + while (size-- > 0) + *str++ = c; + while (i < precision--) + *str++ = '0'; + while (i-- > 0) + *str++ = tmp[i]; + while (size-- > 0) + *str++ = ' '; + + return str; +} + +static char * +eaddr(char *str, unsigned char *addr, int size, int precision, int type) +{ + char tmp[24]; + char *dig = digits; + int i, len; + + if (type & UPPERCASE) + dig = upper_digits; + len = 0; + for (i = 0; i < 6; i++) + { + if (i != 0) + tmp[len++] = ':'; + tmp[len++] = dig[addr[i] >> 4]; + tmp[len++] = dig[addr[i] & 0x0F]; + } + + if (!(type & LEFT)) + while (len < size--) + *str++ = ' '; + for (i = 0; i < len; ++i) + *str++ = tmp[i]; + while (len < size--) + *str++ = ' '; + + return str; +} + +static char * +iaddr(char *str, unsigned char *addr, int size, int precision, int type) +{ + char tmp[24]; + int i, n, len; + + len = 0; + for (i = 0; i < 4; i++) + { + if (i != 0) + tmp[len++] = '.'; + n = addr[i]; + + if (n == 0) + tmp[len++] = digits[0]; + else + { + if (n >= 100) + { + tmp[len++] = digits[n / 100]; + n = n % 100; + tmp[len++] = digits[n / 10]; + n = n % 10; + } + else if (n >= 10) + { + tmp[len++] = digits[n / 10]; + n = n % 10; + } + + tmp[len++] = digits[n]; + } + } + + if (!(type & LEFT)) + while (len < size--) + *str++ = ' '; + for (i = 0; i < len; ++i) + *str++ = tmp[i]; + while (len < size--) + *str++ = ' '; + + return str; +} + +#if HAS_FLOAT + +char * ecvtbuf(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); + +void +ee_bufcpy(char *pd, char *ps, int count) +{ + char *pe = ps + count; + while (ps != pe) + *pd++ = *ps++; +} + +static void +parse_float(double value, char *buffer, char fmt, int precision) +{ + int decpt, sign, exp, pos; + char *digits = NULL; + char cvtbuf[80]; + int capexp = 0; + int magnitude; + + if (fmt == 'G' || fmt == 'E') + { + capexp = 1; + fmt += 'a' - 'A'; + } + + if (fmt == 'g') + { + digits = ecvtbuf(value, precision, &decpt, &sign, cvtbuf); + magnitude = decpt - 1; + if (magnitude < -4 || magnitude > precision - 1) + { + fmt = 'e'; + precision -= 1; + } + else + { + fmt = 'f'; + precision -= decpt; + } + } + + if (fmt == 'e') + { + digits = ecvtbuf(value, precision + 1, &decpt, &sign, cvtbuf); + + if (sign) + *buffer++ = '-'; + *buffer++ = *digits; + if (precision > 0) + *buffer++ = '.'; + ee_bufcpy(buffer, digits + 1, precision); + buffer += precision; + *buffer++ = capexp ? 'E' : 'e'; + + if (decpt == 0) + { + if (value == 0.0) + exp = 0; + else + exp = -1; + } + else + exp = decpt - 1; + + if (exp < 0) + { + *buffer++ = '-'; + exp = -exp; + } + else + *buffer++ = '+'; + + buffer[2] = (exp % 10) + '0'; + exp = exp / 10; + buffer[1] = (exp % 10) + '0'; + exp = exp / 10; + buffer[0] = (exp % 10) + '0'; + buffer += 3; + } + else if (fmt == 'f') + { + digits = fcvtbuf(value, precision, &decpt, &sign, cvtbuf); + if (sign) + *buffer++ = '-'; + if (*digits) + { + if (decpt <= 0) + { + *buffer++ = '0'; + *buffer++ = '.'; + for (pos = 0; pos < -decpt; pos++) + *buffer++ = '0'; + while (*digits) + *buffer++ = *digits++; + } + else + { + pos = 0; + while (*digits) + { + if (pos++ == decpt) + *buffer++ = '.'; + *buffer++ = *digits++; + } + } + } + else + { + *buffer++ = '0'; + if (precision > 0) + { + *buffer++ = '.'; + for (pos = 0; pos < precision; pos++) + *buffer++ = '0'; + } + } + } + + *buffer = '\0'; +} + +static void +decimal_point(char *buffer) +{ + while (*buffer) + { + if (*buffer == '.') + return; + if (*buffer == 'e' || *buffer == 'E') + break; + buffer++; + } + + if (*buffer) + { + int n = strnlen(buffer, 256); + while (n > 0) + { + buffer[n + 1] = buffer[n]; + n--; + } + + *buffer = '.'; + } + else + { + *buffer++ = '.'; + *buffer = '\0'; + } +} + +static void +cropzeros(char *buffer) +{ + char *stop; + + while (*buffer && *buffer != '.') + buffer++; + if (*buffer++) + { + while (*buffer && *buffer != 'e' && *buffer != 'E') + buffer++; + stop = buffer--; + while (*buffer == '0') + buffer--; + if (*buffer == '.') + buffer--; + while (buffer != stop) + *++buffer = 0; + } +} + +static char * +flt(char *str, double num, int size, int precision, char fmt, int flags) +{ + char tmp[80]; + char c, sign; + int n, i; + + // Left align means no zero padding + if (flags & LEFT) + flags &= ~ZEROPAD; + + // Determine padding and sign char + c = (flags & ZEROPAD) ? '0' : ' '; + sign = 0; + if (flags & SIGN) + { + if (num < 0.0) + { + sign = '-'; + num = -num; + size--; + } + else if (flags & PLUS) + { + sign = '+'; + size--; + } + else if (flags & SPACE) + { + sign = ' '; + size--; + } + } + + // Compute the precision value + if (precision < 0) + precision = 6; // Default precision: 6 + + // Convert floating point number to text + parse_float(num, tmp, fmt, precision); + + if ((flags & HEX_PREP) && precision == 0) + decimal_point(tmp); + if (fmt == 'g' && !(flags & HEX_PREP)) + cropzeros(tmp); + + n = strnlen(tmp, 256); + + // Output number with alignment and padding + size -= n; + if (!(flags & (ZEROPAD | LEFT))) + while (size-- > 0) + *str++ = ' '; + if (sign) + *str++ = sign; + if (!(flags & LEFT)) + while (size-- > 0) + *str++ = c; + for (i = 0; i < n; i++) + *str++ = tmp[i]; + while (size-- > 0) + *str++ = ' '; + + return str; +} + +#endif + +static int +ee_vsprintf(char *buf, const char *fmt, va_list args) +{ + int len; + unsigned long num; + int i, base; + char * str; + char * s; + + int flags; // Flags to number() + + int field_width; // Width of output field + int precision; // Min. # of digits for integers; max number of chars for + // from string + int qualifier; // 'h', 'l', or 'L' for integer fields + + for (str = buf; *fmt; fmt++) + { + if (*fmt != '%') + { + *str++ = *fmt; + continue; + } + + // Process flags + flags = 0; + repeat: + fmt++; // This also skips first '%' + switch (*fmt) + { + case '-': + flags |= LEFT; + goto repeat; + case '+': + flags |= PLUS; + goto repeat; + case ' ': + flags |= SPACE; + goto repeat; + case '#': + flags |= HEX_PREP; + goto repeat; + case '0': + flags |= ZEROPAD; + goto repeat; + } + + // Get field width + field_width = -1; + if (is_digit(*fmt)) + field_width = skip_atoi(&fmt); + else if (*fmt == '*') + { + fmt++; + field_width = va_arg(args, int); + if (field_width < 0) + { + field_width = -field_width; + flags |= LEFT; + } + } + + // Get the precision + precision = -1; + if (*fmt == '.') + { + ++fmt; + if (is_digit(*fmt)) + precision = skip_atoi(&fmt); + else if (*fmt == '*') + { + ++fmt; + precision = va_arg(args, int); + } + if (precision < 0) + precision = 0; + } + + // Get the conversion qualifier + qualifier = -1; + if (*fmt == 'l' || *fmt == 'L') + { + qualifier = *fmt; + fmt++; + } + + // Default base + base = 10; + + switch (*fmt) + { + case 'c': + if (!(flags & LEFT)) + while (--field_width > 0) + *str++ = ' '; + *str++ = (unsigned char)va_arg(args, int); + while (--field_width > 0) + *str++ = ' '; + continue; + + case 's': + s = va_arg(args, char *); + if (!s) + s = ""; + len = strnlen(s, precision); + if (!(flags & LEFT)) + while (len < field_width--) + *str++ = ' '; + for (i = 0; i < len; ++i) + *str++ = *s++; + while (len < field_width--) + *str++ = ' '; + continue; + + case 'p': + if (field_width == -1) + { + field_width = 2 * sizeof(void *); + flags |= ZEROPAD; + } + str = number(str, + (unsigned long)va_arg(args, void *), + 16, + field_width, + precision, + flags); + continue; + + case 'A': + flags |= UPPERCASE; + + case 'a': + if (qualifier == 'l') + str = eaddr(str, + va_arg(args, unsigned char *), + field_width, + precision, + flags); + else + str = iaddr(str, + va_arg(args, unsigned char *), + field_width, + precision, + flags); + continue; + + // Integer number formats - set up the flags and "break" + case 'o': + base = 8; + break; + + case 'X': + flags |= UPPERCASE; + + case 'x': + base = 16; + break; + + case 'd': + case 'i': + flags |= SIGN; + + case 'u': + break; + +#if HAS_FLOAT + + case 'f': + str = flt(str, + va_arg(args, double), + field_width, + precision, + *fmt, + flags | SIGN); + continue; + +#endif + + default: + if (*fmt != '%') + *str++ = '%'; + if (*fmt) + *str++ = *fmt; + else + --fmt; + continue; + } + + if (qualifier == 'l') + num = va_arg(args, unsigned long); + else if (flags & SIGN) + num = va_arg(args, int); + else + num = va_arg(args, unsigned int); + + str = number(str, num, base, field_width, precision, flags); + } + + *str = '\0'; + return str - buf; +} + +void +uart_send_char(char c) +{ +#error "You must implement the method uart_send_char to use this file!\n"; + /* Output of a char to a UART usually follows the following model: + Wait until UART is ready + Write char to UART + Wait until UART is done + + Or in code: + while (*UART_CONTROL_ADDRESS != UART_READY); + *UART_DATA_ADDRESS = c; + while (*UART_CONTROL_ADDRESS != UART_READY); + + Check the UART sample code on your platform or the board + documentation. + */ +} + +int +ee_printf(const char *fmt, ...) +{ + char buf[1024], *p; + va_list args; + int n = 0; + + va_start(args, fmt); + ee_vsprintf(buf, fmt, args); + va_end(args); + p = buf; + while (*p) + { + uart_send_char(*p); + n++; + p++; + } + + return n; +} diff --git a/benchmarks/riscv-coremark/coremark/core_list_join.c b/benchmarks/riscv-coremark/coremark/core_list_join.c new file mode 100644 index 000000000..4bffeeccf --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/core_list_join.c @@ -0,0 +1,580 @@ +/* +Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +Original Author: Shay Gal-on +*/ + +#include "coremark.h" +//#include +//#include +/* +Topic: Description + Benchmark using a linked list. + + Linked list is a common data structure used in many applications. + + For our purposes, this will excercise the memory units of the processor. + In particular, usage of the list pointers to find and alter data. + + We are not using Malloc since some platforms do not support this library. + + Instead, the memory block being passed in is used to create a list, + and the benchmark takes care not to add more items then can be + accomodated by the memory block. The porting layer will make sure + that we have a valid memory block. + + All operations are done in place, without using any extra memory. + + The list itself contains list pointers and pointers to data items. + Data items contain the following: + + idx - An index that captures the initial order of the list. + data - Variable data initialized based on the input parameters. The 16b are divided as follows: + o Upper 8b are backup of original data. + o Bit 7 indicates if the lower 7 bits are to be used as is or calculated. + o Bits 0-2 indicate type of operation to perform to get a 7b value. + o Bits 3-6 provide input for the operation. + +*/ + +/* local functions */ + +list_head *core_list_find(list_head *list,list_data *info); +list_head *core_list_reverse(list_head *list); +list_head *core_list_remove(list_head *item); +list_head *core_list_undo_remove(list_head *item_removed, list_head *item_modified); +list_head *core_list_insert_new(list_head *insert_point + , list_data *info, list_head **memblock, list_data **datablock + , list_head *memblock_end, list_data *datablock_end); +typedef ee_s32(*list_cmp)(list_data *a, list_data *b, core_results *res); +list_head *core_list_mergesort(list_head *list, list_cmp cmp, core_results *res); + +ee_s16 calc_func(ee_s16 *pdata, core_results *res) { + ee_s16 data=*pdata; + ee_s16 retval; + ee_u8 optype=(data>>7) & 1; /* bit 7 indicates if the function result has been cached */ + if (optype) /* if cached, use cache */ + return (data & 0x007f); + else { /* otherwise calculate and cache the result */ + ee_s16 flag=data & 0x7; /* bits 0-2 is type of function to perform */ + ee_s16 dtype=((data>>3) & 0xf); /* bits 3-6 is specific data for the operation */ + dtype |= dtype << 4; /* replicate the lower 4 bits to get an 8b value */ + switch (flag) { + case 0: + if (dtype<0x22) /* set min period for bit corruption */ + dtype=0x22; + retval=core_bench_state(res->size,res->memblock[3],res->seed1,res->seed2,dtype,res->crc); + if (res->crcstate==0) + res->crcstate=retval; + break; + case 1: + retval=core_bench_matrix(&(res->mat),dtype,res->crc); + if (res->crcmatrix==0) + res->crcmatrix=retval; + break; + default: + retval=data; + break; + } + res->crc=crcu16(retval,res->crc); + retval &= 0x007f; + *pdata = (data & 0xff00) | 0x0080 | retval; /* cache the result */ + return retval; + } +} +/* Function: cmp_complex + Compare the data item in a list cell. + + Can be used by mergesort. +*/ +ee_s32 cmp_complex(list_data *a, list_data *b, core_results *res) { + ee_s16 val1=calc_func(&(a->data16),res); + ee_s16 val2=calc_func(&(b->data16),res); + return val1 - val2; +} + +/* Function: cmp_idx + Compare the idx item in a list cell, and regen the data. + + Can be used by mergesort. +*/ +ee_s32 cmp_idx(list_data *a, list_data *b, core_results *res) { + if (res==NULL) { + a->data16 = (a->data16 & 0xff00) | (0x00ff & (a->data16>>8)); + b->data16 = (b->data16 & 0xff00) | (0x00ff & (b->data16>>8)); + } + return a->idx - b->idx; +} + +/*void ehitoa(int value, char *str, int base){ + if (value>100000) strcpy(str,"too big"); + else{ + int places[6] = {100000, 10000, 1000, 100, 10, 1}; + int col; + int pv; + for(col = 0; col<6; col++){ + pv = 0; + while (value >= places[col]){ + value=value -places[col]; + pv++; + + } + str[col]=pv+'0'; + } + str[6]=0; + } +}*/ + +void copy_info(list_data *to,list_data *from) { + to->data16=from->data16; + to->idx=from->idx; +} + +/* Benchmark for linked list: + - Try to find multiple data items. + - List sort + - Operate on data from list (crc) + - Single remove/reinsert + * At the end of this function, the list is back to original state +*/ +ee_u16 core_bench_list(core_results *res, ee_s16 finder_idx) { + ee_u16 retval=0; + ee_u16 found=0,missed=0; + list_head *list=res->list; + ee_s16 find_num=res->seed3; + list_head *this_find; + list_head *finder, *remover; + list_data info; + ee_s16 i; + //ee_printf("entered corebenchlist \n"); + info.idx=finder_idx; + /* find values in the list, and change the list each time (reverse and cache if value found) */ + for (i=0; inext->info->data16 >> 8) & 1; + //ee_printf("if statement \n"); + } + else { + found++; + //ee_printf("else statement \n"); + if (this_find->info->data16 & 0x1) /* use found value */ + retval+=(this_find->info->data16 >> 9) & 1; + /* and cache next item at the head of the list (if any) */ + if (this_find->next != NULL) { + finder = this_find->next; + this_find->next = finder->next; + finder->next=list->next; + list->next=finder; + } + } + if (info.idx>=0) + info.idx++; +#if CORE_DEBUG + //ee_printf("List find %d: [%d,%d,%d]\n",i,retval,missed,found); +#endif + } + retval+=found*4-missed; + /* sort the list by data content and remove one item*/ + if (finder_idx>0) + list=core_list_mergesort(list,cmp_complex,res); + remover=core_list_remove(list->next); + /* CRC data content of list from location of index N forward, and then undo remove */ + finder=core_list_find(list,&info); + if (!finder) + finder=list->next; + while (finder) { + retval=crc16(list->info->data16,retval); + finder=finder->next; + } +#if CORE_DEBUG + //ee_printf("List sort 1: %04x\n",retval); +#endif + remover=core_list_undo_remove(remover,list->next); + /* sort the list by index, in effect returning the list to original state */ + list=core_list_mergesort(list,cmp_idx,NULL); + /* CRC data content of list */ + finder=list->next; + while (finder) { + retval=crc16(list->info->data16,retval); + finder=finder->next; + } +#if CORE_DEBUG + //ee_printf("List sort 2: %04x\n",retval); +#endif + return retval; +} +/* Function: core_list_init + Initialize list with data. + + Parameters: + blksize - Size of memory to be initialized. + memblock - Pointer to memory block. + seed - Actual values chosen depend on the seed parameter. + The seed parameter MUST be supplied from a source that cannot be determined at compile time + + Returns: + Pointer to the head of the list. + +*/ +list_head *core_list_init(ee_u32 blksize, list_head *memblock, ee_s16 seed) { + /* calculated pointers for the list */ + //ee_printf("%d \n blksize", blksize); + ee_u32 per_item=16+sizeof(struct list_data_s); + //ee_printf("%d \n sizeof", sizeof(struct list_data_s)); + //ee_printf("%d \n per_item", per_item); + ee_u32 size=(blksize/per_item)-2; + //char bufftwo[200]; + //ehitoa(size, bufftwo, 10); + //ee_printf(" size = %s done \n", bufftwo); + //ee_printf("%d", size);/* to accomodate systems with 64b pointers, and make sure same code is executed, set max list elements */ + list_head *memblock_end=memblock+size; + + list_data *datablock=(list_data *)(memblock_end); + list_data *datablock_end=datablock+size; + //ee_printf("datablock_end"); + /* some useful variables */ + ee_u32 i; + list_head *finder,*list=memblock; + list_data info; + //ehitoa(size, bufftwo, 10); + //ee_printf(" size2 = %s done \n", bufftwo); + + /* create a fake items for the list head and tail */ + list->next=NULL; + list->info=datablock; + list->info->idx=0x0000; + list->info->data16=(ee_s16)0x8080; + memblock++; + datablock++; + info.idx=0x7fff; + info.data16=(ee_s16)0xffff; + //ehitoa(size, bufftwo, 10); + //ee_printf(" size3 = %s done \n", bufftwo); + core_list_insert_new(list,&info,&memblock,&datablock,memblock_end,datablock_end); + //ehitoa(size, bufftwo, 10); + //ee_printf(" size4 = %s done \n", bufftwo);; + /* then insert size items */ + for (i=0; inext; + i=1; + //ehitoa(i, bufftwo, 10); + //ee_printf(" i = %s done \n", bufftwo); + while (finder->next!=NULL) { + //ee_printf("enter while statement \n"); + if (iinfo->idx=i++; + //ehitoa(i, bufftwo, 10); + //ee_printf(" if i = %s done \n", bufftwo); + } + + else { + ee_u16 pat=(ee_u16)(i++ ^ seed); /* get a pseudo random number */ + finder->info->idx=0x3fff & (((i & 0x07) << 8) | pat); /* make sure the mixed items end up after the ones in sequence */ + //ehitoa(i, bufftwo, 10); + //ee_printf(" else i = %s done \n", bufftwo); + } + finder=finder->next; + } + //ehitoa(i, bufftwo, 10); + //ee_printf(" i2 = %s done \n", bufftwo); + list = core_list_mergesort(list,cmp_idx,NULL); +#if CORE_DEBUG + //ee_printf("Initialized list:\n"); + finder=list; + while (finder) { + //ee_printf("[%04x,%04x]",finder->info->idx,(ee_u16)finder->info->data16); + finder=finder->next; + } + //ee_printf("\n"); +#endif + return list; +} + +/* Function: core_list_insert + Insert an item to the list + + Parameters: + insert_point - where to insert the item. + info - data for the cell. + memblock - pointer for the list header + datablock - pointer for the list data + memblock_end - end of region for list headers + datablock_end - end of region for list data + + Returns: + Pointer to new item. +*/ +list_head *core_list_insert_new(list_head *insert_point, list_data *info, list_head **memblock, list_data **datablock + , list_head *memblock_end, list_data *datablock_end) { + list_head *newitem; + + if ((*memblock+1) >= memblock_end) + return NULL; + if ((*datablock+1) >= datablock_end) + return NULL; + + newitem=*memblock; + (*memblock)++; + newitem->next=insert_point->next; + insert_point->next=newitem; + + newitem->info=*datablock; + (*datablock)++; + copy_info(newitem->info,info); + + return newitem; +} + +/* Function: core_list_remove + Remove an item from the list. + + Operation: + For a singly linked list, remove by copying the data from the next item + over to the current cell, and unlinking the next item. + + Note: + since there is always a fake item at the end of the list, no need to check for NULL. + + Returns: + Removed item. +*/ +list_head *core_list_remove(list_head *item) { + list_data *tmp; + list_head *ret=item->next; + /* swap data pointers */ + tmp=item->info; + item->info=ret->info; + ret->info=tmp; + /* and eliminate item */ + item->next=item->next->next; + ret->next=NULL; + return ret; +} + +/* Function: core_list_undo_remove + Undo a remove operation. + + Operation: + Since we want each iteration of the benchmark to be exactly the same, + we need to be able to undo a remove. + Link the removed item back into the list, and switch the info items. + + Parameters: + item_removed - Return value from the + item_modified - List item that was modified during + + Returns: + The item that was linked back to the list. + +*/ +list_head *core_list_undo_remove(list_head *item_removed, list_head *item_modified) { + list_data *tmp; + /* swap data pointers */ + tmp=item_removed->info; + item_removed->info=item_modified->info; + item_modified->info=tmp; + /* and insert item */ + item_removed->next=item_modified->next; + item_modified->next=item_removed; + return item_removed; +} + +/* Function: core_list_find + Find an item in the list + + Operation: + Find an item by idx (if not 0) or specific data value + + Parameters: + list - list head + info - idx or data to find + + Returns: + Found item, or NULL if not found. +*/ +list_head *core_list_find(list_head *list,list_data *info) { + //ee_printf("entered core_list_find \n"); + if (info->idx>=0) { + //ee_printf("find if \n"); + while (list && (list->info->idx != info->idx)){ + list=list->next; + //ee_printf("find while if \n"); + } + //ee_printf("core_list_find end \n"); + return list; + } else { + //ee_printf("find else"); + while (list && ((list->info->data16 & 0xff) != info->data16)){ + list=list->next; + //ee_printf("find while else \n"); + } + //ee_printf("core list find end \n"); + return list; + } +} +/* Function: core_list_reverse + Reverse a list + + Operation: + Rearrange the pointers so the list is reversed. + + Parameters: + list - list head + info - idx or data to find + + Returns: + Found item, or NULL if not found. +*/ + +list_head *core_list_reverse(list_head *list) { +// ee_printf("entered core_list_reverse"); + list_head *next=NULL, *tmp; + while (list) { + tmp=list->next; + list->next=next; + next=list; + list=tmp; + } + //ee_printf("core_list_reverse done"); + return next; +} +/* Function: core_list_mergesort + Sort the list in place without recursion. + + Description: + Use mergesort, as for linked list this is a realistic solution. + Also, since this is aimed at embedded, care was taken to use iterative rather then recursive algorithm. + The sort can either return the list to original order (by idx) , + or use the data item to invoke other other algorithms and change the order of the list. + + Parameters: + list - list to be sorted. + cmp - cmp function to use + + Returns: + New head of the list. + + Note: + We have a special header for the list that will always be first, + but the algorithm could theoretically modify where the list starts. + + */ +list_head *core_list_mergesort(list_head *list, list_cmp cmp, core_results *res) { + list_head *p, *q, *e, *tail; + ee_s32 insize, nmerges, psize, qsize, i; + + insize = 1; + //char bufftwo[200]; + while (1) { + p = list; + list = NULL; + tail = NULL; + + nmerges = 0; /* count number of merges we do in this pass */ + //ehitoa(nmerges, bufftwo, 10); + //ee_printf(" nmerges default value = %s done \n", bufftwo); + while (p) { + nmerges++; /* there exists a merge to be done */ + //ehitoa(nmerges, bufftwo, 10); + //ee_printf(" current nmerges = %s done \n", bufftwo); + /* step `insize' places along from p */ + q = p; + psize = 0; + //ehitoa(insize, bufftwo, 10); + //ee_printf(" insize = %s done \n", bufftwo); + for (i = 0; i < insize; i++) { + //ehitoa(i, bufftwo, 10); + //ee_printf(" i = %s done \n", bufftwo); + psize++; + q = q->next; + if (!q) break; + } + + /* if q hasn't fallen off end, we have two lists to merge */ + qsize = insize; + //ehitoa(qsize, bufftwo, 10); + //ee_printf(" qsize = %s done \n", bufftwo); + + /* now we have two lists; merge them */ + while (psize > 0 || (qsize > 0 && q)) { + + /* decide whether next element of merge comes from p or q */ + if (psize == 0) { + //ee_printf("if \n"); + /* p is empty; e must come from q. */ + e = q; q = q->next; qsize--; + } else if (qsize == 0 || !q) { + //ee_printf("else if \n"); + /* q is empty; e must come from p. */ + e = p; p = p->next; psize--; + } else if (cmp(p->info,q->info,res) <= 0) { + //ee_printf("else if 2 \n"); + /* First element of p is lower (or same); e must come from p. */ + e = p; p = p->next; psize--; + } else { + //ee_printf("else \n"); + /* First element of q is lower; e must come from q. */ + e = q; q = q->next; qsize--; + } + + /* add the next element to the merged list */ + if (tail) { + //ee_printf("tail if \n"); + tail->next = e; + } else { + //ee_printf("tail else \n"); + list = e; + } + tail = e; + } + + /* now p has stepped `insize' places along, and q has too */ + p = q; + } + + tail->next = NULL; + + /* If we have done only one merge, we're finished. */ + if (nmerges <= 1) /* allow for nmerges==0, the empty list case */ + return list; + + /* Otherwise repeat, merging lists twice the size */ + insize *= 2; + //ehitoa(insize, bufftwo, 10); + //ee_printf(" insize2 = %s done \n", bufftwo); + } +#if COMPILER_REQUIRES_SORT_RETURN + return list; +#endif +} diff --git a/benchmarks/riscv-coremark/coremark/core_main.c b/benchmarks/riscv-coremark/coremark/core_main.c new file mode 100644 index 000000000..b1ec758bf --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/core_main.c @@ -0,0 +1,447 @@ +/* +Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +Original Author: Shay Gal-on +*/ + +/* File: core_main.c + This file contains the framework to acquire a block of memory, seed + initial parameters, tun t he benchmark and report the results. +*/ +#include "coremark.h" + +/* Function: iterate + Run the benchmark for a specified number of iterations. + + Operation: + For each type of benchmarked algorithm: + a - Initialize the data block for the algorithm. + b - Execute the algorithm N times. + + Returns: + NULL. +*/ +static ee_u16 list_known_crc[] = { (ee_u16)0xd4b0, + (ee_u16)0x3340, + (ee_u16)0x6a79, + (ee_u16)0xe714, + (ee_u16)0xe3c1 }; +static ee_u16 matrix_known_crc[] = { (ee_u16)0xbe52, + (ee_u16)0x1199, + (ee_u16)0x5608, + (ee_u16)0x1fd7, + (ee_u16)0x0747 }; +static ee_u16 state_known_crc[] = { (ee_u16)0x5e47, + (ee_u16)0x39bf, + (ee_u16)0xe5a4, + (ee_u16)0x8e3a, + (ee_u16)0x8d84 }; +void * +iterate(void *pres) +{ + ee_u32 i; + ee_u16 crc; + core_results *res = (core_results *)pres; + ee_u32 iterations = res->iterations; + res->crc = 0; + res->crclist = 0; + res->crcmatrix = 0; + res->crcstate = 0; + + for (i = 0; i < iterations; i++) + { + crc = core_bench_list(res, 1); + res->crc = crcu16(crc, res->crc); + crc = core_bench_list(res, -1); + res->crc = crcu16(crc, res->crc); + if (i == 0) + res->crclist = res->crc; + } + return NULL; +} + +#if (SEED_METHOD == SEED_ARG) +ee_s32 get_seed_args(int i, int argc, char *argv[]); +#define get_seed(x) (ee_s16) get_seed_args(x, argc, argv) +#define get_seed_32(x) get_seed_args(x, argc, argv) +#else /* via function or volatile */ +ee_s32 get_seed_32(int i); +#define get_seed(x) (ee_s16) get_seed_32(x) +#endif + +#if (MEM_METHOD == MEM_STATIC) +ee_u8 static_memblk[TOTAL_DATA_SIZE]; +#endif +char *mem_name[3] = { "Static", "Heap", "Stack" }; +/* Function: main + Main entry routine for the benchmark. + This function is responsible for the following steps: + + 1 - Initialize input seeds from a source that cannot be determined at + compile time. 2 - Initialize memory block for use. 3 - Run and time the + benchmark. 4 - Report results, testing the validity of the output if the + seeds are known. + + Arguments: + 1 - first seed : Any value + 2 - second seed : Must be identical to first for iterations to be + identical 3 - third seed : Any value, should be at least an order of + magnitude less then the input size, but bigger then 32. 4 - Iterations : + Special, if set to 0, iterations will be automatically determined such that + the benchmark will run between 10 to 100 secs + +*/ + +#if MAIN_HAS_NOARGC +MAIN_RETURN_TYPE +main(void) +{ + int argc = 0; + char *argv[1]; +#else +MAIN_RETURN_TYPE +main(int argc, char *argv[]) +{ +#endif + ee_printf("SHOWTIME\n"); + ee_u16 i, j = 0, num_algorithms = 0; + ee_s16 known_id = -1, total_errors = 0; + ee_u16 seedcrc = 0; + CORE_TICKS total_time; + core_results results[MULTITHREAD]; +#if (MEM_METHOD == MEM_STACK) + ee_u8 stack_memblock[TOTAL_DATA_SIZE * MULTITHREAD]; +#endif + /* first call any initializations needed */ + portable_init(&(results[0].port), &argc, argv); + /* First some checks to make sure benchmark will run ok */ + if (sizeof(struct list_head_s) > 128) + { + ee_printf("list_head structure too big for comparable data!\n"); + return MAIN_RETURN_VAL; + } + results[0].seed1 = get_seed(1); + results[0].seed2 = get_seed(2); + results[0].seed3 = get_seed(3); + results[0].iterations = get_seed_32(4); +#if CORE_DEBUG + results[0].iterations = 1; +#endif + results[0].execs = get_seed_32(5); + if (results[0].execs == 0) + { /* if not supplied, execute all algorithms */ + results[0].execs = ALL_ALGORITHMS_MASK; + } + /* put in some default values based on one seed only for easy testing */ + if ((results[0].seed1 == 0) && (results[0].seed2 == 0) + && (results[0].seed3 == 0)) + { /* perfromance run */ + results[0].seed1 = 0; + results[0].seed2 = 0; + results[0].seed3 = 0x66; + } + if ((results[0].seed1 == 1) && (results[0].seed2 == 0) + && (results[0].seed3 == 0)) + { /* validation run */ + results[0].seed1 = 0x3415; + results[0].seed2 = 0x3415; + results[0].seed3 = 0x66; + } +#if (MEM_METHOD == MEM_STATIC) + results[0].memblock[0] = (void *)static_memblk; + results[0].size = TOTAL_DATA_SIZE; + results[0].err = 0; +#if (MULTITHREAD > 1) +#error "Cannot use a static data area with multiple contexts!" +#endif +#elif (MEM_METHOD == MEM_MALLOC) + for (i = 0; i < MULTITHREAD; i++) + { + ee_s32 malloc_override = get_seed(7); + if (malloc_override != 0) + results[i].size = malloc_override; + else + results[i].size = TOTAL_DATA_SIZE; + results[i].memblock[0] = portable_malloc(results[i].size); + results[i].seed1 = results[0].seed1; + results[i].seed2 = results[0].seed2; + results[i].seed3 = results[0].seed3; + results[i].err = 0; + results[i].execs = results[0].execs; + } +#elif (MEM_METHOD == MEM_STACK) +for (i = 0; i < MULTITHREAD; i++) +{ + results[i].memblock[0] = stack_memblock + i * TOTAL_DATA_SIZE; + results[i].size = TOTAL_DATA_SIZE; + results[i].seed1 = results[0].seed1; + results[i].seed2 = results[0].seed2; + results[i].seed3 = results[0].seed3; + results[i].err = 0; + results[i].execs = results[0].execs; +} +#else +#error "Please define a way to initialize a memory block." +#endif + /* Data init */ + /* Find out how space much we have based on number of algorithms */ + for (i = 0; i < NUM_ALGORITHMS; i++) + { + if ((1 << (ee_u32)i) & results[0].execs) + num_algorithms++; + } + for (i = 0; i < MULTITHREAD; i++) + results[i].size = results[i].size / num_algorithms; + /* Assign pointers */ + for (i = 0; i < NUM_ALGORITHMS; i++) + { + ee_u32 ctx; + if ((1 << (ee_u32)i) & results[0].execs) + { + for (ctx = 0; ctx < MULTITHREAD; ctx++) + results[ctx].memblock[i + 1] + = (char *)(results[ctx].memblock[0]) + results[0].size * j; + j++; + } + } + /* call inits */ + for (i = 0; i < MULTITHREAD; i++) + { + if (results[i].execs & ID_LIST) + { + results[i].list = core_list_init( + results[0].size, results[i].memblock[1], results[i].seed1); + } + if (results[i].execs & ID_MATRIX) + { + core_init_matrix(results[0].size, + results[i].memblock[2], + (ee_s32)results[i].seed1 + | (((ee_s32)results[i].seed2) << 16), + &(results[i].mat)); + } + if (results[i].execs & ID_STATE) + { + core_init_state( + results[0].size, results[i].seed1, results[i].memblock[3]); + } + } + + /* automatically determine number of iterations if not set */ + if (results[0].iterations == 0) + { + secs_ret secs_passed = 0; + ee_u32 divisor; + results[0].iterations = 1; + while (secs_passed < (secs_ret)1) + { + results[0].iterations *= 10; + start_time(); + iterate(&results[0]); + stop_time(); + secs_passed = time_in_secs(get_time()); + } + /* now we know it executes for at least 1 sec, set actual run time at + * about 10 secs */ + divisor = (ee_u32)secs_passed; + if (divisor == 0) /* some machines cast float to int as 0 since this + conversion is not defined by ANSI, but we know at + least one second passed */ + divisor = 1; + results[0].iterations *= 1 + 10 / divisor; + } + /* perform actual benchmark */ + start_time(); +#if (MULTITHREAD > 1) + if (default_num_contexts > MULTITHREAD) + { + default_num_contexts = MULTITHREAD; + } + for (i = 0; i < default_num_contexts; i++) + { + results[i].iterations = results[0].iterations; + results[i].execs = results[0].execs; + core_start_parallel(&results[i]); + } + for (i = 0; i < default_num_contexts; i++) + { + core_stop_parallel(&results[i]); + } +#else + iterate(&results[0]); +#endif + stop_time(); + total_time = get_time(); + /* get a function of the input to report */ + seedcrc = crc16(results[0].seed1, seedcrc); + seedcrc = crc16(results[0].seed2, seedcrc); + seedcrc = crc16(results[0].seed3, seedcrc); + seedcrc = crc16(results[0].size, seedcrc); + + switch (seedcrc) + { /* test known output for common seeds */ + case 0x8a02: /* seed1=0, seed2=0, seed3=0x66, size 2000 per algorithm */ + known_id = 0; + ee_printf("6k performance run parameters for coremark.\n"); + break; + case 0x7b05: /* seed1=0x3415, seed2=0x3415, seed3=0x66, size 2000 per + algorithm */ + known_id = 1; + ee_printf("6k validation run parameters for coremark.\n"); + break; + case 0x4eaf: /* seed1=0x8, seed2=0x8, seed3=0x8, size 400 per algorithm + */ + known_id = 2; + ee_printf("Profile generation run parameters for coremark.\n"); + break; + case 0xe9f5: /* seed1=0, seed2=0, seed3=0x66, size 666 per algorithm */ + known_id = 3; + ee_printf("2K performance run parameters for coremark.\n"); + break; + case 0x18f2: /* seed1=0x3415, seed2=0x3415, seed3=0x66, size 666 per + algorithm */ + known_id = 4; + ee_printf("2K validation run parameters for coremark.\n"); + break; + default: + total_errors = -1; + break; + } + if (known_id >= 0) + { + for (i = 0; i < default_num_contexts; i++) + { + results[i].err = 0; + if ((results[i].execs & ID_LIST) + && (results[i].crclist != list_known_crc[known_id])) + { + ee_printf("[%u]ERROR! list crc 0x%04x - should be 0x%04x\n", + i, + results[i].crclist, + list_known_crc[known_id]); + results[i].err++; + } + if ((results[i].execs & ID_MATRIX) + && (results[i].crcmatrix != matrix_known_crc[known_id])) + { + ee_printf("[%u]ERROR! matrix crc 0x%04x - should be 0x%04x\n", + i, + results[i].crcmatrix, + matrix_known_crc[known_id]); + results[i].err++; + } + if ((results[i].execs & ID_STATE) + && (results[i].crcstate != state_known_crc[known_id])) + { + ee_printf("[%u]ERROR! state crc 0x%04x - should be 0x%04x\n", + i, + results[i].crcstate, + state_known_crc[known_id]); + results[i].err++; + } + total_errors += results[i].err; + } + } + total_errors += check_data_types(); + /* and report results */ + ee_printf("CoreMark Size : %lu\n", (long unsigned)results[0].size); + ee_printf("Total ticks : %lu\n", (long unsigned)total_time); +#if HAS_FLOAT + ee_printf("Total time (secs): %f\n", time_in_secs(total_time)); + if (time_in_secs(total_time) > 0) + ee_printf("Iterations/Sec : %f\n", + default_num_contexts * results[0].iterations + / time_in_secs(total_time)); +#else + ee_printf("Total time (secs): %d\n", time_in_secs(total_time)); + if (time_in_secs(total_time) > 0) + ee_printf("Iterations/Sec : %d\n", + default_num_contexts * results[0].iterations + / time_in_secs(total_time)); +#endif + if (time_in_secs(total_time) < 10) + { + ee_printf( + "ERROR! Must execute for at least 10 secs for a valid result!\n"); + total_errors++; + } + + ee_printf("Iterations : %lu\n", + (long unsigned)default_num_contexts * results[0].iterations); + ee_printf("Compiler version : %s\n", COMPILER_VERSION); + ee_printf("Compiler flags : %s\n", COMPILER_FLAGS); +#if (MULTITHREAD > 1) + ee_printf("Parallel %s : %d\n", PARALLEL_METHOD, default_num_contexts); +#endif + ee_printf("Memory location : %s\n", MEM_LOCATION); + /* output for verification */ + ee_printf("seedcrc : 0x%04x\n", seedcrc); + if (results[0].execs & ID_LIST) + for (i = 0; i < default_num_contexts; i++) + ee_printf("[%d]crclist : 0x%04x\n", i, results[i].crclist); + if (results[0].execs & ID_MATRIX) + for (i = 0; i < default_num_contexts; i++) + ee_printf("[%d]crcmatrix : 0x%04x\n", i, results[i].crcmatrix); + if (results[0].execs & ID_STATE) + for (i = 0; i < default_num_contexts; i++) + ee_printf("[%d]crcstate : 0x%04x\n", i, results[i].crcstate); + for (i = 0; i < default_num_contexts; i++) + ee_printf("[%d]crcfinal : 0x%04x\n", i, results[i].crc); + if (total_errors == 0) + { + ee_printf( + "Correct operation validated. See README.md for run and reporting " + "rules.\n"); +#if HAS_FLOAT + if (known_id == 3) + { + unsigned long long tmp = (unsigned long long) 1000.0*default_num_contexts*results[0].iterations/time_in_secs(total_time); + secs_ret totalmsecs = time_in_secs(total_time); + int totalmint = (int) totalmsecs; + ee_printf("ELAPSED TIME: %d\n", totalmint); + + ee_printf("CoreMark 1.0 : %d / %s %s", + tmp, + COMPILER_VERSION, + COMPILER_FLAGS); +#if defined(MEM_LOCATION) && !defined(MEM_LOCATION_UNSPEC) + ee_printf(" / %s", MEM_LOCATION); +#else + ee_printf(" / %s", mem_name[MEM_METHOD]); +#endif + +#if (MULTITHREAD > 1) + ee_printf(" / %d:%s", default_num_contexts, PARALLEL_METHOD); +#endif + ee_printf("\n"); + } +#endif + } + if (total_errors > 0) + ee_printf("Errors detected\n"); + if (total_errors < 0) + ee_printf( + "Cannot validate operation for these seed values, please compare " + "with results on a known platform.\n"); + +#if (MEM_METHOD == MEM_MALLOC) + for (i = 0; i < MULTITHREAD; i++) + portable_free(results[i].memblock[0]); +#endif + /* And last call any target specific code for finalizing */ + portable_fini(&(results[0].port)); + + return MAIN_RETURN_VAL; +} diff --git a/benchmarks/riscv-coremark/coremark/core_matrix.c b/benchmarks/riscv-coremark/coremark/core_matrix.c new file mode 100644 index 000000000..29fd8ab45 --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/core_matrix.c @@ -0,0 +1,359 @@ +/* +Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +Original Author: Shay Gal-on +*/ + +#include "coremark.h" +/* +Topic: Description + Matrix manipulation benchmark + + This very simple algorithm forms the basis of many more complex +algorithms. + + The tight inner loop is the focus of many optimizations (compiler as +well as hardware based) and is thus relevant for embedded processing. + + The total available data space will be divided to 3 parts: + NxN Matrix A - initialized with small values (upper 3/4 of the bits all +zero). NxN Matrix B - initialized with medium values (upper half of the bits all +zero). NxN Matrix C - used for the result. + + The actual values for A and B must be derived based on input that is not +available at compile time. +*/ +ee_s16 matrix_test(ee_u32 N, MATRES *C, MATDAT *A, MATDAT *B, MATDAT val); +ee_s16 matrix_sum(ee_u32 N, MATRES *C, MATDAT clipval); +void matrix_mul_const(ee_u32 N, MATRES *C, MATDAT *A, MATDAT val); +void matrix_mul_vect(ee_u32 N, MATRES *C, MATDAT *A, MATDAT *B); +void matrix_mul_matrix(ee_u32 N, MATRES *C, MATDAT *A, MATDAT *B); +void matrix_mul_matrix_bitextract(ee_u32 N, MATRES *C, MATDAT *A, MATDAT *B); +void matrix_add_const(ee_u32 N, MATDAT *A, MATDAT val); + +#define matrix_test_next(x) (x + 1) +#define matrix_clip(x, y) ((y) ? (x)&0x0ff : (x)&0x0ffff) +#define matrix_big(x) (0xf000 | (x)) +#define bit_extract(x, from, to) (((x) >> (from)) & (~(0xffffffff << (to)))) + +#if CORE_DEBUG +void +printmat(MATDAT *A, ee_u32 N, char *name) +{ + ee_u32 i, j; + ee_printf("Matrix %s [%dx%d]:\n", name, N, N); + for (i = 0; i < N; i++) + { + for (j = 0; j < N; j++) + { + if (j != 0) + ee_printf(","); + ee_printf("%d", A[i * N + j]); + } + ee_printf("\n"); + } +} +void +printmatC(MATRES *C, ee_u32 N, char *name) +{ + ee_u32 i, j; + ee_printf("Matrix %s [%dx%d]:\n", name, N, N); + for (i = 0; i < N; i++) + { + for (j = 0; j < N; j++) + { + if (j != 0) + ee_printf(","); + ee_printf("%d", C[i * N + j]); + } + ee_printf("\n"); + } +} +#endif +/* Function: core_bench_matrix + Benchmark function + + Iterate N times, + changing the matrix values slightly by a constant amount each time. +*/ +ee_u16 +core_bench_matrix(mat_params *p, ee_s16 seed, ee_u16 crc) +{ + ee_u32 N = p->N; + MATRES *C = p->C; + MATDAT *A = p->A; + MATDAT *B = p->B; + MATDAT val = (MATDAT)seed; + + crc = crc16(matrix_test(N, C, A, B, val), crc); + + return crc; +} + +/* Function: matrix_test + Perform matrix manipulation. + + Parameters: + N - Dimensions of the matrix. + C - memory for result matrix. + A - input matrix + B - operator matrix (not changed during operations) + + Returns: + A CRC value that captures all results calculated in the function. + In particular, crc of the value calculated on the result matrix + after each step by . + + Operation: + + 1 - Add a constant value to all elements of a matrix. + 2 - Multiply a matrix by a constant. + 3 - Multiply a matrix by a vector. + 4 - Multiply a matrix by a matrix. + 5 - Add a constant value to all elements of a matrix. + + After the last step, matrix A is back to original contents. +*/ +ee_s16 +matrix_test(ee_u32 N, MATRES *C, MATDAT *A, MATDAT *B, MATDAT val) +{ + ee_u16 crc = 0; + MATDAT clipval = matrix_big(val); + + matrix_add_const(N, A, val); /* make sure data changes */ +#if CORE_DEBUG + printmat(A, N, "matrix_add_const"); +#endif + matrix_mul_const(N, C, A, val); + crc = crc16(matrix_sum(N, C, clipval), crc); +#if CORE_DEBUG + printmatC(C, N, "matrix_mul_const"); +#endif + matrix_mul_vect(N, C, A, B); + crc = crc16(matrix_sum(N, C, clipval), crc); +#if CORE_DEBUG + printmatC(C, N, "matrix_mul_vect"); +#endif + matrix_mul_matrix(N, C, A, B); + crc = crc16(matrix_sum(N, C, clipval), crc); +#if CORE_DEBUG + printmatC(C, N, "matrix_mul_matrix"); +#endif + matrix_mul_matrix_bitextract(N, C, A, B); + crc = crc16(matrix_sum(N, C, clipval), crc); +#if CORE_DEBUG + printmatC(C, N, "matrix_mul_matrix_bitextract"); +#endif + + matrix_add_const(N, A, -val); /* return matrix to initial value */ + return crc; +} + +/* Function : matrix_init + Initialize the memory block for matrix benchmarking. + + Parameters: + blksize - Size of memory to be initialized. + memblk - Pointer to memory block. + seed - Actual values chosen depend on the seed parameter. + p - pointers to containing initialized matrixes. + + Returns: + Matrix dimensions. + + Note: + The seed parameter MUST be supplied from a source that cannot be + determined at compile time +*/ +ee_u32 +core_init_matrix(ee_u32 blksize, void *memblk, ee_s32 seed, mat_params *p) +{ + ee_u32 N = 0; + MATDAT *A; + MATDAT *B; + ee_s32 order = 1; + MATDAT val; + ee_u32 i = 0, j = 0; + if (seed == 0) + seed = 1; + while (j < blksize) + { + i++; + j = i * i * 2 * 4; + } + N = i - 1; + A = (MATDAT *)align_mem(memblk); + B = A + N * N; + + for (i = 0; i < N; i++) + { + for (j = 0; j < N; j++) + { + seed = ((order * seed) % 65536); + val = (seed + order); + val = matrix_clip(val, 0); + B[i * N + j] = val; + val = (val + order); + val = matrix_clip(val, 1); + A[i * N + j] = val; + order++; + } + } + + p->A = A; + p->B = B; + p->C = (MATRES *)align_mem(B + N * N); + p->N = N; +#if CORE_DEBUG + printmat(A, N, "A"); + printmat(B, N, "B"); +#endif + return N; +} + +/* Function: matrix_sum + Calculate a function that depends on the values of elements in the + matrix. + + For each element, accumulate into a temporary variable. + + As long as this value is under the parameter clipval, + add 1 to the result if the element is bigger then the previous. + + Otherwise, reset the accumulator and add 10 to the result. +*/ +ee_s16 +matrix_sum(ee_u32 N, MATRES *C, MATDAT clipval) +{ + MATRES tmp = 0, prev = 0, cur = 0; + ee_s16 ret = 0; + ee_u32 i, j; + for (i = 0; i < N; i++) + { + for (j = 0; j < N; j++) + { + cur = C[i * N + j]; + tmp += cur; + if (tmp > clipval) + { + ret += 10; + tmp = 0; + } + else + { + ret += (cur > prev) ? 1 : 0; + } + prev = cur; + } + } + return ret; +} + +/* Function: matrix_mul_const + Multiply a matrix by a constant. + This could be used as a scaler for instance. +*/ +void +matrix_mul_const(ee_u32 N, MATRES *C, MATDAT *A, MATDAT val) +{ + ee_u32 i, j; + for (i = 0; i < N; i++) + { + for (j = 0; j < N; j++) + { + C[i * N + j] = (MATRES)A[i * N + j] * (MATRES)val; + } + } +} + +/* Function: matrix_add_const + Add a constant value to all elements of a matrix. +*/ +void +matrix_add_const(ee_u32 N, MATDAT *A, MATDAT val) +{ + ee_u32 i, j; + for (i = 0; i < N; i++) + { + for (j = 0; j < N; j++) + { + A[i * N + j] += val; + } + } +} + +/* Function: matrix_mul_vect + Multiply a matrix by a vector. + This is common in many simple filters (e.g. fir where a vector of + coefficients is applied to the matrix.) +*/ +void +matrix_mul_vect(ee_u32 N, MATRES *C, MATDAT *A, MATDAT *B) +{ + ee_u32 i, j; + for (i = 0; i < N; i++) + { + C[i] = 0; + for (j = 0; j < N; j++) + { + C[i] += (MATRES)A[i * N + j] * (MATRES)B[j]; + } + } +} + +/* Function: matrix_mul_matrix + Multiply a matrix by a matrix. + Basic code is used in many algorithms, mostly with minor changes such as + scaling. +*/ +void +matrix_mul_matrix(ee_u32 N, MATRES *C, MATDAT *A, MATDAT *B) +{ + ee_u32 i, j, k; + for (i = 0; i < N; i++) + { + for (j = 0; j < N; j++) + { + C[i * N + j] = 0; + for (k = 0; k < N; k++) + { + C[i * N + j] += (MATRES)A[i * N + k] * (MATRES)B[k * N + j]; + } + } + } +} + +/* Function: matrix_mul_matrix_bitextract + Multiply a matrix by a matrix, and extract some bits from the result. + Basic code is used in many algorithms, mostly with minor changes such as + scaling. +*/ +void +matrix_mul_matrix_bitextract(ee_u32 N, MATRES *C, MATDAT *A, MATDAT *B) +{ + ee_u32 i, j, k; + for (i = 0; i < N; i++) + { + for (j = 0; j < N; j++) + { + C[i * N + j] = 0; + for (k = 0; k < N; k++) + { + MATRES tmp = (MATRES)A[i * N + k] * (MATRES)B[k * N + j]; + C[i * N + j] += bit_extract(tmp, 2, 4) * bit_extract(tmp, 5, 7); + } + } + } +} diff --git a/benchmarks/riscv-coremark/coremark/core_state.c b/benchmarks/riscv-coremark/coremark/core_state.c new file mode 100644 index 000000000..6dbab9dd9 --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/core_state.c @@ -0,0 +1,330 @@ +/* +Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +Original Author: Shay Gal-on +*/ + +#include "coremark.h" +/* local functions */ +enum CORE_STATE core_state_transition(ee_u8 **instr, ee_u32 *transition_count); + +/* +Topic: Description + Simple state machines like this one are used in many embedded products. + + For more complex state machines, sometimes a state transition table +implementation is used instead, trading speed of direct coding for ease of +maintenance. + + Since the main goal of using a state machine in CoreMark is to excercise +the switch/if behaviour, we are using a small moore machine. + + In particular, this machine tests type of string input, + trying to determine whether the input is a number or something else. + (see core_state.png). +*/ + +/* Function: core_bench_state + Benchmark function + + Go over the input twice, once direct, and once after introducing some + corruption. +*/ +ee_u16 +core_bench_state(ee_u32 blksize, + ee_u8 *memblock, + ee_s16 seed1, + ee_s16 seed2, + ee_s16 step, + ee_u16 crc) +{ + ee_u32 final_counts[NUM_CORE_STATES]; + ee_u32 track_counts[NUM_CORE_STATES]; + ee_u8 *p = memblock; + ee_u32 i; + +#if CORE_DEBUG + ee_printf("State Bench: %d,%d,%d,%04x\n", seed1, seed2, step, crc); +#endif + for (i = 0; i < NUM_CORE_STATES; i++) + { + final_counts[i] = track_counts[i] = 0; + } + /* run the state machine over the input */ + while (*p != 0) + { + enum CORE_STATE fstate = core_state_transition(&p, track_counts); + final_counts[fstate]++; +#if CORE_DEBUG + ee_printf("%d,", fstate); + } + ee_printf("\n"); +#else + } +#endif + p = memblock; + while (p < (memblock + blksize)) + { /* insert some corruption */ + if (*p != ',') + *p ^= (ee_u8)seed1; + p += step; + } + p = memblock; + /* run the state machine over the input again */ + while (*p != 0) + { + enum CORE_STATE fstate = core_state_transition(&p, track_counts); + final_counts[fstate]++; +#if CORE_DEBUG + ee_printf("%d,", fstate); + } + ee_printf("\n"); +#else + } +#endif + p = memblock; + while (p < (memblock + blksize)) + { /* undo corruption is seed1 and seed2 are equal */ + if (*p != ',') + *p ^= (ee_u8)seed2; + p += step; + } + /* end timing */ + for (i = 0; i < NUM_CORE_STATES; i++) + { + crc = crcu32(final_counts[i], crc); + crc = crcu32(track_counts[i], crc); + } + return crc; +} + +/* Default initialization patterns */ +static ee_u8 *intpat[4] + = { (ee_u8 *)"5012", (ee_u8 *)"1234", (ee_u8 *)"-874", (ee_u8 *)"+122" }; +static ee_u8 *floatpat[4] = { (ee_u8 *)"35.54400", + (ee_u8 *)".1234500", + (ee_u8 *)"-110.700", + (ee_u8 *)"+0.64400" }; +static ee_u8 *scipat[4] = { (ee_u8 *)"5.500e+3", + (ee_u8 *)"-.123e-2", + (ee_u8 *)"-87e+832", + (ee_u8 *)"+0.6e-12" }; +static ee_u8 *errpat[4] = { (ee_u8 *)"T0.3e-1F", + (ee_u8 *)"-T.T++Tq", + (ee_u8 *)"1T3.4e4z", + (ee_u8 *)"34.0e-T^" }; + +/* Function: core_init_state + Initialize the input data for the state machine. + + Populate the input with several predetermined strings, interspersed. + Actual patterns chosen depend on the seed parameter. + + Note: + The seed parameter MUST be supplied from a source that cannot be + determined at compile time +*/ +void +core_init_state(ee_u32 size, ee_s16 seed, ee_u8 *p) +{ + ee_u32 total = 0, next = 0, i; + ee_u8 *buf = 0; +#if CORE_DEBUG + ee_u8 *start = p; + ee_printf("State: %d,%d\n", size, seed); +#endif + size--; + next = 0; + while ((total + next + 1) < size) + { + if (next > 0) + { + for (i = 0; i < next; i++) + *(p + total + i) = buf[i]; + *(p + total + i) = ','; + total += next + 1; + } + seed++; + switch (seed & 0x7) + { + case 0: /* int */ + case 1: /* int */ + case 2: /* int */ + buf = intpat[(seed >> 3) & 0x3]; + next = 4; + break; + case 3: /* float */ + case 4: /* float */ + buf = floatpat[(seed >> 3) & 0x3]; + next = 8; + break; + case 5: /* scientific */ + case 6: /* scientific */ + buf = scipat[(seed >> 3) & 0x3]; + next = 8; + break; + case 7: /* invalid */ + buf = errpat[(seed >> 3) & 0x3]; + next = 8; + break; + default: /* Never happen, just to make some compilers happy */ + break; + } + } + size++; + while (total < size) + { /* fill the rest with 0 */ + *(p + total) = 0; + total++; + } +#if CORE_DEBUG + ee_printf("State Input: %s\n", start); +#endif +} + +static ee_u8 +ee_isdigit(ee_u8 c) +{ + ee_u8 retval; + retval = ((c >= '0') & (c <= '9')) ? 1 : 0; + return retval; +} + +/* Function: core_state_transition + Actual state machine. + + The state machine will continue scanning until either: + 1 - an invalid input is detcted. + 2 - a valid number has been detected. + + The input pointer is updated to point to the end of the token, and the + end state is returned (either specific format determined or invalid). +*/ + +enum CORE_STATE +core_state_transition(ee_u8 **instr, ee_u32 *transition_count) +{ + ee_u8 * str = *instr; + ee_u8 NEXT_SYMBOL; + enum CORE_STATE state = CORE_START; + for (; *str && state != CORE_INVALID; str++) + { + NEXT_SYMBOL = *str; + if (NEXT_SYMBOL == ',') /* end of this input */ + { + str++; + break; + } + switch (state) + { + case CORE_START: + if (ee_isdigit(NEXT_SYMBOL)) + { + state = CORE_INT; + } + else if (NEXT_SYMBOL == '+' || NEXT_SYMBOL == '-') + { + state = CORE_S1; + } + else if (NEXT_SYMBOL == '.') + { + state = CORE_FLOAT; + } + else + { + state = CORE_INVALID; + transition_count[CORE_INVALID]++; + } + transition_count[CORE_START]++; + break; + case CORE_S1: + if (ee_isdigit(NEXT_SYMBOL)) + { + state = CORE_INT; + transition_count[CORE_S1]++; + } + else if (NEXT_SYMBOL == '.') + { + state = CORE_FLOAT; + transition_count[CORE_S1]++; + } + else + { + state = CORE_INVALID; + transition_count[CORE_S1]++; + } + break; + case CORE_INT: + if (NEXT_SYMBOL == '.') + { + state = CORE_FLOAT; + transition_count[CORE_INT]++; + } + else if (!ee_isdigit(NEXT_SYMBOL)) + { + state = CORE_INVALID; + transition_count[CORE_INT]++; + } + break; + case CORE_FLOAT: + if (NEXT_SYMBOL == 'E' || NEXT_SYMBOL == 'e') + { + state = CORE_S2; + transition_count[CORE_FLOAT]++; + } + else if (!ee_isdigit(NEXT_SYMBOL)) + { + state = CORE_INVALID; + transition_count[CORE_FLOAT]++; + } + break; + case CORE_S2: + if (NEXT_SYMBOL == '+' || NEXT_SYMBOL == '-') + { + state = CORE_EXPONENT; + transition_count[CORE_S2]++; + } + else + { + state = CORE_INVALID; + transition_count[CORE_S2]++; + } + break; + case CORE_EXPONENT: + if (ee_isdigit(NEXT_SYMBOL)) + { + state = CORE_SCIENTIFIC; + transition_count[CORE_EXPONENT]++; + } + else + { + state = CORE_INVALID; + transition_count[CORE_EXPONENT]++; + } + break; + case CORE_SCIENTIFIC: + if (!ee_isdigit(NEXT_SYMBOL)) + { + state = CORE_INVALID; + transition_count[CORE_INVALID]++; + } + break; + default: + break; + } + } + *instr = str; + return state; +} diff --git a/benchmarks/riscv-coremark/coremark/core_util.c b/benchmarks/riscv-coremark/coremark/core_util.c new file mode 100644 index 000000000..67c5d7757 --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/core_util.c @@ -0,0 +1,249 @@ +/* +Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +Original Author: Shay Gal-on +*/ + +#include "coremark.h" +/* Function: get_seed + Get a values that cannot be determined at compile time. + + Since different embedded systems and compilers are used, 3 different + methods are provided: 1 - Using a volatile variable. This method is only + valid if the compiler is forced to generate code that reads the value of a + volatile variable from memory at run time. Please note, if using this method, + you would need to modify core_portme.c to generate training profile. 2 - + Command line arguments. This is the preferred method if command line + arguments are supported. 3 - System function. If none of the first 2 methods + is available on the platform, a system function which is not a stub can be + used. + + e.g. read the value on GPIO pins connected to switches, or invoke + special simulator functions. +*/ +#if (SEED_METHOD == SEED_VOLATILE) +extern volatile ee_s32 seed1_volatile; +extern volatile ee_s32 seed2_volatile; +extern volatile ee_s32 seed3_volatile; +extern volatile ee_s32 seed4_volatile; +extern volatile ee_s32 seed5_volatile; +ee_s32 +get_seed_32(int i) +{ + ee_s32 retval; + switch (i) + { + case 1: + retval = seed1_volatile; + break; + case 2: + retval = seed2_volatile; + break; + case 3: + retval = seed3_volatile; + break; + case 4: + retval = seed4_volatile; + break; + case 5: + retval = seed5_volatile; + break; + default: + retval = 0; + break; + } + return retval; +} +#elif (SEED_METHOD == SEED_ARG) +ee_s32 +parseval(char *valstring) +{ + ee_s32 retval = 0; + ee_s32 neg = 1; + int hexmode = 0; + if (*valstring == '-') + { + neg = -1; + valstring++; + } + if ((valstring[0] == '0') && (valstring[1] == 'x')) + { + hexmode = 1; + valstring += 2; + } + /* first look for digits */ + if (hexmode) + { + while (((*valstring >= '0') && (*valstring <= '9')) + || ((*valstring >= 'a') && (*valstring <= 'f'))) + { + ee_s32 digit = *valstring - '0'; + if (digit > 9) + digit = 10 + *valstring - 'a'; + retval *= 16; + retval += digit; + valstring++; + } + } + else + { + while ((*valstring >= '0') && (*valstring <= '9')) + { + ee_s32 digit = *valstring - '0'; + retval *= 10; + retval += digit; + valstring++; + } + } + /* now add qualifiers */ + if (*valstring == 'K') + retval *= 1024; + if (*valstring == 'M') + retval *= 1024 * 1024; + + retval *= neg; + return retval; +} + +ee_s32 +get_seed_args(int i, int argc, char *argv[]) +{ + if (argc > i) + return parseval(argv[i]); + return 0; +} + +#elif (SEED_METHOD == SEED_FUNC) +/* If using OS based function, you must define and implement the functions below + * in core_portme.h and core_portme.c ! */ +ee_s32 +get_seed_32(int i) +{ + ee_s32 retval; + switch (i) + { + case 1: + retval = portme_sys1(); + break; + case 2: + retval = portme_sys2(); + break; + case 3: + retval = portme_sys3(); + break; + case 4: + retval = portme_sys4(); + break; + case 5: + retval = portme_sys5(); + break; + default: + retval = 0; + break; + } + return retval; +} +#endif + +/* Function: crc* + Service functions to calculate 16b CRC code. + +*/ +ee_u16 +crcu8(ee_u8 data, ee_u16 crc) +{ + ee_u8 i = 0, x16 = 0, carry = 0; + + for (i = 0; i < 8; i++) + { + x16 = (ee_u8)((data & 1) ^ ((ee_u8)crc & 1)); + data >>= 1; + + if (x16 == 1) + { + crc ^= 0x4002; + carry = 1; + } + else + carry = 0; + crc >>= 1; + if (carry) + crc |= 0x8000; + else + crc &= 0x7fff; + } + return crc; +} +ee_u16 +crcu16(ee_u16 newval, ee_u16 crc) +{ + crc = crcu8((ee_u8)(newval), crc); + crc = crcu8((ee_u8)((newval) >> 8), crc); + return crc; +} +ee_u16 +crcu32(ee_u32 newval, ee_u16 crc) +{ + crc = crc16((ee_s16)newval, crc); + crc = crc16((ee_s16)(newval >> 16), crc); + return crc; +} +ee_u16 +crc16(ee_s16 newval, ee_u16 crc) +{ + return crcu16((ee_u16)newval, crc); +} + +ee_u8 +check_data_types() +{ + ee_u8 retval = 0; + if (sizeof(ee_u8) != 1) + { + ee_printf("ERROR: ee_u8 is not an 8b datatype!\n"); + retval++; + } + if (sizeof(ee_u16) != 2) + { + ee_printf("ERROR: ee_u16 is not a 16b datatype!\n"); + retval++; + } + if (sizeof(ee_s16) != 2) + { + ee_printf("ERROR: ee_s16 is not a 16b datatype!\n"); + retval++; + } + if (sizeof(ee_s32) != 4) + { + ee_printf("ERROR: ee_s32 is not a 32b datatype!\n"); + retval++; + } + if (sizeof(ee_u32) != 4) + { + ee_printf("ERROR: ee_u32 is not a 32b datatype!\n"); + retval++; + } + if (sizeof(ee_ptr_int) != sizeof(int *)) + { + ee_printf( + "ERROR: ee_ptr_int is not a datatype that holds an int pointer!\n"); + retval++; + } + if (retval > 0) + { + ee_printf("ERROR: Please modify the datatypes in core_portme.h!\n"); + } + return retval; +} diff --git a/benchmarks/riscv-coremark/coremark/coremark.exe b/benchmarks/riscv-coremark/coremark/coremark.exe new file mode 100755 index 0000000000000000000000000000000000000000..75b8e8468c8019f140cf7c9c0a6e1315d3629db9 GIT binary patch literal 23200 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 b<`GdQ>J|ALa50|z;MWX}Nhty;S?T`(%Gk++ literal 0 HcmV?d00001 diff --git a/benchmarks/riscv-coremark/coremark/coremark.h b/benchmarks/riscv-coremark/coremark/coremark.h new file mode 100644 index 000000000..9c5e4060a --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/coremark.h @@ -0,0 +1,183 @@ +/* +Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +Original Author: Shay Gal-on +*/ + +/* Topic: Description + This file contains declarations of the various benchmark functions. +*/ + +/* Configuration: TOTAL_DATA_SIZE + Define total size for data algorithms will operate on +*/ +#ifndef TOTAL_DATA_SIZE +#define TOTAL_DATA_SIZE 2 * 1000 +#endif + +#define SEED_ARG 0 +#define SEED_FUNC 1 +#define SEED_VOLATILE 2 + +#define MEM_STATIC 0 +#define MEM_MALLOC 1 +#define MEM_STACK 2 + +#include "core_portme.h" + +#if HAS_STDIO +#include +#endif +#if HAS_PRINTF +#define ee_printf printf +#endif + +/* Actual benchmark execution in iterate */ +void *iterate(void *pres); + +/* Typedef: secs_ret + For machines that have floating point support, get number of seconds as + a double. Otherwise an unsigned int. +*/ +#if HAS_FLOAT +typedef double secs_ret; +#else +typedef ee_u32 secs_ret; +#endif + +#if MAIN_HAS_NORETURN +#define MAIN_RETURN_VAL +#define MAIN_RETURN_TYPE void +#else +#define MAIN_RETURN_VAL 0 +#define MAIN_RETURN_TYPE int +#endif + +void start_time(void); +void stop_time(void); +CORE_TICKS get_time(void); +secs_ret time_in_secs(CORE_TICKS ticks); + +/* Misc useful functions */ +ee_u16 crcu8(ee_u8 data, ee_u16 crc); +ee_u16 crc16(ee_s16 newval, ee_u16 crc); +ee_u16 crcu16(ee_u16 newval, ee_u16 crc); +ee_u16 crcu32(ee_u32 newval, ee_u16 crc); +ee_u8 check_data_types(void); +void * portable_malloc(ee_size_t size); +void portable_free(void *p); +ee_s32 parseval(char *valstring); + +/* Algorithm IDS */ +#define ID_LIST (1 << 0) +#define ID_MATRIX (1 << 1) +#define ID_STATE (1 << 2) +#define ALL_ALGORITHMS_MASK (ID_LIST | ID_MATRIX | ID_STATE) +#define NUM_ALGORITHMS 3 + +/* list data structures */ +typedef struct list_data_s +{ + ee_s16 data16; + ee_s16 idx; +} list_data; + +typedef struct list_head_s +{ + struct list_head_s *next; + struct list_data_s *info; +} list_head; + +/*matrix benchmark related stuff */ +#define MATDAT_INT 1 +#if MATDAT_INT +typedef ee_s16 MATDAT; +typedef ee_s32 MATRES; +#else +typedef ee_f16 MATDAT; +typedef ee_f32 MATRES; +#endif + +typedef struct MAT_PARAMS_S +{ + int N; + MATDAT *A; + MATDAT *B; + MATRES *C; +} mat_params; + +/* state machine related stuff */ +/* List of all the possible states for the FSM */ +typedef enum CORE_STATE +{ + CORE_START = 0, + CORE_INVALID, + CORE_S1, + CORE_S2, + CORE_INT, + CORE_FLOAT, + CORE_EXPONENT, + CORE_SCIENTIFIC, + NUM_CORE_STATES +} core_state_e; + +/* Helper structure to hold results */ +typedef struct RESULTS_S +{ + /* inputs */ + ee_s16 seed1; /* Initializing seed */ + ee_s16 seed2; /* Initializing seed */ + ee_s16 seed3; /* Initializing seed */ + void * memblock[4]; /* Pointer to safe memory location */ + ee_u32 size; /* Size of the data */ + ee_u32 iterations; /* Number of iterations to execute */ + ee_u32 execs; /* Bitmask of operations to execute */ + struct list_head_s *list; + mat_params mat; + /* outputs */ + ee_u16 crc; + ee_u16 crclist; + ee_u16 crcmatrix; + ee_u16 crcstate; + ee_s16 err; + /* ultithread specific */ + core_portable port; +} core_results; + +/* Multicore execution handling */ +#if (MULTITHREAD > 1) +ee_u8 core_start_parallel(core_results *res); +ee_u8 core_stop_parallel(core_results *res); +#endif + +/* list benchmark functions */ +list_head *core_list_init(ee_u32 blksize, list_head *memblock, ee_s16 seed); +ee_u16 core_bench_list(core_results *res, ee_s16 finder_idx); + +/* state benchmark functions */ +void core_init_state(ee_u32 size, ee_s16 seed, ee_u8 *p); +ee_u16 core_bench_state(ee_u32 blksize, + ee_u8 *memblock, + ee_s16 seed1, + ee_s16 seed2, + ee_s16 step, + ee_u16 crc); + +/* matrix benchmark functions */ +ee_u32 core_init_matrix(ee_u32 blksize, + void * memblk, + ee_s32 seed, + mat_params *p); +ee_u16 core_bench_matrix(mat_params *p, ee_s16 seed, ee_u16 crc); diff --git a/benchmarks/riscv-coremark/coremark/coremark.md5 b/benchmarks/riscv-coremark/coremark/coremark.md5 new file mode 100644 index 000000000..94160db22 --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/coremark.md5 @@ -0,0 +1,6 @@ +8d082dc4a9676c02731a8cf209339072 core_list_join.c +c984863b84b59185d8b5fb81c1ca7535 core_main.c +5fa21a0f7c3964167c9691db531ca652 core_matrix.c +edcfc7a0b146a50028014f06e6826aa3 core_state.c +45540ba2145adea1ec7ea2c72a1fbbcb core_util.c +8ca974c013b380dc7f0d6d1afb76eb2d coremark.h diff --git a/benchmarks/riscv-coremark/coremark/cygwin/core_portme.c b/benchmarks/riscv-coremark/coremark/cygwin/core_portme.c new file mode 100755 index 000000000..fe8d29983 --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/cygwin/core_portme.c @@ -0,0 +1,336 @@ +/* +Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +Original Author: Shay Gal-on +*/ + +#include +#include +#include "coremark.h" +#if CALLGRIND_RUN +#include +#endif + +#if (MEM_METHOD==MEM_MALLOC) +#include +/* Function: portable_malloc + Provide malloc() functionality in a platform specific way. +*/ +void *portable_malloc(size_t size) { + return malloc(size); +} +/* Function: portable_free + Provide free() functionality in a platform specific way. +*/ +void portable_free(void *p) { + free(p); +} +#else +void *portable_malloc(size_t size) { + return NULL; +} +void portable_free(void *p) { + p=NULL; +} +#endif + +#if (SEED_METHOD==SEED_VOLATILE) +#if VALIDATION_RUN + volatile ee_s32 seed1_volatile=0x3415; + volatile ee_s32 seed2_volatile=0x3415; + volatile ee_s32 seed3_volatile=0x66; +#endif +#if PERFORMANCE_RUN + volatile ee_s32 seed1_volatile=0x0; + volatile ee_s32 seed2_volatile=0x0; + volatile ee_s32 seed3_volatile=0x66; +#endif +#if PROFILE_RUN + volatile ee_s32 seed1_volatile=0x8; + volatile ee_s32 seed2_volatile=0x8; + volatile ee_s32 seed3_volatile=0x8; +#endif + volatile ee_s32 seed4_volatile=ITERATIONS; + volatile ee_s32 seed5_volatile=0; +#endif +/* Porting: Timing functions + How to capture time and convert to seconds must be ported to whatever is supported by the platform. + e.g. Read value from on board RTC, read value from cpu clock cycles performance counter etc. + Sample implementation for standard time.h and windows.h definitions included. +*/ +/* Define: TIMER_RES_DIVIDER + Divider to trade off timer resolution and total time that can be measured. + + Use lower values to increase resolution, but make sure that overflow does not occur. + If there are issues with the return value overflowing, increase this value. + */ +#if USE_CLOCK + #define NSECS_PER_SEC CLOCKS_PER_SEC + #define EE_TIMER_TICKER_RATE 1000 + #define CORETIMETYPE clock_t + #define GETMYTIME(_t) (*_t=clock()) + #define MYTIMEDIFF(fin,ini) ((fin)-(ini)) + #define TIMER_RES_DIVIDER 1 + #define SAMPLE_TIME_IMPLEMENTATION 1 +#elif defined(_MSC_VER) + #define NSECS_PER_SEC 10000000 + #define EE_TIMER_TICKER_RATE 1000 + #define CORETIMETYPE FILETIME + #define GETMYTIME(_t) GetSystemTimeAsFileTime(_t) + #define MYTIMEDIFF(fin,ini) (((*(__int64*)&fin)-(*(__int64*)&ini))/TIMER_RES_DIVIDER) + /* setting to millisces resolution by default with MSDEV */ + #ifndef TIMER_RES_DIVIDER + #define TIMER_RES_DIVIDER 1000 + #endif + #define SAMPLE_TIME_IMPLEMENTATION 1 +#elif HAS_TIME_H + #define NSECS_PER_SEC 1000000000 + #define EE_TIMER_TICKER_RATE 1000 + #define CORETIMETYPE struct timespec + #define GETMYTIME(_t) clock_gettime(CLOCK_REALTIME,_t) + #define MYTIMEDIFF(fin,ini) ((fin.tv_sec-ini.tv_sec)*(NSECS_PER_SEC/TIMER_RES_DIVIDER)+(fin.tv_nsec-ini.tv_nsec)/TIMER_RES_DIVIDER) + /* setting to 1/1000 of a second resolution by default with linux */ + #ifndef TIMER_RES_DIVIDER + #define TIMER_RES_DIVIDER 1000000 + #endif + #define SAMPLE_TIME_IMPLEMENTATION 1 +#else + #define SAMPLE_TIME_IMPLEMENTATION 0 +#endif +#define EE_TICKS_PER_SEC (NSECS_PER_SEC / TIMER_RES_DIVIDER) + +#if SAMPLE_TIME_IMPLEMENTATION +/** Define Host specific (POSIX), or target specific global time variables. */ +static CORETIMETYPE start_time_val, stop_time_val; + +/* Function: start_time + This function will be called right before starting the timed portion of the benchmark. + + Implementation may be capturing a system timer (as implemented in the example code) + or zeroing some system parameters - e.g. setting the cpu clocks cycles to 0. +*/ +void start_time(void) { + GETMYTIME(&start_time_val ); +#if CALLGRIND_RUN + CALLGRIND_START_INSTRUMENTATION +#endif +#if MICA + asm volatile("int3");/*1 */ +#endif +} +/* Function: stop_time + This function will be called right after ending the timed portion of the benchmark. + + Implementation may be capturing a system timer (as implemented in the example code) + or other system parameters - e.g. reading the current value of cpu cycles counter. +*/ +void stop_time(void) { +#if CALLGRIND_RUN + CALLGRIND_STOP_INSTRUMENTATION +#endif +#if MICA + asm volatile("int3");/*1 */ +#endif + GETMYTIME(&stop_time_val ); +} +/* Function: get_time + Return an abstract "ticks" number that signifies time on the system. + + Actual value returned may be cpu cycles, milliseconds or any other value, + as long as it can be converted to seconds by . + This methodology is taken to accomodate any hardware or simulated platform. + The sample implementation returns millisecs by default, + and the resolution is controlled by +*/ +CORE_TICKS get_time(void) { + CORE_TICKS elapsed=(CORE_TICKS)(MYTIMEDIFF(stop_time_val, start_time_val)); + return elapsed; +} +/* Function: time_in_secs + Convert the value returned by get_time to seconds. + + The type is used to accomodate systems with no support for floating point. + Default implementation implemented by the EE_TICKS_PER_SEC macro above. +*/ +secs_ret time_in_secs(CORE_TICKS ticks) { + secs_ret retval=((secs_ret)ticks) / (secs_ret)EE_TICKS_PER_SEC; + return retval; +} +#else +#error "Please implement timing functionality in core_portme.c" +#endif /* SAMPLE_TIME_IMPLEMENTATION */ + +ee_u32 default_num_contexts=MULTITHREAD; + +/* Function: portable_init + Target specific initialization code + Test for some common mistakes. +*/ +void portable_init(core_portable *p, int *argc, char *argv[]) +{ +#if PRINT_ARGS + int i; + for (i=0; i<*argc; i++) { + ee_printf("Arg[%d]=%s\n",i,argv[i]); + } +#endif + if (sizeof(ee_ptr_int) != sizeof(ee_u8 *)) { + ee_printf("ERROR! Please define ee_ptr_int to a type that holds a pointer!\n"); + } + if (sizeof(ee_u32) != 4) { + ee_printf("ERROR! Please define ee_u32 to a 32b unsigned type!\n"); + } +#if (MAIN_HAS_NOARGC && (SEED_METHOD==SEED_ARG)) + ee_printf("ERROR! Main has no argc, but SEED_METHOD defined to SEED_ARG!\n"); +#endif + +#if (MULTITHREAD>1) && (SEED_METHOD==SEED_ARG) + int nargs=*argc,i; + if ((nargs>1) && (*argv[1]=='M')) { + default_num_contexts=parseval(argv[1]+1); + if (default_num_contexts>MULTITHREAD) + default_num_contexts=MULTITHREAD; + /* Shift args since first arg is directed to the portable part and not to coremark main */ + --nargs; + for (i=1; i*/ + p->portable_id=1; +} +/* Function: portable_fini + Target specific final code +*/ +void portable_fini(core_portable *p) +{ + p->portable_id=0; +} + +#if (MULTITHREAD>1) + +/* Function: core_start_parallel + Start benchmarking in a parallel context. + + Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets. + Other implementations using MCAPI or other standards can easily be devised. +*/ +/* Function: core_stop_parallel + Stop a parallel context execution of coremark, and gather the results. + + Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets. + Other implementations using MCAPI or other standards can easily be devised. +*/ +#if USE_PTHREAD +ee_u8 core_start_parallel(core_results *res) { + return (ee_u8)pthread_create(&(res->port.thread),NULL,iterate,(void *)res); +} +ee_u8 core_stop_parallel(core_results *res) { + void *retval; + return (ee_u8)pthread_join(res->port.thread,&retval); +} +#elif USE_FORK +static int key_id=0; +ee_u8 core_start_parallel(core_results *res) { + key_t key=4321+key_id; + key_id++; + res->port.pid=fork(); + res->port.shmid=shmget(key, 8, IPC_CREAT | 0666); + if (res->port.shmid<0) { + ee_printf("ERROR in shmget!\n"); + } + if (res->port.pid==0) { + iterate(res); + res->port.shm=shmat(res->port.shmid, NULL, 0); + /* copy the validation values to the shared memory area and quit*/ + if (res->port.shm == (char *) -1) { + ee_printf("ERROR in child shmat!\n"); + } else { + memcpy(res->port.shm,&(res->crc),8); + shmdt(res->port.shm); + } + exit(0); + } + return 1; +} +ee_u8 core_stop_parallel(core_results *res) { + int status; + pid_t wpid = waitpid(res->port.pid,&status,WUNTRACED); + if (wpid != res->port.pid) { + ee_printf("ERROR waiting for child.\n"); + if (errno == ECHILD) ee_printf("errno=No such child %d\n",res->port.pid); + if (errno == EINTR) ee_printf("errno=Interrupted\n"); + return 0; + } + /* after process is done, get the values from the shared memory area */ + res->port.shm=shmat(res->port.shmid, NULL, 0); + if (res->port.shm == (char *) -1) { + ee_printf("ERROR in parent shmat!\n"); + return 0; + } + memcpy(&(res->crc),res->port.shm,8); + shmdt(res->port.shm); + return 1; +} +#elif USE_SOCKET +static int key_id=0; +ee_u8 core_start_parallel(core_results *res) { + int bound, buffer_length=8; + res->port.sa.sin_family = AF_INET; + res->port.sa.sin_addr.s_addr = htonl(0x7F000001); + res->port.sa.sin_port = htons(7654+key_id); + key_id++; + res->port.pid=fork(); + if (res->port.pid==0) { /* benchmark child */ + iterate(res); + res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); + if (-1 == res->port.sock) /* if socket failed to initialize, exit */ { + ee_printf("Error Creating Socket"); + } else { + int bytes_sent = sendto(res->port.sock, &(res->crc), buffer_length, 0,(struct sockaddr*)&(res->port.sa), sizeof (struct sockaddr_in)); + if (bytes_sent < 0) + ee_printf("Error sending packet: %s\n", strerror(errno)); + close(res->port.sock); /* close the socket */ + } + exit(0); + } + /* parent process, open the socket */ + res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); + bound = bind(res->port.sock,(struct sockaddr*)&(res->port.sa), sizeof(struct sockaddr)); + if (bound < 0) + ee_printf("bind(): %s\n",strerror(errno)); + return 1; +} +ee_u8 core_stop_parallel(core_results *res) { + int status; + int fromlen=sizeof(struct sockaddr); + int recsize = recvfrom(res->port.sock, &(res->crc), 8, 0, (struct sockaddr*)&(res->port.sa), &fromlen); + if (recsize < 0) { + ee_printf("Error in receive: %s\n", strerror(errno)); + return 0; + } + pid_t wpid = waitpid(res->port.pid,&status,WUNTRACED); + if (wpid != res->port.pid) { + ee_printf("ERROR waiting for child.\n"); + if (errno == ECHILD) ee_printf("errno=No such child %d\n",res->port.pid); + if (errno == EINTR) ee_printf("errno=Interrupted\n"); + return 0; + } + return 1; +} +#else /* no standard multicore implementation */ +#error "Please implement multicore functionality in core_portme.c to use multiple contexts." +#endif /* multithread implementations */ +#endif diff --git a/benchmarks/riscv-coremark/coremark/cygwin/core_portme.h b/benchmarks/riscv-coremark/coremark/cygwin/core_portme.h new file mode 100755 index 000000000..9471b12ec --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/cygwin/core_portme.h @@ -0,0 +1,293 @@ +/* +Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +Original Author: Shay Gal-on +*/ + +/* Topic: Description + This file contains configuration constants required to execute on different platforms +*/ +#ifndef CORE_PORTME_H +#define CORE_PORTME_H +/************************/ +/* Data types and settings */ +/************************/ +/* Configuration: HAS_FLOAT + Define to 1 if the platform supports floating point. +*/ +#ifndef HAS_FLOAT +#define HAS_FLOAT 1 +#endif +/* Configuration: HAS_TIME_H + Define to 1 if platform has the time.h header file, + and implementation of functions thereof. +*/ +#ifndef HAS_TIME_H +#define HAS_TIME_H 1 +#endif +/* Configuration: USE_CLOCK + Define to 1 if platform has the time.h header file, + and implementation of functions thereof. +*/ +#ifndef USE_CLOCK +#define USE_CLOCK 0 +#endif +/* Configuration: HAS_STDIO + Define to 1 if the platform has stdio.h. +*/ +#ifndef HAS_STDIO +#define HAS_STDIO 1 +#endif +/* Configuration: HAS_PRINTF + Define to 1 if the platform has stdio.h and implements the printf function. +*/ +#ifndef HAS_PRINTF +#define HAS_PRINTF 1 +#endif + +/* Configuration: CORE_TICKS + Define type of return from the timing functions. + */ +#if defined(_MSC_VER) +#include +typedef size_t CORE_TICKS; +#elif HAS_TIME_H +#include +typedef clock_t CORE_TICKS; +#else +#error "Please define type of CORE_TICKS and implement start_time, end_time get_time and time_in_secs functions!" +#endif + +/* Definitions: COMPILER_VERSION, COMPILER_FLAGS, MEM_LOCATION + Initialize these strings per platform +*/ +#ifndef COMPILER_VERSION + #ifdef __GNUC__ + #define COMPILER_VERSION "GCC"__VERSION__ + #else + #define COMPILER_VERSION "Please put compiler version here (e.g. gcc 4.1)" + #endif +#endif +#ifndef COMPILER_FLAGS + #define COMPILER_FLAGS FLAGS_STR /* "Please put compiler flags here (e.g. -o3)" */ +#endif +#ifndef MEM_LOCATION + #define MEM_LOCATION "Please put data memory location here\n\t\t\t(e.g. code in flash, data on heap etc)" + #define MEM_LOCATION_UNSPEC 1 +#endif + +/* Data Types: + To avoid compiler issues, define the data types that need ot be used for 8b, 16b and 32b in . + + *Imprtant*: + ee_ptr_int needs to be the data type used to hold pointers, otherwise coremark may fail!!! +*/ +typedef signed short ee_s16; +typedef unsigned short ee_u16; +typedef signed int ee_s32; +typedef double ee_f32; +typedef unsigned char ee_u8; +typedef unsigned int ee_u32; +typedef ee_u32 ee_ptr_int; +typedef size_t ee_size_t; +/* align_mem: + This macro is used to align an offset to point to a 32b value. It is used in the Matrix algorithm to initialize the input memory blocks. +*/ +#define align_mem(x) (void *)(4 + (((ee_ptr_int)(x) - 1) & ~3)) + +/* Configuration: SEED_METHOD + Defines method to get seed values that cannot be computed at compile time. + + Valid values: + SEED_ARG - from command line. + SEED_FUNC - from a system function. + SEED_VOLATILE - from volatile variables. +*/ +#ifndef SEED_METHOD +#define SEED_METHOD SEED_ARG +#endif + +/* Configuration: MEM_METHOD + Defines method to get a block of memry. + + Valid values: + MEM_MALLOC - for platforms that implement malloc and have malloc.h. + MEM_STATIC - to use a static memory array. + MEM_STACK - to allocate the data block on the stack (NYI). +*/ +#ifndef MEM_METHOD +#define MEM_METHOD MEM_MALLOC +#endif + +/* Configuration: MULTITHREAD + Define for parallel execution + + Valid values: + 1 - only one context (default). + N>1 - will execute N copies in parallel. + + Note: + If this flag is defined to more then 1, an implementation for launching parallel contexts must be defined. + + Two sample implementations are provided. Use or to enable them. + + It is valid to have a different implementation of and in , + to fit a particular architecture. +*/ +#ifndef MULTITHREAD +#define MULTITHREAD 1 +#endif + +/* Configuration: USE_PTHREAD + Sample implementation for launching parallel contexts + This implementation uses pthread_thread_create and pthread_join. + + Valid values: + 0 - Do not use pthreads API. + 1 - Use pthreads API + + Note: + This flag only matters if MULTITHREAD has been defined to a value greater then 1. +*/ +#ifndef USE_PTHREAD +#define USE_PTHREAD 0 +#endif + +/* Configuration: USE_FORK + Sample implementation for launching parallel contexts + This implementation uses fork, waitpid, shmget,shmat and shmdt. + + Valid values: + 0 - Do not use fork API. + 1 - Use fork API + + Note: + This flag only matters if MULTITHREAD has been defined to a value greater then 1. +*/ +#ifndef USE_FORK +#define USE_FORK 0 +#endif + +/* Configuration: USE_SOCKET + Sample implementation for launching parallel contexts + This implementation uses fork, socket, sendto and recvfrom + + Valid values: + 0 - Do not use fork and sockets API. + 1 - Use fork and sockets API + + Note: + This flag only matters if MULTITHREAD has been defined to a value greater then 1. +*/ +#ifndef USE_SOCKET +#define USE_SOCKET 0 +#endif + +/* Configuration: MAIN_HAS_NOARGC + Needed if platform does not support getting arguments to main. + + Valid values: + 0 - argc/argv to main is supported + 1 - argc/argv to main is not supported +*/ +#ifndef MAIN_HAS_NOARGC +#define MAIN_HAS_NOARGC 0 +#endif + +/* Configuration: MAIN_HAS_NORETURN + Needed if platform does not support returning a value from main. + + Valid values: + 0 - main returns an int, and return value will be 0. + 1 - platform does not support returning a value from main +*/ +#ifndef MAIN_HAS_NORETURN +#define MAIN_HAS_NORETURN 0 +#endif + +/* Variable: default_num_contexts + Number of contexts to spawn in multicore context. + Override this global value to change number of contexts used. + + Note: + This value may not be set higher then the define. + + To experiment, you can set the define to the highest value expected, and use argc/argv in the to set this value from the command line. +*/ +extern ee_u32 default_num_contexts; + +#if (MULTITHREAD>1) +#if USE_PTHREAD + #include + #define PARALLEL_METHOD "PThreads" +#elif USE_FORK + #include + #include + #include + #include + #include /* for memcpy */ + #define PARALLEL_METHOD "Fork" +#elif USE_SOCKET + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #define PARALLEL_METHOD "Sockets" +#else + #define PARALLEL_METHOD "Proprietary" + #error "Please implement multicore functionality in core_portme.c to use multiple contexts." +#endif /* Method for multithreading */ +#endif /* MULTITHREAD > 1 */ + +typedef struct CORE_PORTABLE_S { +#if (MULTITHREAD>1) + #if USE_PTHREAD + pthread_t thread; + #elif USE_FORK + pid_t pid; + int shmid; + void *shm; + #elif USE_SOCKET + pid_t pid; + int sock; + struct sockaddr_in sa; + #endif /* Method for multithreading */ +#endif /* MULTITHREAD>1 */ + ee_u8 portable_id; +} core_portable; + +/* target specific init/fini */ +void portable_init(core_portable *p, int *argc, char *argv[]); +void portable_fini(core_portable *p); + +#if (SEED_METHOD==SEED_VOLATILE) + #if (VALIDATION_RUN || PERFORMANCE_RUN || PROFILE_RUN) + #define RUN_TYPE_FLAG 1 + #else + #if (TOTAL_DATA_SIZE==1200) + #define PROFILE_RUN 1 + #else + #define PERFORMANCE_RUN 1 + #endif + #endif +#endif /* SEED_METHOD==SEED_VOLATILE */ + +#endif /* CORE_PORTME_H */ diff --git a/benchmarks/riscv-coremark/coremark/cygwin/core_portme.mak b/benchmarks/riscv-coremark/coremark/cygwin/core_portme.mak new file mode 100644 index 000000000..97b6d6ace --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/cygwin/core_portme.mak @@ -0,0 +1,17 @@ +# Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Original Author: Shay Gal-on + +include posix/core_portme.mak diff --git a/benchmarks/riscv-coremark/coremark/docs/READM.md b/benchmarks/riscv-coremark/coremark/docs/READM.md new file mode 100644 index 000000000..6f71f426d --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/docs/READM.md @@ -0,0 +1 @@ +This folder contains the original, unaltered documents from the CoreMark V1.0 release. diff --git a/benchmarks/riscv-coremark/coremark/docs/balance_O0_joined.png b/benchmarks/riscv-coremark/coremark/docs/balance_O0_joined.png new file mode 100644 index 0000000000000000000000000000000000000000..46b41583a8b834d371c2bced376f956e0f54065b GIT binary patch literal 48672 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 + +core_portme.mak - CoreMark + + + + + + + +

core_portme.mak

Summary
core_portme.mak
Variables
OUTFLAGUse this flag to define how to to get an executable (e.g -o)
CFLAGSUse this flag to define compiler options.
LFLAGS_ENDDefine any libraries needed for linking or other flags that should come at the end of the link line (e.g.
SEPARATE_COMPILEDefine if you need to separate compilation from link stage.
PORT_OBJSPort specific object files can be added here
Build Targets
port_prebuildGenerate any files that are needed before actual build starts.
port_postbuildGenerate any files that are needed after actual build end.
port_postrunDo platform specific after run stuff.
port_prerunDo platform specific after run stuff.
port_postloadDo platform specific after load stuff.
port_preloadDo platform specific before load stuff.
Variables
OPATH
PERLDefine perl executable to calculate the geomean if running separate.
+ +

Variables

+ +

OUTFLAG

Use this flag to define how to to get an executable (e.g -o)

+ +

CFLAGS

Use this flag to define compiler options.  Note, you can add compiler options from the command line using XCFLAGS=”other flags”

+ +

LFLAGS_END

Define any libraries needed for linking or other flags that should come at the end of the link line (e.g. linker scripts).  Note: On certain platforms, the default clock_gettime implementation is supported but requires linking of librt.

+ +

SEPARATE_COMPILE

Define if you need to separate compilation from link stage.  In this case, you also need to define below how to create an object file, and how to link.

+ +

PORT_OBJS

Port specific object files can be added here

+ +

Build Targets

+ +

port_prebuild

Generate any files that are needed before actual build starts.  E.g. generate profile guidance files.  Sample PGO generation for gcc enabled with PGO=1

  • First, check if PGO was defined on the command line, if so, need to add -fprofile-use to compile line.
  • Second, if PGO reference has not yet been generated, add a step to the prebuild that will build a profile-generate version and run it.
NoteUsing REBUILD=1

Use make PGO=1 to invoke this sample processing.

+ +

port_postbuild

Generate any files that are needed after actual build end.  E.g. change format to srec, bin, zip in order to be able to load into flash

+ +

port_postrun

Do platform specific after run stuff.  E.g. reset the board, backup the logfiles etc.

+ +

port_prerun

Do platform specific after run stuff.  E.g. reset the board, backup the logfiles etc.

+ +

port_postload

Do platform specific after load stuff.  E.g. reset the reset power to the flash eraser

+ +

port_preload

Do platform specific before load stuff.  E.g. reset the reset power to the flash eraser

+ +

Variables

+ +

OPATH

Path to the output folder.  Defaultcurrent folder.
+ +

PERL

Define perl executable to calculate the geomean if running separate.

+ +
+ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/benchmarks/riscv-coremark/coremark/docs/html/files/core_list_join-c.html b/benchmarks/riscv-coremark/coremark/docs/html/files/core_list_join-c.html new file mode 100644 index 000000000..6ee2aeecd --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/docs/html/files/core_list_join-c.html @@ -0,0 +1,58 @@ + + +/cygdrive/d/dev/code/coremark/core_list_join.c - CoreMark + + + + + + + +

core_list_join.c

Summary
core_list_join.c
DescriptionBenchmark using a linked list.
Functions
cmp_complexCompare the data item in a list cell.
cmp_idxCompare the idx item in a list cell, and regen the data.
core_list_initInitialize list with data.
core_list_insertInsert an item to the list
core_list_removeRemove an item from the list.
core_list_undo_removeUndo a remove operation.
core_list_findFind an item in the list
core_list_reverseReverse a list
core_list_mergesortSort the list in place without recursion.
+ +

Description

Benchmark using a linked list.

Linked list is a common data structure used in many applications.

For our purposes, this will excercise the memory units of the processor.  In particular, usage of the list pointers to find and alter data.

We are not using Malloc since some platforms do not support this library.

Instead, the memory block being passed in is used to create a list, and the benchmark takes care not to add more items then can be accomodated by the memory block.  The porting layer will make sure that we have a valid memory block.

All operations are done in place, without using any extra memory.

The list itself contains list pointers and pointers to data items.  Data items contain the following:

idxAn index that captures the initial order of the list.
dataVariable data initialized based on the input parameters.  The 16b are divided as follows:
  • Upper 8b are backup of original data.
  • Bit 7 indicates if the lower 7 bits are to be used as is or calculated.
  • Bits 0-2 indicate type of operation to perform to get a 7b value.
  • Bits 3-6 provide input for the operation.
+ +

Functions

+ +

cmp_complex

ee_s32 cmp_complex(list_data *a,
list_data *b,
core_results *res)

Compare the data item in a list cell.

Can be used by mergesort.

+ +

cmp_idx

ee_s32 cmp_idx(list_data *a,
list_data *b,
core_results *res)

Compare the idx item in a list cell, and regen the data.

Can be used by mergesort.

+ +

core_list_init

list_head *core_list_init(ee_u32 blksize,
list_head *memblock,
ee_s16 seed)

Initialize list with data.

Parameters

blksizeSize of memory to be initialized.
memblockPointer to memory block.
seedActual values chosen depend on the seed parameter.  The seed parameter MUST be supplied from a source that cannot be determined at compile time

Returns

Pointer to the head of the list.

+ +

core_list_insert

list_head *core_list_insert_new(list_head *insert_point,
list_data *info,
list_head **memblock,
list_data **datablock ,
list_head *memblock_end,
list_data *datablock_end)

Insert an item to the list

Parameters

insert_pointwhere to insert the item.
infodata for the cell.
memblockpointer for the list header
datablockpointer for the list data
memblock_endend of region for list headers
datablock_endend of region for list data

Returns

Pointer to new item.

+ +

core_list_remove

list_head *core_list_remove(list_head *item)

Remove an item from the list.

Operation

For a singly linked list, remove by copying the data from the next item over to the current cell, and unlinking the next item.

Note

since there is always a fake item at the end of the list, no need to check for NULL.

Returns

Removed item.

+ +

core_list_undo_remove

list_head *core_list_undo_remove(list_head *item_removed,
list_head *item_modified)

Undo a remove operation.

Operation

Since we want each iteration of the benchmark to be exactly the same, we need to be able to undo a remove.  Link the removed item back into the list, and switch the info items.

Parameters

item_removedReturn value from the core_list_remove
item_modifiedList item that was modified during core_list_remove

Returns

The item that was linked back to the list.

+ +

core_list_find

list_head *core_list_find(list_head *list,
list_data *info)

Find an item in the list

Operation

Find an item by idx (if not 0) or specific data value

Parameters

listlist head
infoidx or data to find

Returns

Found item, or NULL if not found.

+ +

core_list_reverse

list_head *core_list_reverse(list_head *list)

Reverse a list

Operation

Rearrange the pointers so the list is reversed.

Parameters

listlist head
infoidx or data to find

Returns

Found item, or NULL if not found.

+ +

core_list_mergesort

list_head *core_list_mergesort(list_head *list,
list_cmp cmp,
core_results *res)

Sort the list in place without recursion.

Description

Use mergesort, as for linked list this is a realistic solution.  Also, since this is aimed at embedded, care was taken to use iterative rather then recursive algorithm.  The sort can either return the list to original order (by idx) , or use the data item to invoke other other algorithms and change the order of the list.

Parameters

listlist to be sorted.
cmpcmp function to use

Returns

New head of the list.

Note

We have a special header for the list that will always be first, but the algorithm could theoretically modify where the list starts.

+ +
+ + + + + + + + + + +
ee_s32 cmp_complex(list_data *a,
list_data *b,
core_results *res)
Compare the data item in a list cell.
ee_s32 cmp_idx(list_data *a,
list_data *b,
core_results *res)
Compare the idx item in a list cell, and regen the data.
list_head *core_list_init(ee_u32 blksize,
list_head *memblock,
ee_s16 seed)
Initialize list with data.
list_head *core_list_insert_new(list_head *insert_point,
list_data *info,
list_head **memblock,
list_data **datablock ,
list_head *memblock_end,
list_data *datablock_end)
Insert an item to the list
list_head *core_list_remove(list_head *item)
Remove an item from the list.
list_head *core_list_undo_remove(list_head *item_removed,
list_head *item_modified)
Undo a remove operation.
list_head *core_list_find(list_head *list,
list_data *info)
Find an item in the list
list_head *core_list_reverse(list_head *list)
Reverse a list
list_head *core_list_mergesort(list_head *list,
list_cmp cmp,
core_results *res)
Sort the list in place without recursion.
+ + + + + + + + \ No newline at end of file diff --git a/benchmarks/riscv-coremark/coremark/docs/html/files/core_main-c.html b/benchmarks/riscv-coremark/coremark/docs/html/files/core_main-c.html new file mode 100644 index 000000000..847744131 --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/docs/html/files/core_main-c.html @@ -0,0 +1,42 @@ + + +core_main.c - CoreMark + + + + + + + +

core_main.c

This file contains the framework to acquire a block of memory, seed initial parameters, tun t he benchmark and report the results.

Summary
core_main.cThis file contains the framework to acquire a block of memory, seed initial parameters, tun t he benchmark and report the results.
Functions
iterateRun the benchmark for a specified number of iterations.
mainMain entry routine for the benchmark.
+ +

Functions

+ +

iterate

Run the benchmark for a specified number of iterations.

Operation

For each type of benchmarked algorithm: a - Initialize the data block for the algorithm. b - Execute the algorithm N times.

Returns

NULL.

+ +

main

#if MAIN_HAS_NOARGC MAIN_RETURN_TYPE main(void)

Main entry routine for the benchmark.  This function is responsible for the following steps:

1Initialize input seeds from a source that cannot be determined at compile time.
2Initialize memory block for use.
3Run and time the benchmark.
4Report results, testing the validity of the output if the seeds are known.

Arguments

1first seed : Any value
2second seed : Must be identical to first for iterations to be identical
3third seed : Any value, should be at least an order of magnitude less then the input size, but bigger then 32.
4Iterations : Special, if set to 0, iterations will be automatically determined such that the benchmark will run between 10 to 100 secs
+ +
+ + + + + + + + + + +
#if MAIN_HAS_NOARGC MAIN_RETURN_TYPE main(void)
Main entry routine for the benchmark.
+ + + + + + + + \ No newline at end of file diff --git a/benchmarks/riscv-coremark/coremark/docs/html/files/core_matrix-c.html b/benchmarks/riscv-coremark/coremark/docs/html/files/core_matrix-c.html new file mode 100644 index 000000000..2ad041b71 --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/docs/html/files/core_matrix-c.html @@ -0,0 +1,56 @@ + + +/cygdrive/d/dev/code/coremark/core_matrix.c - CoreMark + + + + + + + +

core_matrix.c

Summary
core_matrix.c
DescriptionMatrix manipulation benchmark
Functions
core_bench_matrixBenchmark function
matrix_testPerform matrix manipulation.
matrix_sumCalculate a function that depends on the values of elements in the matrix.
matrix_mul_constMultiply a matrix by a constant.
matrix_add_constAdd a constant value to all elements of a matrix.
matrix_mul_vectMultiply a matrix by a vector.
matrix_mul_matrixMultiply a matrix by a matrix.
matrix_mul_matrix_bitextractMultiply a matrix by a matrix, and extract some bits from the result.
+ +

Description

Matrix manipulation benchmark

This very simple algorithm forms the basis of many more complex algorithms.

The tight inner loop is the focus of many optimizations (compiler as well as hardware based) and is thus relevant for embedded processing.

The total available data space will be divided to 3 parts

NxN Matrix Ainitialized with small values (upper 3/4 of the bits all zero).
NxN Matrix Binitialized with medium values (upper half of the bits all zero).
NxN Matrix Cused for the result.

The actual values for A and B must be derived based on input that is not available at compile time.

+ +

Functions

+ +

core_bench_matrix

ee_u16 core_bench_matrix(mat_params *p,
ee_s16 seed,
ee_u16 crc)

Benchmark function

Iterate matrix_test N times, changing the matrix values slightly by a constant amount each time.

+ +

matrix_test

ee_s16 matrix_test(ee_u32 N,
MATRES *C,
MATDAT *A,
MATDAT *B,
MATDAT val)

Perform matrix manipulation.

Parameters

NDimensions of the matrix.
Cmemory for result matrix.
Ainput matrix
Boperator matrix (not changed during operations)

Returns

A CRC value that captures all results calculated in the function.  In particular, crc of the value calculated on the result matrix after each step by matrix_sum.

Operation

1Add a constant value to all elements of a matrix.
2Multiply a matrix by a constant.
3Multiply a matrix by a vector.
4Multiply a matrix by a matrix.
5Add a constant value to all elements of a matrix.

After the last step, matrix A is back to original contents.

+ +

matrix_sum

ee_s16 matrix_sum(ee_u32 N,
MATRES *C,
MATDAT clipval)

Calculate a function that depends on the values of elements in the matrix.

For each element, accumulate into a temporary variable.

As long as this value is under the parameter clipval, add 1 to the result if the element is bigger then the previous.

Otherwise, reset the accumulator and add 10 to the result.

+ +

matrix_mul_const

void matrix_mul_const(ee_u32 N,
MATRES *C,
MATDAT *A,
MATDAT val)

Multiply a matrix by a constant.  This could be used as a scaler for instance.

+ +

matrix_add_const

void matrix_add_const(ee_u32 N,
MATDAT *A,
MATDAT val)

Add a constant value to all elements of a matrix.

+ +

matrix_mul_vect

void matrix_mul_vect(ee_u32 N,
MATRES *C,
MATDAT *A,
MATDAT *B)

Multiply a matrix by a vector.  This is common in many simple filters (e.g. fir where a vector of coefficients is applied to the matrix.)

+ +

matrix_mul_matrix

void matrix_mul_matrix(ee_u32 N,
MATRES *C,
MATDAT *A,
MATDAT *B)

Multiply a matrix by a matrix.  Basic code is used in many algorithms, mostly with minor changes such as scaling.

+ +

matrix_mul_matrix_bitextract

void matrix_mul_matrix_bitextract(ee_u32 N,
MATRES *C,
MATDAT *A,
MATDAT *B)

Multiply a matrix by a matrix, and extract some bits from the result.  Basic code is used in many algorithms, mostly with minor changes such as scaling.

+ +
+ + + + + + + + + + +
ee_u16 core_bench_matrix(mat_params *p,
ee_s16 seed,
ee_u16 crc)
Benchmark function
ee_s16 matrix_test(ee_u32 N,
MATRES *C,
MATDAT *A,
MATDAT *B,
MATDAT val)
Perform matrix manipulation.
ee_s16 matrix_sum(ee_u32 N,
MATRES *C,
MATDAT clipval)
Calculate a function that depends on the values of elements in the matrix.
void matrix_mul_const(ee_u32 N,
MATRES *C,
MATDAT *A,
MATDAT val)
Multiply a matrix by a constant.
void matrix_add_const(ee_u32 N,
MATDAT *A,
MATDAT val)
Add a constant value to all elements of a matrix.
void matrix_mul_vect(ee_u32 N,
MATRES *C,
MATDAT *A,
MATDAT *B)
Multiply a matrix by a vector.
void matrix_mul_matrix(ee_u32 N,
MATRES *C,
MATDAT *A,
MATDAT *B)
Multiply a matrix by a matrix.
void matrix_mul_matrix_bitextract(ee_u32 N,
MATRES *C,
MATDAT *A,
MATDAT *B)
Multiply a matrix by a matrix, and extract some bits from the result.
+ + + + + + + + \ No newline at end of file diff --git a/benchmarks/riscv-coremark/coremark/docs/html/files/core_state-c.html b/benchmarks/riscv-coremark/coremark/docs/html/files/core_state-c.html new file mode 100644 index 000000000..9f8035990 --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/docs/html/files/core_state-c.html @@ -0,0 +1,46 @@ + + +/cygdrive/d/dev/code/coremark/core_state.c - CoreMark + + + + + + + +

core_state.c

Summary
core_state.c
DescriptionSimple state machines like this one are used in many embedded products.
Functions
core_bench_stateBenchmark function
core_init_stateInitialize the input data for the state machine.
core_state_transitionActual state machine.
+ +

Description

Simple state machines like this one are used in many embedded products.

For more complex state machines, sometimes a state transition table implementation is used instead, trading speed of direct coding for ease of maintenance.

Since the main goal of using a state machine in CoreMark is to excercise the switch/if behaviour, we are using a small moore machine.

In particular, this machine tests type of string input, trying to determine whether the input is a number or something else.  (see core_state).

core_state
+ +

Functions

+ +

core_bench_state

ee_u16 core_bench_state(ee_u32 blksize,
ee_u8 *memblock,
ee_s16 seed1,
ee_s16 seed2,
ee_s16 step,
ee_u16 crc)

Benchmark function

Go over the input twice, once direct, and once after introducing some corruption.

+ +

core_init_state

void core_init_state(ee_u32 size,
ee_s16 seed,
ee_u8 *p)

Initialize the input data for the state machine.

Populate the input with several predetermined strings, interspersed.  Actual patterns chosen depend on the seed parameter.

Note

The seed parameter MUST be supplied from a source that cannot be determined at compile time

+ +

core_state_transition

enum CORE_STATE core_state_transition(ee_u8 **instr ,
ee_u32 *transition_count)

Actual state machine.

The state machine will continue scanning until either

1an invalid input is detcted.
2a valid number has been detected.

The input pointer is updated to point to the end of the token, and the end state is returned (either specific format determined or invalid).

+ +
+ + + + + + + + + + +
ee_u16 core_bench_state(ee_u32 blksize,
ee_u8 *memblock,
ee_s16 seed1,
ee_s16 seed2,
ee_s16 step,
ee_u16 crc)
Benchmark function
void core_init_state(ee_u32 size,
ee_s16 seed,
ee_u8 *p)
Initialize the input data for the state machine.
enum CORE_STATE core_state_transition(ee_u8 **instr ,
ee_u32 *transition_count)
Actual state machine.
+ + + + + + + + \ No newline at end of file diff --git a/benchmarks/riscv-coremark/coremark/docs/html/files/core_util-c.html b/benchmarks/riscv-coremark/coremark/docs/html/files/core_util-c.html new file mode 100644 index 000000000..3ebdb3879 --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/docs/html/files/core_util-c.html @@ -0,0 +1,42 @@ + + +/cygdrive/d/dev/code/coremark/core_util.c - CoreMark + + + + + + + +

core_util.c

Summary
core_util.c
Functions
get_seedGet a values that cannot be determined at compile time.
crc*Service functions to calculate 16b CRC code.
+ +

Functions

+ +

get_seed

Get a values that cannot be determined at compile time.

Since different embedded systems and compilers are used, 3 different methods are provided

1Using a volatile variable.  This method is only valid if the compiler is forced to generate code that reads the value of a volatile variable from memory at run time.  Please note, if using this method, you would need to modify core_portme.c to generate training profile.
2Command line arguments.  This is the preferred method if command line arguments are supported.
3System function.  If none of the first 2 methods is available on the platform, a system function which is not a stub can be used.

e.g. read the value on GPIO pins connected to switches, or invoke special simulator functions.

+ +

crc*

Service functions to calculate 16b CRC code.

+ +
+ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/benchmarks/riscv-coremark/coremark/docs/html/files/coremark-h.html b/benchmarks/riscv-coremark/coremark/docs/html/files/coremark-h.html new file mode 100644 index 000000000..337bc1a0c --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/docs/html/files/coremark-h.html @@ -0,0 +1,46 @@ + + +/cygdrive/d/dev/code/coremark/coremark.h - CoreMark + + + + + + + +

coremark.h

Summary
coremark.h
DescriptionThis file contains declarations of the various benchmark functions.
Configuration
TOTAL_DATA_SIZEDefine total size for data algorithms will operate on
Types
secs_retFor machines that have floating point support, get number of seconds as a double.
+ +

Description

This file contains declarations of the various benchmark functions.

+ +

Configuration

+ +

TOTAL_DATA_SIZE

Define total size for data algorithms will operate on

+ +

Types

+ +

secs_ret

For machines that have floating point support, get number of seconds as a double.  Otherwise an unsigned int.

+ +
+ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/benchmarks/riscv-coremark/coremark/docs/html/files/docs/core_state.png b/benchmarks/riscv-coremark/coremark/docs/html/files/docs/core_state.png new file mode 100644 index 0000000000000000000000000000000000000000..9b5a4ea6078f44f7ffab2d06574052d01ae0db55 GIT binary patch literal 72093 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

-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 + +core_portme.c - CoreMark + + + + + + + +

core_portme.c

Summary
core_portme.c
portable_mallocProvide malloc() functionality in a platform specific way.
portable_freeProvide free() functionality in a platform specific way.
TIMER_RES_DIVIDERDivider to trade off timer resolution and total time that can be measured.
start_timeThis function will be called right before starting the timed portion of the benchmark.
stop_timeThis function will be called right after ending the timed portion of the benchmark.
get_timeReturn an abstract “ticks” number that signifies time on the system.
time_in_secsConvert the value returned by get_time to seconds.
portable_initTarget specific initialization code Test for some common mistakes.
portable_finiTarget specific final code
core_start_parallelStart benchmarking in a parallel context.
core_stop_parallelStop a parallel context execution of coremark, and gather the results.
+ +

portable_malloc

void *portable_malloc(size_t size)

Provide malloc() functionality in a platform specific way.

+ +

portable_free

void portable_free(void *p)

Provide free() functionality in a platform specific way.

+ +

TIMER_RES_DIVIDER

Divider to trade off timer resolution and total time that can be measured.

Use lower values to increase resolution, but make sure that overflow does not occur.  If there are issues with the return value overflowing, increase this value.

+ +

start_time

void start_time(void)

This function will be called right before starting the timed portion of the benchmark.

Implementation may be capturing a system timer (as implemented in the example code) or zeroing some system parameters - e.g. setting the cpu clocks cycles to 0.

+ +

stop_time

void stop_time(void)

This function will be called right after ending the timed portion of the benchmark.

Implementation may be capturing a system timer (as implemented in the example code) or other system parameters - e.g. reading the current value of cpu cycles counter.

+ +

get_time

CORE_TICKS get_time(void)

Return an abstract “ticks” number that signifies time on the system.

Actual value returned may be cpu cycles, milliseconds or any other value, as long as it can be converted to seconds by time_in_secs.  This methodology is taken to accomodate any hardware or simulated platform.  The sample implementation returns millisecs by default, and the resolution is controlled by TIMER_RES_DIVIDER

+ +

time_in_secs

secs_ret time_in_secs(CORE_TICKS ticks)

Convert the value returned by get_time to seconds.

The secs_ret type is used to accomodate systems with no support for floating point.  Default implementation implemented by the EE_TICKS_PER_SEC macro above.

+ +

portable_init

void portable_init(core_portable *p,
int *argc,
char *argv[])

Target specific initialization code Test for some common mistakes.

+ +

portable_fini

void portable_fini(core_portable *p)

Target specific final code

+ +

core_start_parallel

Start benchmarking in a parallel context.

Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets.  Other implementations using MCAPI or other standards can easily be devised.

+ +

core_stop_parallel

Stop a parallel context execution of coremark, and gather the results.

Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets.  Other implementations using MCAPI or other standards can easily be devised.

+ +
+ + + + + + + + + + +
void *portable_malloc(size_t size)
Provide malloc() functionality in a platform specific way.
void portable_free(void *p)
Provide free() functionality in a platform specific way.
void start_time(void)
This function will be called right before starting the timed portion of the benchmark.
void stop_time(void)
This function will be called right after ending the timed portion of the benchmark.
CORE_TICKS get_time(void)
Return an abstract “ticks” number that signifies time on the system.
secs_ret time_in_secs(CORE_TICKS ticks)
Convert the value returned by get_time to seconds.
void portable_init(core_portable *p,
int *argc,
char *argv[])
Target specific initialization code Test for some common mistakes.
void portable_fini(core_portable *p)
Target specific final code
Divider to trade off timer resolution and total time that can be measured.
For machines that have floating point support, get number of seconds as a double.
+ + + + + + + + \ No newline at end of file diff --git a/benchmarks/riscv-coremark/coremark/docs/html/files/linux/core_portme-h.html b/benchmarks/riscv-coremark/coremark/docs/html/files/linux/core_portme-h.html new file mode 100644 index 000000000..90810f13d --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/docs/html/files/linux/core_portme-h.html @@ -0,0 +1,72 @@ + + +core_portme.h - CoreMark + + + + + + + +

core_portme.h

Summary
core_portme.h
DescriptionThis file contains configuration constants required to execute on different platforms
Configuration
HAS_FLOATDefine to 1 if the platform supports floating point.
HAS_TIME_HDefine to 1 if platform has the time.h header file, and implementation of functions thereof.
USE_CLOCKDefine to 1 if platform has the time.h header file, and implementation of functions thereof.
HAS_STDIODefine to 1 if the platform has stdio.h.
HAS_PRINTFDefine to 1 if the platform has stdio.h and implements the printf function.
CORE_TICKSDefine type of return from the timing functions.
SEED_METHODDefines method to get seed values that cannot be computed at compile time.
MEM_METHODDefines method to get a block of memry.
MULTITHREADDefine for parallel execution
USE_PTHREADSample implementation for launching parallel contexts This implementation uses pthread_thread_create and pthread_join.
USE_FORKSample implementation for launching parallel contexts This implementation uses fork, waitpid, shmget,shmat and shmdt.
USE_SOCKETSample implementation for launching parallel contexts This implementation uses fork, socket, sendto and recvfrom
MAIN_HAS_NOARGCNeeded if platform does not support getting arguments to main.
MAIN_HAS_NORETURNNeeded if platform does not support returning a value from main.
Variables
default_num_contextsNumber of contexts to spawn in multicore context.
+ +

Description

This file contains configuration constants required to execute on different platforms

+ +

Configuration

+ +

HAS_FLOAT

Define to 1 if the platform supports floating point.

+ +

HAS_TIME_H

Define to 1 if platform has the time.h header file, and implementation of functions thereof.

+ +

USE_CLOCK

Define to 1 if platform has the time.h header file, and implementation of functions thereof.

+ +

HAS_STDIO

Define to 1 if the platform has stdio.h.

+ +

HAS_PRINTF

Define to 1 if the platform has stdio.h and implements the printf function.

+ +

CORE_TICKS

Define type of return from the timing functions.

+ +

SEED_METHOD

Defines method to get seed values that cannot be computed at compile time.

Valid values

SEED_ARGfrom command line.
SEED_FUNCfrom a system function.
SEED_VOLATILEfrom volatile variables.
+ +

MEM_METHOD

Defines method to get a block of memry.

Valid values

MEM_MALLOCfor platforms that implement malloc and have malloc.h.
MEM_STATICto use a static memory array.
MEM_STACKto allocate the data block on the stack (NYI).
+ +

MULTITHREAD

Define for parallel execution

Valid values

1only one context (default).
N>1will execute N copies in parallel.

Note

If this flag is defined to more then 1, an implementation for launching parallel contexts must be defined.

Two sample implementations are provided.  Use USE_PTHREAD or USE_FORK to enable them.

It is valid to have a different implementation of core_start_parallel and <core_end_parallel> in core_portme.c, to fit a particular architecture.

+ +

USE_PTHREAD

Sample implementation for launching parallel contexts This implementation uses pthread_thread_create and pthread_join.

Valid values

0Do not use pthreads API.
1Use pthreads API

Note

This flag only matters if MULTITHREAD has been defined to a value greater then 1.

+ +

USE_FORK

Sample implementation for launching parallel contexts This implementation uses fork, waitpid, shmget,shmat and shmdt.

Valid values

0Do not use fork API.
1Use fork API

Note

This flag only matters if MULTITHREAD has been defined to a value greater then 1.

+ +

USE_SOCKET

Sample implementation for launching parallel contexts This implementation uses fork, socket, sendto and recvfrom

Valid values

0Do not use fork and sockets API.
1Use fork and sockets API

Note

This flag only matters if MULTITHREAD has been defined to a value greater then 1.

+ +

MAIN_HAS_NOARGC

Needed if platform does not support getting arguments to main.

Valid values

0argc/argv to main is supported
1argc/argv to main is not supported
+ +

MAIN_HAS_NORETURN

Needed if platform does not support returning a value from main.

Valid values

0main returns an int, and return value will be 0.
1platform does not support returning a value from main
+ +

Variables

+ +

default_num_contexts

extern ee_u32 default_num_contexts

Number of contexts to spawn in multicore context.  Override this global value to change number of contexts used.

Note

This value may not be set higher then the MULTITHREAD define.

To experiment, you can set the MULTITHREAD define to the highest value expected, and use argc/argv in the portable_init to set this value from the command line.

+ +
+ + + + + + + + + + +
extern ee_u32 default_num_contexts
Number of contexts to spawn in multicore context.
Sample implementation for launching parallel contexts This implementation uses pthread_thread_create and pthread_join.
Sample implementation for launching parallel contexts This implementation uses fork, waitpid, shmget,shmat and shmdt.
Start benchmarking in a parallel context.
Define for parallel execution
void portable_init(core_portable *p,
int *argc,
char *argv[])
Target specific initialization code Test for some common mistakes.
+ + + + + + + + \ No newline at end of file diff --git a/benchmarks/riscv-coremark/coremark/docs/html/files/linux/core_portme-mak.html b/benchmarks/riscv-coremark/coremark/docs/html/files/linux/core_portme-mak.html new file mode 100644 index 000000000..ffd6cbe66 --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/docs/html/files/linux/core_portme-mak.html @@ -0,0 +1,76 @@ + + +core_portme.mak - CoreMark + + + + + + + +

core_portme.mak

Summary
core_portme.mak
Variables
OUTFLAGUse this flag to define how to to get an executable (e.g -o)
CCUse this flag to define compiler to use
CFLAGSUse this flag to define compiler options.
LFLAGS_ENDDefine any libraries needed for linking or other flags that should come at the end of the link line (e.g.
PORT_SRCSPort specific source files can be added here
LOADDefine this flag if you need to load to a target, as in a cross compile environment.
RUNDefine this flag if running does not consist of simple invocation of the binary.
SEPARATE_COMPILEDefine if you need to separate compilation from link stage.
PORT_OBJSPort specific object files can be added here
Build Targets
port_prebuildGenerate any files that are needed before actual build starts.
port_postbuildGenerate any files that are needed after actual build end.
port_postrunDo platform specific after run stuff.
port_prerunDo platform specific after run stuff.
port_postloadDo platform specific after load stuff.
port_preloadDo platform specific before load stuff.
Variables
OPATH
PERLDefine perl executable to calculate the geomean if running separate.
+ +

Variables

+ +

OUTFLAG

Use this flag to define how to to get an executable (e.g -o)

+ +

CC

Use this flag to define compiler to use

+ +

CFLAGS

Use this flag to define compiler options.  Note, you can add compiler options from the command line using XCFLAGS=”other flags”

+ +

LFLAGS_END

Define any libraries needed for linking or other flags that should come at the end of the link line (e.g. linker scripts).  Note: On certain platforms, the default clock_gettime implementation is supported but requires linking of librt.

+ +

PORT_SRCS

Port specific source files can be added here

+ +

LOAD

Define this flag if you need to load to a target, as in a cross compile environment.

+ +

RUN

Define this flag if running does not consist of simple invocation of the binary.  In a cross compile environment, you need to define this.

+ +

SEPARATE_COMPILE

Define if you need to separate compilation from link stage.  In this case, you also need to define below how to create an object file, and how to link.

+ +

PORT_OBJS

Port specific object files can be added here

+ +

Build Targets

+ +

port_prebuild

Generate any files that are needed before actual build starts.  E.g. generate profile guidance files.  Sample PGO generation for gcc enabled with PGO=1

  • First, check if PGO was defined on the command line, if so, need to add -fprofile-use to compile line.
  • Second, if PGO reference has not yet been generated, add a step to the prebuild that will build a profile-generate version and run it.
NoteUsing REBUILD=1

Use make PGO=1 to invoke this sample processing.

+ +

port_postbuild

Generate any files that are needed after actual build end.  E.g. change format to srec, bin, zip in order to be able to load into flash

+ +

port_postrun

Do platform specific after run stuff.  E.g. reset the board, backup the logfiles etc.

+ +

port_prerun

Do platform specific after run stuff.  E.g. reset the board, backup the logfiles etc.

+ +

port_postload

Do platform specific after load stuff.  E.g. reset the reset power to the flash eraser

+ +

port_preload

Do platform specific before load stuff.  E.g. reset the reset power to the flash eraser

+ +

Variables

+ +

OPATH

Path to the output folder.  Defaultcurrent folder.
+ +

PERL

Define perl executable to calculate the geomean if running separate.

+ +
+ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/benchmarks/riscv-coremark/coremark/docs/html/files/readme-txt.html b/benchmarks/riscv-coremark/coremark/docs/html/files/readme-txt.html new file mode 100644 index 000000000..2b57f37f4 --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/docs/html/files/readme-txt.html @@ -0,0 +1,71 @@ + + +CoreMark + + + + + + + +

CoreMark

Summary
CoreMark
WelcomeCopyright © 2009 EEMBC All rights reserved.
Building and runningDownload the release files from the www.coremark.org.
DocumentationWhen you unpack the documentation (tar -vzxf coremark_<version>_docs.tgz) a docs folder will be created.
Submitting resultsCoreMark results can be submitted on the web.
Run rulesWhat is and is not allowed.
Reporting rulesHow to report results on a data sheet?
Log File FormatThe log files have the following format
LegalSee LICENSE.txt or the word document file under docs/LICENSE.doc.
CreditsMany thanks to all of the individuals who helped with the development or testing of CoreMark including (Sorted by company name)
+ +

Welcome

Copyright © 2009 EEMBC All rights reserved.  CoreMark is a trademark of EEMBC and EEMBC is a registered trademark of the Embedded Microprocessor Benchmark Consortium.

CoreMark’s primary goals are simplicity and providing a method for testing only a processor’s core features.

For more information about EEMBC’s comprehensive embedded benchmark suites, please see www.eembc.org.

+ +

Building and running

Download the release files from the www.coremark.org.  You can verify the download using the coremark_<version>.md5 file

md5sum -c coremark_<version>.md5

Unpack the distribution (tar -vzxf coremark_<version>.tgz && tar -vzxf coremark_<version>_docs.tgz) then change to the coremark_<version> folder.

To build and run the benchmark, type

make

Full results are available in the files run1.log and run2.log.  CoreMark result can be found in run1.log.

For self hosted Linux or Cygwin platforms, a simple make should work.

Cross Compile

For cross compile platforms please adjust core_portme.mak, core_portme.h (and possibly core_portme.c) according to the specific platform used.  When porting to a new platform, it is recommended to copy one of the default port folders (e.g. mkdir <platform> && cp linux/* <platform>), adjust the porting files, and run

make PORT_DIR=<platform>

Systems without make

The following files need to be compiled:

For example

gcc -O2 -o coremark.exe core_list_join.c core_main.c core_matrix.c core_state.c core_util.c simple/core_portme.c -DPERFORMANCE_RUN=1 -DITERATIONS=1000
+./coremark.exe > run1.log

The above will compile the benchmark for a performance run and 1000 iterations.  Output is redirected to run1.log.

Make targets

runDefault target, creates run1.log and run2.log.
run1.logRun the benchmark with performance parameters, and output to run1.log
run2.logRun the benchmark with validation parameters, and output to run2.log
run3.logRun the benchmark with profile generation parameters, and output to run3.log
compilecompile the benchmark executable
linklink the benchmark executable
checktest MD5 of sources that may not be modified
cleanclean temporary files

ITERATIONS

By default, the benchmark will run between 10-100 seconds.  To override, use ITERATIONS=N

make ITERATIONS=10

Will run the benchmark for 10 iterations.  It is recommended to set a specific number of iterations in certain situations e.g.:

  • Running with a simulator
  • Measuring power/energy
  • Timing cannot be restarted

Minimum required run time

Results are only valid for reporting if the benchmark ran for at least 10 secs!

XCFLAGS

To add compiler flags from the command line, use XCFLAGS e.g.

make XCFLAGS="-g -DMULTITHREAD=4 -DUSE_FORK=1"
  • CORE_DEBUG

Define to compile for a debug run if you get incorrect CRC.

make XCFLAGS="-DCORE_DEBUG=1"
  • Parallel Execution

Use XCFLAGS=-DMULTITHREAD=N where N is number of threads to run in parallel.  Several implementations are available to execute in multiple contexts, or you can implement your own in core_portme.c.

make XCFLAGS="-DMULTITHREAD=4 -DUSE_PTHREAD"

Above will compile the benchmark for execution on 4 cores, using POSIX Threads API.

REBUILD

To force rebuild, add the flag REBUILD to the command line

make REBUILD=1

Check core_portme.mak for more important options.

Run parameters for the benchmark executable

Coremark executable takes several parameters as follows (if main accepts arguments).  1st - A seed value used for initialization of data.  2nd - A seed value used for initialization of data.  3rd - A seed value used for initialization of data.  4th - Number of iterations (0 for auto : default value) 5th - Reserved for internal use.  6th - Reserved for internal use.  7th - For malloc users only, ovreride the size of the input data buffer.

The run target from make will run coremark with 2 different data initialization seeds.

Alternative parameters

If not using malloc or command line arguments are not supported, the buffer size for the algorithms must be defined via the compiler define TOTAL_DATA_SIZE.  TOTAL_DATA_SIZE must be set to 2000 bytes (default) for standard runs.  The default for such a target when testing different configurations could be ...

make XCFLAGS="-DTOTAL_DATA_SIZE=6000 -DMAIN_HAS_NOARGC=1"
+ +

Documentation

When you unpack the documentation (tar -vzxf coremark_<version>_docs.tgz) a docs folder will be created.  Check the file docs/html/index.html and the website http://www.coremark.org for more info.

+ +

Submitting results

CoreMark results can be submitted on the web.

Open a web browser and go to http://www.coremark.org- /benchmark- /index.php?pg=benchmark Select the link to add a new score and follow the instructions.

+ +

Run rules

What is and is not allowed.

Required

1The benchmark needs to run for at least 10 seconds.
2All validation must succeed for seeds 0,0,0x66 and 0x3415,0x3415,0x66, buffer size of 2000 bytes total.
  • If not using command line arguments to main:
make XCFLAGS="-DPERFORMANCE_RUN=1" REBUILD=1 run1.log
+make XCFLAGS="-DVALIDATION_RUN=1" REBUILD=1 run2.log
3If using profile guided optimization, profile must be generated using seeds of 8,8,8, and buffer size of 1200 bytes total.
make XCFLAGS="-DTOTAL_DATA_SIZE=1200 -DPROFILE_RUN=1" REBUILD=1 run3.log
4All source files must be compiled with the same flags.
5All data type sizes must match size in bits such that:
  • ee_u8 is an 8 bits datatype.
  • ee_s16 is an 16 bits datatype.
  • ee_u16 is an 16 bits datatype.
  • ee_s32 is an 32 bits datatype.
  • ee_u32 is an 32 bits datatype.

Allowed

  • Changing number of iterations
  • Changing toolchain and build/load/run options
  • Changing method of acquiring a data memory block
  • Changing the method of acquiring seed values
  • Changing implementation in core_portme.c
  • Changing configuration values in core_portme.h
  • Changing core_portme.mak

Not allowed

  • Changing of source file other then core_portme* (use make check to validate)
+ +

Reporting rules

How to report results on a data sheet?

CoreMark 1.0 : N / C [/ P] [/ M]

NNumber of iterations per second with seeds 0,0,0x66,size=2000)
CCompiler version and flags
PParameters such as data and code allocation specifics
  • This parameter may be omitted if all data was allocated on the heap in RAM.
  • This parameter may not be omitted when reporting CoreMark/MHz
MType of parallel execution (if used) and number of contexts This parameter may be omitted if parallel execution was not used.

e.g.

CoreMark 1.0 : 128 / GCC 4.1.2 -O2 -fprofile-use / Heap in TCRAM / FORK:2

or

CoreMark 1.0 : 1400 / GCC 3.4 -O4

If reporting scaling results, the results must be reported as follows

CoreMark/MHz 1.0 : N / C / P [/ M]

PWhen reporting scaling results, memory parameter must also indicate memory frequency:core frequency ratio.
  • If the core has cache and cache frequency to core frequency ratio is configurable, that must also be included.

e.g.

CoreMark/MHz 1.0 : 1.47 / GCC 4.1.2 -O2 / DDR3(Heap) 30:1 Memory 1:1 Cache
+ +

Log File Format

The log files have the following format

2K performance run parameters for coremark. (Run type)
+CoreMark Size       : 666                   (Buffer size)
+Total ticks         : 25875                 (platform dependent value)
+Total time (secs)   : 25.875000             (actual time in seconds)
+Iterations/Sec      : 3864.734300           (Performance value to report)
+Iterations          : 100000                (number of iterations used)
+Compiler version    : GCC3.4.4              (Compiler and version)
+Compiler flags      : -O2                   (Compiler and linker flags)
+Memory location     : Code in flash, data in on chip RAM
+seedcrc             : 0xe9f5                (identifier for the input seeds)
+[0]crclist          : 0xe714                (validation for list part)
+[0]crcmatrix        : 0x1fd7                (validation for matrix part)
+[0]crcstate         : 0x8e3a                (validation for state part)
+[0]crcfinal         : 0x33ff                (iteration dependent output)
+Correct operation validated. See README.md for run and reporting rules.  (*Only when run is successful*)
+CoreMark 1.0 : 6508.490622 / GCC3.4.4 -O2 / Heap                          (*Only on a successful performance run*)
+ +

Legal

See LICENSE.txt or the word document file under docs/LICENSE.doc.  For more information on your legal rights to use this benchmark, please see http://www.coremark.org- /download- /register.php?pg=register

+ +

Credits

Many thanks to all of the individuals who helped with the development or testing of CoreMark including (Sorted by company name)

  • Alan Anderson, ADI
  • Adhikary Rajiv, ADI
  • Elena Stohr, ARM
  • Ian Rickards, ARM
  • Andrew Pickard, ARM
  • Trent Parker, CAVIUM
  • Shay Gal-On, EEMBC
  • Markus Levy, EEMBC
  • Ron Olson, IBM
  • Eyal Barzilay, MIPS
  • Jens Eltze, NEC
  • Hirohiko Ono, NEC
  • Ulrich Drees, NEC
  • Frank Roscheda, NEC
  • Rob Cosaro, NXP
  • Shumpei Kawasaki, RENESAS
+ +
+ + + + + + + + + + +
This file contains the framework to acquire a block of memory, seed initial parameters, tun t he benchmark and report the results.
+ + + + + + + + diff --git a/benchmarks/riscv-coremark/coremark/docs/html/files/release_notes-txt.html b/benchmarks/riscv-coremark/coremark/docs/html/files/release_notes-txt.html new file mode 100644 index 000000000..6658c7141 --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/docs/html/files/release_notes-txt.html @@ -0,0 +1,56 @@ + + +Release Notes - CoreMark + + + + + + + +

Release Notes

Version: 1.01

History

Version 1.01

  • Added validation testing the sizes of datatypes.

Version 1.00

  • First public version.

Validation

This release was tested on the following platforms

  • x86 cygwin and gcc 3.4 (Quad, dual and single core systems)
  • x86 linux (Ubuntu/Fedora) and gcc (4.2/4.1) (Quad and single core systems)
  • MIPS64 BE linux and gcc 3.4 16 cores system
  • MIPS32 BE linux with CodeSourcery compiler 4.2-177 on Malta/Linux with a 1004K 3-core system
  • PPC simulator with gcc 4.2.2 (No OS)
  • PPC 64b BE linux (yellowdog) with gcc 3.4 and 4.1 (Dual core system)
  • BF533 with VDSP50
  • Renesas R8C/H8 MCU with HEW 4.05
  • NXP LPC1700 armcc v4.0.0.524
  • NEC 78K with IAR v4.61
  • ARM simulator with armcc v4

Coverage

GCOV results can be found on SVN under cover.

Memory analysis

Valgrind 3.4.0 used and no errors reported.

Balance analysis

Number of instructions executed for each function tested with cachegrind and found balanced with gcc and -O0.

Statistics

Lines

Lines  Blank  Cmnts  Source     AESL
+=====  =====  =====  =====  ==========  =======================================
+  469     66    170    251       627.5  core_list_join.c  (C)
+  330     18     54    268       670.0  core_main.c  (C)
+  256     32     80    146       365.0  core_matrix.c  (C)
+  240     16     51    186       465.0  core_state.c  (C)
+  165     11     20    134       335.0  core_util.c  (C)
+  150     23     36     98       245.0  coremark.h  (C)
+ 1610    166    411   1083      2707.5  ----- Benchmark -----  (6 files)
+  293     15     74    212       530.0  linux/core_portme.c  (C)
+  235     30    104    104       260.0  linux/core_portme.h  (C)
+  528     45    178    316       790.0  ----- Porting -----  (2 files)
+
+
+* For comparison, here are the stats for Dhrystone
+Lines  Blank  Cmnts  Source     AESL
+=====  =====  =====  =====  ==========  =======================================
+  311     15    242     54       135.0  dhry.h  (C)
+  789    132    119    553      1382.5  dhry_1.c  (C)
+  186     26     68    107       267.5  dhry_2.c  (C)
+ 1286    173    429    714      1785.0  ----- C -----  (3 files)
+ +
+ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/benchmarks/riscv-coremark/coremark/docs/html/index.html b/benchmarks/riscv-coremark/coremark/docs/html/index.html new file mode 100644 index 000000000..f7a88682a --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/docs/html/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/benchmarks/riscv-coremark/coremark/docs/html/index/BuildTargets.html b/benchmarks/riscv-coremark/coremark/docs/html/index/BuildTargets.html new file mode 100644 index 000000000..635c0ff78 --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/docs/html/index/BuildTargets.html @@ -0,0 +1,31 @@ + + +Build Target Index - CoreMark + + + + + + + +
Build Target Index
$#! · 0-9 · A · B · C · D · E · F · G · H · I · J · K · L · M · N · O · P · Q · R · S · T · U · V · W · X · Y · Z
P
 port_postbuild
 port_postload
 port_postrun
 port_prebuild
 port_preload
 port_prerun
+ +
Generate any files that are needed after actual build end.
Do platform specific after load stuff.
Do platform specific after run stuff.
Generate any files that are needed before actual build starts.
Do platform specific before load stuff.
Do platform specific after run stuff.
+ +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/benchmarks/riscv-coremark/coremark/docs/html/index/Configuration.html b/benchmarks/riscv-coremark/coremark/docs/html/index/Configuration.html new file mode 100644 index 000000000..8e5ef3aab --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/docs/html/index/Configuration.html @@ -0,0 +1,51 @@ + + +Configuration Index - CoreMark + + + + + + + +
Configuration Index
$#! · 0-9 · A · B · C · D · E · F · G · H · I · J · K · L · M · N · O · P · Q · R · S · T · U · V · W · X · Y · Z
C
 CORE_TICKS
H
 HAS_FLOAT
 HAS_PRINTF
 HAS_STDIO
 HAS_TIME_H
M
 MAIN_HAS_NOARGC
 MAIN_HAS_NORETURN
 MEM_METHOD
 MULTITHREAD
S
 SEED_METHOD
T
 TOTAL_DATA_SIZE
U
 USE_CLOCK
 USE_FORK
 USE_PTHREAD
 USE_SOCKET
+ +
Define type of return from the timing functions.
+ + + +
Define to 1 if the platform supports floating point.
Define to 1 if the platform has stdio.h and implements the printf function.
Define to 1 if the platform has stdio.h.
Define to 1 if platform has the time.h header file, and implementation of functions thereof.
+ + + +
Needed if platform does not support getting arguments to main.
Needed if platform does not support returning a value from main.
Defines method to get a block of memry.
Define for parallel execution
+ + + +
Defines method to get seed values that cannot be computed at compile time.
+ + + +
Define total size for data algorithms will operate on
+ + + +
Define to 1 if platform has the time.h header file, and implementation of functions thereof.
Sample implementation for launching parallel contexts This implementation uses fork, waitpid, shmget,shmat and shmdt.
Sample implementation for launching parallel contexts This implementation uses pthread_thread_create and pthread_join.
Sample implementation for launching parallel contexts This implementation uses fork, socket, sendto and recvfrom
+ +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/benchmarks/riscv-coremark/coremark/docs/html/index/Configurations.html b/benchmarks/riscv-coremark/coremark/docs/html/index/Configurations.html new file mode 100644 index 000000000..0faee64a0 --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/docs/html/index/Configurations.html @@ -0,0 +1,45 @@ + + +Configuration Index + + + + + + + + + +
Configuration Index
$#! · 0-9 · A · B · C · D · E · F · G · H · I · J · K · L · M · N · O · P · Q · R · S · T · U · V · W · X · Y · Z
H
 HAS_FLOAT
 HAS_STDIO
 HAS_TIME_H
M
 MEM_METHOD
S
 SEED_METHOD
T
 TOTAL_DATA_SIZE
+ +
Define to 1 if the platform supports floating point.
Define to 1 if the platform has stdio.h and implements the printf function.
Define to 1 if platform has the time.h header file, and implementation of functions thereof.
+ + + +
Defines method to get a block of memry.
+ + + +
Defines method to get seed values that cannot be computed at compile time.
+ + + +
Define total size for data algorithms will operate on
+ +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/benchmarks/riscv-coremark/coremark/docs/html/index/Files.html b/benchmarks/riscv-coremark/coremark/docs/html/index/Files.html new file mode 100644 index 000000000..7e6d2fa04 --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/docs/html/index/Files.html @@ -0,0 +1,35 @@ + + +File Index - CoreMark + + + + + + + +
File Index
$#! · 0-9 · A · B · C · D · E · F · G · H · I · J · K · L · M · N · O · P · Q · R · S · T · U · V · W · X · Y · Z
C
 core_list_join.c
 core_main.c
 core_matrix.c
 core_portme.c
 core_portme.h
 core_portme.mak
 core_state.c
 core_util.c
 CoreMark
 coremark.h
R
 Release Notes
+ +
This file contains the framework to acquire a block of memory, seed initial parameters, tun t he benchmark and report the results.
+ + + +
Version: 1.01
+ +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/benchmarks/riscv-coremark/coremark/docs/html/index/Functions.html b/benchmarks/riscv-coremark/coremark/docs/html/index/Functions.html new file mode 100644 index 000000000..a249d5186 --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/docs/html/index/Functions.html @@ -0,0 +1,55 @@ + + +Function Index - CoreMark + + + + + + + +
Function Index
$#! · 0-9 · A · B · C · D · E · F · G · H · I · J · K · L · M · N · O · P · Q · R · S · T · U · V · W · X · Y · Z
C
 cmp_complex
 cmp_idx
 core_bench_matrix
 core_bench_state
 core_init_state
 core_list_find
 core_list_init
 core_list_insert
 core_list_mergesort
 core_list_remove
 core_list_reverse
 core_list_undo_remove
 core_start_parallel
 core_state_transition
 core_stop_parallel
 crc*
G
 get_seed
 get_time
I
 iterate
M
 main
 matrix_add_const
 matrix_mul_const
 matrix_mul_matrix
 matrix_mul_matrix_bitextract
 matrix_mul_vect
 matrix_sum
 matrix_test
P
 portable_fini
 portable_free
 portable_init
 portable_malloc
S
 start_time
 stop_time
T
 time_in_secs
+ +
ee_s32 cmp_complex(list_data *a,
list_data *b,
core_results *res)
Compare the data item in a list cell.
ee_s32 cmp_idx(list_data *a,
list_data *b,
core_results *res)
Compare the idx item in a list cell, and regen the data.
ee_u16 core_bench_matrix(mat_params *p,
ee_s16 seed,
ee_u16 crc)
Benchmark function
ee_u16 core_bench_state(ee_u32 blksize,
ee_u8 *memblock,
ee_s16 seed1,
ee_s16 seed2,
ee_s16 step,
ee_u16 crc)
Benchmark function
void core_init_state(ee_u32 size,
ee_s16 seed,
ee_u8 *p)
Initialize the input data for the state machine.
list_head *core_list_find(list_head *list,
list_data *info)
Find an item in the list
list_head *core_list_init(ee_u32 blksize,
list_head *memblock,
ee_s16 seed)
Initialize list with data.
list_head *core_list_insert_new(list_head *insert_point,
list_data *info,
list_head **memblock,
list_data **datablock ,
list_head *memblock_end,
list_data *datablock_end)
Insert an item to the list
list_head *core_list_mergesort(list_head *list,
list_cmp cmp,
core_results *res)
Sort the list in place without recursion.
list_head *core_list_remove(list_head *item)
Remove an item from the list.
list_head *core_list_reverse(list_head *list)
Reverse a list
list_head *core_list_undo_remove(list_head *item_removed,
list_head *item_modified)
Undo a remove operation.
Start benchmarking in a parallel context.
enum CORE_STATE core_state_transition(ee_u8 **instr ,
ee_u32 *transition_count)
Actual state machine.
Stop a parallel context execution of coremark, and gather the results.
Service functions to calculate 16b CRC code.
+ + + +
Get a values that cannot be determined at compile time.
CORE_TICKS get_time(void)
Return an abstract “ticks” number that signifies time on the system.
+ + + +
Run the benchmark for a specified number of iterations.
+ + + +
#if MAIN_HAS_NOARGC MAIN_RETURN_TYPE main(void)
Main entry routine for the benchmark.
void matrix_add_const(ee_u32 N,
MATDAT *A,
MATDAT val)
Add a constant value to all elements of a matrix.
void matrix_mul_const(ee_u32 N,
MATRES *C,
MATDAT *A,
MATDAT val)
Multiply a matrix by a constant.
void matrix_mul_matrix(ee_u32 N,
MATRES *C,
MATDAT *A,
MATDAT *B)
Multiply a matrix by a matrix.
void matrix_mul_matrix_bitextract(ee_u32 N,
MATRES *C,
MATDAT *A,
MATDAT *B)
Multiply a matrix by a matrix, and extract some bits from the result.
void matrix_mul_vect(ee_u32 N,
MATRES *C,
MATDAT *A,
MATDAT *B)
Multiply a matrix by a vector.
ee_s16 matrix_sum(ee_u32 N,
MATRES *C,
MATDAT clipval)
Calculate a function that depends on the values of elements in the matrix.
ee_s16 matrix_test(ee_u32 N,
MATRES *C,
MATDAT *A,
MATDAT *B,
MATDAT val)
Perform matrix manipulation.
+ + + +
void portable_fini(core_portable *p)
Target specific final code
void portable_free(void *p)
Provide free() functionality in a platform specific way.
void portable_init(core_portable *p,
int *argc,
char *argv[])
Target specific initialization code Test for some common mistakes.
void *portable_malloc(size_t size)
Provide malloc() functionality in a platform specific way.
+ + + +
void start_time(void)
This function will be called right before starting the timed portion of the benchmark.
void stop_time(void)
This function will be called right after ending the timed portion of the benchmark.
+ + + +
secs_ret time_in_secs(CORE_TICKS ticks)
Convert the value returned by get_time to seconds.
+ +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/benchmarks/riscv-coremark/coremark/docs/html/index/General.html b/benchmarks/riscv-coremark/coremark/docs/html/index/General.html new file mode 100644 index 000000000..bd47b299f --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/docs/html/index/General.html @@ -0,0 +1,75 @@ + + +Index - CoreMark + + + + + + + +
Index
$#! · 0-9 · A · B · C · D · E · F · G · H · I · J · K · L · M · N · O · P · Q · R · S · T · U · V · W · X · Y · Z
B
 Build Targets
 Building and running
C
 CC
 CFLAGS
 cmp_complex
 cmp_idx
 Configuration
 core_bench_matrix
 core_bench_state
 core_init_state
 core_list_find
 core_list_init
 core_list_insert
 core_list_join.c
 core_list_mergesort
 core_list_remove
 core_list_reverse
 core_list_undo_remove
 core_main.c
 core_matrix.c
 core_portme.c
 core_portme.h
 core_portme.mak
 core_start_parallel
 core_state.c
 core_state_transition
 core_stop_parallel
 CORE_TICKS
 core_util.c
 CoreMark
 coremark.h
 crc*
 Credits
D
 default_num_contexts
 Description
 Documentation
F
 Functions
G
 get_seed
 get_time
H
 HAS_FLOAT
 HAS_PRINTF
 HAS_STDIO
 HAS_TIME_H
I
 iterate
L
 Legal
 LFLAGS_END
 LOAD
 Log File Format
M
 main
 MAIN_HAS_NOARGC
 MAIN_HAS_NORETURN
 matrix_add_const
 matrix_mul_const
 matrix_mul_matrix
 matrix_mul_matrix_bitextract
 matrix_mul_vect
 matrix_sum
 matrix_test
 MEM_METHOD
 MULTITHREAD
O
 OPATH
 OUTFLAG
P
 PERL
 PORT_OBJS
 port_postbuild
 port_postload
 port_postrun
 port_prebuild
 port_preload
 port_prerun
 PORT_SRCS
 portable_fini
 portable_free
 portable_init
 portable_malloc
R
 Release Notes
 Reporting rules
 RUN
 Run rules
+ +
Download the release files from the www.coremark.org.
+ + + +
Use this flag to define compiler to use
Use this flag to define compiler options.
ee_s32 cmp_complex(list_data *a,
list_data *b,
core_results *res)
Compare the data item in a list cell.
ee_s32 cmp_idx(list_data *a,
list_data *b,
core_results *res)
Compare the idx item in a list cell, and regen the data.
ee_u16 core_bench_matrix(mat_params *p,
ee_s16 seed,
ee_u16 crc)
Benchmark function
ee_u16 core_bench_state(ee_u32 blksize,
ee_u8 *memblock,
ee_s16 seed1,
ee_s16 seed2,
ee_s16 step,
ee_u16 crc)
Benchmark function
void core_init_state(ee_u32 size,
ee_s16 seed,
ee_u8 *p)
Initialize the input data for the state machine.
list_head *core_list_find(list_head *list,
list_data *info)
Find an item in the list
list_head *core_list_init(ee_u32 blksize,
list_head *memblock,
ee_s16 seed)
Initialize list with data.
list_head *core_list_insert_new(list_head *insert_point,
list_data *info,
list_head **memblock,
list_data **datablock ,
list_head *memblock_end,
list_data *datablock_end)
Insert an item to the list
list_head *core_list_mergesort(list_head *list,
list_cmp cmp,
core_results *res)
Sort the list in place without recursion.
list_head *core_list_remove(list_head *item)
Remove an item from the list.
list_head *core_list_reverse(list_head *list)
Reverse a list
list_head *core_list_undo_remove(list_head *item_removed,
list_head *item_modified)
Undo a remove operation.
This file contains the framework to acquire a block of memory, seed initial parameters, tun t he benchmark and report the results.
Start benchmarking in a parallel context.
enum CORE_STATE core_state_transition(ee_u8 **instr ,
ee_u32 *transition_count)
Actual state machine.
Stop a parallel context execution of coremark, and gather the results.
Define type of return from the timing functions.
Service functions to calculate 16b CRC code.
Many thanks to all of the individuals who helped with the development or testing of CoreMark including (Sorted by company name)
+ + + +
extern ee_u32 default_num_contexts
Number of contexts to spawn in multicore context.
Benchmark using a linked list.
When you unpack the documentation (tar -vzxf coremark_version_docs.tgz) a docs folder will be created.
+ + + + + + + +
Get a values that cannot be determined at compile time.
CORE_TICKS get_time(void)
Return an abstract “ticks” number that signifies time on the system.
+ + + +
Define to 1 if the platform supports floating point.
Define to 1 if the platform has stdio.h and implements the printf function.
Define to 1 if the platform has stdio.h.
Define to 1 if platform has the time.h header file, and implementation of functions thereof.
+ + + +
Run the benchmark for a specified number of iterations.
+ + + +
See LICENSE.txt or the word document file under docs/LICENSE.doc.
Define any libraries needed for linking or other flags that should come at the end of the link line (e.g.
Define this flag if you need to load to a target, as in a cross compile environment.
The log files have the following format
+ + + +
#if MAIN_HAS_NOARGC MAIN_RETURN_TYPE main(void)
Main entry routine for the benchmark.
Needed if platform does not support getting arguments to main.
Needed if platform does not support returning a value from main.
void matrix_add_const(ee_u32 N,
MATDAT *A,
MATDAT val)
Add a constant value to all elements of a matrix.
void matrix_mul_const(ee_u32 N,
MATRES *C,
MATDAT *A,
MATDAT val)
Multiply a matrix by a constant.
void matrix_mul_matrix(ee_u32 N,
MATRES *C,
MATDAT *A,
MATDAT *B)
Multiply a matrix by a matrix.
void matrix_mul_matrix_bitextract(ee_u32 N,
MATRES *C,
MATDAT *A,
MATDAT *B)
Multiply a matrix by a matrix, and extract some bits from the result.
void matrix_mul_vect(ee_u32 N,
MATRES *C,
MATDAT *A,
MATDAT *B)
Multiply a matrix by a vector.
ee_s16 matrix_sum(ee_u32 N,
MATRES *C,
MATDAT clipval)
Calculate a function that depends on the values of elements in the matrix.
ee_s16 matrix_test(ee_u32 N,
MATRES *C,
MATDAT *A,
MATDAT *B,
MATDAT val)
Perform matrix manipulation.
Defines method to get a block of memry.
Define for parallel execution
+ + + +
Use this flag to define how to to get an executable (e.g -o)
+ + + +
Define perl executable to calculate the geomean if running separate.
Port specific object files can be added here
Generate any files that are needed after actual build end.
Do platform specific after load stuff.
Do platform specific after run stuff.
Generate any files that are needed before actual build starts.
Do platform specific before load stuff.
Do platform specific after run stuff.
Port specific source files can be added here
void portable_fini(core_portable *p)
Target specific final code
void portable_free(void *p)
Provide free() functionality in a platform specific way.
void portable_init(core_portable *p,
int *argc,
char *argv[])
Target specific initialization code Test for some common mistakes.
void *portable_malloc(size_t size)
Provide malloc() functionality in a platform specific way.
+ + + +
Version: 1.01
How to report results on a data sheet?
Define this flag if running does not consist of simple invocation of the binary.
What is and is not allowed.
+ +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/benchmarks/riscv-coremark/coremark/docs/html/index/General2.html b/benchmarks/riscv-coremark/coremark/docs/html/index/General2.html new file mode 100644 index 000000000..3852ab5aa --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/docs/html/index/General2.html @@ -0,0 +1,47 @@ + + +Index - CoreMark + + + + + + + +
Index
$#! · 0-9 · A · B · C · D · E · F · G · H · I · J · K · L · M · N · O · P · Q · R · S · T · U · V · W · X · Y · Z
S
 secs_ret
 SEED_METHOD
 SEPARATE_COMPILE
 start_time
 stop_time
 Submitting results
T
 time_in_secs
 TIMER_RES_DIVIDER
 TOTAL_DATA_SIZE
 Types
U
 USE_CLOCK
 USE_FORK
 USE_PTHREAD
 USE_SOCKET
V
 Variables
W
 Welcome
+ +
For machines that have floating point support, get number of seconds as a double.
Defines method to get seed values that cannot be computed at compile time.
Define if you need to separate compilation from link stage.
void start_time(void)
This function will be called right before starting the timed portion of the benchmark.
void stop_time(void)
This function will be called right after ending the timed portion of the benchmark.
CoreMark results can be submitted on the web.
+ + + +
secs_ret time_in_secs(CORE_TICKS ticks)
Convert the value returned by get_time to seconds.
Divider to trade off timer resolution and total time that can be measured.
Define total size for data algorithms will operate on
+ + + +
Define to 1 if platform has the time.h header file, and implementation of functions thereof.
Sample implementation for launching parallel contexts This implementation uses fork, waitpid, shmget,shmat and shmdt.
Sample implementation for launching parallel contexts This implementation uses pthread_thread_create and pthread_join.
Sample implementation for launching parallel contexts This implementation uses fork, socket, sendto and recvfrom
+ + + + + + + +
Copyright © 2009 EEMBC All rights reserved.
+ +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/benchmarks/riscv-coremark/coremark/docs/html/index/Types.html b/benchmarks/riscv-coremark/coremark/docs/html/index/Types.html new file mode 100644 index 000000000..1f4413653 --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/docs/html/index/Types.html @@ -0,0 +1,31 @@ + + +Type Index - CoreMark + + + + + + + +
Type Index
$#! · 0-9 · A · B · C · D · E · F · G · H · I · J · K · L · M · N · O · P · Q · R · S · T · U · V · W · X · Y · Z
S
 secs_ret
+ +
For machines that have floating point support, get number of seconds as a double.
+ +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/benchmarks/riscv-coremark/coremark/docs/html/index/Variables.html b/benchmarks/riscv-coremark/coremark/docs/html/index/Variables.html new file mode 100644 index 000000000..8c050daef --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/docs/html/index/Variables.html @@ -0,0 +1,55 @@ + + +Variable Index - CoreMark + + + + + + + +
Variable Index
$#! · 0-9 · A · B · C · D · E · F · G · H · I · J · K · L · M · N · O · P · Q · R · S · T · U · V · W · X · Y · Z
C
 CC
 CFLAGS
D
 default_num_contexts
L
 LFLAGS_END
 LOAD
O
 OPATH
 OUTFLAG
P
 PERL
 PORT_OBJS
 PORT_SRCS
R
 RUN
S
 SEPARATE_COMPILE
+ +
Use this flag to define compiler to use
Use this flag to define compiler options.
+ + + +
extern ee_u32 default_num_contexts
Number of contexts to spawn in multicore context.
+ + + +
Define any libraries needed for linking or other flags that should come at the end of the link line (e.g.
Define this flag if you need to load to a target, as in a cross compile environment.
+ + + +
Use this flag to define how to to get an executable (e.g -o)
+ + + +
Define perl executable to calculate the geomean if running separate.
Port specific object files can be added here
Port specific source files can be added here
+ + + +
Define this flag if running does not consist of simple invocation of the binary.
+ + + +
Define if you need to separate compilation from link stage.
+ +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/benchmarks/riscv-coremark/coremark/docs/html/javascript/main.js b/benchmarks/riscv-coremark/coremark/docs/html/javascript/main.js new file mode 100644 index 000000000..91991f507 --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/docs/html/javascript/main.js @@ -0,0 +1,836 @@ +// This file is part of Natural Docs, which is Copyright (C) 2003-2008 Greg Valure +// Natural Docs is licensed under the GPL + + +// +// Browser Styles +// ____________________________________________________________________________ + +var agt=navigator.userAgent.toLowerCase(); +var browserType; +var browserVer; + +if (agt.indexOf("opera") != -1) + { + browserType = "Opera"; + + if (agt.indexOf("opera 7") != -1 || agt.indexOf("opera/7") != -1) + { browserVer = "Opera7"; } + else if (agt.indexOf("opera 8") != -1 || agt.indexOf("opera/8") != -1) + { browserVer = "Opera8"; } + else if (agt.indexOf("opera 9") != -1 || agt.indexOf("opera/9") != -1) + { browserVer = "Opera9"; } + } + +else if (agt.indexOf("applewebkit") != -1) + { + browserType = "Safari"; + + if (agt.indexOf("version/3") != -1) + { browserVer = "Safari3"; } + else if (agt.indexOf("safari/4") != -1) + { browserVer = "Safari2"; } + } + +else if (agt.indexOf("khtml") != -1) + { + browserType = "Konqueror"; + } + +else if (agt.indexOf("msie") != -1) + { + browserType = "IE"; + + if (agt.indexOf("msie 6") != -1) + { browserVer = "IE6"; } + else if (agt.indexOf("msie 7") != -1) + { browserVer = "IE7"; } + } + +else if (agt.indexOf("gecko") != -1) + { + browserType = "Firefox"; + + if (agt.indexOf("rv:1.7") != -1) + { browserVer = "Firefox1"; } + else if (agt.indexOf("rv:1.8)") != -1 || agt.indexOf("rv:1.8.0") != -1) + { browserVer = "Firefox15"; } + else if (agt.indexOf("rv:1.8.1") != -1) + { browserVer = "Firefox2"; } + } + + +// +// Support Functions +// ____________________________________________________________________________ + + +function GetXPosition(item) + { + var position = 0; + + if (item.offsetWidth != null) + { + while (item != document.body && item != null) + { + position += item.offsetLeft; + item = item.offsetParent; + }; + }; + + return position; + }; + + +function GetYPosition(item) + { + var position = 0; + + if (item.offsetWidth != null) + { + while (item != document.body && item != null) + { + position += item.offsetTop; + item = item.offsetParent; + }; + }; + + return position; + }; + + +function MoveToPosition(item, x, y) + { + // Opera 5 chokes on the px extension, so it can use the Microsoft one instead. + + if (item.style.left != null) + { + item.style.left = x + "px"; + item.style.top = y + "px"; + } + else if (item.style.pixelLeft != null) + { + item.style.pixelLeft = x; + item.style.pixelTop = y; + }; + }; + + +// +// Menu +// ____________________________________________________________________________ + + +function ToggleMenu(id) + { + if (!window.document.getElementById) + { return; }; + + var display = window.document.getElementById(id).style.display; + + if (display == "none") + { display = "block"; } + else + { display = "none"; } + + window.document.getElementById(id).style.display = display; + } + +function HideAllBut(ids, max) + { + if (document.getElementById) + { + ids.sort( function(a,b) { return a - b; } ); + var number = 1; + + while (number < max) + { + if (ids.length > 0 && number == ids[0]) + { ids.shift(); } + else + { + document.getElementById("MGroupContent" + number).style.display = "none"; + }; + + number++; + }; + }; + } + + +// +// Tooltips +// ____________________________________________________________________________ + + +var tooltipTimer = 0; + +function ShowTip(event, tooltipID, linkID) + { + if (tooltipTimer) + { clearTimeout(tooltipTimer); }; + + var docX = event.clientX + window.pageXOffset; + var docY = event.clientY + window.pageYOffset; + + var showCommand = "ReallyShowTip('" + tooltipID + "', '" + linkID + "', " + docX + ", " + docY + ")"; + + tooltipTimer = setTimeout(showCommand, 1000); + } + +function ReallyShowTip(tooltipID, linkID, docX, docY) + { + tooltipTimer = 0; + + var tooltip; + var link; + + if (document.getElementById) + { + tooltip = document.getElementById(tooltipID); + link = document.getElementById(linkID); + } +/* else if (document.all) + { + tooltip = eval("document.all['" + tooltipID + "']"); + link = eval("document.all['" + linkID + "']"); + } +*/ + if (tooltip) + { + var left = GetXPosition(link); + var top = GetYPosition(link); + top += link.offsetHeight; + + + // The fallback method is to use the mouse X and Y relative to the document. We use a separate if and test if its a number + // in case some browser snuck through the above if statement but didn't support everything. + + if (!isFinite(top) || top == 0) + { + left = docX; + top = docY; + } + + // Some spacing to get it out from under the cursor. + + top += 10; + + // Make sure the tooltip doesnt get smushed by being too close to the edge, or in some browsers, go off the edge of the + // page. We do it here because Konqueror does get offsetWidth right even if it doesnt get the positioning right. + + if (tooltip.offsetWidth != null) + { + var width = tooltip.offsetWidth; + var docWidth = document.body.clientWidth; + + if (left + width > docWidth) + { left = docWidth - width - 1; } + + // If there's a horizontal scroll bar we could go past zero because it's using the page width, not the window width. + if (left < 0) + { left = 0; }; + } + + MoveToPosition(tooltip, left, top); + tooltip.style.visibility = "visible"; + } + } + +function HideTip(tooltipID) + { + if (tooltipTimer) + { + clearTimeout(tooltipTimer); + tooltipTimer = 0; + } + + var tooltip; + + if (document.getElementById) + { tooltip = document.getElementById(tooltipID); } + else if (document.all) + { tooltip = eval("document.all['" + tooltipID + "']"); } + + if (tooltip) + { tooltip.style.visibility = "hidden"; } + } + + +// +// Blockquote fix for IE +// ____________________________________________________________________________ + + +function NDOnLoad() + { + if (browserVer == "IE6") + { + var scrollboxes = document.getElementsByTagName('blockquote'); + + if (scrollboxes.item(0)) + { + NDDoResize(); + window.onresize=NDOnResize; + }; + }; + }; + + +var resizeTimer = 0; + +function NDOnResize() + { + if (resizeTimer != 0) + { clearTimeout(resizeTimer); }; + + resizeTimer = setTimeout(NDDoResize, 250); + }; + + +function NDDoResize() + { + var scrollboxes = document.getElementsByTagName('blockquote'); + + var i; + var item; + + i = 0; + while (item = scrollboxes.item(i)) + { + item.style.width = 100; + i++; + }; + + i = 0; + while (item = scrollboxes.item(i)) + { + item.style.width = item.parentNode.offsetWidth; + i++; + }; + + clearTimeout(resizeTimer); + resizeTimer = 0; + } + + + +/* ________________________________________________________________________________________________________ + + Class: SearchPanel + ________________________________________________________________________________________________________ + + A class handling everything associated with the search panel. + + Parameters: + + name - The name of the global variable that will be storing this instance. Is needed to be able to set timeouts. + mode - The mode the search is going to work in. Pass CommandLineOption()>, so the + value will be something like "HTML" or "FramedHTML". + + ________________________________________________________________________________________________________ +*/ + + +function SearchPanel(name, mode, resultsPath) + { + if (!name || !mode || !resultsPath) + { alert("Incorrect parameters to SearchPanel."); }; + + + // Group: Variables + // ________________________________________________________________________ + + /* + var: name + The name of the global variable that will be storing this instance of the class. + */ + this.name = name; + + /* + var: mode + The mode the search is going to work in, such as "HTML" or "FramedHTML". + */ + this.mode = mode; + + /* + var: resultsPath + The relative path from the current HTML page to the results page directory. + */ + this.resultsPath = resultsPath; + + /* + var: keyTimeout + The timeout used between a keystroke and when a search is performed. + */ + this.keyTimeout = 0; + + /* + var: keyTimeoutLength + The length of in thousandths of a second. + */ + this.keyTimeoutLength = 500; + + /* + var: lastSearchValue + The last search string executed, or an empty string if none. + */ + this.lastSearchValue = ""; + + /* + var: lastResultsPage + The last results page. The value is only relevant if is set. + */ + this.lastResultsPage = ""; + + /* + var: deactivateTimeout + + The timeout used between when a control is deactivated and when the entire panel is deactivated. Is necessary + because a control may be deactivated in favor of another control in the same panel, in which case it should stay + active. + */ + this.deactivateTimout = 0; + + /* + var: deactivateTimeoutLength + The length of in thousandths of a second. + */ + this.deactivateTimeoutLength = 200; + + + + + // Group: DOM Elements + // ________________________________________________________________________ + + + // Function: DOMSearchField + this.DOMSearchField = function() + { return document.getElementById("MSearchField"); }; + + // Function: DOMSearchType + this.DOMSearchType = function() + { return document.getElementById("MSearchType"); }; + + // Function: DOMPopupSearchResults + this.DOMPopupSearchResults = function() + { return document.getElementById("MSearchResults"); }; + + // Function: DOMPopupSearchResultsWindow + this.DOMPopupSearchResultsWindow = function() + { return document.getElementById("MSearchResultsWindow"); }; + + // Function: DOMSearchPanel + this.DOMSearchPanel = function() + { return document.getElementById("MSearchPanel"); }; + + + + + // Group: Event Handlers + // ________________________________________________________________________ + + + /* + Function: OnSearchFieldFocus + Called when focus is added or removed from the search field. + */ + this.OnSearchFieldFocus = function(isActive) + { + this.Activate(isActive); + }; + + + /* + Function: OnSearchFieldChange + Called when the content of the search field is changed. + */ + this.OnSearchFieldChange = function() + { + if (this.keyTimeout) + { + clearTimeout(this.keyTimeout); + this.keyTimeout = 0; + }; + + var searchValue = this.DOMSearchField().value.replace(/ +/g, ""); + + if (searchValue != this.lastSearchValue) + { + if (searchValue != "") + { + this.keyTimeout = setTimeout(this.name + ".Search()", this.keyTimeoutLength); + } + else + { + if (this.mode == "HTML") + { this.DOMPopupSearchResultsWindow().style.display = "none"; }; + this.lastSearchValue = ""; + }; + }; + }; + + + /* + Function: OnSearchTypeFocus + Called when focus is added or removed from the search type. + */ + this.OnSearchTypeFocus = function(isActive) + { + this.Activate(isActive); + }; + + + /* + Function: OnSearchTypeChange + Called when the search type is changed. + */ + this.OnSearchTypeChange = function() + { + var searchValue = this.DOMSearchField().value.replace(/ +/g, ""); + + if (searchValue != "") + { + this.Search(); + }; + }; + + + + // Group: Action Functions + // ________________________________________________________________________ + + + /* + Function: CloseResultsWindow + Closes the results window. + */ + this.CloseResultsWindow = function() + { + this.DOMPopupSearchResultsWindow().style.display = "none"; + this.Activate(false, true); + }; + + + /* + Function: Search + Performs a search. + */ + this.Search = function() + { + this.keyTimeout = 0; + + var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + var searchTopic = this.DOMSearchType().value; + + var pageExtension = searchValue.substr(0,1); + + if (pageExtension.match(/^[a-z]/i)) + { pageExtension = pageExtension.toUpperCase(); } + else if (pageExtension.match(/^[0-9]/)) + { pageExtension = 'Numbers'; } + else + { pageExtension = "Symbols"; }; + + var resultsPage; + var resultsPageWithSearch; + var hasResultsPage; + + // indexSectionsWithContent is defined in searchdata.js + if (indexSectionsWithContent[searchTopic][pageExtension] == true) + { + resultsPage = this.resultsPath + '/' + searchTopic + pageExtension + '.html'; + resultsPageWithSearch = resultsPage+'?'+escape(searchValue); + hasResultsPage = true; + } + else + { + resultsPage = this.resultsPath + '/NoResults.html'; + resultsPageWithSearch = resultsPage; + hasResultsPage = false; + }; + + var resultsFrame; + if (this.mode == "HTML") + { resultsFrame = window.frames.MSearchResults; } + else if (this.mode == "FramedHTML") + { resultsFrame = window.top.frames['Content']; }; + + + if (resultsPage != this.lastResultsPage || + + // Bug in IE. If everything becomes hidden in a run, none of them will be able to be reshown in the next for some + // reason. It counts the right number of results, and you can even read the display as "block" after setting it, but it + // just doesn't work in IE 6 or IE 7. So if we're on the right page but the previous search had no results, reload the + // page anyway to get around the bug. + (browserType == "IE" && hasResultsPage && + (!resultsFrame.searchResults || resultsFrame.searchResults.lastMatchCount == 0)) ) + + { + resultsFrame.location.href = resultsPageWithSearch; + } + + // So if the results page is right and there's no IE bug, reperform the search on the existing page. We have to check if there + // are results because NoResults.html doesn't have any JavaScript, and it would be useless to do anything on that page even + // if it did. + else if (hasResultsPage) + { + // We need to check if this exists in case the frame is present but didn't finish loading. + if (resultsFrame.searchResults) + { resultsFrame.searchResults.Search(searchValue); } + + // Otherwise just reload instead of waiting. + else + { resultsFrame.location.href = resultsPageWithSearch; }; + }; + + + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + + if (this.mode == "HTML" && domPopupSearchResultsWindow.style.display != "block") + { + var domSearchType = this.DOMSearchType(); + + var left = GetXPosition(domSearchType); + var top = GetYPosition(domSearchType) + domSearchType.offsetHeight; + + MoveToPosition(domPopupSearchResultsWindow, left, top); + domPopupSearchResultsWindow.style.display = 'block'; + }; + + + this.lastSearchValue = searchValue; + this.lastResultsPage = resultsPage; + }; + + + + // Group: Activation Functions + // Functions that handle whether the entire panel is active or not. + // ________________________________________________________________________ + + + /* + Function: Activate + + Activates or deactivates the search panel, resetting things to their default values if necessary. You can call this on every + control's OnBlur() and it will handle not deactivating the entire panel when focus is just switching between them transparently. + + Parameters: + + isActive - Whether you're activating or deactivating the panel. + ignoreDeactivateDelay - Set if you're positive the action will deactivate the panel and thus want to skip the delay. + */ + this.Activate = function(isActive, ignoreDeactivateDelay) + { + // We want to ignore isActive being false while the results window is open. + if (isActive || (this.mode == "HTML" && this.DOMPopupSearchResultsWindow().style.display == "block")) + { + if (this.inactivateTimeout) + { + clearTimeout(this.inactivateTimeout); + this.inactivateTimeout = 0; + }; + + this.DOMSearchPanel().className = 'MSearchPanelActive'; + + var searchField = this.DOMSearchField(); + + if (searchField.value == 'Search') + { searchField.value = ""; } + } + else if (!ignoreDeactivateDelay) + { + this.inactivateTimeout = setTimeout(this.name + ".InactivateAfterTimeout()", this.inactivateTimeoutLength); + } + else + { + this.InactivateAfterTimeout(); + }; + }; + + + /* + Function: InactivateAfterTimeout + + Called by , which is set by . Inactivation occurs on a timeout because a control may + receive OnBlur() when focus is really transferring to another control in the search panel. In this case we don't want to + actually deactivate the panel because not only would that cause a visible flicker but it could also reset the search value. + So by doing it on a timeout instead, there's a short period where the second control's OnFocus() can cancel the deactivation. + */ + this.InactivateAfterTimeout = function() + { + this.inactivateTimeout = 0; + + this.DOMSearchPanel().className = 'MSearchPanelInactive'; + this.DOMSearchField().value = "Search"; + + this.lastSearchValue = ""; + this.lastResultsPage = ""; + }; + }; + + + + +/* ________________________________________________________________________________________________________ + + Class: SearchResults + _________________________________________________________________________________________________________ + + The class that handles everything on the search results page. + _________________________________________________________________________________________________________ +*/ + + +function SearchResults(name, mode) + { + /* + var: mode + The mode the search is going to work in, such as "HTML" or "FramedHTML". + */ + this.mode = mode; + + /* + var: lastMatchCount + The number of matches from the last run of . + */ + this.lastMatchCount = 0; + + + /* + Function: Toggle + Toggles the visibility of the passed element ID. + */ + this.Toggle = function(id) + { + if (this.mode == "FramedHTML") + { return; }; + + var parentElement = document.getElementById(id); + + var element = parentElement.firstChild; + + while (element && element != parentElement) + { + if (element.nodeName == 'DIV' && element.className == 'ISubIndex') + { + if (element.style.display == 'block') + { element.style.display = "none"; } + else + { element.style.display = 'block'; } + }; + + if (element.nodeName == 'DIV' && element.hasChildNodes()) + { element = element.firstChild; } + else if (element.nextSibling) + { element = element.nextSibling; } + else + { + do + { + element = element.parentNode; + } + while (element && element != parentElement && !element.nextSibling); + + if (element && element != parentElement) + { element = element.nextSibling; }; + }; + }; + }; + + + /* + Function: Search + + Searches for the passed string. If there is no parameter, it takes it from the URL query. + + Always returns true, since other documents may try to call it and that may or may not be possible. + */ + this.Search = function(search) + { + if (!search) + { + search = window.location.search; + search = search.substring(1); // Remove the leading ? + search = unescape(search); + }; + + search = search.replace(/^ +/, ""); + search = search.replace(/ +$/, ""); + search = search.toLowerCase(); + + if (search.match(/[^a-z0-9]/)) // Just a little speedup so it doesn't have to go through the below unnecessarily. + { + search = search.replace(/\_/g, "_und"); + search = search.replace(/\ +/gi, "_spc"); + search = search.replace(/\~/g, "_til"); + search = search.replace(/\!/g, "_exc"); + search = search.replace(/\@/g, "_att"); + search = search.replace(/\#/g, "_num"); + search = search.replace(/\$/g, "_dol"); + search = search.replace(/\%/g, "_pct"); + search = search.replace(/\^/g, "_car"); + search = search.replace(/\&/g, "_amp"); + search = search.replace(/\*/g, "_ast"); + search = search.replace(/\(/g, "_lpa"); + search = search.replace(/\)/g, "_rpa"); + search = search.replace(/\-/g, "_min"); + search = search.replace(/\+/g, "_plu"); + search = search.replace(/\=/g, "_equ"); + search = search.replace(/\{/g, "_lbc"); + search = search.replace(/\}/g, "_rbc"); + search = search.replace(/\[/g, "_lbk"); + search = search.replace(/\]/g, "_rbk"); + search = search.replace(/\:/g, "_col"); + search = search.replace(/\;/g, "_sco"); + search = search.replace(/\"/g, "_quo"); + search = search.replace(/\'/g, "_apo"); + search = search.replace(/\/g, "_ran"); + search = search.replace(/\,/g, "_com"); + search = search.replace(/\./g, "_per"); + search = search.replace(/\?/g, "_que"); + search = search.replace(/\//g, "_sla"); + search = search.replace(/[^a-z0-9\_]i/gi, "_zzz"); + }; + + var resultRows = document.getElementsByTagName("div"); + var matches = 0; + + var i = 0; + while (i < resultRows.length) + { + var row = resultRows.item(i); + + if (row.className == "SRResult") + { + var rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); + + if (search.length <= rowMatchName.length && rowMatchName.substr(0, search.length) == search) + { + row.style.display = "block"; + matches++; + } + else + { row.style.display = "none"; }; + }; + + i++; + }; + + document.getElementById("Searching").style.display="none"; + + if (matches == 0) + { document.getElementById("NoMatches").style.display="block"; } + else + { document.getElementById("NoMatches").style.display="none"; } + + this.lastMatchCount = matches; + + return true; + }; + }; + diff --git a/benchmarks/riscv-coremark/coremark/docs/html/javascript/searchdata.js b/benchmarks/riscv-coremark/coremark/docs/html/javascript/searchdata.js new file mode 100644 index 000000000..901318e77 --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/docs/html/javascript/searchdata.js @@ -0,0 +1,212 @@ +var indexSectionsWithContent = { + "General": { + "Symbols": false, + "Numbers": false, + "A": false, + "B": false, + "C": true, + "D": true, + "E": false, + "F": true, + "G": true, + "H": false, + "I": true, + "J": false, + "K": false, + "L": false, + "M": true, + "N": false, + "O": false, + "P": false, + "Q": false, + "R": false, + "S": true, + "T": true, + "U": false, + "V": false, + "W": false, + "X": false, + "Y": false, + "Z": false + }, + "Variables": { + "Symbols": false, + "Numbers": false, + "A": false, + "B": false, + "C": true, + "D": true, + "E": false, + "F": false, + "G": false, + "H": false, + "I": false, + "J": false, + "K": false, + "L": true, + "M": false, + "N": false, + "O": true, + "P": true, + "Q": false, + "R": true, + "S": true, + "T": false, + "U": false, + "V": false, + "W": false, + "X": false, + "Y": false, + "Z": false + }, + "Functions": { + "Symbols": false, + "Numbers": false, + "A": false, + "B": false, + "C": true, + "D": false, + "E": false, + "F": false, + "G": true, + "H": false, + "I": true, + "J": false, + "K": false, + "L": false, + "M": true, + "N": false, + "O": false, + "P": true, + "Q": false, + "R": false, + "S": true, + "T": true, + "U": false, + "V": false, + "W": false, + "X": false, + "Y": false, + "Z": false + }, + "Files": { + "Symbols": false, + "Numbers": false, + "A": false, + "B": false, + "C": true, + "D": false, + "E": false, + "F": false, + "G": false, + "H": false, + "I": false, + "J": false, + "K": false, + "L": false, + "M": false, + "N": false, + "O": false, + "P": false, + "Q": false, + "R": true, + "S": false, + "T": false, + "U": false, + "V": false, + "W": false, + "X": false, + "Y": false, + "Z": false + }, + "Configuration": { + "Symbols": false, + "Numbers": false, + "A": false, + "B": false, + "C": true, + "D": false, + "E": false, + "F": false, + "G": false, + "H": true, + "I": false, + "J": false, + "K": false, + "L": false, + "M": true, + "N": false, + "O": false, + "P": false, + "Q": false, + "R": false, + "S": true, + "T": true, + "U": true, + "V": false, + "W": false, + "X": false, + "Y": false, + "Z": false + }, + "Types": { + "Symbols": false, + "Numbers": false, + "A": false, + "B": false, + "C": false, + "D": false, + "E": false, + "F": false, + "G": false, + "H": false, + "I": false, + "J": false, + "K": false, + "L": false, + "M": false, + "N": false, + "O": false, + "P": false, + "Q": false, + "R": false, + "S": true, + "T": false, + "U": false, + "V": false, + "W": false, + "X": false, + "Y": false, + "Z": false + }, + "BuildTargets": { + "Symbols": false, + "Numbers": false, + "A": false, + "B": false, + "C": false, + "D": false, + "E": false, + "F": false, + "G": false, + "H": false, + "I": false, + "J": false, + "K": false, + "L": false, + "M": false, + "N": false, + "O": false, + "P": true, + "Q": false, + "R": false, + "S": false, + "T": false, + "U": false, + "V": false, + "W": false, + "X": false, + "Y": false, + "Z": false + } + } \ No newline at end of file diff --git a/benchmarks/riscv-coremark/coremark/docs/html/search/BuildTargetsP.html b/benchmarks/riscv-coremark/coremark/docs/html/search/BuildTargetsP.html new file mode 100644 index 000000000..65e741d65 --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/docs/html/search/BuildTargetsP.html @@ -0,0 +1,18 @@ + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/benchmarks/riscv-coremark/coremark/docs/html/search/ConfigurationC.html b/benchmarks/riscv-coremark/coremark/docs/html/search/ConfigurationC.html new file mode 100644 index 000000000..84b49ca3a --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/docs/html/search/ConfigurationC.html @@ -0,0 +1,18 @@ + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/benchmarks/riscv-coremark/coremark/docs/html/search/ConfigurationH.html b/benchmarks/riscv-coremark/coremark/docs/html/search/ConfigurationH.html new file mode 100644 index 000000000..3b0c39213 --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/docs/html/search/ConfigurationH.html @@ -0,0 +1,18 @@ + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/benchmarks/riscv-coremark/coremark/docs/html/search/ConfigurationM.html b/benchmarks/riscv-coremark/coremark/docs/html/search/ConfigurationM.html new file mode 100644 index 000000000..022606fa2 --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/docs/html/search/ConfigurationM.html @@ -0,0 +1,18 @@ + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/benchmarks/riscv-coremark/coremark/docs/html/search/ConfigurationS.html b/benchmarks/riscv-coremark/coremark/docs/html/search/ConfigurationS.html new file mode 100644 index 000000000..d26de19b9 --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/docs/html/search/ConfigurationS.html @@ -0,0 +1,18 @@ + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/benchmarks/riscv-coremark/coremark/docs/html/search/ConfigurationT.html b/benchmarks/riscv-coremark/coremark/docs/html/search/ConfigurationT.html new file mode 100644 index 000000000..183daf1ee --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/docs/html/search/ConfigurationT.html @@ -0,0 +1,18 @@ + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/benchmarks/riscv-coremark/coremark/docs/html/search/ConfigurationU.html b/benchmarks/riscv-coremark/coremark/docs/html/search/ConfigurationU.html new file mode 100644 index 000000000..d9b46a52d --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/docs/html/search/ConfigurationU.html @@ -0,0 +1,18 @@ + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/benchmarks/riscv-coremark/coremark/docs/html/search/ConfigurationsH.html b/benchmarks/riscv-coremark/coremark/docs/html/search/ConfigurationsH.html new file mode 100644 index 000000000..ade2ab757 --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/docs/html/search/ConfigurationsH.html @@ -0,0 +1,20 @@ + + + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/benchmarks/riscv-coremark/coremark/docs/html/search/ConfigurationsM.html b/benchmarks/riscv-coremark/coremark/docs/html/search/ConfigurationsM.html new file mode 100644 index 000000000..baa189221 --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/docs/html/search/ConfigurationsM.html @@ -0,0 +1,20 @@ + + + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/benchmarks/riscv-coremark/coremark/docs/html/search/ConfigurationsS.html b/benchmarks/riscv-coremark/coremark/docs/html/search/ConfigurationsS.html new file mode 100644 index 000000000..ceb8abf51 --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/docs/html/search/ConfigurationsS.html @@ -0,0 +1,20 @@ + + + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/benchmarks/riscv-coremark/coremark/docs/html/search/ConfigurationsT.html b/benchmarks/riscv-coremark/coremark/docs/html/search/ConfigurationsT.html new file mode 100644 index 000000000..ef138108f --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/docs/html/search/ConfigurationsT.html @@ -0,0 +1,20 @@ + + + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/benchmarks/riscv-coremark/coremark/docs/html/search/FilesC.html b/benchmarks/riscv-coremark/coremark/docs/html/search/FilesC.html new file mode 100644 index 000000000..e2b01c4b1 --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/docs/html/search/FilesC.html @@ -0,0 +1,18 @@ + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/benchmarks/riscv-coremark/coremark/docs/html/search/FilesR.html b/benchmarks/riscv-coremark/coremark/docs/html/search/FilesR.html new file mode 100644 index 000000000..6202fb7c7 --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/docs/html/search/FilesR.html @@ -0,0 +1,18 @@ + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/benchmarks/riscv-coremark/coremark/docs/html/search/FunctionsC.html b/benchmarks/riscv-coremark/coremark/docs/html/search/FunctionsC.html new file mode 100644 index 000000000..43993db85 --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/docs/html/search/FunctionsC.html @@ -0,0 +1,18 @@ + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/benchmarks/riscv-coremark/coremark/docs/html/search/FunctionsG.html b/benchmarks/riscv-coremark/coremark/docs/html/search/FunctionsG.html new file mode 100644 index 000000000..217e8540b --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/docs/html/search/FunctionsG.html @@ -0,0 +1,18 @@ + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/benchmarks/riscv-coremark/coremark/docs/html/search/FunctionsI.html b/benchmarks/riscv-coremark/coremark/docs/html/search/FunctionsI.html new file mode 100644 index 000000000..f17354d65 --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/docs/html/search/FunctionsI.html @@ -0,0 +1,18 @@ + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/benchmarks/riscv-coremark/coremark/docs/html/search/FunctionsM.html b/benchmarks/riscv-coremark/coremark/docs/html/search/FunctionsM.html new file mode 100644 index 000000000..345e2ba83 --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/docs/html/search/FunctionsM.html @@ -0,0 +1,18 @@ + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/benchmarks/riscv-coremark/coremark/docs/html/search/FunctionsP.html b/benchmarks/riscv-coremark/coremark/docs/html/search/FunctionsP.html new file mode 100644 index 000000000..c4b9d2dbe --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/docs/html/search/FunctionsP.html @@ -0,0 +1,18 @@ + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/benchmarks/riscv-coremark/coremark/docs/html/search/FunctionsS.html b/benchmarks/riscv-coremark/coremark/docs/html/search/FunctionsS.html new file mode 100644 index 000000000..33dfa5fa4 --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/docs/html/search/FunctionsS.html @@ -0,0 +1,18 @@ + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/benchmarks/riscv-coremark/coremark/docs/html/search/FunctionsT.html b/benchmarks/riscv-coremark/coremark/docs/html/search/FunctionsT.html new file mode 100644 index 000000000..65ae37ccd --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/docs/html/search/FunctionsT.html @@ -0,0 +1,18 @@ + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/benchmarks/riscv-coremark/coremark/docs/html/search/GeneralB.html b/benchmarks/riscv-coremark/coremark/docs/html/search/GeneralB.html new file mode 100644 index 000000000..66e27e49b --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/docs/html/search/GeneralB.html @@ -0,0 +1,18 @@ + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/benchmarks/riscv-coremark/coremark/docs/html/search/GeneralC.html b/benchmarks/riscv-coremark/coremark/docs/html/search/GeneralC.html new file mode 100644 index 000000000..f1ac9d2d3 --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/docs/html/search/GeneralC.html @@ -0,0 +1,18 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/benchmarks/riscv-coremark/coremark/docs/html/search/GeneralD.html b/benchmarks/riscv-coremark/coremark/docs/html/search/GeneralD.html new file mode 100644 index 000000000..b3c21002d --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/docs/html/search/GeneralD.html @@ -0,0 +1,18 @@ + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/benchmarks/riscv-coremark/coremark/docs/html/search/GeneralF.html b/benchmarks/riscv-coremark/coremark/docs/html/search/GeneralF.html new file mode 100644 index 000000000..126a24c57 --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/docs/html/search/GeneralF.html @@ -0,0 +1,18 @@ + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/benchmarks/riscv-coremark/coremark/docs/html/search/GeneralG.html b/benchmarks/riscv-coremark/coremark/docs/html/search/GeneralG.html new file mode 100644 index 000000000..217e8540b --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/docs/html/search/GeneralG.html @@ -0,0 +1,18 @@ + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/benchmarks/riscv-coremark/coremark/docs/html/search/GeneralH.html b/benchmarks/riscv-coremark/coremark/docs/html/search/GeneralH.html new file mode 100644 index 000000000..3b0c39213 --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/docs/html/search/GeneralH.html @@ -0,0 +1,18 @@ + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/benchmarks/riscv-coremark/coremark/docs/html/search/GeneralI.html b/benchmarks/riscv-coremark/coremark/docs/html/search/GeneralI.html new file mode 100644 index 000000000..f17354d65 --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/docs/html/search/GeneralI.html @@ -0,0 +1,18 @@ + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/benchmarks/riscv-coremark/coremark/docs/html/search/GeneralL.html b/benchmarks/riscv-coremark/coremark/docs/html/search/GeneralL.html new file mode 100644 index 000000000..22a700c93 --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/docs/html/search/GeneralL.html @@ -0,0 +1,18 @@ + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/benchmarks/riscv-coremark/coremark/docs/html/search/GeneralM.html b/benchmarks/riscv-coremark/coremark/docs/html/search/GeneralM.html new file mode 100644 index 000000000..57f55b249 --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/docs/html/search/GeneralM.html @@ -0,0 +1,18 @@ + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/benchmarks/riscv-coremark/coremark/docs/html/search/GeneralO.html b/benchmarks/riscv-coremark/coremark/docs/html/search/GeneralO.html new file mode 100644 index 000000000..b14f18001 --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/docs/html/search/GeneralO.html @@ -0,0 +1,18 @@ + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/benchmarks/riscv-coremark/coremark/docs/html/search/GeneralP.html b/benchmarks/riscv-coremark/coremark/docs/html/search/GeneralP.html new file mode 100644 index 000000000..063a6c13e --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/docs/html/search/GeneralP.html @@ -0,0 +1,18 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/benchmarks/riscv-coremark/coremark/docs/html/search/GeneralR.html b/benchmarks/riscv-coremark/coremark/docs/html/search/GeneralR.html new file mode 100644 index 000000000..24f33954e --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/docs/html/search/GeneralR.html @@ -0,0 +1,18 @@ + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/benchmarks/riscv-coremark/coremark/docs/html/search/GeneralS.html b/benchmarks/riscv-coremark/coremark/docs/html/search/GeneralS.html new file mode 100644 index 000000000..a18c40715 --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/docs/html/search/GeneralS.html @@ -0,0 +1,18 @@ + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/benchmarks/riscv-coremark/coremark/docs/html/search/GeneralT.html b/benchmarks/riscv-coremark/coremark/docs/html/search/GeneralT.html new file mode 100644 index 000000000..a2fde7e28 --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/docs/html/search/GeneralT.html @@ -0,0 +1,18 @@ + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/benchmarks/riscv-coremark/coremark/docs/html/search/GeneralU.html b/benchmarks/riscv-coremark/coremark/docs/html/search/GeneralU.html new file mode 100644 index 000000000..d9b46a52d --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/docs/html/search/GeneralU.html @@ -0,0 +1,18 @@ + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/benchmarks/riscv-coremark/coremark/docs/html/search/GeneralV.html b/benchmarks/riscv-coremark/coremark/docs/html/search/GeneralV.html new file mode 100644 index 000000000..9c53066a5 --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/docs/html/search/GeneralV.html @@ -0,0 +1,18 @@ + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/benchmarks/riscv-coremark/coremark/docs/html/search/GeneralW.html b/benchmarks/riscv-coremark/coremark/docs/html/search/GeneralW.html new file mode 100644 index 000000000..e22dcb062 --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/docs/html/search/GeneralW.html @@ -0,0 +1,18 @@ + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/benchmarks/riscv-coremark/coremark/docs/html/search/NoResults.html b/benchmarks/riscv-coremark/coremark/docs/html/search/NoResults.html new file mode 100644 index 000000000..49e385959 --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/docs/html/search/NoResults.html @@ -0,0 +1,13 @@ + + + + + + + + + + +
No Matches
\ No newline at end of file diff --git a/benchmarks/riscv-coremark/coremark/docs/html/search/TypesS.html b/benchmarks/riscv-coremark/coremark/docs/html/search/TypesS.html new file mode 100644 index 000000000..3d87649f5 --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/docs/html/search/TypesS.html @@ -0,0 +1,18 @@ + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/benchmarks/riscv-coremark/coremark/docs/html/search/VariablesC.html b/benchmarks/riscv-coremark/coremark/docs/html/search/VariablesC.html new file mode 100644 index 000000000..d3bdfef76 --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/docs/html/search/VariablesC.html @@ -0,0 +1,18 @@ + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/benchmarks/riscv-coremark/coremark/docs/html/search/VariablesD.html b/benchmarks/riscv-coremark/coremark/docs/html/search/VariablesD.html new file mode 100644 index 000000000..d4b961d3c --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/docs/html/search/VariablesD.html @@ -0,0 +1,18 @@ + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/benchmarks/riscv-coremark/coremark/docs/html/search/VariablesL.html b/benchmarks/riscv-coremark/coremark/docs/html/search/VariablesL.html new file mode 100644 index 000000000..09e4b9abc --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/docs/html/search/VariablesL.html @@ -0,0 +1,18 @@ + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/benchmarks/riscv-coremark/coremark/docs/html/search/VariablesO.html b/benchmarks/riscv-coremark/coremark/docs/html/search/VariablesO.html new file mode 100644 index 000000000..b14f18001 --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/docs/html/search/VariablesO.html @@ -0,0 +1,18 @@ + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/benchmarks/riscv-coremark/coremark/docs/html/search/VariablesP.html b/benchmarks/riscv-coremark/coremark/docs/html/search/VariablesP.html new file mode 100644 index 000000000..c687999aa --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/docs/html/search/VariablesP.html @@ -0,0 +1,18 @@ + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/benchmarks/riscv-coremark/coremark/docs/html/search/VariablesR.html b/benchmarks/riscv-coremark/coremark/docs/html/search/VariablesR.html new file mode 100644 index 000000000..9cd771d25 --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/docs/html/search/VariablesR.html @@ -0,0 +1,18 @@ + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/benchmarks/riscv-coremark/coremark/docs/html/search/VariablesS.html b/benchmarks/riscv-coremark/coremark/docs/html/search/VariablesS.html new file mode 100644 index 000000000..a1280a7d0 --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/docs/html/search/VariablesS.html @@ -0,0 +1,18 @@ + + + + + + + + + + +
Loading...
Searching...
No Matches
\ No newline at end of file diff --git a/benchmarks/riscv-coremark/coremark/docs/html/styles/1.css b/benchmarks/riscv-coremark/coremark/docs/html/styles/1.css new file mode 100644 index 000000000..d5a8bd6a2 --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/docs/html/styles/1.css @@ -0,0 +1,767 @@ +/* + IMPORTANT: If you're editing this file in the output directory of one of + your projects, your changes will be overwritten the next time you run + Natural Docs. Instead, copy this file to your project directory, make your + changes, and you can use it with -s. Even better would be to make a CSS + file in your project directory with only your changes, which you can then + use with -s [original style] [your changes]. + + On the other hand, if you're editing this file in the Natural Docs styles + directory, the changes will automatically be applied to all your projects + that use this style the next time Natural Docs is run on them. + + This file is part of Natural Docs, which is Copyright (C) 2003-2008 Greg Valure + Natural Docs is licensed under the GPL +*/ + +body { + font: 10pt Verdana, Arial, sans-serif; + color: #000000; + margin: 0; padding: 0; + } + +.ContentPage, +.IndexPage, +.FramedMenuPage { + background-color: #E8E8E8; + } +.FramedContentPage, +.FramedIndexPage, +.FramedSearchResultsPage, +.PopupSearchResultsPage { + background-color: #FFFFFF; + } + + +a:link, +a:visited { color: #900000; text-decoration: none } +a:hover { color: #900000; text-decoration: underline } +a:active { color: #FF0000; text-decoration: underline } + +td { + vertical-align: top } + +img { border: 0; } + + +/* + Comment out this line to use web-style paragraphs (blank line between + paragraphs, no indent) instead of print-style paragraphs (no blank line, + indented.) +*/ +p { + text-indent: 5ex; margin: 0 } + + +/* Can't use something like display: none or it won't break. */ +.HB { + font-size: 1px; + visibility: hidden; + } + +/* Blockquotes are used as containers for things that may need to scroll. */ +blockquote { + padding: 0; + margin: 0; + overflow: auto; + } + + +.Firefox1 blockquote { + padding-bottom: .5em; + } + +/* Turn off scrolling when printing. */ +@media print { + blockquote { + overflow: visible; + } + .IE blockquote { + width: auto; + } + } + + + +#Menu { + font-size: 9pt; + padding: 10px 0 0 0; + } +.ContentPage #Menu, +.IndexPage #Menu { + position: absolute; + top: 0; + left: 0; + width: 31ex; + overflow: hidden; + } +.ContentPage .Firefox #Menu, +.IndexPage .Firefox #Menu { + width: 27ex; + } + + + .MTitle { + font-size: 16pt; font-weight: bold; font-variant: small-caps; + text-align: center; + padding: 5px 10px 15px 10px; + border-bottom: 1px dotted #000000; + margin-bottom: 15px } + + .MSubTitle { + font-size: 9pt; font-weight: normal; font-variant: normal; + margin-top: 1ex; margin-bottom: 5px } + + + .MEntry a:link, + .MEntry a:hover, + .MEntry a:visited { color: #606060; margin-right: 0 } + .MEntry a:active { color: #A00000; margin-right: 0 } + + + .MGroup { + font-variant: small-caps; font-weight: bold; + margin: 1em 0 1em 10px; + } + + .MGroupContent { + font-variant: normal; font-weight: normal } + + .MGroup a:link, + .MGroup a:hover, + .MGroup a:visited { color: #545454; margin-right: 10px } + .MGroup a:active { color: #A00000; margin-right: 10px } + + + .MFile, + .MText, + .MLink, + .MIndex { + padding: 1px 17px 2px 10px; + margin: .25em 0 .25em 0; + } + + .MText { + font-size: 8pt; font-style: italic } + + .MLink { + font-style: italic } + + #MSelected { + color: #000000; background-color: #FFFFFF; + /* Replace padding with border. */ + padding: 0 10px 0 10px; + border-width: 1px 2px 2px 0; border-style: solid; border-color: #000000; + margin-right: 5px; + } + + /* Close off the left side when its in a group. */ + .MGroup #MSelected { + padding-left: 9px; border-left-width: 1px } + + /* A treat for Mozilla users. Blatantly non-standard. Will be replaced with CSS 3 attributes when finalized/supported. */ + .Firefox #MSelected { + -moz-border-radius-topright: 10px; + -moz-border-radius-bottomright: 10px } + .Firefox .MGroup #MSelected { + -moz-border-radius-topleft: 10px; + -moz-border-radius-bottomleft: 10px } + + + #MSearchPanel { + padding: 0px 6px; + margin: .25em 0; + } + + + #MSearchField { + font: italic 9pt Verdana, sans-serif; + color: #606060; + background-color: #E8E8E8; + border: none; + padding: 2px 4px; + width: 100%; + } + /* Only Opera gets it right. */ + .Firefox #MSearchField, + .IE #MSearchField, + .Safari #MSearchField { + width: 94%; + } + .Opera9 #MSearchField, + .Konqueror #MSearchField { + width: 97%; + } + .FramedMenuPage .Firefox #MSearchField, + .FramedMenuPage .Safari #MSearchField, + .FramedMenuPage .Konqueror #MSearchField { + width: 98%; + } + + /* Firefox doesn't do this right in frames without #MSearchPanel added on. + It's presence doesn't hurt anything other browsers. */ + #MSearchPanel.MSearchPanelInactive:hover #MSearchField { + background-color: #FFFFFF; + border: 1px solid #C0C0C0; + padding: 1px 3px; + } + .MSearchPanelActive #MSearchField { + background-color: #FFFFFF; + border: 1px solid #C0C0C0; + font-style: normal; + padding: 1px 3px; + } + + #MSearchType { + visibility: hidden; + font: 8pt Verdana, sans-serif; + width: 98%; + padding: 0; + border: 1px solid #C0C0C0; + } + .MSearchPanelActive #MSearchType, + /* As mentioned above, Firefox doesn't do this right in frames without #MSearchPanel added on. */ + #MSearchPanel.MSearchPanelInactive:hover #MSearchType, + #MSearchType:focus { + visibility: visible; + color: #606060; + } + #MSearchType option#MSearchEverything { + font-weight: bold; + } + + .Opera8 .MSearchPanelInactive:hover, + .Opera8 .MSearchPanelActive { + margin-left: -1px; + } + + + iframe#MSearchResults { + width: 60ex; + height: 15em; + } + #MSearchResultsWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #000000; + background-color: #E8E8E8; + } + #MSearchResultsWindowClose { + font-weight: bold; + font-size: 8pt; + display: block; + padding: 2px 5px; + } + #MSearchResultsWindowClose:link, + #MSearchResultsWindowClose:visited { + color: #000000; + text-decoration: none; + } + #MSearchResultsWindowClose:active, + #MSearchResultsWindowClose:hover { + color: #800000; + text-decoration: none; + background-color: #F4F4F4; + } + + + + +#Content { + padding-bottom: 15px; + } + +.ContentPage #Content { + border-width: 0 0 1px 1px; + border-style: solid; + border-color: #000000; + background-color: #FFFFFF; + font-size: 9pt; /* To make 31ex match the menu's 31ex. */ + margin-left: 31ex; + } +.ContentPage .Firefox #Content { + margin-left: 27ex; + } + + + + .CTopic { + font-size: 10pt; + margin-bottom: 3em; + } + + + .CTitle { + font-size: 12pt; font-weight: bold; + border-width: 0 0 1px 0; border-style: solid; border-color: #A0A0A0; + margin: 0 15px .5em 15px } + + .CGroup .CTitle { + font-size: 16pt; font-variant: small-caps; + padding-left: 15px; padding-right: 15px; + border-width: 0 0 2px 0; border-color: #000000; + margin-left: 0; margin-right: 0 } + + .CClass .CTitle, + .CInterface .CTitle, + .CDatabase .CTitle, + .CDatabaseTable .CTitle, + .CSection .CTitle { + font-size: 18pt; + color: #FFFFFF; background-color: #A0A0A0; + padding: 10px 15px 10px 15px; + border-width: 2px 0; border-color: #000000; + margin-left: 0; margin-right: 0 } + + #MainTopic .CTitle { + font-size: 20pt; + color: #FFFFFF; background-color: #7070C0; + padding: 10px 15px 10px 15px; + border-width: 0 0 3px 0; border-color: #000000; + margin-left: 0; margin-right: 0 } + + .CBody { + margin-left: 15px; margin-right: 15px } + + + .CToolTip { + position: absolute; visibility: hidden; + left: 0; top: 0; + background-color: #FFFFE0; + padding: 5px; + border-width: 1px 2px 2px 1px; border-style: solid; border-color: #000000; + font-size: 8pt; + } + + .Opera .CToolTip { + max-width: 98%; + } + + /* Scrollbars would be useless. */ + .CToolTip blockquote { + overflow: hidden; + } + .IE6 .CToolTip blockquote { + overflow: visible; + } + + .CHeading { + font-weight: bold; font-size: 10pt; + margin: 1.5em 0 .5em 0; + } + + .CBody pre { + font: 10pt "Courier New", Courier, monospace; + margin: 1em 0; + } + + .CBody ul { + /* I don't know why CBody's margin doesn't apply, but it's consistent across browsers so whatever. + Reapply it here as padding. */ + padding-left: 15px; padding-right: 15px; + margin: .5em 5ex .5em 5ex; + } + + .CDescriptionList { + margin: .5em 5ex 0 5ex } + + .CDLEntry { + font: 10pt "Courier New", Courier, monospace; color: #808080; + padding-bottom: .25em; + white-space: nowrap } + + .CDLDescription { + font-size: 10pt; /* For browsers that don't inherit correctly, like Opera 5. */ + padding-bottom: .5em; padding-left: 5ex } + + + .CTopic img { + text-align: center; + display: block; + margin: 1em auto; + } + .CImageCaption { + font-variant: small-caps; + font-size: 8pt; + color: #808080; + text-align: center; + position: relative; + top: 1em; + } + + .CImageLink { + color: #808080; + font-style: italic; + } + a.CImageLink:link, + a.CImageLink:visited, + a.CImageLink:hover { color: #808080 } + + + + + +.Prototype { + font: 10pt "Courier New", Courier, monospace; + padding: 5px 3ex; + border-width: 1px; border-style: solid; + margin: 0 5ex 1.5em 5ex; + } + + .Prototype td { + font-size: 10pt; + } + + .PDefaultValue, + .PDefaultValuePrefix, + .PTypePrefix { + color: #8F8F8F; + } + .PTypePrefix { + text-align: right; + } + .PAfterParameters { + vertical-align: bottom; + } + + .IE .Prototype table { + padding: 0; + } + + .CFunction .Prototype { + background-color: #F4F4F4; border-color: #D0D0D0 } + .CProperty .Prototype { + background-color: #F4F4FF; border-color: #C0C0E8 } + .CVariable .Prototype { + background-color: #FFFFF0; border-color: #E0E0A0 } + + .CClass .Prototype { + border-width: 1px 2px 2px 1px; border-style: solid; border-color: #A0A0A0; + background-color: #F4F4F4; + } + .CInterface .Prototype { + border-width: 1px 2px 2px 1px; border-style: solid; border-color: #A0A0D0; + background-color: #F4F4FF; + } + + .CDatabaseIndex .Prototype, + .CConstant .Prototype { + background-color: #D0D0D0; border-color: #000000 } + .CType .Prototype, + .CEnumeration .Prototype { + background-color: #FAF0F0; border-color: #E0B0B0; + } + .CDatabaseTrigger .Prototype, + .CEvent .Prototype, + .CDelegate .Prototype { + background-color: #F0FCF0; border-color: #B8E4B8 } + + .CToolTip .Prototype { + margin: 0 0 .5em 0; + white-space: nowrap; + } + + + + + +.Summary { + margin: 1.5em 5ex 0 5ex } + + .STitle { + font-size: 12pt; font-weight: bold; + margin-bottom: .5em } + + + .SBorder { + background-color: #FFFFF0; + padding: 15px; + border: 1px solid #C0C060 } + + /* In a frame IE 6 will make them too long unless you set the width to 100%. Without frames it will be correct without a width + or slightly too long (but not enough to scroll) with a width. This arbitrary weirdness simply astounds me. IE 7 has the same + problem with frames, haven't tested it without. */ + .FramedContentPage .IE .SBorder { + width: 100% } + + /* A treat for Mozilla users. Blatantly non-standard. Will be replaced with CSS 3 attributes when finalized/supported. */ + .Firefox .SBorder { + -moz-border-radius: 20px } + + + .STable { + font-size: 9pt; width: 100% } + + .SEntry { + width: 30% } + .SDescription { + width: 70% } + + + .SMarked { + background-color: #F8F8D8 } + + .SDescription { padding-left: 2ex } + .SIndent1 .SEntry { padding-left: 1.5ex } .SIndent1 .SDescription { padding-left: 3.5ex } + .SIndent2 .SEntry { padding-left: 3.0ex } .SIndent2 .SDescription { padding-left: 5.0ex } + .SIndent3 .SEntry { padding-left: 4.5ex } .SIndent3 .SDescription { padding-left: 6.5ex } + .SIndent4 .SEntry { padding-left: 6.0ex } .SIndent4 .SDescription { padding-left: 8.0ex } + .SIndent5 .SEntry { padding-left: 7.5ex } .SIndent5 .SDescription { padding-left: 9.5ex } + + .SDescription a { color: #800000} + .SDescription a:active { color: #A00000 } + + .SGroup td { + padding-top: .5em; padding-bottom: .25em } + + .SGroup .SEntry { + font-weight: bold; font-variant: small-caps } + + .SGroup .SEntry a { color: #800000 } + .SGroup .SEntry a:active { color: #F00000 } + + + .SMain td, + .SClass td, + .SDatabase td, + .SDatabaseTable td, + .SSection td { + font-size: 10pt; + padding-bottom: .25em } + + .SClass td, + .SDatabase td, + .SDatabaseTable td, + .SSection td { + padding-top: 1em } + + .SMain .SEntry, + .SClass .SEntry, + .SDatabase .SEntry, + .SDatabaseTable .SEntry, + .SSection .SEntry { + font-weight: bold; + } + + .SMain .SEntry a, + .SClass .SEntry a, + .SDatabase .SEntry a, + .SDatabaseTable .SEntry a, + .SSection .SEntry a { color: #000000 } + + .SMain .SEntry a:active, + .SClass .SEntry a:active, + .SDatabase .SEntry a:active, + .SDatabaseTable .SEntry a:active, + .SSection .SEntry a:active { color: #A00000 } + + + + + +.ClassHierarchy { + margin: 0 15px 1em 15px } + + .CHEntry { + border-width: 1px 2px 2px 1px; border-style: solid; border-color: #A0A0A0; + margin-bottom: 3px; + padding: 2px 2ex; + font-size: 10pt; + background-color: #F4F4F4; color: #606060; + } + + .Firefox .CHEntry { + -moz-border-radius: 4px; + } + + .CHCurrent .CHEntry { + font-weight: bold; + border-color: #000000; + color: #000000; + } + + .CHChildNote .CHEntry { + font-style: italic; + font-size: 8pt; + } + + .CHIndent { + margin-left: 3ex; + } + + .CHEntry a:link, + .CHEntry a:visited, + .CHEntry a:hover { + color: #606060; + } + .CHEntry a:active { + color: #800000; + } + + + + + +#Index { + background-color: #FFFFFF; + } + +/* As opposed to .PopupSearchResultsPage #Index */ +.IndexPage #Index, +.FramedIndexPage #Index, +.FramedSearchResultsPage #Index { + padding: 15px; + } + +.IndexPage #Index { + border-width: 0 0 1px 1px; + border-style: solid; + border-color: #000000; + font-size: 9pt; /* To make 27ex match the menu's 27ex. */ + margin-left: 27ex; + } + + + .IPageTitle { + font-size: 20pt; font-weight: bold; + color: #FFFFFF; background-color: #7070C0; + padding: 10px 15px 10px 15px; + border-width: 0 0 3px 0; border-color: #000000; border-style: solid; + margin: -15px -15px 0 -15px } + + .FramedSearchResultsPage .IPageTitle { + margin-bottom: 15px; + } + + .INavigationBar { + font-size: 10pt; + text-align: center; + background-color: #FFFFF0; + padding: 5px; + border-bottom: solid 1px black; + margin: 0 -15px 15px -15px; + } + + .INavigationBar a { + font-weight: bold } + + .IHeading { + font-size: 16pt; font-weight: bold; + padding: 2.5em 0 .5em 0; + text-align: center; + width: 3.5ex; + } + #IFirstHeading { + padding-top: 0; + } + + .IEntry { + font-size: 10pt; + padding-left: 1ex; + } + .PopupSearchResultsPage .IEntry { + font-size: 8pt; + padding: 1px 5px; + } + .PopupSearchResultsPage .Opera9 .IEntry, + .FramedSearchResultsPage .Opera9 .IEntry { + text-align: left; + } + .FramedSearchResultsPage .IEntry { + padding: 0; + } + + .ISubIndex { + padding-left: 3ex; padding-bottom: .5em } + .PopupSearchResultsPage .ISubIndex { + display: none; + } + + /* While it may cause some entries to look like links when they aren't, I found it's much easier to read the + index if everything's the same color. */ + .ISymbol { + font-weight: bold; color: #900000 } + + .IndexPage .ISymbolPrefix, + .FramedIndexPage .ISymbolPrefix { + font-size: 10pt; + text-align: right; + color: #C47C7C; + background-color: #F8F8F8; + border-right: 3px solid #E0E0E0; + border-left: 1px solid #E0E0E0; + padding: 0 1px 0 2px; + } + .PopupSearchResultsPage .ISymbolPrefix, + .FramedSearchResultsPage .ISymbolPrefix { + color: #900000; + } + .PopupSearchResultsPage .ISymbolPrefix { + font-size: 8pt; + } + + .IndexPage #IFirstSymbolPrefix, + .FramedIndexPage #IFirstSymbolPrefix { + border-top: 1px solid #E0E0E0; + } + .IndexPage #ILastSymbolPrefix, + .FramedIndexPage #ILastSymbolPrefix { + border-bottom: 1px solid #E0E0E0; + } + .IndexPage #IOnlySymbolPrefix, + .FramedIndexPage #IOnlySymbolPrefix { + border-top: 1px solid #E0E0E0; + border-bottom: 1px solid #E0E0E0; + } + + a.IParent, + a.IFile { + display: block; + } + + .PopupSearchResultsPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + } + .FramedSearchResultsPage .SRStatus { + font-size: 10pt; + font-style: italic; + } + + .SRResult { + display: none; + } + + + +#Footer { + font-size: 8pt; + color: #989898; + text-align: right; + } + +#Footer p { + text-indent: 0; + margin-bottom: .5em; + } + +.ContentPage #Footer, +.IndexPage #Footer { + text-align: right; + margin: 2px; + } + +.FramedMenuPage #Footer { + text-align: center; + margin: 5em 10px 10px 10px; + padding-top: 1em; + border-top: 1px solid #C8C8C8; + } + + #Footer a:link, + #Footer a:hover, + #Footer a:visited { color: #989898 } + #Footer a:active { color: #A00000 } + diff --git a/benchmarks/riscv-coremark/coremark/docs/html/styles/2.css b/benchmarks/riscv-coremark/coremark/docs/html/styles/2.css new file mode 100644 index 000000000..69a1d1a7a --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/docs/html/styles/2.css @@ -0,0 +1,6 @@ +#Menu { + padding: 48px 0 0 0; + background: url(file:../../coremark_logo.jpg) no-repeat; + background-position: 30px 10px; + } + diff --git a/benchmarks/riscv-coremark/coremark/docs/html/styles/main.css b/benchmarks/riscv-coremark/coremark/docs/html/styles/main.css new file mode 100644 index 000000000..a672a9492 --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/docs/html/styles/main.css @@ -0,0 +1,2 @@ +@import URL("1.css"); +@import URL("2.css"); diff --git a/benchmarks/riscv-coremark/coremark/freebsd/core_portme.mak b/benchmarks/riscv-coremark/coremark/freebsd/core_portme.mak new file mode 100644 index 000000000..97b6d6ace --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/freebsd/core_portme.mak @@ -0,0 +1,17 @@ +# Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Original Author: Shay Gal-on + +include posix/core_portme.mak diff --git a/benchmarks/riscv-coremark/coremark/linux/core_portme.c b/benchmarks/riscv-coremark/coremark/linux/core_portme.c new file mode 100755 index 000000000..6b63610d1 --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/linux/core_portme.c @@ -0,0 +1,338 @@ +/* +Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +Original Author: Shay Gal-on +*/ + +#include +#include +#include "coremark.h" +#if CALLGRIND_RUN +#include +#endif + +#if (MEM_METHOD==MEM_MALLOC) +#include +/* Function: portable_malloc + Provide malloc() functionality in a platform specific way. +*/ +void *portable_malloc(size_t size) { + return malloc(size); +} +/* Function: portable_free + Provide free() functionality in a platform specific way. +*/ +void portable_free(void *p) { + free(p); +} +#else +void *portable_malloc(size_t size) { + return NULL; +} +void portable_free(void *p) { + p=NULL; +} +#endif + +#if (SEED_METHOD==SEED_VOLATILE) +#if VALIDATION_RUN + volatile ee_s32 seed1_volatile=0x3415; + volatile ee_s32 seed2_volatile=0x3415; + volatile ee_s32 seed3_volatile=0x66; +#endif +#if PERFORMANCE_RUN + volatile ee_s32 seed1_volatile=0x0; + volatile ee_s32 seed2_volatile=0x0; + volatile ee_s32 seed3_volatile=0x66; +#endif +#if PROFILE_RUN + volatile ee_s32 seed1_volatile=0x8; + volatile ee_s32 seed2_volatile=0x8; + volatile ee_s32 seed3_volatile=0x8; +#endif + volatile ee_s32 seed4_volatile=ITERATIONS; + volatile ee_s32 seed5_volatile=0; +#endif +/* Porting: Timing functions + How to capture time and convert to seconds must be ported to whatever is supported by the platform. + e.g. Read value from on board RTC, read value from cpu clock cycles performance counter etc. + Sample implementation for standard time.h and windows.h definitions included. +*/ +/* Define: TIMER_RES_DIVIDER + Divider to trade off timer resolution and total time that can be measured. + + Use lower values to increase resolution, but make sure that overflow does not occur. + If there are issues with the return value overflowing, increase this value. + */ +#if USE_CLOCK + #define NSECS_PER_SEC CLOCKS_PER_SEC + #define EE_TIMER_TICKER_RATE 1000 + #define CORETIMETYPE clock_t + #define GETMYTIME(_t) (*_t=clock()) + #define MYTIMEDIFF(fin,ini) ((fin)-(ini)) + #define TIMER_RES_DIVIDER 1 + #define SAMPLE_TIME_IMPLEMENTATION 1 +#elif defined(_MSC_VER) + #define NSECS_PER_SEC 10000000 + #define EE_TIMER_TICKER_RATE 1000 + #define CORETIMETYPE FILETIME + #define GETMYTIME(_t) GetSystemTimeAsFileTime(_t) + #define MYTIMEDIFF(fin,ini) (((*(__int64*)&fin)-(*(__int64*)&ini))/TIMER_RES_DIVIDER) + /* setting to millisces resolution by default with MSDEV */ + #ifndef TIMER_RES_DIVIDER + #define TIMER_RES_DIVIDER 1000 + #endif + #define SAMPLE_TIME_IMPLEMENTATION 1 +#elif HAS_TIME_H + #define NSECS_PER_SEC 1000000000 + #define EE_TIMER_TICKER_RATE 1000 + #define CORETIMETYPE struct timespec + #define GETMYTIME(_t) clock_gettime(CLOCK_REALTIME,_t) + #define MYTIMEDIFF(fin,ini) ((fin.tv_sec-ini.tv_sec)*(NSECS_PER_SEC/TIMER_RES_DIVIDER)+(fin.tv_nsec-ini.tv_nsec)/TIMER_RES_DIVIDER) + /* setting to 1/1000 of a second resolution by default with linux */ + #ifndef TIMER_RES_DIVIDER + #define TIMER_RES_DIVIDER 1000000 + #endif + #define SAMPLE_TIME_IMPLEMENTATION 1 +#else + #define SAMPLE_TIME_IMPLEMENTATION 0 +#endif +#define EE_TICKS_PER_SEC (NSECS_PER_SEC / TIMER_RES_DIVIDER) + +#if SAMPLE_TIME_IMPLEMENTATION +/** Define Host specific (POSIX), or target specific global time variables. */ +static CORETIMETYPE start_time_val, stop_time_val; + +/* Function: start_time + This function will be called right before starting the timed portion of the benchmark. + + Implementation may be capturing a system timer (as implemented in the example code) + or zeroing some system parameters - e.g. setting the cpu clocks cycles to 0. +*/ +void start_time(void) { + GETMYTIME(&start_time_val ); +#if CALLGRIND_RUN + CALLGRIND_START_INSTRUMENTATION +#endif +#if MICA + asm volatile("int3");/*1 */ +#endif +} +/* Function: stop_time + This function will be called right after ending the timed portion of the benchmark. + + Implementation may be capturing a system timer (as implemented in the example code) + or other system parameters - e.g. reading the current value of cpu cycles counter. +*/ +void stop_time(void) { +#if CALLGRIND_RUN + CALLGRIND_STOP_INSTRUMENTATION +#endif +#if MICA + asm volatile("int3");/*1 */ +#endif + GETMYTIME(&stop_time_val ); +} +/* Function: get_time + Return an abstract "ticks" number that signifies time on the system. + + Actual value returned may be cpu cycles, milliseconds or any other value, + as long as it can be converted to seconds by . + This methodology is taken to accomodate any hardware or simulated platform. + The sample implementation returns millisecs by default, + and the resolution is controlled by +*/ +CORE_TICKS get_time(void) { + CORE_TICKS elapsed=(CORE_TICKS)(MYTIMEDIFF(stop_time_val, start_time_val)); + return elapsed; +} +/* Function: time_in_secs + Convert the value returned by get_time to seconds. + + The type is used to accomodate systems with no support for floating point. + Default implementation implemented by the EE_TICKS_PER_SEC macro above. +*/ +secs_ret time_in_secs(CORE_TICKS ticks) { + secs_ret retval=((secs_ret)ticks) / (secs_ret)EE_TICKS_PER_SEC; + return retval; +} +#else +#error "Please implement timing functionality in core_portme.c" +#endif /* SAMPLE_TIME_IMPLEMENTATION */ + +ee_u32 default_num_contexts=MULTITHREAD; + +/* Function: portable_init + Target specific initialization code + Test for some common mistakes. +*/ +void portable_init(core_portable *p, int *argc, char *argv[]) +{ +#if PRINT_ARGS + int i; + for (i=0; i<*argc; i++) { + ee_printf("Arg[%d]=%s\n",i,argv[i]); + } +#endif + if (sizeof(ee_ptr_int) != sizeof(ee_u8 *)) { + ee_printf("ERROR! Please define ee_ptr_int to a type that holds a pointer!\n"); + } + if (sizeof(ee_u32) != 4) { + ee_printf("ERROR! Please define ee_u32 to a 32b unsigned type!\n"); + } +#if (MAIN_HAS_NOARGC && (SEED_METHOD==SEED_ARG)) + ee_printf("ERROR! Main has no argc, but SEED_METHOD defined to SEED_ARG!\n"); +#endif + +#if (MULTITHREAD>1) && (SEED_METHOD==SEED_ARG) + { + int nargs=*argc,i; + if ((nargs>1) && (*argv[1]=='M')) { + default_num_contexts=parseval(argv[1]+1); + if (default_num_contexts>MULTITHREAD) + default_num_contexts=MULTITHREAD; + /* Shift args since first arg is directed to the portable part and not to coremark main */ + --nargs; + for (i=1; i*/ + p->portable_id=1; +} +/* Function: portable_fini + Target specific final code +*/ +void portable_fini(core_portable *p) +{ + p->portable_id=0; +} + +#if (MULTITHREAD>1) + +/* Function: core_start_parallel + Start benchmarking in a parallel context. + + Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets. + Other implementations using MCAPI or other standards can easily be devised. +*/ +/* Function: core_stop_parallel + Stop a parallel context execution of coremark, and gather the results. + + Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets. + Other implementations using MCAPI or other standards can easily be devised. +*/ +#if USE_PTHREAD +ee_u8 core_start_parallel(core_results *res) { + return (ee_u8)pthread_create(&(res->port.thread),NULL,iterate,(void *)res); +} +ee_u8 core_stop_parallel(core_results *res) { + void *retval; + return (ee_u8)pthread_join(res->port.thread,&retval); +} +#elif USE_FORK +static int key_id=0; +ee_u8 core_start_parallel(core_results *res) { + key_t key=4321+key_id; + key_id++; + res->port.pid=fork(); + res->port.shmid=shmget(key, 8, IPC_CREAT | 0666); + if (res->port.shmid<0) { + ee_printf("ERROR in shmget!\n"); + } + if (res->port.pid==0) { + iterate(res); + res->port.shm=shmat(res->port.shmid, NULL, 0); + /* copy the validation values to the shared memory area and quit*/ + if (res->port.shm == (char *) -1) { + ee_printf("ERROR in child shmat!\n"); + } else { + memcpy(res->port.shm,&(res->crc),8); + shmdt(res->port.shm); + } + exit(0); + } + return 1; +} +ee_u8 core_stop_parallel(core_results *res) { + int status; + pid_t wpid = waitpid(res->port.pid,&status,WUNTRACED); + if (wpid != res->port.pid) { + ee_printf("ERROR waiting for child.\n"); + if (errno == ECHILD) ee_printf("errno=No such child %d\n",res->port.pid); + if (errno == EINTR) ee_printf("errno=Interrupted\n"); + return 0; + } + /* after process is done, get the values from the shared memory area */ + res->port.shm=shmat(res->port.shmid, NULL, 0); + if (res->port.shm == (char *) -1) { + ee_printf("ERROR in parent shmat!\n"); + return 0; + } + memcpy(&(res->crc),res->port.shm,8); + shmdt(res->port.shm); + return 1; +} +#elif USE_SOCKET +static int key_id=0; +ee_u8 core_start_parallel(core_results *res) { + int bound, buffer_length=8; + res->port.sa.sin_family = AF_INET; + res->port.sa.sin_addr.s_addr = htonl(0x7F000001); + res->port.sa.sin_port = htons(7654+key_id); + key_id++; + res->port.pid=fork(); + if (res->port.pid==0) { /* benchmark child */ + iterate(res); + res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); + if (-1 == res->port.sock) /* if socket failed to initialize, exit */ { + ee_printf("Error Creating Socket"); + } else { + int bytes_sent = sendto(res->port.sock, &(res->crc), buffer_length, 0,(struct sockaddr*)&(res->port.sa), sizeof (struct sockaddr_in)); + if (bytes_sent < 0) + ee_printf("Error sending packet: %s\n", strerror(errno)); + close(res->port.sock); /* close the socket */ + } + exit(0); + } + /* parent process, open the socket */ + res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); + bound = bind(res->port.sock,(struct sockaddr*)&(res->port.sa), sizeof(struct sockaddr)); + if (bound < 0) + ee_printf("bind(): %s\n",strerror(errno)); + return 1; +} +ee_u8 core_stop_parallel(core_results *res) { + int status; + int fromlen=sizeof(struct sockaddr); + int recsize = recvfrom(res->port.sock, &(res->crc), 8, 0, (struct sockaddr*)&(res->port.sa), &fromlen); + if (recsize < 0) { + ee_printf("Error in receive: %s\n", strerror(errno)); + return 0; + } + pid_t wpid = waitpid(res->port.pid,&status,WUNTRACED); + if (wpid != res->port.pid) { + ee_printf("ERROR waiting for child.\n"); + if (errno == ECHILD) ee_printf("errno=No such child %d\n",res->port.pid); + if (errno == EINTR) ee_printf("errno=Interrupted\n"); + return 0; + } + return 1; +} +#else /* no standard multicore implementation */ +#error "Please implement multicore functionality in core_portme.c to use multiple contexts." +#endif /* multithread implementations */ +#endif diff --git a/benchmarks/riscv-coremark/coremark/linux/core_portme.h b/benchmarks/riscv-coremark/coremark/linux/core_portme.h new file mode 100755 index 000000000..2cf4659a4 --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/linux/core_portme.h @@ -0,0 +1,290 @@ +/* +Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +Original Author: Shay Gal-on +*/ + +#ifndef CORE_PORTME_H +#define CORE_PORTME_H +/************************/ +/* Data types and settings */ +/************************/ +/* Configuration: HAS_FLOAT + Define to 1 if the platform supports floating point. +*/ +#ifndef HAS_FLOAT +#define HAS_FLOAT 1 +#endif +/* Configuration: HAS_TIME_H + Define to 1 if platform has the time.h header file, + and implementation of functions thereof. +*/ +#ifndef HAS_TIME_H +#define HAS_TIME_H 1 +#endif +/* Configuration: USE_CLOCK + Define to 1 if platform has the time.h header file, + and implementation of functions thereof. +*/ +#ifndef USE_CLOCK +#define USE_CLOCK 0 +#endif +/* Configuration: HAS_STDIO + Define to 1 if the platform has stdio.h. +*/ +#ifndef HAS_STDIO +#define HAS_STDIO 1 +#endif +/* Configuration: HAS_PRINTF + Define to 1 if the platform has stdio.h and implements the printf function. +*/ +#ifndef HAS_PRINTF +#define HAS_PRINTF 1 +#endif + +/* Configuration: CORE_TICKS + Define type of return from the timing functions. + */ +#if defined(_MSC_VER) +#include +typedef size_t CORE_TICKS; +#elif HAS_TIME_H +#include +typedef clock_t CORE_TICKS; +#else +#error "Please define type of CORE_TICKS and implement start_time, end_time get_time and time_in_secs functions!" +#endif + +/* Definitions: COMPILER_VERSION, COMPILER_FLAGS, MEM_LOCATION + Initialize these strings per platform +*/ +#ifndef COMPILER_VERSION + #ifdef __GNUC__ + #define COMPILER_VERSION "GCC"__VERSION__ + #else + #define COMPILER_VERSION "Please put compiler version here (e.g. gcc 4.1)" + #endif +#endif +#ifndef COMPILER_FLAGS + #define COMPILER_FLAGS FLAGS_STR /* "Please put compiler flags here (e.g. -o3)" */ +#endif +#ifndef MEM_LOCATION + #define MEM_LOCATION "Please put data memory location here\n\t\t\t(e.g. code in flash, data on heap etc)" + #define MEM_LOCATION_UNSPEC 1 +#endif + +/* Data Types: + To avoid compiler issues, define the data types that need ot be used for 8b, 16b and 32b in . + + *Imprtant*: + ee_ptr_int needs to be the data type used to hold pointers, otherwise coremark may fail!!! +*/ +typedef signed short ee_s16; +typedef unsigned short ee_u16; +typedef signed int ee_s32; +typedef double ee_f32; +typedef unsigned char ee_u8; +typedef unsigned int ee_u32; +typedef ee_u32 ee_ptr_int; +typedef size_t ee_size_t; +/* align_mem: + This macro is used to align an offset to point to a 32b value. It is used in the Matrix algorithm to initialize the input memory blocks. +*/ +#define align_mem(x) (void *)(4 + (((ee_ptr_int)(x) - 1) & ~3)) + +/* Configuration: SEED_METHOD + Defines method to get seed values that cannot be computed at compile time. + + Valid values: + SEED_ARG - from command line. + SEED_FUNC - from a system function. + SEED_VOLATILE - from volatile variables. +*/ +#ifndef SEED_METHOD +#define SEED_METHOD SEED_ARG +#endif + +/* Configuration: MEM_METHOD + Defines method to get a block of memry. + + Valid values: + MEM_MALLOC - for platforms that implement malloc and have malloc.h. + MEM_STATIC - to use a static memory array. + MEM_STACK - to allocate the data block on the stack (NYI). +*/ +#ifndef MEM_METHOD +#define MEM_METHOD MEM_MALLOC +#endif + +/* Configuration: MULTITHREAD + Define for parallel execution + + Valid values: + 1 - only one context (default). + N>1 - will execute N copies in parallel. + + Note: + If this flag is defined to more then 1, an implementation for launching parallel contexts must be defined. + + Two sample implementations are provided. Use or to enable them. + + It is valid to have a different implementation of and in , + to fit a particular architecture. +*/ +#ifndef MULTITHREAD +#define MULTITHREAD 1 +#endif + +/* Configuration: USE_PTHREAD + Sample implementation for launching parallel contexts + This implementation uses pthread_thread_create and pthread_join. + + Valid values: + 0 - Do not use pthreads API. + 1 - Use pthreads API + + Note: + This flag only matters if MULTITHREAD has been defined to a value greater then 1. +*/ +#ifndef USE_PTHREAD +#define USE_PTHREAD 0 +#endif + +/* Configuration: USE_FORK + Sample implementation for launching parallel contexts + This implementation uses fork, waitpid, shmget,shmat and shmdt. + + Valid values: + 0 - Do not use fork API. + 1 - Use fork API + + Note: + This flag only matters if MULTITHREAD has been defined to a value greater then 1. +*/ +#ifndef USE_FORK +#define USE_FORK 0 +#endif + +/* Configuration: USE_SOCKET + Sample implementation for launching parallel contexts + This implementation uses fork, socket, sendto and recvfrom + + Valid values: + 0 - Do not use fork and sockets API. + 1 - Use fork and sockets API + + Note: + This flag only matters if MULTITHREAD has been defined to a value greater then 1. +*/ +#ifndef USE_SOCKET +#define USE_SOCKET 0 +#endif + +/* Configuration: MAIN_HAS_NOARGC + Needed if platform does not support getting arguments to main. + + Valid values: + 0 - argc/argv to main is supported + 1 - argc/argv to main is not supported +*/ +#ifndef MAIN_HAS_NOARGC +#define MAIN_HAS_NOARGC 0 +#endif + +/* Configuration: MAIN_HAS_NORETURN + Needed if platform does not support returning a value from main. + + Valid values: + 0 - main returns an int, and return value will be 0. + 1 - platform does not support returning a value from main +*/ +#ifndef MAIN_HAS_NORETURN +#define MAIN_HAS_NORETURN 0 +#endif + +/* Variable: default_num_contexts + Number of contexts to spawn in multicore context. + Override this global value to change number of contexts used. + + Note: + This value may not be set higher then the define. + + To experiment, you can set the define to the highest value expected, and use argc/argv in the to set this value from the command line. +*/ +extern ee_u32 default_num_contexts; + +#if (MULTITHREAD>1) +#if USE_PTHREAD + #include + #define PARALLEL_METHOD "PThreads" +#elif USE_FORK + #include + #include + #include + #include + #include /* for memcpy */ + #define PARALLEL_METHOD "Fork" +#elif USE_SOCKET + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #define PARALLEL_METHOD "Sockets" +#else + #define PARALLEL_METHOD "Proprietary" + #error "Please implement multicore functionality in core_portme.c to use multiple contexts." +#endif /* Method for multithreading */ +#endif /* MULTITHREAD > 1 */ + +typedef struct CORE_PORTABLE_S { +#if (MULTITHREAD>1) + #if USE_PTHREAD + pthread_t thread; + #elif USE_FORK + pid_t pid; + int shmid; + void *shm; + #elif USE_SOCKET + pid_t pid; + int sock; + struct sockaddr_in sa; + #endif /* Method for multithreading */ +#endif /* MULTITHREAD>1 */ + ee_u8 portable_id; +} core_portable; + +/* target specific init/fini */ +void portable_init(core_portable *p, int *argc, char *argv[]); +void portable_fini(core_portable *p); + +#if (SEED_METHOD==SEED_VOLATILE) + #if (VALIDATION_RUN || PERFORMANCE_RUN || PROFILE_RUN) + #define RUN_TYPE_FLAG 1 + #else + #if (TOTAL_DATA_SIZE==1200) + #define PROFILE_RUN 1 + #else + #define PERFORMANCE_RUN 1 + #endif + #endif +#endif /* SEED_METHOD==SEED_VOLATILE */ + +#endif /* CORE_PORTME_H */ diff --git a/benchmarks/riscv-coremark/coremark/linux/core_portme.mak b/benchmarks/riscv-coremark/coremark/linux/core_portme.mak new file mode 100644 index 000000000..97b6d6ace --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/linux/core_portme.mak @@ -0,0 +1,17 @@ +# Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Original Author: Shay Gal-on + +include posix/core_portme.mak diff --git a/benchmarks/riscv-coremark/coremark/linux64/core_portme.c b/benchmarks/riscv-coremark/coremark/linux64/core_portme.c new file mode 100755 index 000000000..fe8d29983 --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/linux64/core_portme.c @@ -0,0 +1,336 @@ +/* +Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +Original Author: Shay Gal-on +*/ + +#include +#include +#include "coremark.h" +#if CALLGRIND_RUN +#include +#endif + +#if (MEM_METHOD==MEM_MALLOC) +#include +/* Function: portable_malloc + Provide malloc() functionality in a platform specific way. +*/ +void *portable_malloc(size_t size) { + return malloc(size); +} +/* Function: portable_free + Provide free() functionality in a platform specific way. +*/ +void portable_free(void *p) { + free(p); +} +#else +void *portable_malloc(size_t size) { + return NULL; +} +void portable_free(void *p) { + p=NULL; +} +#endif + +#if (SEED_METHOD==SEED_VOLATILE) +#if VALIDATION_RUN + volatile ee_s32 seed1_volatile=0x3415; + volatile ee_s32 seed2_volatile=0x3415; + volatile ee_s32 seed3_volatile=0x66; +#endif +#if PERFORMANCE_RUN + volatile ee_s32 seed1_volatile=0x0; + volatile ee_s32 seed2_volatile=0x0; + volatile ee_s32 seed3_volatile=0x66; +#endif +#if PROFILE_RUN + volatile ee_s32 seed1_volatile=0x8; + volatile ee_s32 seed2_volatile=0x8; + volatile ee_s32 seed3_volatile=0x8; +#endif + volatile ee_s32 seed4_volatile=ITERATIONS; + volatile ee_s32 seed5_volatile=0; +#endif +/* Porting: Timing functions + How to capture time and convert to seconds must be ported to whatever is supported by the platform. + e.g. Read value from on board RTC, read value from cpu clock cycles performance counter etc. + Sample implementation for standard time.h and windows.h definitions included. +*/ +/* Define: TIMER_RES_DIVIDER + Divider to trade off timer resolution and total time that can be measured. + + Use lower values to increase resolution, but make sure that overflow does not occur. + If there are issues with the return value overflowing, increase this value. + */ +#if USE_CLOCK + #define NSECS_PER_SEC CLOCKS_PER_SEC + #define EE_TIMER_TICKER_RATE 1000 + #define CORETIMETYPE clock_t + #define GETMYTIME(_t) (*_t=clock()) + #define MYTIMEDIFF(fin,ini) ((fin)-(ini)) + #define TIMER_RES_DIVIDER 1 + #define SAMPLE_TIME_IMPLEMENTATION 1 +#elif defined(_MSC_VER) + #define NSECS_PER_SEC 10000000 + #define EE_TIMER_TICKER_RATE 1000 + #define CORETIMETYPE FILETIME + #define GETMYTIME(_t) GetSystemTimeAsFileTime(_t) + #define MYTIMEDIFF(fin,ini) (((*(__int64*)&fin)-(*(__int64*)&ini))/TIMER_RES_DIVIDER) + /* setting to millisces resolution by default with MSDEV */ + #ifndef TIMER_RES_DIVIDER + #define TIMER_RES_DIVIDER 1000 + #endif + #define SAMPLE_TIME_IMPLEMENTATION 1 +#elif HAS_TIME_H + #define NSECS_PER_SEC 1000000000 + #define EE_TIMER_TICKER_RATE 1000 + #define CORETIMETYPE struct timespec + #define GETMYTIME(_t) clock_gettime(CLOCK_REALTIME,_t) + #define MYTIMEDIFF(fin,ini) ((fin.tv_sec-ini.tv_sec)*(NSECS_PER_SEC/TIMER_RES_DIVIDER)+(fin.tv_nsec-ini.tv_nsec)/TIMER_RES_DIVIDER) + /* setting to 1/1000 of a second resolution by default with linux */ + #ifndef TIMER_RES_DIVIDER + #define TIMER_RES_DIVIDER 1000000 + #endif + #define SAMPLE_TIME_IMPLEMENTATION 1 +#else + #define SAMPLE_TIME_IMPLEMENTATION 0 +#endif +#define EE_TICKS_PER_SEC (NSECS_PER_SEC / TIMER_RES_DIVIDER) + +#if SAMPLE_TIME_IMPLEMENTATION +/** Define Host specific (POSIX), or target specific global time variables. */ +static CORETIMETYPE start_time_val, stop_time_val; + +/* Function: start_time + This function will be called right before starting the timed portion of the benchmark. + + Implementation may be capturing a system timer (as implemented in the example code) + or zeroing some system parameters - e.g. setting the cpu clocks cycles to 0. +*/ +void start_time(void) { + GETMYTIME(&start_time_val ); +#if CALLGRIND_RUN + CALLGRIND_START_INSTRUMENTATION +#endif +#if MICA + asm volatile("int3");/*1 */ +#endif +} +/* Function: stop_time + This function will be called right after ending the timed portion of the benchmark. + + Implementation may be capturing a system timer (as implemented in the example code) + or other system parameters - e.g. reading the current value of cpu cycles counter. +*/ +void stop_time(void) { +#if CALLGRIND_RUN + CALLGRIND_STOP_INSTRUMENTATION +#endif +#if MICA + asm volatile("int3");/*1 */ +#endif + GETMYTIME(&stop_time_val ); +} +/* Function: get_time + Return an abstract "ticks" number that signifies time on the system. + + Actual value returned may be cpu cycles, milliseconds or any other value, + as long as it can be converted to seconds by . + This methodology is taken to accomodate any hardware or simulated platform. + The sample implementation returns millisecs by default, + and the resolution is controlled by +*/ +CORE_TICKS get_time(void) { + CORE_TICKS elapsed=(CORE_TICKS)(MYTIMEDIFF(stop_time_val, start_time_val)); + return elapsed; +} +/* Function: time_in_secs + Convert the value returned by get_time to seconds. + + The type is used to accomodate systems with no support for floating point. + Default implementation implemented by the EE_TICKS_PER_SEC macro above. +*/ +secs_ret time_in_secs(CORE_TICKS ticks) { + secs_ret retval=((secs_ret)ticks) / (secs_ret)EE_TICKS_PER_SEC; + return retval; +} +#else +#error "Please implement timing functionality in core_portme.c" +#endif /* SAMPLE_TIME_IMPLEMENTATION */ + +ee_u32 default_num_contexts=MULTITHREAD; + +/* Function: portable_init + Target specific initialization code + Test for some common mistakes. +*/ +void portable_init(core_portable *p, int *argc, char *argv[]) +{ +#if PRINT_ARGS + int i; + for (i=0; i<*argc; i++) { + ee_printf("Arg[%d]=%s\n",i,argv[i]); + } +#endif + if (sizeof(ee_ptr_int) != sizeof(ee_u8 *)) { + ee_printf("ERROR! Please define ee_ptr_int to a type that holds a pointer!\n"); + } + if (sizeof(ee_u32) != 4) { + ee_printf("ERROR! Please define ee_u32 to a 32b unsigned type!\n"); + } +#if (MAIN_HAS_NOARGC && (SEED_METHOD==SEED_ARG)) + ee_printf("ERROR! Main has no argc, but SEED_METHOD defined to SEED_ARG!\n"); +#endif + +#if (MULTITHREAD>1) && (SEED_METHOD==SEED_ARG) + int nargs=*argc,i; + if ((nargs>1) && (*argv[1]=='M')) { + default_num_contexts=parseval(argv[1]+1); + if (default_num_contexts>MULTITHREAD) + default_num_contexts=MULTITHREAD; + /* Shift args since first arg is directed to the portable part and not to coremark main */ + --nargs; + for (i=1; i*/ + p->portable_id=1; +} +/* Function: portable_fini + Target specific final code +*/ +void portable_fini(core_portable *p) +{ + p->portable_id=0; +} + +#if (MULTITHREAD>1) + +/* Function: core_start_parallel + Start benchmarking in a parallel context. + + Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets. + Other implementations using MCAPI or other standards can easily be devised. +*/ +/* Function: core_stop_parallel + Stop a parallel context execution of coremark, and gather the results. + + Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets. + Other implementations using MCAPI or other standards can easily be devised. +*/ +#if USE_PTHREAD +ee_u8 core_start_parallel(core_results *res) { + return (ee_u8)pthread_create(&(res->port.thread),NULL,iterate,(void *)res); +} +ee_u8 core_stop_parallel(core_results *res) { + void *retval; + return (ee_u8)pthread_join(res->port.thread,&retval); +} +#elif USE_FORK +static int key_id=0; +ee_u8 core_start_parallel(core_results *res) { + key_t key=4321+key_id; + key_id++; + res->port.pid=fork(); + res->port.shmid=shmget(key, 8, IPC_CREAT | 0666); + if (res->port.shmid<0) { + ee_printf("ERROR in shmget!\n"); + } + if (res->port.pid==0) { + iterate(res); + res->port.shm=shmat(res->port.shmid, NULL, 0); + /* copy the validation values to the shared memory area and quit*/ + if (res->port.shm == (char *) -1) { + ee_printf("ERROR in child shmat!\n"); + } else { + memcpy(res->port.shm,&(res->crc),8); + shmdt(res->port.shm); + } + exit(0); + } + return 1; +} +ee_u8 core_stop_parallel(core_results *res) { + int status; + pid_t wpid = waitpid(res->port.pid,&status,WUNTRACED); + if (wpid != res->port.pid) { + ee_printf("ERROR waiting for child.\n"); + if (errno == ECHILD) ee_printf("errno=No such child %d\n",res->port.pid); + if (errno == EINTR) ee_printf("errno=Interrupted\n"); + return 0; + } + /* after process is done, get the values from the shared memory area */ + res->port.shm=shmat(res->port.shmid, NULL, 0); + if (res->port.shm == (char *) -1) { + ee_printf("ERROR in parent shmat!\n"); + return 0; + } + memcpy(&(res->crc),res->port.shm,8); + shmdt(res->port.shm); + return 1; +} +#elif USE_SOCKET +static int key_id=0; +ee_u8 core_start_parallel(core_results *res) { + int bound, buffer_length=8; + res->port.sa.sin_family = AF_INET; + res->port.sa.sin_addr.s_addr = htonl(0x7F000001); + res->port.sa.sin_port = htons(7654+key_id); + key_id++; + res->port.pid=fork(); + if (res->port.pid==0) { /* benchmark child */ + iterate(res); + res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); + if (-1 == res->port.sock) /* if socket failed to initialize, exit */ { + ee_printf("Error Creating Socket"); + } else { + int bytes_sent = sendto(res->port.sock, &(res->crc), buffer_length, 0,(struct sockaddr*)&(res->port.sa), sizeof (struct sockaddr_in)); + if (bytes_sent < 0) + ee_printf("Error sending packet: %s\n", strerror(errno)); + close(res->port.sock); /* close the socket */ + } + exit(0); + } + /* parent process, open the socket */ + res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); + bound = bind(res->port.sock,(struct sockaddr*)&(res->port.sa), sizeof(struct sockaddr)); + if (bound < 0) + ee_printf("bind(): %s\n",strerror(errno)); + return 1; +} +ee_u8 core_stop_parallel(core_results *res) { + int status; + int fromlen=sizeof(struct sockaddr); + int recsize = recvfrom(res->port.sock, &(res->crc), 8, 0, (struct sockaddr*)&(res->port.sa), &fromlen); + if (recsize < 0) { + ee_printf("Error in receive: %s\n", strerror(errno)); + return 0; + } + pid_t wpid = waitpid(res->port.pid,&status,WUNTRACED); + if (wpid != res->port.pid) { + ee_printf("ERROR waiting for child.\n"); + if (errno == ECHILD) ee_printf("errno=No such child %d\n",res->port.pid); + if (errno == EINTR) ee_printf("errno=Interrupted\n"); + return 0; + } + return 1; +} +#else /* no standard multicore implementation */ +#error "Please implement multicore functionality in core_portme.c to use multiple contexts." +#endif /* multithread implementations */ +#endif diff --git a/benchmarks/riscv-coremark/coremark/linux64/core_portme.h b/benchmarks/riscv-coremark/coremark/linux64/core_portme.h new file mode 100755 index 000000000..1228a679b --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/linux64/core_portme.h @@ -0,0 +1,291 @@ +/* +Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +Original Author: Shay Gal-on +*/ + +/* Topic: Description + This file contains configuration constants required to execute on different platforms +*/ +#ifndef CORE_PORTME_H +#define CORE_PORTME_H +/************************/ +/* Data types and settings */ +/************************/ +/* Configuration: HAS_FLOAT + Define to 1 if the platform supports floating point. +*/ +#ifndef HAS_FLOAT +#define HAS_FLOAT 1 +#endif +/* Configuration: HAS_TIME_H + Define to 1 if platform has the time.h header file, + and implementation of functions thereof. +*/ +#ifndef HAS_TIME_H +#define HAS_TIME_H 1 +#endif +/* Configuration: USE_CLOCK + Define to 1 if platform has the time.h header file, + and implementation of functions thereof. +*/ +#ifndef USE_CLOCK +#define USE_CLOCK 0 +#endif +/* Configuration: HAS_STDIO + Define to 1 if the platform has stdio.h. +*/ +#ifndef HAS_STDIO +#define HAS_STDIO 1 +#endif +/* Configuration: HAS_PRINTF + Define to 1 if the platform has stdio.h and implements the printf function. +*/ +#ifndef HAS_PRINTF +#define HAS_PRINTF 1 +#endif + +/* Configuration: CORE_TICKS + Define type of return from the timing functions. + */ +#if defined(_MSC_VER) +#include +typedef size_t CORE_TICKS; +#elif HAS_TIME_H +#include +typedef clock_t CORE_TICKS; +#else +#error "Please define type of CORE_TICKS and implement start_time, end_time get_time and time_in_secs functions!" +#endif + +/* Definitions: COMPILER_VERSION, COMPILER_FLAGS, MEM_LOCATION + Initialize these strings per platform +*/ +#ifndef COMPILER_VERSION + #ifdef __GNUC__ + #define COMPILER_VERSION "GCC"__VERSION__ + #else + #define COMPILER_VERSION "Please put compiler version here (e.g. gcc 4.1)" + #endif +#endif +#ifndef COMPILER_FLAGS + #define COMPILER_FLAGS FLAGS_STR /* "Please put compiler flags here (e.g. -o3)" */ +#endif +#ifndef MEM_LOCATION + #define MEM_LOCATION "Please put data memory location here\n\t\t\t(e.g. code in flash, data on heap etc)" + #define MEM_LOCATION_UNSPEC 1 +#endif + +/* Data Types: + To avoid compiler issues, define the data types that need ot be used for 8b, 16b and 32b in . + + *Imprtant*: + ee_ptr_int needs to be the data type used to hold pointers, otherwise coremark may fail!!! +*/ +typedef signed short ee_s16; +typedef unsigned short ee_u16; +typedef signed int ee_s32; +typedef double ee_f32; +typedef unsigned char ee_u8; +typedef unsigned int ee_u32; +typedef unsigned long long ee_ptr_int; +typedef size_t ee_size_t; +/* align an offset to point to a 32b value */ +#define align_mem(x) (void *)(4 + (((ee_ptr_int)(x) - 1) & ~3)) + +/* Configuration: SEED_METHOD + Defines method to get seed values that cannot be computed at compile time. + + Valid values: + SEED_ARG - from command line. + SEED_FUNC - from a system function. + SEED_VOLATILE - from volatile variables. +*/ +#ifndef SEED_METHOD +#define SEED_METHOD SEED_ARG +#endif + +/* Configuration: MEM_METHOD + Defines method to get a block of memry. + + Valid values: + MEM_MALLOC - for platforms that implement malloc and have malloc.h. + MEM_STATIC - to use a static memory array. + MEM_STACK - to allocate the data block on the stack (NYI). +*/ +#ifndef MEM_METHOD +#define MEM_METHOD MEM_MALLOC +#endif + +/* Configuration: MULTITHREAD + Define for parallel execution + + Valid values: + 1 - only one context (default). + N>1 - will execute N copies in parallel. + + Note: + If this flag is defined to more then 1, an implementation for launching parallel contexts must be defined. + + Two sample implementations are provided. Use or to enable them. + + It is valid to have a different implementation of and in , + to fit a particular architecture. +*/ +#ifndef MULTITHREAD +#define MULTITHREAD 1 +#endif + +/* Configuration: USE_PTHREAD + Sample implementation for launching parallel contexts + This implementation uses pthread_thread_create and pthread_join. + + Valid values: + 0 - Do not use pthreads API. + 1 - Use pthreads API + + Note: + This flag only matters if MULTITHREAD has been defined to a value greater then 1. +*/ +#ifndef USE_PTHREAD +#define USE_PTHREAD 0 +#endif + +/* Configuration: USE_FORK + Sample implementation for launching parallel contexts + This implementation uses fork, waitpid, shmget,shmat and shmdt. + + Valid values: + 0 - Do not use fork API. + 1 - Use fork API + + Note: + This flag only matters if MULTITHREAD has been defined to a value greater then 1. +*/ +#ifndef USE_FORK +#define USE_FORK 0 +#endif + +/* Configuration: USE_SOCKET + Sample implementation for launching parallel contexts + This implementation uses fork, socket, sendto and recvfrom + + Valid values: + 0 - Do not use fork and sockets API. + 1 - Use fork and sockets API + + Note: + This flag only matters if MULTITHREAD has been defined to a value greater then 1. +*/ +#ifndef USE_SOCKET +#define USE_SOCKET 0 +#endif + +/* Configuration: MAIN_HAS_NOARGC + Needed if platform does not support getting arguments to main. + + Valid values: + 0 - argc/argv to main is supported + 1 - argc/argv to main is not supported +*/ +#ifndef MAIN_HAS_NOARGC +#define MAIN_HAS_NOARGC 0 +#endif + +/* Configuration: MAIN_HAS_NORETURN + Needed if platform does not support returning a value from main. + + Valid values: + 0 - main returns an int, and return value will be 0. + 1 - platform does not support returning a value from main +*/ +#ifndef MAIN_HAS_NORETURN +#define MAIN_HAS_NORETURN 0 +#endif + +/* Variable: default_num_contexts + Number of contexts to spawn in multicore context. + Override this global value to change number of contexts used. + + Note: + This value may not be set higher then the define. + + To experiment, you can set the define to the highest value expected, and use argc/argv in the to set this value from the command line. +*/ +extern ee_u32 default_num_contexts; + +#if (MULTITHREAD>1) +#if USE_PTHREAD + #include + #define PARALLEL_METHOD "PThreads" +#elif USE_FORK + #include + #include + #include + #include + #include /* for memcpy */ + #define PARALLEL_METHOD "Fork" +#elif USE_SOCKET + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #define PARALLEL_METHOD "Sockets" +#else + #define PARALLEL_METHOD "Proprietary" + #error "Please implement multicore functionality in core_portme.c to use multiple contexts." +#endif /* Method for multithreading */ +#endif /* MULTITHREAD > 1 */ + +typedef struct CORE_PORTABLE_S { +#if (MULTITHREAD>1) + #if USE_PTHREAD + pthread_t thread; + #elif USE_FORK + pid_t pid; + int shmid; + void *shm; + #elif USE_SOCKET + pid_t pid; + int sock; + struct sockaddr_in sa; + #endif /* Method for multithreading */ +#endif /* MULTITHREAD>1 */ + ee_u8 portable_id; +} core_portable; + +/* target specific init/fini */ +void portable_init(core_portable *p, int *argc, char *argv[]); +void portable_fini(core_portable *p); + +#if (SEED_METHOD==SEED_VOLATILE) + #if (VALIDATION_RUN || PERFORMANCE_RUN || PROFILE_RUN) + #define RUN_TYPE_FLAG 1 + #else + #if (TOTAL_DATA_SIZE==1200) + #define PROFILE_RUN 1 + #else + #define PERFORMANCE_RUN 1 + #endif + #endif +#endif /* SEED_METHOD==SEED_VOLATILE */ + +#endif /* CORE_PORTME_H */ diff --git a/benchmarks/riscv-coremark/coremark/linux64/core_portme.mak b/benchmarks/riscv-coremark/coremark/linux64/core_portme.mak new file mode 100755 index 000000000..5cfabee32 --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/linux64/core_portme.mak @@ -0,0 +1,140 @@ +# Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Original Author: Shay Gal-on + +#File: core_portme.mak + +# Flag: OUTFLAG +# Use this flag to define how to to get an executable (e.g -o) +OUTFLAG= -o +# Flag: CC +# Use this flag to define compiler to use +CC = gcc +# Flag: CFLAGS +# Use this flag to define compiler options. Note, you can add compiler options from the command line using XCFLAGS="other flags" +PORT_CFLAGS = -O2 +FLAGS_STR = "$(PORT_CFLAGS) $(XCFLAGS) $(XLFLAGS) $(LFLAGS_END)" +CFLAGS = $(PORT_CFLAGS) -I$(PORT_DIR) -I. -DFLAGS_STR=\"$(FLAGS_STR)\" +#Flag: LFLAGS_END +# Define any libraries needed for linking or other flags that should come at the end of the link line (e.g. linker scripts). +# Note: On certain platforms, the default clock_gettime implementation is supported but requires linking of librt. +LFLAGS_END += -lrt +# Flag: PORT_SRCS +# Port specific source files can be added here +PORT_SRCS = $(PORT_DIR)/core_portme.c +# Flag: LOAD +# Define this flag if you need to load to a target, as in a cross compile environment. + +# Flag: RUN +# Define this flag if running does not consist of simple invocation of the binary. +# In a cross compile environment, you need to define this. + +#For flashing and using a tera term macro, you could use +#LOAD = flash ADDR +#RUN = ttpmacro coremark.ttl + +#For copying to target and executing via SSH connection, you could use +#LOAD = scp $(OUTFILE) user@target:~ +#RUN = ssh user@target -c + +#For native compilation and execution +LOAD = echo Loading done +RUN = + +OEXT = .o +EXE = .exe + +# Flag: SEPARATE_COMPILE +# Define if you need to separate compilation from link stage. +# In this case, you also need to define below how to create an object file, and how to link. +ifdef SEPARATE_COMPILE + +LD = gcc +OBJOUT = -o +LFLAGS = +OFLAG = -o +COUT = -c +# Flag: PORT_OBJS +# Port specific object files can be added here +PORT_OBJS = $(PORT_DIR)/core_portme$(OEXT) +PORT_CLEAN = *$(OEXT) + +$(OPATH)%$(OEXT) : %.c + $(CC) $(CFLAGS) $(XCFLAGS) $(COUT) $< $(OBJOUT) $@ + +endif + +# Target: port_prebuild +# Generate any files that are needed before actual build starts. +# E.g. generate profile guidance files. Sample PGO generation for gcc enabled with PGO=1 +# - First, check if PGO was defined on the command line, if so, need to add -fprofile-use to compile line. +# - Second, if PGO reference has not yet been generated, add a step to the prebuild that will build a profile-generate version and run it. +# Note - Using REBUILD=1 +# +# Use make PGO=1 to invoke this sample processing. + +ifdef PGO + ifeq (,$(findstring $(PGO),gen)) + PGO_STAGE=build_pgo_gcc + CFLAGS+=-fprofile-use + endif + PORT_CLEAN+=*.gcda *.gcno gmon.out +endif + +.PHONY: port_prebuild +port_prebuild: $(PGO_STAGE) + +.PHONY: build_pgo_gcc +build_pgo_gcc: + $(MAKE) PGO=gen XCFLAGS="$(XCFLAGS) -fprofile-generate -DTOTAL_DATA_SIZE=1200" ITERATIONS=10 gen_pgo_data REBUILD=1 + +# Target: port_postbuild +# Generate any files that are needed after actual build end. +# E.g. change format to srec, bin, zip in order to be able to load into flash +.PHONY: port_postbuild +port_postbuild: + +# Target: port_postrun +# Do platform specific after run stuff. +# E.g. reset the board, backup the logfiles etc. +.PHONY: port_postrun +port_postrun: + +# Target: port_prerun +# Do platform specific after run stuff. +# E.g. reset the board, backup the logfiles etc. +.PHONY: port_prerun +port_prerun: + +# Target: port_postload +# Do platform specific after load stuff. +# E.g. reset the reset power to the flash eraser +.PHONY: port_postload +port_postload: + +# Target: port_preload +# Do platform specific before load stuff. +# E.g. reset the reset power to the flash eraser +.PHONY: port_preload +port_preload: + +# FLAG: OPATH +# Path to the output folder. Default - current folder. +OPATH = ./ +MKDIR = mkdir -p + +# FLAG: PERL +# Define perl executable to calculate the geomean if running separate. +PERL=/usr/bin/perl diff --git a/benchmarks/riscv-coremark/coremark/macos/core_portme.mak b/benchmarks/riscv-coremark/coremark/macos/core_portme.mak new file mode 100644 index 000000000..6b27c3c41 --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/macos/core_portme.mak @@ -0,0 +1,18 @@ +# Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Original Author: Shay Gal-on + +NO_LIBRT = 1 +include posix/core_portme.mak diff --git a/benchmarks/riscv-coremark/coremark/posix/core_portme.c b/benchmarks/riscv-coremark/coremark/posix/core_portme.c new file mode 100644 index 000000000..f5a7f5b3d --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/posix/core_portme.c @@ -0,0 +1,419 @@ +/* +Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +Original Author: Shay Gal-on +*/ + +#include +#include +#include "coremark.h" +#if CALLGRIND_RUN +#include +#endif + +#if (MEM_METHOD == MEM_MALLOC) +/* Function: portable_malloc + Provide malloc() functionality in a platform specific way. +*/ +void * +portable_malloc(size_t size) +{ + return malloc(size); +} +/* Function: portable_free + Provide free() functionality in a platform specific way. +*/ +void +portable_free(void *p) +{ + free(p); +} +#else +void * +portable_malloc(size_t size) +{ + return NULL; +} +void +portable_free(void *p) +{ + p = NULL; +} +#endif + +#if (SEED_METHOD == SEED_VOLATILE) +#if VALIDATION_RUN +volatile ee_s32 seed1_volatile = 0x3415; +volatile ee_s32 seed2_volatile = 0x3415; +volatile ee_s32 seed3_volatile = 0x66; +#endif +#if PERFORMANCE_RUN +volatile ee_s32 seed1_volatile = 0x0; +volatile ee_s32 seed2_volatile = 0x0; +volatile ee_s32 seed3_volatile = 0x66; +#endif +#if PROFILE_RUN +volatile ee_s32 seed1_volatile = 0x8; +volatile ee_s32 seed2_volatile = 0x8; +volatile ee_s32 seed3_volatile = 0x8; +#endif +volatile ee_s32 seed4_volatile = ITERATIONS; +volatile ee_s32 seed5_volatile = 0; +#endif +/* Porting: Timing functions + How to capture time and convert to seconds must be ported to whatever is + supported by the platform. e.g. Read value from on board RTC, read value from + cpu clock cycles performance counter etc. Sample implementation for standard + time.h and windows.h definitions included. +*/ +/* Define: TIMER_RES_DIVIDER + Divider to trade off timer resolution and total time that can be + measured. + + Use lower values to increase resolution, but make sure that overflow + does not occur. If there are issues with the return value overflowing, + increase this value. + */ +#if USE_CLOCK +#define NSECS_PER_SEC CLOCKS_PER_SEC +#define EE_TIMER_TICKER_RATE 1000 +#define CORETIMETYPE clock_t +#define GETMYTIME(_t) (*_t = clock()) +#define MYTIMEDIFF(fin, ini) ((fin) - (ini)) +#define TIMER_RES_DIVIDER 1 +#define SAMPLE_TIME_IMPLEMENTATION 1 +#elif defined(_MSC_VER) +#define NSECS_PER_SEC 10000000 +#define EE_TIMER_TICKER_RATE 1000 +#define CORETIMETYPE FILETIME +#define GETMYTIME(_t) GetSystemTimeAsFileTime(_t) +#define MYTIMEDIFF(fin, ini) \ + (((*(__int64 *)&fin) - (*(__int64 *)&ini)) / TIMER_RES_DIVIDER) +/* setting to millisces resolution by default with MSDEV */ +#ifndef TIMER_RES_DIVIDER +#define TIMER_RES_DIVIDER 1000 +#endif +#define SAMPLE_TIME_IMPLEMENTATION 1 +#elif HAS_TIME_H +#define NSECS_PER_SEC 1000000000 +#define EE_TIMER_TICKER_RATE 1000 +#define CORETIMETYPE struct timespec +#define GETMYTIME(_t) clock_gettime(CLOCK_REALTIME, _t) +#define MYTIMEDIFF(fin, ini) \ + ((fin.tv_sec - ini.tv_sec) * (NSECS_PER_SEC / TIMER_RES_DIVIDER) \ + + (fin.tv_nsec - ini.tv_nsec) / TIMER_RES_DIVIDER) +/* setting to 1/1000 of a second resolution by default with linux */ +#ifndef TIMER_RES_DIVIDER +#define TIMER_RES_DIVIDER 1000000 +#endif +#define SAMPLE_TIME_IMPLEMENTATION 1 +#else +#define SAMPLE_TIME_IMPLEMENTATION 0 +#endif +#define EE_TICKS_PER_SEC (NSECS_PER_SEC / TIMER_RES_DIVIDER) + +#if SAMPLE_TIME_IMPLEMENTATION +/** Define Host specific (POSIX), or target specific global time variables. */ +static CORETIMETYPE start_time_val, stop_time_val; + +/* Function: start_time + This function will be called right before starting the timed portion of + the benchmark. + + Implementation may be capturing a system timer (as implemented in the + example code) or zeroing some system parameters - e.g. setting the cpu clocks + cycles to 0. +*/ +void +start_time(void) +{ + GETMYTIME(&start_time_val); +#if CALLGRIND_RUN + CALLGRIND_START_INSTRUMENTATION +#endif +#if MICA + asm volatile("int3"); /*1 */ +#endif +} +/* Function: stop_time + This function will be called right after ending the timed portion of the + benchmark. + + Implementation may be capturing a system timer (as implemented in the + example code) or other system parameters - e.g. reading the current value of + cpu cycles counter. +*/ +void +stop_time(void) +{ +#if CALLGRIND_RUN + CALLGRIND_STOP_INSTRUMENTATION +#endif +#if MICA + asm volatile("int3"); /*1 */ +#endif + GETMYTIME(&stop_time_val); +} +/* Function: get_time + Return an abstract "ticks" number that signifies time on the system. + + Actual value returned may be cpu cycles, milliseconds or any other + value, as long as it can be converted to seconds by . This + methodology is taken to accomodate any hardware or simulated platform. The + sample implementation returns millisecs by default, and the resolution is + controlled by +*/ +CORE_TICKS +get_time(void) +{ + CORE_TICKS elapsed + = (CORE_TICKS)(MYTIMEDIFF(stop_time_val, start_time_val)); + return elapsed; +} +/* Function: time_in_secs + Convert the value returned by get_time to seconds. + + The type is used to accomodate systems with no support for + floating point. Default implementation implemented by the EE_TICKS_PER_SEC + macro above. +*/ +secs_ret +time_in_secs(CORE_TICKS ticks) +{ + secs_ret retval = ((secs_ret)ticks) / (secs_ret)EE_TICKS_PER_SEC; + return retval; +} +#else +#error "Please implement timing functionality in core_portme.c" +#endif /* SAMPLE_TIME_IMPLEMENTATION */ + +ee_u32 default_num_contexts = MULTITHREAD; + +/* Function: portable_init + Target specific initialization code + Test for some common mistakes. +*/ +void +portable_init(core_portable *p, int *argc, char *argv[]) +{ +#if PRINT_ARGS + int i; + for (i = 0; i < *argc; i++) + { + ee_printf("Arg[%d]=%s\n", i, argv[i]); + } +#endif + if (sizeof(ee_ptr_int) != sizeof(ee_u8 *)) + { + ee_printf( + "ERROR! Please define ee_ptr_int to a type that holds a " + "pointer!\n"); + } + if (sizeof(ee_u32) != 4) + { + ee_printf("ERROR! Please define ee_u32 to a 32b unsigned type!\n"); + } +#if (MAIN_HAS_NOARGC && (SEED_METHOD == SEED_ARG)) + ee_printf( + "ERROR! Main has no argc, but SEED_METHOD defined to SEED_ARG!\n"); +#endif + +#if (MULTITHREAD > 1) && (SEED_METHOD == SEED_ARG) + int nargs = *argc, i; + if ((nargs > 1) && (*argv[1] == 'M')) + { + default_num_contexts = parseval(argv[1] + 1); + if (default_num_contexts > MULTITHREAD) + default_num_contexts = MULTITHREAD; + /* Shift args since first arg is directed to the portable part and not + * to coremark main */ + --nargs; + for (i = 1; i < nargs; i++) + argv[i] = argv[i + 1]; + *argc = nargs; + } +#endif /* sample of potential platform specific init via command line, reset \ + the number of contexts being used if first argument is M*/ + p->portable_id = 1; +} +/* Function: portable_fini + Target specific final code +*/ +void +portable_fini(core_portable *p) +{ + p->portable_id = 0; +} + +#if (MULTITHREAD > 1) + +/* Function: core_start_parallel + Start benchmarking in a parallel context. + + Three implementations are provided, one using pthreads, one using fork + and shared mem, and one using fork and sockets. Other implementations using + MCAPI or other standards can easily be devised. +*/ +/* Function: core_stop_parallel + Stop a parallel context execution of coremark, and gather the results. + + Three implementations are provided, one using pthreads, one using fork + and shared mem, and one using fork and sockets. Other implementations using + MCAPI or other standards can easily be devised. +*/ +#if USE_PTHREAD +ee_u8 +core_start_parallel(core_results *res) +{ + return (ee_u8)pthread_create( + &(res->port.thread), NULL, iterate, (void *)res); +} +ee_u8 +core_stop_parallel(core_results *res) +{ + void *retval; + return (ee_u8)pthread_join(res->port.thread, &retval); +} +#elif USE_FORK +static int key_id = 0; +ee_u8 +core_start_parallel(core_results *res) +{ + key_t key = 4321 + key_id; + key_id++; + res->port.pid = fork(); + res->port.shmid = shmget(key, 8, IPC_CREAT | 0666); + if (res->port.shmid < 0) + { + ee_printf("ERROR in shmget!\n"); + } + if (res->port.pid == 0) + { + iterate(res); + res->port.shm = shmat(res->port.shmid, NULL, 0); + /* copy the validation values to the shared memory area and quit*/ + if (res->port.shm == (char *)-1) + { + ee_printf("ERROR in child shmat!\n"); + } + else + { + memcpy(res->port.shm, &(res->crc), 8); + shmdt(res->port.shm); + } + exit(0); + } + return 1; +} +ee_u8 +core_stop_parallel(core_results *res) +{ + int status; + pid_t wpid = waitpid(res->port.pid, &status, WUNTRACED); + if (wpid != res->port.pid) + { + ee_printf("ERROR waiting for child.\n"); + if (errno == ECHILD) + ee_printf("errno=No such child %d\n", res->port.pid); + if (errno == EINTR) + ee_printf("errno=Interrupted\n"); + return 0; + } + /* after process is done, get the values from the shared memory area */ + res->port.shm = shmat(res->port.shmid, NULL, 0); + if (res->port.shm == (char *)-1) + { + ee_printf("ERROR in parent shmat!\n"); + return 0; + } + memcpy(&(res->crc), res->port.shm, 8); + shmdt(res->port.shm); + return 1; +} +#elif USE_SOCKET +static int key_id = 0; +ee_u8 +core_start_parallel(core_results *res) +{ + int bound, buffer_length = 8; + res->port.sa.sin_family = AF_INET; + res->port.sa.sin_addr.s_addr = htonl(0x7F000001); + res->port.sa.sin_port = htons(7654 + key_id); + key_id++; + res->port.pid = fork(); + if (res->port.pid == 0) + { /* benchmark child */ + iterate(res); + res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); + if (-1 == res->port.sock) /* if socket failed to initialize, exit */ + { + ee_printf("Error Creating Socket"); + } + else + { + int bytes_sent = sendto(res->port.sock, + &(res->crc), + buffer_length, + 0, + (struct sockaddr *)&(res->port.sa), + sizeof(struct sockaddr_in)); + if (bytes_sent < 0) + ee_printf("Error sending packet: %s\n", strerror(errno)); + close(res->port.sock); /* close the socket */ + } + exit(0); + } + /* parent process, open the socket */ + res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); + bound = bind(res->port.sock, + (struct sockaddr *)&(res->port.sa), + sizeof(struct sockaddr)); + if (bound < 0) + ee_printf("bind(): %s\n", strerror(errno)); + return 1; +} +ee_u8 +core_stop_parallel(core_results *res) +{ + int status; + int fromlen = sizeof(struct sockaddr); + int recsize = recvfrom(res->port.sock, + &(res->crc), + 8, + 0, + (struct sockaddr *)&(res->port.sa), + &fromlen); + if (recsize < 0) + { + ee_printf("Error in receive: %s\n", strerror(errno)); + return 0; + } + pid_t wpid = waitpid(res->port.pid, &status, WUNTRACED); + if (wpid != res->port.pid) + { + ee_printf("ERROR waiting for child.\n"); + if (errno == ECHILD) + ee_printf("errno=No such child %d\n", res->port.pid); + if (errno == EINTR) + ee_printf("errno=Interrupted\n"); + return 0; + } + return 1; +} +#else /* no standard multicore implementation */ +#error \ + "Please implement multicore functionality in core_portme.c to use multiple contexts." +#endif /* multithread implementations */ +#endif diff --git a/benchmarks/riscv-coremark/coremark/posix/core_portme.h b/benchmarks/riscv-coremark/coremark/posix/core_portme.h new file mode 100644 index 000000000..e49e474b1 --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/posix/core_portme.h @@ -0,0 +1,314 @@ +/* +Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +Original Author: Shay Gal-on +*/ + +/* Topic: Description + This file contains configuration constants required to execute on + different platforms +*/ +#ifndef CORE_PORTME_H +#define CORE_PORTME_H + +#include "core_portme_posix_overrides.h" + +/************************/ +/* Data types and settings */ +/************************/ +/* Configuration: HAS_FLOAT + Define to 1 if the platform supports floating point. +*/ +#ifndef HAS_FLOAT +#define HAS_FLOAT 1 +#endif +/* Configuration: HAS_TIME_H + Define to 1 if platform has the time.h header file, + and implementation of functions thereof. +*/ +#ifndef HAS_TIME_H +#define HAS_TIME_H 1 +#endif +/* Configuration: USE_CLOCK + Define to 1 if platform has the time.h header file, + and implementation of functions thereof. +*/ +#ifndef USE_CLOCK +#define USE_CLOCK 0 +#endif +/* Configuration: HAS_STDIO + Define to 1 if the platform has stdio.h. +*/ +#ifndef HAS_STDIO +#define HAS_STDIO 1 +#endif +/* Configuration: HAS_PRINTF + Define to 1 if the platform has stdio.h and implements the printf + function. +*/ +#ifndef HAS_PRINTF +#define HAS_PRINTF 1 +#endif + +/* Configuration: CORE_TICKS + Define type of return from the timing functions. + */ +#if defined(_MSC_VER) +#include +typedef size_t CORE_TICKS; +#elif HAS_TIME_H +#include +typedef clock_t CORE_TICKS; +#else +#error \ + "Please define type of CORE_TICKS and implement start_time, end_time get_time and time_in_secs functions!" +#endif + +/* Definitions: COMPILER_VERSION, COMPILER_FLAGS, MEM_LOCATION + Initialize these strings per platform +*/ +#ifndef COMPILER_VERSION +#ifdef __GNUC__ +#define COMPILER_VERSION "GCC"__VERSION__ +#else +#define COMPILER_VERSION "Please put compiler version here (e.g. gcc 4.1)" +#endif +#endif +#ifndef COMPILER_FLAGS +#define COMPILER_FLAGS \ + FLAGS_STR /* "Please put compiler flags here (e.g. -o3)" */ +#endif +#ifndef MEM_LOCATION +#define MEM_LOCATION \ + "Please put data memory location here\n\t\t\t(e.g. code in flash, data " \ + "on heap etc)" +#define MEM_LOCATION_UNSPEC 1 +#endif + +#include + +/* Data Types: + To avoid compiler issues, define the data types that need ot be used for + 8b, 16b and 32b in . + + *Imprtant*: + ee_ptr_int needs to be the data type used to hold pointers, otherwise + coremark may fail!!! +*/ +typedef signed short ee_s16; +typedef unsigned short ee_u16; +typedef signed int ee_s32; +typedef double ee_f32; +typedef unsigned char ee_u8; +typedef unsigned int ee_u32; +typedef uintptr_t ee_ptr_int; +typedef size_t ee_size_t; +/* align an offset to point to a 32b value */ +#define align_mem(x) (void *)(4 + (((ee_ptr_int)(x)-1) & ~3)) + +/* Configuration: SEED_METHOD + Defines method to get seed values that cannot be computed at compile + time. + + Valid values: + SEED_ARG - from command line. + SEED_FUNC - from a system function. + SEED_VOLATILE - from volatile variables. +*/ +#ifndef SEED_METHOD +#define SEED_METHOD SEED_ARG +#endif + +/* Configuration: MEM_METHOD + Defines method to get a block of memry. + + Valid values: + MEM_MALLOC - for platforms that implement malloc and have malloc.h. + MEM_STATIC - to use a static memory array. + MEM_STACK - to allocate the data block on the stack (NYI). +*/ +#ifndef MEM_METHOD +#define MEM_METHOD MEM_MALLOC +#endif + +/* Configuration: MULTITHREAD + Define for parallel execution + + Valid values: + 1 - only one context (default). + N>1 - will execute N copies in parallel. + + Note: + If this flag is defined to more then 1, an implementation for launching + parallel contexts must be defined. + + Two sample implementations are provided. Use or + to enable them. + + It is valid to have a different implementation of + and in , to fit a particular architecture. +*/ +#ifndef MULTITHREAD +#define MULTITHREAD 1 +#endif + +/* Configuration: USE_PTHREAD + Sample implementation for launching parallel contexts + This implementation uses pthread_thread_create and pthread_join. + + Valid values: + 0 - Do not use pthreads API. + 1 - Use pthreads API + + Note: + This flag only matters if MULTITHREAD has been defined to a value + greater then 1. +*/ +#ifndef USE_PTHREAD +#define USE_PTHREAD 0 +#endif + +/* Configuration: USE_FORK + Sample implementation for launching parallel contexts + This implementation uses fork, waitpid, shmget,shmat and shmdt. + + Valid values: + 0 - Do not use fork API. + 1 - Use fork API + + Note: + This flag only matters if MULTITHREAD has been defined to a value + greater then 1. +*/ +#ifndef USE_FORK +#define USE_FORK 0 +#endif + +/* Configuration: USE_SOCKET + Sample implementation for launching parallel contexts + This implementation uses fork, socket, sendto and recvfrom + + Valid values: + 0 - Do not use fork and sockets API. + 1 - Use fork and sockets API + + Note: + This flag only matters if MULTITHREAD has been defined to a value + greater then 1. +*/ +#ifndef USE_SOCKET +#define USE_SOCKET 0 +#endif + +/* Configuration: MAIN_HAS_NOARGC + Needed if platform does not support getting arguments to main. + + Valid values: + 0 - argc/argv to main is supported + 1 - argc/argv to main is not supported +*/ +#ifndef MAIN_HAS_NOARGC +#define MAIN_HAS_NOARGC 0 +#endif + +/* Configuration: MAIN_HAS_NORETURN + Needed if platform does not support returning a value from main. + + Valid values: + 0 - main returns an int, and return value will be 0. + 1 - platform does not support returning a value from main +*/ +#ifndef MAIN_HAS_NORETURN +#define MAIN_HAS_NORETURN 0 +#endif + +/* Variable: default_num_contexts + Number of contexts to spawn in multicore context. + Override this global value to change number of contexts used. + + Note: + This value may not be set higher then the define. + + To experiment, you can set the define to the highest value + expected, and use argc/argv in the to set this value from the + command line. +*/ +extern ee_u32 default_num_contexts; + +#if (MULTITHREAD > 1) +#if USE_PTHREAD +#include +#define PARALLEL_METHOD "PThreads" +#elif USE_FORK +#include +#include +#include +#include +#include /* for memcpy */ +#define PARALLEL_METHOD "Fork" +#elif USE_SOCKET +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#define PARALLEL_METHOD "Sockets" +#else +#define PARALLEL_METHOD "Proprietary" +#error \ + "Please implement multicore functionality in core_portme.c to use multiple contexts." +#endif /* Method for multithreading */ +#endif /* MULTITHREAD > 1 */ + +typedef struct CORE_PORTABLE_S +{ +#if (MULTITHREAD > 1) +#if USE_PTHREAD + pthread_t thread; +#elif USE_FORK + pid_t pid; + int shmid; + void *shm; +#elif USE_SOCKET + pid_t pid; + int sock; + struct sockaddr_in sa; +#endif /* Method for multithreading */ +#endif /* MULTITHREAD>1 */ + ee_u8 portable_id; +} core_portable; + +/* target specific init/fini */ +void portable_init(core_portable *p, int *argc, char *argv[]); +void portable_fini(core_portable *p); + +#if (SEED_METHOD == SEED_VOLATILE) +#if (VALIDATION_RUN || PERFORMANCE_RUN || PROFILE_RUN) +#define RUN_TYPE_FLAG 1 +#else +#if (TOTAL_DATA_SIZE == 1200) +#define PROFILE_RUN 1 +#else +#define PERFORMANCE_RUN 1 +#endif +#endif +#endif /* SEED_METHOD==SEED_VOLATILE */ + +#endif /* CORE_PORTME_H */ diff --git a/benchmarks/riscv-coremark/coremark/posix/core_portme.mak b/benchmarks/riscv-coremark/coremark/posix/core_portme.mak new file mode 100755 index 000000000..e6be71a7e --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/posix/core_portme.mak @@ -0,0 +1,151 @@ +# Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Original Author: Shay Gal-on + +#File: core_portme.mak + +# Flag: OUTFLAG +# Use this flag to define how to to get an executable (e.g -o) +OUTFLAG= -o +# Flag: CC +# Use this flag to define compiler to use +CC?= cc +# Flag: CFLAGS +# Use this flag to define compiler options. Note, you can add compiler options from the command line using XCFLAGS="other flags" +PORT_CFLAGS = -O2 +FLAGS_STR = "$(PORT_CFLAGS) $(XCFLAGS) $(XLFLAGS) $(LFLAGS_END)" +CFLAGS = $(PORT_CFLAGS) -I$(PORT_DIR) -Iposix -I. -DFLAGS_STR=\"$(FLAGS_STR)\" +# Flag: NO_LIBRT +# Define if the platform does not provide a librt +ifndef NO_LIBRT +#Flag: LFLAGS_END +# Define any libraries needed for linking or other flags that should come at the end of the link line (e.g. linker scripts). +# Note: On certain platforms, the default clock_gettime implementation is supported but requires linking of librt. +LFLAGS_END += -lrt +endif +# Flag: PORT_SRCS +# Port specific source files can be added here +PORT_SRCS = posix/core_portme.c +vpath %.c posix +vpath %.h posix +vpath %.mak posix +# Flag: EXTRA_DEPENDS +# Port specific extra build dependencies. +# Some ports inherit from us, so ensure this Makefile is always a dependency. +EXTRA_DEPENDS += posix/core_portme.mak +# Flag: LOAD +# Define this flag if you need to load to a target, as in a cross compile environment. + +# Flag: RUN +# Define this flag if running does not consist of simple invocation of the binary. +# In a cross compile environment, you need to define this. + +#For flashing and using a tera term macro, you could use +#LOAD = flash ADDR +#RUN = ttpmacro coremark.ttl + +#For copying to target and executing via SSH connection, you could use +#LOAD = scp $(OUTFILE) user@target:~ +#RUN = ssh user@target -c + +#For native compilation and execution +LOAD = echo Loading done +RUN = + +OEXT = .o +EXE = .exe + +# Flag: SEPARATE_COMPILE +# Define if you need to separate compilation from link stage. +# In this case, you also need to define below how to create an object file, and how to link. +ifdef SEPARATE_COMPILE + +LD = gcc +OBJOUT = -o +LFLAGS = +OFLAG = -o +COUT = -c +# Flag: PORT_OBJS +# Port specific object files can be added here +PORT_OBJS = $(PORT_DIR)/core_portme$(OEXT) +PORT_CLEAN = *$(OEXT) + +$(OPATH)%$(OEXT) : %.c + $(CC) $(CFLAGS) $(XCFLAGS) $(COUT) $< $(OBJOUT) $@ + +endif + +# Target: port_prebuild +# Generate any files that are needed before actual build starts. +# E.g. generate profile guidance files. Sample PGO generation for gcc enabled with PGO=1 +# - First, check if PGO was defined on the command line, if so, need to add -fprofile-use to compile line. +# - Second, if PGO reference has not yet been generated, add a step to the prebuild that will build a profile-generate version and run it. +# Note - Using REBUILD=1 +# +# Use make PGO=1 to invoke this sample processing. + +ifdef PGO + ifeq (,$(findstring $(PGO),gen)) + PGO_STAGE=build_pgo_gcc + CFLAGS+=-fprofile-use + endif + PORT_CLEAN+=*.gcda *.gcno gmon.out +endif + +.PHONY: port_prebuild +port_prebuild: $(PGO_STAGE) + +.PHONY: build_pgo_gcc +build_pgo_gcc: + $(MAKE) PGO=gen XCFLAGS="$(XCFLAGS) -fprofile-generate -DTOTAL_DATA_SIZE=1200" ITERATIONS=10 gen_pgo_data REBUILD=1 + +# Target: port_postbuild +# Generate any files that are needed after actual build end. +# E.g. change format to srec, bin, zip in order to be able to load into flash +.PHONY: port_postbuild +port_postbuild: + +# Target: port_postrun +# Do platform specific after run stuff. +# E.g. reset the board, backup the logfiles etc. +.PHONY: port_postrun +port_postrun: + +# Target: port_prerun +# Do platform specific after run stuff. +# E.g. reset the board, backup the logfiles etc. +.PHONY: port_prerun +port_prerun: + +# Target: port_postload +# Do platform specific after load stuff. +# E.g. reset the reset power to the flash eraser +.PHONY: port_postload +port_postload: + +# Target: port_preload +# Do platform specific before load stuff. +# E.g. reset the reset power to the flash eraser +.PHONY: port_preload +port_preload: + +# FLAG: OPATH +# Path to the output folder. Default - current folder. +OPATH = ./ +MKDIR = mkdir -p + +# FLAG: PERL +# Define perl executable to calculate the geomean if running separate. +PERL=/usr/bin/perl diff --git a/benchmarks/riscv-coremark/coremark/posix/core_portme_posix_overrides.h b/benchmarks/riscv-coremark/coremark/posix/core_portme_posix_overrides.h new file mode 100644 index 000000000..c0e998adf --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/posix/core_portme_posix_overrides.h @@ -0,0 +1,28 @@ +/* +Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +Original Author: Shay Gal-on +*/ + +/* Topic: Description + This file contains additional configuration constants required to execute on + different platforms over and above the POSIX defaults +*/ +#ifndef CORE_PORTME_POSIX_OVERRIDES_H +#define CORE_PORTME_POSIX_OVERRIDES_H + +/* None by default */ + +#endif diff --git a/benchmarks/riscv-coremark/coremark/rtems/core_portme.mak b/benchmarks/riscv-coremark/coremark/rtems/core_portme.mak new file mode 100644 index 000000000..6b27c3c41 --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/rtems/core_portme.mak @@ -0,0 +1,18 @@ +# Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Original Author: Shay Gal-on + +NO_LIBRT = 1 +include posix/core_portme.mak diff --git a/benchmarks/riscv-coremark/coremark/rtems/init.c b/benchmarks/riscv-coremark/coremark/rtems/init.c new file mode 100644 index 000000000..64d3e59ae --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/rtems/init.c @@ -0,0 +1,63 @@ +/*- + * SPDX-License-Identifier: BSD-2-Clause + * + * Copyright (c) 2021 Hesham Almatary + * + * This software was developed by SRI International and the University of + * Cambridge Computer Laboratory (Department of Computer Science and + * Technology) under DARPA contract HR0011-18-C-0016 ("ECATS"), as part of the + * DARPA SSITH research programme. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include + +int main( + int argc, + void **args +); + +rtems_task Init( + rtems_task_argument ignored +); + +rtems_task Init( + rtems_task_argument ignored +) +{ + int ret = main(0, NULL); + exit(ret); +} + +/* configuration information */ +#define CONFIGURE_APPLICATION_NEEDS_SIMPLE_CONSOLE_DRIVER +#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER + +#define CONFIGURE_MAXIMUM_TASKS 20 + +#define CONFIGURE_RTEMS_INIT_TASKS_TABLE + +#define CONFIGURE_INIT + +#include diff --git a/benchmarks/riscv-coremark/coremark/simple/core_portme.c b/benchmarks/riscv-coremark/coremark/simple/core_portme.c new file mode 100644 index 000000000..b95e3b21e --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/simple/core_portme.c @@ -0,0 +1,149 @@ +/* +Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +Original Author: Shay Gal-on +*/ + +#include +#include +#include "coremark.h" + +#if VALIDATION_RUN +volatile ee_s32 seed1_volatile = 0x3415; +volatile ee_s32 seed2_volatile = 0x3415; +volatile ee_s32 seed3_volatile = 0x66; +#endif +#if PERFORMANCE_RUN +volatile ee_s32 seed1_volatile = 0x0; +volatile ee_s32 seed2_volatile = 0x0; +volatile ee_s32 seed3_volatile = 0x66; +#endif +#if PROFILE_RUN +volatile ee_s32 seed1_volatile = 0x8; +volatile ee_s32 seed2_volatile = 0x8; +volatile ee_s32 seed3_volatile = 0x8; +#endif +volatile ee_s32 seed4_volatile = ITERATIONS; +volatile ee_s32 seed5_volatile = 0; +/* Porting : Timing functions + How to capture time and convert to seconds must be ported to whatever is + supported by the platform. e.g. Read value from on board RTC, read value from + cpu clock cycles performance counter etc. Sample implementation for standard + time.h and windows.h definitions included. +*/ +/* Define : TIMER_RES_DIVIDER + Divider to trade off timer resolution and total time that can be + measured. + + Use lower values to increase resolution, but make sure that overflow + does not occur. If there are issues with the return value overflowing, + increase this value. + */ +#define NSECS_PER_SEC CLOCKS_PER_SEC +#define CORETIMETYPE clock_t +#define GETMYTIME(_t) (*_t = clock()) +#define MYTIMEDIFF(fin, ini) ((fin) - (ini)) +#define TIMER_RES_DIVIDER 1 +#define SAMPLE_TIME_IMPLEMENTATION 1 +#define EE_TICKS_PER_SEC (NSECS_PER_SEC / TIMER_RES_DIVIDER) + +/** Define Host specific (POSIX), or target specific global time variables. */ +static CORETIMETYPE start_time_val, stop_time_val; + +/* Function : start_time + This function will be called right before starting the timed portion of + the benchmark. + + Implementation may be capturing a system timer (as implemented in the + example code) or zeroing some system parameters - e.g. setting the cpu clocks + cycles to 0. +*/ +void +start_time(void) +{ + GETMYTIME(&start_time_val); +} +/* Function : stop_time + This function will be called right after ending the timed portion of the + benchmark. + + Implementation may be capturing a system timer (as implemented in the + example code) or other system parameters - e.g. reading the current value of + cpu cycles counter. +*/ +void +stop_time(void) +{ + GETMYTIME(&stop_time_val); +} +/* Function : get_time + Return an abstract "ticks" number that signifies time on the system. + + Actual value returned may be cpu cycles, milliseconds or any other + value, as long as it can be converted to seconds by . This + methodology is taken to accomodate any hardware or simulated platform. The + sample implementation returns millisecs by default, and the resolution is + controlled by +*/ +CORE_TICKS +get_time(void) +{ + CORE_TICKS elapsed + = (CORE_TICKS)(MYTIMEDIFF(stop_time_val, start_time_val)); + return elapsed; +} +/* Function : time_in_secs + Convert the value returned by get_time to seconds. + + The type is used to accomodate systems with no support for + floating point. Default implementation implemented by the EE_TICKS_PER_SEC + macro above. +*/ +secs_ret +time_in_secs(CORE_TICKS ticks) +{ + secs_ret retval = ((secs_ret)ticks) / (secs_ret)EE_TICKS_PER_SEC; + return retval; +} + +ee_u32 default_num_contexts = 1; + +/* Function : portable_init + Target specific initialization code + Test for some common mistakes. +*/ +void +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 " + "pointer!\n"); + } + if (sizeof(ee_u32) != 4) + { + ee_printf("ERROR! Please define ee_u32 to a 32b unsigned type!\n"); + } + p->portable_id = 1; +} +/* Function : portable_fini + Target specific final code +*/ +void +portable_fini(core_portable *p) +{ + p->portable_id = 0; +} diff --git a/benchmarks/riscv-coremark/coremark/simple/core_portme.h b/benchmarks/riscv-coremark/coremark/simple/core_portme.h new file mode 100644 index 000000000..dfd94cbfc --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/simple/core_portme.h @@ -0,0 +1,208 @@ +/* +Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +Original Author: Shay Gal-on +*/ + +/* Topic : Description + This file contains configuration constants required to execute on + different platforms +*/ +#ifndef CORE_PORTME_H +#define CORE_PORTME_H +/************************/ +/* Data types and settings */ +/************************/ +/* Configuration : HAS_FLOAT + Define to 1 if the platform supports floating point. +*/ +#ifndef HAS_FLOAT +#define HAS_FLOAT 1 +#endif +/* Configuration : HAS_TIME_H + Define to 1 if platform has the time.h header file, + and implementation of functions thereof. +*/ +#ifndef HAS_TIME_H +#define HAS_TIME_H 1 +#endif +/* Configuration : USE_CLOCK + Define to 1 if platform has the time.h header file, + and implementation of functions thereof. +*/ +#ifndef USE_CLOCK +#define USE_CLOCK 1 +#endif +/* Configuration : HAS_STDIO + Define to 1 if the platform has stdio.h. +*/ +#ifndef HAS_STDIO +#define HAS_STDIO 1 +#endif +/* Configuration : HAS_PRINTF + Define to 1 if the platform has stdio.h and implements the printf + function. +*/ +#ifndef HAS_PRINTF +#define HAS_PRINTF 1 +#endif + +/* Configuration : CORE_TICKS + Define type of return from the timing functions. + */ +#include +typedef clock_t CORE_TICKS; + +/* Definitions : COMPILER_VERSION, COMPILER_FLAGS, MEM_LOCATION + Initialize these strings per platform +*/ +#ifndef COMPILER_VERSION +#ifdef __GNUC__ +#define COMPILER_VERSION "GCC"__VERSION__ +#else +#define COMPILER_VERSION "Please put compiler version here (e.g. gcc 4.1)" +#endif +#endif +#ifndef COMPILER_FLAGS +#define COMPILER_FLAGS \ + FLAGS_STR /* "Please put compiler flags here (e.g. -o3)" */ +#endif +#ifndef MEM_LOCATION +#define MEM_LOCATION "STACK" +#endif + +/* Data Types : + To avoid compiler issues, define the data types that need ot be used for + 8b, 16b and 32b in . + + *Imprtant* : + ee_ptr_int needs to be the data type used to hold pointers, otherwise + coremark may fail!!! +*/ +typedef signed short ee_s16; +typedef unsigned short ee_u16; +typedef signed int ee_s32; +typedef double ee_f32; +typedef unsigned char ee_u8; +typedef unsigned int ee_u32; +typedef ee_u32 ee_ptr_int; +typedef size_t ee_size_t; +/* align_mem : + This macro is used to align an offset to point to a 32b value. It is + used in the Matrix algorithm to initialize the input memory blocks. +*/ +#define align_mem(x) (void *)(4 + (((ee_ptr_int)(x)-1) & ~3)) + +/* Configuration : SEED_METHOD + Defines method to get seed values that cannot be computed at compile + time. + + Valid values : + SEED_ARG - from command line. + SEED_FUNC - from a system function. + SEED_VOLATILE - from volatile variables. +*/ +#ifndef SEED_METHOD +#define SEED_METHOD SEED_VOLATILE +#endif + +/* Configuration : MEM_METHOD + Defines method to get a block of memry. + + Valid values : + MEM_MALLOC - for platforms that implement malloc and have malloc.h. + MEM_STATIC - to use a static memory array. + MEM_STACK - to allocate the data block on the stack (NYI). +*/ +#ifndef MEM_METHOD +#define MEM_METHOD MEM_STACK +#endif + +/* Configuration : MULTITHREAD + Define for parallel execution + + Valid values : + 1 - only one context (default). + N>1 - will execute N copies in parallel. + + Note : + If this flag is defined to more then 1, an implementation for launching + parallel contexts must be defined. + + Two sample implementations are provided. Use or + to enable them. + + It is valid to have a different implementation of + and in , to fit a particular architecture. +*/ +#ifndef MULTITHREAD +#define MULTITHREAD 1 +#define USE_PTHREAD 0 +#define USE_FORK 0 +#define USE_SOCKET 0 +#endif + +/* Configuration : MAIN_HAS_NOARGC + Needed if platform does not support getting arguments to main. + + Valid values : + 0 - argc/argv to main is supported + 1 - argc/argv to main is not supported + + Note : + This flag only matters if MULTITHREAD has been defined to a value + greater then 1. +*/ +#ifndef MAIN_HAS_NOARGC +#define MAIN_HAS_NOARGC 0 +#endif + +/* Configuration : MAIN_HAS_NORETURN + Needed if platform does not support returning a value from main. + + Valid values : + 0 - main returns an int, and return value will be 0. + 1 - platform does not support returning a value from main +*/ +#ifndef MAIN_HAS_NORETURN +#define MAIN_HAS_NORETURN 0 +#endif + +/* Variable : default_num_contexts + Not used for this simple port, must cintain the value 1. +*/ +extern ee_u32 default_num_contexts; + +typedef struct CORE_PORTABLE_S +{ + ee_u8 portable_id; +} core_portable; + +/* target specific init/fini */ +void portable_init(core_portable *p, int *argc, char *argv[]); +void portable_fini(core_portable *p); + +#if !defined(PROFILE_RUN) && !defined(PERFORMANCE_RUN) \ + && !defined(VALIDATION_RUN) +#if (TOTAL_DATA_SIZE == 1200) +#define PROFILE_RUN 1 +#elif (TOTAL_DATA_SIZE == 2000) +#define PERFORMANCE_RUN 1 +#else +#define VALIDATION_RUN 1 +#endif +#endif + +#endif /* CORE_PORTME_H */ diff --git a/benchmarks/riscv-coremark/coremark/simple/core_portme.mak b/benchmarks/riscv-coremark/coremark/simple/core_portme.mak new file mode 100755 index 000000000..61c3db683 --- /dev/null +++ b/benchmarks/riscv-coremark/coremark/simple/core_portme.mak @@ -0,0 +1,60 @@ +# Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Original Author: Shay Gal-on + +#File : core_portme.mak + +# Flag : OUTFLAG +# Use this flag to define how to to get an executable (e.g -o) +OUTFLAG= -o +# Flag : CC +# Use this flag to define compiler to use +CC = gcc +# Flag : CFLAGS +# Use this flag to define compiler options. Note, you can add compiler options from the command line using XCFLAGS="other flags" +PORT_CFLAGS = -O2 +FLAGS_STR = "$(PORT_CFLAGS) $(XCFLAGS) $(XLFLAGS) $(LFLAGS_END)" +CFLAGS = $(PORT_CFLAGS) -I$(PORT_DIR) -I. -DFLAGS_STR=\"$(FLAGS_STR)\" +#Flag : LFLAGS_END +# Define any libraries needed for linking or other flags that should come at the end of the link line (e.g. linker scripts). +# Note : On certain platforms, the default clock_gettime implementation is supported but requires linking of librt. +LFLAGS_END = +# Flag : PORT_SRCS +# Port specific source files can be added here +PORT_SRCS = $(PORT_DIR)/core_portme.c +# Flag : LOAD +# For a simple port, we assume self hosted compile and run, no load needed. + +# Flag : RUN +# For a simple port, we assume self hosted compile and run, simple invocation of the executable + +#For native compilation and execution +LOAD = echo Loading done +RUN = + +OEXT = .o +EXE = .exe + +# Target : port_pre% and port_post% +# For the purpose of this simple port, no pre or post steps needed. + +.PHONY : port_prebuild port_postbuild port_prerun port_postrun port_preload port_postload +port_pre% port_post% : + +# FLAG : OPATH +# Path to the output folder. Default - current folder. +OPATH = ./ +MKDIR = mkdir -p + diff --git a/benchmarks/riscv-coremark/extraPortmes/README.md b/benchmarks/riscv-coremark/extraPortmes/README.md new file mode 100644 index 000000000..681fc4d8b --- /dev/null +++ b/benchmarks/riscv-coremark/extraPortmes/README.md @@ -0,0 +1,7 @@ +This directory is a backup for the portme files associated with cygwin, linux, and linux64 + +This backup is needed in the event that a user replaces the coremark directory with a clean version +from EEMBC's github page (the clean version does not have the cygwin, linux, +and linux64 files that our version does). + +Please do not delete this directory under any circumstance. \ No newline at end of file diff --git a/benchmarks/riscv-coremark/extraPortmes/cygwin/core_portme.c b/benchmarks/riscv-coremark/extraPortmes/cygwin/core_portme.c new file mode 100755 index 000000000..fe8d29983 --- /dev/null +++ b/benchmarks/riscv-coremark/extraPortmes/cygwin/core_portme.c @@ -0,0 +1,336 @@ +/* +Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +Original Author: Shay Gal-on +*/ + +#include +#include +#include "coremark.h" +#if CALLGRIND_RUN +#include +#endif + +#if (MEM_METHOD==MEM_MALLOC) +#include +/* Function: portable_malloc + Provide malloc() functionality in a platform specific way. +*/ +void *portable_malloc(size_t size) { + return malloc(size); +} +/* Function: portable_free + Provide free() functionality in a platform specific way. +*/ +void portable_free(void *p) { + free(p); +} +#else +void *portable_malloc(size_t size) { + return NULL; +} +void portable_free(void *p) { + p=NULL; +} +#endif + +#if (SEED_METHOD==SEED_VOLATILE) +#if VALIDATION_RUN + volatile ee_s32 seed1_volatile=0x3415; + volatile ee_s32 seed2_volatile=0x3415; + volatile ee_s32 seed3_volatile=0x66; +#endif +#if PERFORMANCE_RUN + volatile ee_s32 seed1_volatile=0x0; + volatile ee_s32 seed2_volatile=0x0; + volatile ee_s32 seed3_volatile=0x66; +#endif +#if PROFILE_RUN + volatile ee_s32 seed1_volatile=0x8; + volatile ee_s32 seed2_volatile=0x8; + volatile ee_s32 seed3_volatile=0x8; +#endif + volatile ee_s32 seed4_volatile=ITERATIONS; + volatile ee_s32 seed5_volatile=0; +#endif +/* Porting: Timing functions + How to capture time and convert to seconds must be ported to whatever is supported by the platform. + e.g. Read value from on board RTC, read value from cpu clock cycles performance counter etc. + Sample implementation for standard time.h and windows.h definitions included. +*/ +/* Define: TIMER_RES_DIVIDER + Divider to trade off timer resolution and total time that can be measured. + + Use lower values to increase resolution, but make sure that overflow does not occur. + If there are issues with the return value overflowing, increase this value. + */ +#if USE_CLOCK + #define NSECS_PER_SEC CLOCKS_PER_SEC + #define EE_TIMER_TICKER_RATE 1000 + #define CORETIMETYPE clock_t + #define GETMYTIME(_t) (*_t=clock()) + #define MYTIMEDIFF(fin,ini) ((fin)-(ini)) + #define TIMER_RES_DIVIDER 1 + #define SAMPLE_TIME_IMPLEMENTATION 1 +#elif defined(_MSC_VER) + #define NSECS_PER_SEC 10000000 + #define EE_TIMER_TICKER_RATE 1000 + #define CORETIMETYPE FILETIME + #define GETMYTIME(_t) GetSystemTimeAsFileTime(_t) + #define MYTIMEDIFF(fin,ini) (((*(__int64*)&fin)-(*(__int64*)&ini))/TIMER_RES_DIVIDER) + /* setting to millisces resolution by default with MSDEV */ + #ifndef TIMER_RES_DIVIDER + #define TIMER_RES_DIVIDER 1000 + #endif + #define SAMPLE_TIME_IMPLEMENTATION 1 +#elif HAS_TIME_H + #define NSECS_PER_SEC 1000000000 + #define EE_TIMER_TICKER_RATE 1000 + #define CORETIMETYPE struct timespec + #define GETMYTIME(_t) clock_gettime(CLOCK_REALTIME,_t) + #define MYTIMEDIFF(fin,ini) ((fin.tv_sec-ini.tv_sec)*(NSECS_PER_SEC/TIMER_RES_DIVIDER)+(fin.tv_nsec-ini.tv_nsec)/TIMER_RES_DIVIDER) + /* setting to 1/1000 of a second resolution by default with linux */ + #ifndef TIMER_RES_DIVIDER + #define TIMER_RES_DIVIDER 1000000 + #endif + #define SAMPLE_TIME_IMPLEMENTATION 1 +#else + #define SAMPLE_TIME_IMPLEMENTATION 0 +#endif +#define EE_TICKS_PER_SEC (NSECS_PER_SEC / TIMER_RES_DIVIDER) + +#if SAMPLE_TIME_IMPLEMENTATION +/** Define Host specific (POSIX), or target specific global time variables. */ +static CORETIMETYPE start_time_val, stop_time_val; + +/* Function: start_time + This function will be called right before starting the timed portion of the benchmark. + + Implementation may be capturing a system timer (as implemented in the example code) + or zeroing some system parameters - e.g. setting the cpu clocks cycles to 0. +*/ +void start_time(void) { + GETMYTIME(&start_time_val ); +#if CALLGRIND_RUN + CALLGRIND_START_INSTRUMENTATION +#endif +#if MICA + asm volatile("int3");/*1 */ +#endif +} +/* Function: stop_time + This function will be called right after ending the timed portion of the benchmark. + + Implementation may be capturing a system timer (as implemented in the example code) + or other system parameters - e.g. reading the current value of cpu cycles counter. +*/ +void stop_time(void) { +#if CALLGRIND_RUN + CALLGRIND_STOP_INSTRUMENTATION +#endif +#if MICA + asm volatile("int3");/*1 */ +#endif + GETMYTIME(&stop_time_val ); +} +/* Function: get_time + Return an abstract "ticks" number that signifies time on the system. + + Actual value returned may be cpu cycles, milliseconds or any other value, + as long as it can be converted to seconds by . + This methodology is taken to accomodate any hardware or simulated platform. + The sample implementation returns millisecs by default, + and the resolution is controlled by +*/ +CORE_TICKS get_time(void) { + CORE_TICKS elapsed=(CORE_TICKS)(MYTIMEDIFF(stop_time_val, start_time_val)); + return elapsed; +} +/* Function: time_in_secs + Convert the value returned by get_time to seconds. + + The type is used to accomodate systems with no support for floating point. + Default implementation implemented by the EE_TICKS_PER_SEC macro above. +*/ +secs_ret time_in_secs(CORE_TICKS ticks) { + secs_ret retval=((secs_ret)ticks) / (secs_ret)EE_TICKS_PER_SEC; + return retval; +} +#else +#error "Please implement timing functionality in core_portme.c" +#endif /* SAMPLE_TIME_IMPLEMENTATION */ + +ee_u32 default_num_contexts=MULTITHREAD; + +/* Function: portable_init + Target specific initialization code + Test for some common mistakes. +*/ +void portable_init(core_portable *p, int *argc, char *argv[]) +{ +#if PRINT_ARGS + int i; + for (i=0; i<*argc; i++) { + ee_printf("Arg[%d]=%s\n",i,argv[i]); + } +#endif + if (sizeof(ee_ptr_int) != sizeof(ee_u8 *)) { + ee_printf("ERROR! Please define ee_ptr_int to a type that holds a pointer!\n"); + } + if (sizeof(ee_u32) != 4) { + ee_printf("ERROR! Please define ee_u32 to a 32b unsigned type!\n"); + } +#if (MAIN_HAS_NOARGC && (SEED_METHOD==SEED_ARG)) + ee_printf("ERROR! Main has no argc, but SEED_METHOD defined to SEED_ARG!\n"); +#endif + +#if (MULTITHREAD>1) && (SEED_METHOD==SEED_ARG) + int nargs=*argc,i; + if ((nargs>1) && (*argv[1]=='M')) { + default_num_contexts=parseval(argv[1]+1); + if (default_num_contexts>MULTITHREAD) + default_num_contexts=MULTITHREAD; + /* Shift args since first arg is directed to the portable part and not to coremark main */ + --nargs; + for (i=1; i*/ + p->portable_id=1; +} +/* Function: portable_fini + Target specific final code +*/ +void portable_fini(core_portable *p) +{ + p->portable_id=0; +} + +#if (MULTITHREAD>1) + +/* Function: core_start_parallel + Start benchmarking in a parallel context. + + Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets. + Other implementations using MCAPI or other standards can easily be devised. +*/ +/* Function: core_stop_parallel + Stop a parallel context execution of coremark, and gather the results. + + Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets. + Other implementations using MCAPI or other standards can easily be devised. +*/ +#if USE_PTHREAD +ee_u8 core_start_parallel(core_results *res) { + return (ee_u8)pthread_create(&(res->port.thread),NULL,iterate,(void *)res); +} +ee_u8 core_stop_parallel(core_results *res) { + void *retval; + return (ee_u8)pthread_join(res->port.thread,&retval); +} +#elif USE_FORK +static int key_id=0; +ee_u8 core_start_parallel(core_results *res) { + key_t key=4321+key_id; + key_id++; + res->port.pid=fork(); + res->port.shmid=shmget(key, 8, IPC_CREAT | 0666); + if (res->port.shmid<0) { + ee_printf("ERROR in shmget!\n"); + } + if (res->port.pid==0) { + iterate(res); + res->port.shm=shmat(res->port.shmid, NULL, 0); + /* copy the validation values to the shared memory area and quit*/ + if (res->port.shm == (char *) -1) { + ee_printf("ERROR in child shmat!\n"); + } else { + memcpy(res->port.shm,&(res->crc),8); + shmdt(res->port.shm); + } + exit(0); + } + return 1; +} +ee_u8 core_stop_parallel(core_results *res) { + int status; + pid_t wpid = waitpid(res->port.pid,&status,WUNTRACED); + if (wpid != res->port.pid) { + ee_printf("ERROR waiting for child.\n"); + if (errno == ECHILD) ee_printf("errno=No such child %d\n",res->port.pid); + if (errno == EINTR) ee_printf("errno=Interrupted\n"); + return 0; + } + /* after process is done, get the values from the shared memory area */ + res->port.shm=shmat(res->port.shmid, NULL, 0); + if (res->port.shm == (char *) -1) { + ee_printf("ERROR in parent shmat!\n"); + return 0; + } + memcpy(&(res->crc),res->port.shm,8); + shmdt(res->port.shm); + return 1; +} +#elif USE_SOCKET +static int key_id=0; +ee_u8 core_start_parallel(core_results *res) { + int bound, buffer_length=8; + res->port.sa.sin_family = AF_INET; + res->port.sa.sin_addr.s_addr = htonl(0x7F000001); + res->port.sa.sin_port = htons(7654+key_id); + key_id++; + res->port.pid=fork(); + if (res->port.pid==0) { /* benchmark child */ + iterate(res); + res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); + if (-1 == res->port.sock) /* if socket failed to initialize, exit */ { + ee_printf("Error Creating Socket"); + } else { + int bytes_sent = sendto(res->port.sock, &(res->crc), buffer_length, 0,(struct sockaddr*)&(res->port.sa), sizeof (struct sockaddr_in)); + if (bytes_sent < 0) + ee_printf("Error sending packet: %s\n", strerror(errno)); + close(res->port.sock); /* close the socket */ + } + exit(0); + } + /* parent process, open the socket */ + res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); + bound = bind(res->port.sock,(struct sockaddr*)&(res->port.sa), sizeof(struct sockaddr)); + if (bound < 0) + ee_printf("bind(): %s\n",strerror(errno)); + return 1; +} +ee_u8 core_stop_parallel(core_results *res) { + int status; + int fromlen=sizeof(struct sockaddr); + int recsize = recvfrom(res->port.sock, &(res->crc), 8, 0, (struct sockaddr*)&(res->port.sa), &fromlen); + if (recsize < 0) { + ee_printf("Error in receive: %s\n", strerror(errno)); + return 0; + } + pid_t wpid = waitpid(res->port.pid,&status,WUNTRACED); + if (wpid != res->port.pid) { + ee_printf("ERROR waiting for child.\n"); + if (errno == ECHILD) ee_printf("errno=No such child %d\n",res->port.pid); + if (errno == EINTR) ee_printf("errno=Interrupted\n"); + return 0; + } + return 1; +} +#else /* no standard multicore implementation */ +#error "Please implement multicore functionality in core_portme.c to use multiple contexts." +#endif /* multithread implementations */ +#endif diff --git a/benchmarks/riscv-coremark/extraPortmes/cygwin/core_portme.h b/benchmarks/riscv-coremark/extraPortmes/cygwin/core_portme.h new file mode 100755 index 000000000..9471b12ec --- /dev/null +++ b/benchmarks/riscv-coremark/extraPortmes/cygwin/core_portme.h @@ -0,0 +1,293 @@ +/* +Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +Original Author: Shay Gal-on +*/ + +/* Topic: Description + This file contains configuration constants required to execute on different platforms +*/ +#ifndef CORE_PORTME_H +#define CORE_PORTME_H +/************************/ +/* Data types and settings */ +/************************/ +/* Configuration: HAS_FLOAT + Define to 1 if the platform supports floating point. +*/ +#ifndef HAS_FLOAT +#define HAS_FLOAT 1 +#endif +/* Configuration: HAS_TIME_H + Define to 1 if platform has the time.h header file, + and implementation of functions thereof. +*/ +#ifndef HAS_TIME_H +#define HAS_TIME_H 1 +#endif +/* Configuration: USE_CLOCK + Define to 1 if platform has the time.h header file, + and implementation of functions thereof. +*/ +#ifndef USE_CLOCK +#define USE_CLOCK 0 +#endif +/* Configuration: HAS_STDIO + Define to 1 if the platform has stdio.h. +*/ +#ifndef HAS_STDIO +#define HAS_STDIO 1 +#endif +/* Configuration: HAS_PRINTF + Define to 1 if the platform has stdio.h and implements the printf function. +*/ +#ifndef HAS_PRINTF +#define HAS_PRINTF 1 +#endif + +/* Configuration: CORE_TICKS + Define type of return from the timing functions. + */ +#if defined(_MSC_VER) +#include +typedef size_t CORE_TICKS; +#elif HAS_TIME_H +#include +typedef clock_t CORE_TICKS; +#else +#error "Please define type of CORE_TICKS and implement start_time, end_time get_time and time_in_secs functions!" +#endif + +/* Definitions: COMPILER_VERSION, COMPILER_FLAGS, MEM_LOCATION + Initialize these strings per platform +*/ +#ifndef COMPILER_VERSION + #ifdef __GNUC__ + #define COMPILER_VERSION "GCC"__VERSION__ + #else + #define COMPILER_VERSION "Please put compiler version here (e.g. gcc 4.1)" + #endif +#endif +#ifndef COMPILER_FLAGS + #define COMPILER_FLAGS FLAGS_STR /* "Please put compiler flags here (e.g. -o3)" */ +#endif +#ifndef MEM_LOCATION + #define MEM_LOCATION "Please put data memory location here\n\t\t\t(e.g. code in flash, data on heap etc)" + #define MEM_LOCATION_UNSPEC 1 +#endif + +/* Data Types: + To avoid compiler issues, define the data types that need ot be used for 8b, 16b and 32b in . + + *Imprtant*: + ee_ptr_int needs to be the data type used to hold pointers, otherwise coremark may fail!!! +*/ +typedef signed short ee_s16; +typedef unsigned short ee_u16; +typedef signed int ee_s32; +typedef double ee_f32; +typedef unsigned char ee_u8; +typedef unsigned int ee_u32; +typedef ee_u32 ee_ptr_int; +typedef size_t ee_size_t; +/* align_mem: + This macro is used to align an offset to point to a 32b value. It is used in the Matrix algorithm to initialize the input memory blocks. +*/ +#define align_mem(x) (void *)(4 + (((ee_ptr_int)(x) - 1) & ~3)) + +/* Configuration: SEED_METHOD + Defines method to get seed values that cannot be computed at compile time. + + Valid values: + SEED_ARG - from command line. + SEED_FUNC - from a system function. + SEED_VOLATILE - from volatile variables. +*/ +#ifndef SEED_METHOD +#define SEED_METHOD SEED_ARG +#endif + +/* Configuration: MEM_METHOD + Defines method to get a block of memry. + + Valid values: + MEM_MALLOC - for platforms that implement malloc and have malloc.h. + MEM_STATIC - to use a static memory array. + MEM_STACK - to allocate the data block on the stack (NYI). +*/ +#ifndef MEM_METHOD +#define MEM_METHOD MEM_MALLOC +#endif + +/* Configuration: MULTITHREAD + Define for parallel execution + + Valid values: + 1 - only one context (default). + N>1 - will execute N copies in parallel. + + Note: + If this flag is defined to more then 1, an implementation for launching parallel contexts must be defined. + + Two sample implementations are provided. Use or to enable them. + + It is valid to have a different implementation of and in , + to fit a particular architecture. +*/ +#ifndef MULTITHREAD +#define MULTITHREAD 1 +#endif + +/* Configuration: USE_PTHREAD + Sample implementation for launching parallel contexts + This implementation uses pthread_thread_create and pthread_join. + + Valid values: + 0 - Do not use pthreads API. + 1 - Use pthreads API + + Note: + This flag only matters if MULTITHREAD has been defined to a value greater then 1. +*/ +#ifndef USE_PTHREAD +#define USE_PTHREAD 0 +#endif + +/* Configuration: USE_FORK + Sample implementation for launching parallel contexts + This implementation uses fork, waitpid, shmget,shmat and shmdt. + + Valid values: + 0 - Do not use fork API. + 1 - Use fork API + + Note: + This flag only matters if MULTITHREAD has been defined to a value greater then 1. +*/ +#ifndef USE_FORK +#define USE_FORK 0 +#endif + +/* Configuration: USE_SOCKET + Sample implementation for launching parallel contexts + This implementation uses fork, socket, sendto and recvfrom + + Valid values: + 0 - Do not use fork and sockets API. + 1 - Use fork and sockets API + + Note: + This flag only matters if MULTITHREAD has been defined to a value greater then 1. +*/ +#ifndef USE_SOCKET +#define USE_SOCKET 0 +#endif + +/* Configuration: MAIN_HAS_NOARGC + Needed if platform does not support getting arguments to main. + + Valid values: + 0 - argc/argv to main is supported + 1 - argc/argv to main is not supported +*/ +#ifndef MAIN_HAS_NOARGC +#define MAIN_HAS_NOARGC 0 +#endif + +/* Configuration: MAIN_HAS_NORETURN + Needed if platform does not support returning a value from main. + + Valid values: + 0 - main returns an int, and return value will be 0. + 1 - platform does not support returning a value from main +*/ +#ifndef MAIN_HAS_NORETURN +#define MAIN_HAS_NORETURN 0 +#endif + +/* Variable: default_num_contexts + Number of contexts to spawn in multicore context. + Override this global value to change number of contexts used. + + Note: + This value may not be set higher then the define. + + To experiment, you can set the define to the highest value expected, and use argc/argv in the to set this value from the command line. +*/ +extern ee_u32 default_num_contexts; + +#if (MULTITHREAD>1) +#if USE_PTHREAD + #include + #define PARALLEL_METHOD "PThreads" +#elif USE_FORK + #include + #include + #include + #include + #include /* for memcpy */ + #define PARALLEL_METHOD "Fork" +#elif USE_SOCKET + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #define PARALLEL_METHOD "Sockets" +#else + #define PARALLEL_METHOD "Proprietary" + #error "Please implement multicore functionality in core_portme.c to use multiple contexts." +#endif /* Method for multithreading */ +#endif /* MULTITHREAD > 1 */ + +typedef struct CORE_PORTABLE_S { +#if (MULTITHREAD>1) + #if USE_PTHREAD + pthread_t thread; + #elif USE_FORK + pid_t pid; + int shmid; + void *shm; + #elif USE_SOCKET + pid_t pid; + int sock; + struct sockaddr_in sa; + #endif /* Method for multithreading */ +#endif /* MULTITHREAD>1 */ + ee_u8 portable_id; +} core_portable; + +/* target specific init/fini */ +void portable_init(core_portable *p, int *argc, char *argv[]); +void portable_fini(core_portable *p); + +#if (SEED_METHOD==SEED_VOLATILE) + #if (VALIDATION_RUN || PERFORMANCE_RUN || PROFILE_RUN) + #define RUN_TYPE_FLAG 1 + #else + #if (TOTAL_DATA_SIZE==1200) + #define PROFILE_RUN 1 + #else + #define PERFORMANCE_RUN 1 + #endif + #endif +#endif /* SEED_METHOD==SEED_VOLATILE */ + +#endif /* CORE_PORTME_H */ diff --git a/benchmarks/riscv-coremark/extraPortmes/cygwin/core_portme.mak b/benchmarks/riscv-coremark/extraPortmes/cygwin/core_portme.mak new file mode 100644 index 000000000..97b6d6ace --- /dev/null +++ b/benchmarks/riscv-coremark/extraPortmes/cygwin/core_portme.mak @@ -0,0 +1,17 @@ +# Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Original Author: Shay Gal-on + +include posix/core_portme.mak diff --git a/benchmarks/riscv-coremark/extraPortmes/linux/core_portme.c b/benchmarks/riscv-coremark/extraPortmes/linux/core_portme.c new file mode 100755 index 000000000..6b63610d1 --- /dev/null +++ b/benchmarks/riscv-coremark/extraPortmes/linux/core_portme.c @@ -0,0 +1,338 @@ +/* +Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +Original Author: Shay Gal-on +*/ + +#include +#include +#include "coremark.h" +#if CALLGRIND_RUN +#include +#endif + +#if (MEM_METHOD==MEM_MALLOC) +#include +/* Function: portable_malloc + Provide malloc() functionality in a platform specific way. +*/ +void *portable_malloc(size_t size) { + return malloc(size); +} +/* Function: portable_free + Provide free() functionality in a platform specific way. +*/ +void portable_free(void *p) { + free(p); +} +#else +void *portable_malloc(size_t size) { + return NULL; +} +void portable_free(void *p) { + p=NULL; +} +#endif + +#if (SEED_METHOD==SEED_VOLATILE) +#if VALIDATION_RUN + volatile ee_s32 seed1_volatile=0x3415; + volatile ee_s32 seed2_volatile=0x3415; + volatile ee_s32 seed3_volatile=0x66; +#endif +#if PERFORMANCE_RUN + volatile ee_s32 seed1_volatile=0x0; + volatile ee_s32 seed2_volatile=0x0; + volatile ee_s32 seed3_volatile=0x66; +#endif +#if PROFILE_RUN + volatile ee_s32 seed1_volatile=0x8; + volatile ee_s32 seed2_volatile=0x8; + volatile ee_s32 seed3_volatile=0x8; +#endif + volatile ee_s32 seed4_volatile=ITERATIONS; + volatile ee_s32 seed5_volatile=0; +#endif +/* Porting: Timing functions + How to capture time and convert to seconds must be ported to whatever is supported by the platform. + e.g. Read value from on board RTC, read value from cpu clock cycles performance counter etc. + Sample implementation for standard time.h and windows.h definitions included. +*/ +/* Define: TIMER_RES_DIVIDER + Divider to trade off timer resolution and total time that can be measured. + + Use lower values to increase resolution, but make sure that overflow does not occur. + If there are issues with the return value overflowing, increase this value. + */ +#if USE_CLOCK + #define NSECS_PER_SEC CLOCKS_PER_SEC + #define EE_TIMER_TICKER_RATE 1000 + #define CORETIMETYPE clock_t + #define GETMYTIME(_t) (*_t=clock()) + #define MYTIMEDIFF(fin,ini) ((fin)-(ini)) + #define TIMER_RES_DIVIDER 1 + #define SAMPLE_TIME_IMPLEMENTATION 1 +#elif defined(_MSC_VER) + #define NSECS_PER_SEC 10000000 + #define EE_TIMER_TICKER_RATE 1000 + #define CORETIMETYPE FILETIME + #define GETMYTIME(_t) GetSystemTimeAsFileTime(_t) + #define MYTIMEDIFF(fin,ini) (((*(__int64*)&fin)-(*(__int64*)&ini))/TIMER_RES_DIVIDER) + /* setting to millisces resolution by default with MSDEV */ + #ifndef TIMER_RES_DIVIDER + #define TIMER_RES_DIVIDER 1000 + #endif + #define SAMPLE_TIME_IMPLEMENTATION 1 +#elif HAS_TIME_H + #define NSECS_PER_SEC 1000000000 + #define EE_TIMER_TICKER_RATE 1000 + #define CORETIMETYPE struct timespec + #define GETMYTIME(_t) clock_gettime(CLOCK_REALTIME,_t) + #define MYTIMEDIFF(fin,ini) ((fin.tv_sec-ini.tv_sec)*(NSECS_PER_SEC/TIMER_RES_DIVIDER)+(fin.tv_nsec-ini.tv_nsec)/TIMER_RES_DIVIDER) + /* setting to 1/1000 of a second resolution by default with linux */ + #ifndef TIMER_RES_DIVIDER + #define TIMER_RES_DIVIDER 1000000 + #endif + #define SAMPLE_TIME_IMPLEMENTATION 1 +#else + #define SAMPLE_TIME_IMPLEMENTATION 0 +#endif +#define EE_TICKS_PER_SEC (NSECS_PER_SEC / TIMER_RES_DIVIDER) + +#if SAMPLE_TIME_IMPLEMENTATION +/** Define Host specific (POSIX), or target specific global time variables. */ +static CORETIMETYPE start_time_val, stop_time_val; + +/* Function: start_time + This function will be called right before starting the timed portion of the benchmark. + + Implementation may be capturing a system timer (as implemented in the example code) + or zeroing some system parameters - e.g. setting the cpu clocks cycles to 0. +*/ +void start_time(void) { + GETMYTIME(&start_time_val ); +#if CALLGRIND_RUN + CALLGRIND_START_INSTRUMENTATION +#endif +#if MICA + asm volatile("int3");/*1 */ +#endif +} +/* Function: stop_time + This function will be called right after ending the timed portion of the benchmark. + + Implementation may be capturing a system timer (as implemented in the example code) + or other system parameters - e.g. reading the current value of cpu cycles counter. +*/ +void stop_time(void) { +#if CALLGRIND_RUN + CALLGRIND_STOP_INSTRUMENTATION +#endif +#if MICA + asm volatile("int3");/*1 */ +#endif + GETMYTIME(&stop_time_val ); +} +/* Function: get_time + Return an abstract "ticks" number that signifies time on the system. + + Actual value returned may be cpu cycles, milliseconds or any other value, + as long as it can be converted to seconds by . + This methodology is taken to accomodate any hardware or simulated platform. + The sample implementation returns millisecs by default, + and the resolution is controlled by +*/ +CORE_TICKS get_time(void) { + CORE_TICKS elapsed=(CORE_TICKS)(MYTIMEDIFF(stop_time_val, start_time_val)); + return elapsed; +} +/* Function: time_in_secs + Convert the value returned by get_time to seconds. + + The type is used to accomodate systems with no support for floating point. + Default implementation implemented by the EE_TICKS_PER_SEC macro above. +*/ +secs_ret time_in_secs(CORE_TICKS ticks) { + secs_ret retval=((secs_ret)ticks) / (secs_ret)EE_TICKS_PER_SEC; + return retval; +} +#else +#error "Please implement timing functionality in core_portme.c" +#endif /* SAMPLE_TIME_IMPLEMENTATION */ + +ee_u32 default_num_contexts=MULTITHREAD; + +/* Function: portable_init + Target specific initialization code + Test for some common mistakes. +*/ +void portable_init(core_portable *p, int *argc, char *argv[]) +{ +#if PRINT_ARGS + int i; + for (i=0; i<*argc; i++) { + ee_printf("Arg[%d]=%s\n",i,argv[i]); + } +#endif + if (sizeof(ee_ptr_int) != sizeof(ee_u8 *)) { + ee_printf("ERROR! Please define ee_ptr_int to a type that holds a pointer!\n"); + } + if (sizeof(ee_u32) != 4) { + ee_printf("ERROR! Please define ee_u32 to a 32b unsigned type!\n"); + } +#if (MAIN_HAS_NOARGC && (SEED_METHOD==SEED_ARG)) + ee_printf("ERROR! Main has no argc, but SEED_METHOD defined to SEED_ARG!\n"); +#endif + +#if (MULTITHREAD>1) && (SEED_METHOD==SEED_ARG) + { + int nargs=*argc,i; + if ((nargs>1) && (*argv[1]=='M')) { + default_num_contexts=parseval(argv[1]+1); + if (default_num_contexts>MULTITHREAD) + default_num_contexts=MULTITHREAD; + /* Shift args since first arg is directed to the portable part and not to coremark main */ + --nargs; + for (i=1; i*/ + p->portable_id=1; +} +/* Function: portable_fini + Target specific final code +*/ +void portable_fini(core_portable *p) +{ + p->portable_id=0; +} + +#if (MULTITHREAD>1) + +/* Function: core_start_parallel + Start benchmarking in a parallel context. + + Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets. + Other implementations using MCAPI or other standards can easily be devised. +*/ +/* Function: core_stop_parallel + Stop a parallel context execution of coremark, and gather the results. + + Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets. + Other implementations using MCAPI or other standards can easily be devised. +*/ +#if USE_PTHREAD +ee_u8 core_start_parallel(core_results *res) { + return (ee_u8)pthread_create(&(res->port.thread),NULL,iterate,(void *)res); +} +ee_u8 core_stop_parallel(core_results *res) { + void *retval; + return (ee_u8)pthread_join(res->port.thread,&retval); +} +#elif USE_FORK +static int key_id=0; +ee_u8 core_start_parallel(core_results *res) { + key_t key=4321+key_id; + key_id++; + res->port.pid=fork(); + res->port.shmid=shmget(key, 8, IPC_CREAT | 0666); + if (res->port.shmid<0) { + ee_printf("ERROR in shmget!\n"); + } + if (res->port.pid==0) { + iterate(res); + res->port.shm=shmat(res->port.shmid, NULL, 0); + /* copy the validation values to the shared memory area and quit*/ + if (res->port.shm == (char *) -1) { + ee_printf("ERROR in child shmat!\n"); + } else { + memcpy(res->port.shm,&(res->crc),8); + shmdt(res->port.shm); + } + exit(0); + } + return 1; +} +ee_u8 core_stop_parallel(core_results *res) { + int status; + pid_t wpid = waitpid(res->port.pid,&status,WUNTRACED); + if (wpid != res->port.pid) { + ee_printf("ERROR waiting for child.\n"); + if (errno == ECHILD) ee_printf("errno=No such child %d\n",res->port.pid); + if (errno == EINTR) ee_printf("errno=Interrupted\n"); + return 0; + } + /* after process is done, get the values from the shared memory area */ + res->port.shm=shmat(res->port.shmid, NULL, 0); + if (res->port.shm == (char *) -1) { + ee_printf("ERROR in parent shmat!\n"); + return 0; + } + memcpy(&(res->crc),res->port.shm,8); + shmdt(res->port.shm); + return 1; +} +#elif USE_SOCKET +static int key_id=0; +ee_u8 core_start_parallel(core_results *res) { + int bound, buffer_length=8; + res->port.sa.sin_family = AF_INET; + res->port.sa.sin_addr.s_addr = htonl(0x7F000001); + res->port.sa.sin_port = htons(7654+key_id); + key_id++; + res->port.pid=fork(); + if (res->port.pid==0) { /* benchmark child */ + iterate(res); + res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); + if (-1 == res->port.sock) /* if socket failed to initialize, exit */ { + ee_printf("Error Creating Socket"); + } else { + int bytes_sent = sendto(res->port.sock, &(res->crc), buffer_length, 0,(struct sockaddr*)&(res->port.sa), sizeof (struct sockaddr_in)); + if (bytes_sent < 0) + ee_printf("Error sending packet: %s\n", strerror(errno)); + close(res->port.sock); /* close the socket */ + } + exit(0); + } + /* parent process, open the socket */ + res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); + bound = bind(res->port.sock,(struct sockaddr*)&(res->port.sa), sizeof(struct sockaddr)); + if (bound < 0) + ee_printf("bind(): %s\n",strerror(errno)); + return 1; +} +ee_u8 core_stop_parallel(core_results *res) { + int status; + int fromlen=sizeof(struct sockaddr); + int recsize = recvfrom(res->port.sock, &(res->crc), 8, 0, (struct sockaddr*)&(res->port.sa), &fromlen); + if (recsize < 0) { + ee_printf("Error in receive: %s\n", strerror(errno)); + return 0; + } + pid_t wpid = waitpid(res->port.pid,&status,WUNTRACED); + if (wpid != res->port.pid) { + ee_printf("ERROR waiting for child.\n"); + if (errno == ECHILD) ee_printf("errno=No such child %d\n",res->port.pid); + if (errno == EINTR) ee_printf("errno=Interrupted\n"); + return 0; + } + return 1; +} +#else /* no standard multicore implementation */ +#error "Please implement multicore functionality in core_portme.c to use multiple contexts." +#endif /* multithread implementations */ +#endif diff --git a/benchmarks/riscv-coremark/extraPortmes/linux/core_portme.h b/benchmarks/riscv-coremark/extraPortmes/linux/core_portme.h new file mode 100755 index 000000000..2cf4659a4 --- /dev/null +++ b/benchmarks/riscv-coremark/extraPortmes/linux/core_portme.h @@ -0,0 +1,290 @@ +/* +Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +Original Author: Shay Gal-on +*/ + +#ifndef CORE_PORTME_H +#define CORE_PORTME_H +/************************/ +/* Data types and settings */ +/************************/ +/* Configuration: HAS_FLOAT + Define to 1 if the platform supports floating point. +*/ +#ifndef HAS_FLOAT +#define HAS_FLOAT 1 +#endif +/* Configuration: HAS_TIME_H + Define to 1 if platform has the time.h header file, + and implementation of functions thereof. +*/ +#ifndef HAS_TIME_H +#define HAS_TIME_H 1 +#endif +/* Configuration: USE_CLOCK + Define to 1 if platform has the time.h header file, + and implementation of functions thereof. +*/ +#ifndef USE_CLOCK +#define USE_CLOCK 0 +#endif +/* Configuration: HAS_STDIO + Define to 1 if the platform has stdio.h. +*/ +#ifndef HAS_STDIO +#define HAS_STDIO 1 +#endif +/* Configuration: HAS_PRINTF + Define to 1 if the platform has stdio.h and implements the printf function. +*/ +#ifndef HAS_PRINTF +#define HAS_PRINTF 1 +#endif + +/* Configuration: CORE_TICKS + Define type of return from the timing functions. + */ +#if defined(_MSC_VER) +#include +typedef size_t CORE_TICKS; +#elif HAS_TIME_H +#include +typedef clock_t CORE_TICKS; +#else +#error "Please define type of CORE_TICKS and implement start_time, end_time get_time and time_in_secs functions!" +#endif + +/* Definitions: COMPILER_VERSION, COMPILER_FLAGS, MEM_LOCATION + Initialize these strings per platform +*/ +#ifndef COMPILER_VERSION + #ifdef __GNUC__ + #define COMPILER_VERSION "GCC"__VERSION__ + #else + #define COMPILER_VERSION "Please put compiler version here (e.g. gcc 4.1)" + #endif +#endif +#ifndef COMPILER_FLAGS + #define COMPILER_FLAGS FLAGS_STR /* "Please put compiler flags here (e.g. -o3)" */ +#endif +#ifndef MEM_LOCATION + #define MEM_LOCATION "Please put data memory location here\n\t\t\t(e.g. code in flash, data on heap etc)" + #define MEM_LOCATION_UNSPEC 1 +#endif + +/* Data Types: + To avoid compiler issues, define the data types that need ot be used for 8b, 16b and 32b in . + + *Imprtant*: + ee_ptr_int needs to be the data type used to hold pointers, otherwise coremark may fail!!! +*/ +typedef signed short ee_s16; +typedef unsigned short ee_u16; +typedef signed int ee_s32; +typedef double ee_f32; +typedef unsigned char ee_u8; +typedef unsigned int ee_u32; +typedef ee_u32 ee_ptr_int; +typedef size_t ee_size_t; +/* align_mem: + This macro is used to align an offset to point to a 32b value. It is used in the Matrix algorithm to initialize the input memory blocks. +*/ +#define align_mem(x) (void *)(4 + (((ee_ptr_int)(x) - 1) & ~3)) + +/* Configuration: SEED_METHOD + Defines method to get seed values that cannot be computed at compile time. + + Valid values: + SEED_ARG - from command line. + SEED_FUNC - from a system function. + SEED_VOLATILE - from volatile variables. +*/ +#ifndef SEED_METHOD +#define SEED_METHOD SEED_ARG +#endif + +/* Configuration: MEM_METHOD + Defines method to get a block of memry. + + Valid values: + MEM_MALLOC - for platforms that implement malloc and have malloc.h. + MEM_STATIC - to use a static memory array. + MEM_STACK - to allocate the data block on the stack (NYI). +*/ +#ifndef MEM_METHOD +#define MEM_METHOD MEM_MALLOC +#endif + +/* Configuration: MULTITHREAD + Define for parallel execution + + Valid values: + 1 - only one context (default). + N>1 - will execute N copies in parallel. + + Note: + If this flag is defined to more then 1, an implementation for launching parallel contexts must be defined. + + Two sample implementations are provided. Use or to enable them. + + It is valid to have a different implementation of and in , + to fit a particular architecture. +*/ +#ifndef MULTITHREAD +#define MULTITHREAD 1 +#endif + +/* Configuration: USE_PTHREAD + Sample implementation for launching parallel contexts + This implementation uses pthread_thread_create and pthread_join. + + Valid values: + 0 - Do not use pthreads API. + 1 - Use pthreads API + + Note: + This flag only matters if MULTITHREAD has been defined to a value greater then 1. +*/ +#ifndef USE_PTHREAD +#define USE_PTHREAD 0 +#endif + +/* Configuration: USE_FORK + Sample implementation for launching parallel contexts + This implementation uses fork, waitpid, shmget,shmat and shmdt. + + Valid values: + 0 - Do not use fork API. + 1 - Use fork API + + Note: + This flag only matters if MULTITHREAD has been defined to a value greater then 1. +*/ +#ifndef USE_FORK +#define USE_FORK 0 +#endif + +/* Configuration: USE_SOCKET + Sample implementation for launching parallel contexts + This implementation uses fork, socket, sendto and recvfrom + + Valid values: + 0 - Do not use fork and sockets API. + 1 - Use fork and sockets API + + Note: + This flag only matters if MULTITHREAD has been defined to a value greater then 1. +*/ +#ifndef USE_SOCKET +#define USE_SOCKET 0 +#endif + +/* Configuration: MAIN_HAS_NOARGC + Needed if platform does not support getting arguments to main. + + Valid values: + 0 - argc/argv to main is supported + 1 - argc/argv to main is not supported +*/ +#ifndef MAIN_HAS_NOARGC +#define MAIN_HAS_NOARGC 0 +#endif + +/* Configuration: MAIN_HAS_NORETURN + Needed if platform does not support returning a value from main. + + Valid values: + 0 - main returns an int, and return value will be 0. + 1 - platform does not support returning a value from main +*/ +#ifndef MAIN_HAS_NORETURN +#define MAIN_HAS_NORETURN 0 +#endif + +/* Variable: default_num_contexts + Number of contexts to spawn in multicore context. + Override this global value to change number of contexts used. + + Note: + This value may not be set higher then the define. + + To experiment, you can set the define to the highest value expected, and use argc/argv in the to set this value from the command line. +*/ +extern ee_u32 default_num_contexts; + +#if (MULTITHREAD>1) +#if USE_PTHREAD + #include + #define PARALLEL_METHOD "PThreads" +#elif USE_FORK + #include + #include + #include + #include + #include /* for memcpy */ + #define PARALLEL_METHOD "Fork" +#elif USE_SOCKET + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #define PARALLEL_METHOD "Sockets" +#else + #define PARALLEL_METHOD "Proprietary" + #error "Please implement multicore functionality in core_portme.c to use multiple contexts." +#endif /* Method for multithreading */ +#endif /* MULTITHREAD > 1 */ + +typedef struct CORE_PORTABLE_S { +#if (MULTITHREAD>1) + #if USE_PTHREAD + pthread_t thread; + #elif USE_FORK + pid_t pid; + int shmid; + void *shm; + #elif USE_SOCKET + pid_t pid; + int sock; + struct sockaddr_in sa; + #endif /* Method for multithreading */ +#endif /* MULTITHREAD>1 */ + ee_u8 portable_id; +} core_portable; + +/* target specific init/fini */ +void portable_init(core_portable *p, int *argc, char *argv[]); +void portable_fini(core_portable *p); + +#if (SEED_METHOD==SEED_VOLATILE) + #if (VALIDATION_RUN || PERFORMANCE_RUN || PROFILE_RUN) + #define RUN_TYPE_FLAG 1 + #else + #if (TOTAL_DATA_SIZE==1200) + #define PROFILE_RUN 1 + #else + #define PERFORMANCE_RUN 1 + #endif + #endif +#endif /* SEED_METHOD==SEED_VOLATILE */ + +#endif /* CORE_PORTME_H */ diff --git a/benchmarks/riscv-coremark/extraPortmes/linux/core_portme.mak b/benchmarks/riscv-coremark/extraPortmes/linux/core_portme.mak new file mode 100644 index 000000000..97b6d6ace --- /dev/null +++ b/benchmarks/riscv-coremark/extraPortmes/linux/core_portme.mak @@ -0,0 +1,17 @@ +# Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Original Author: Shay Gal-on + +include posix/core_portme.mak diff --git a/benchmarks/riscv-coremark/extraPortmes/linux64/core_portme.c b/benchmarks/riscv-coremark/extraPortmes/linux64/core_portme.c new file mode 100755 index 000000000..fe8d29983 --- /dev/null +++ b/benchmarks/riscv-coremark/extraPortmes/linux64/core_portme.c @@ -0,0 +1,336 @@ +/* +Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +Original Author: Shay Gal-on +*/ + +#include +#include +#include "coremark.h" +#if CALLGRIND_RUN +#include +#endif + +#if (MEM_METHOD==MEM_MALLOC) +#include +/* Function: portable_malloc + Provide malloc() functionality in a platform specific way. +*/ +void *portable_malloc(size_t size) { + return malloc(size); +} +/* Function: portable_free + Provide free() functionality in a platform specific way. +*/ +void portable_free(void *p) { + free(p); +} +#else +void *portable_malloc(size_t size) { + return NULL; +} +void portable_free(void *p) { + p=NULL; +} +#endif + +#if (SEED_METHOD==SEED_VOLATILE) +#if VALIDATION_RUN + volatile ee_s32 seed1_volatile=0x3415; + volatile ee_s32 seed2_volatile=0x3415; + volatile ee_s32 seed3_volatile=0x66; +#endif +#if PERFORMANCE_RUN + volatile ee_s32 seed1_volatile=0x0; + volatile ee_s32 seed2_volatile=0x0; + volatile ee_s32 seed3_volatile=0x66; +#endif +#if PROFILE_RUN + volatile ee_s32 seed1_volatile=0x8; + volatile ee_s32 seed2_volatile=0x8; + volatile ee_s32 seed3_volatile=0x8; +#endif + volatile ee_s32 seed4_volatile=ITERATIONS; + volatile ee_s32 seed5_volatile=0; +#endif +/* Porting: Timing functions + How to capture time and convert to seconds must be ported to whatever is supported by the platform. + e.g. Read value from on board RTC, read value from cpu clock cycles performance counter etc. + Sample implementation for standard time.h and windows.h definitions included. +*/ +/* Define: TIMER_RES_DIVIDER + Divider to trade off timer resolution and total time that can be measured. + + Use lower values to increase resolution, but make sure that overflow does not occur. + If there are issues with the return value overflowing, increase this value. + */ +#if USE_CLOCK + #define NSECS_PER_SEC CLOCKS_PER_SEC + #define EE_TIMER_TICKER_RATE 1000 + #define CORETIMETYPE clock_t + #define GETMYTIME(_t) (*_t=clock()) + #define MYTIMEDIFF(fin,ini) ((fin)-(ini)) + #define TIMER_RES_DIVIDER 1 + #define SAMPLE_TIME_IMPLEMENTATION 1 +#elif defined(_MSC_VER) + #define NSECS_PER_SEC 10000000 + #define EE_TIMER_TICKER_RATE 1000 + #define CORETIMETYPE FILETIME + #define GETMYTIME(_t) GetSystemTimeAsFileTime(_t) + #define MYTIMEDIFF(fin,ini) (((*(__int64*)&fin)-(*(__int64*)&ini))/TIMER_RES_DIVIDER) + /* setting to millisces resolution by default with MSDEV */ + #ifndef TIMER_RES_DIVIDER + #define TIMER_RES_DIVIDER 1000 + #endif + #define SAMPLE_TIME_IMPLEMENTATION 1 +#elif HAS_TIME_H + #define NSECS_PER_SEC 1000000000 + #define EE_TIMER_TICKER_RATE 1000 + #define CORETIMETYPE struct timespec + #define GETMYTIME(_t) clock_gettime(CLOCK_REALTIME,_t) + #define MYTIMEDIFF(fin,ini) ((fin.tv_sec-ini.tv_sec)*(NSECS_PER_SEC/TIMER_RES_DIVIDER)+(fin.tv_nsec-ini.tv_nsec)/TIMER_RES_DIVIDER) + /* setting to 1/1000 of a second resolution by default with linux */ + #ifndef TIMER_RES_DIVIDER + #define TIMER_RES_DIVIDER 1000000 + #endif + #define SAMPLE_TIME_IMPLEMENTATION 1 +#else + #define SAMPLE_TIME_IMPLEMENTATION 0 +#endif +#define EE_TICKS_PER_SEC (NSECS_PER_SEC / TIMER_RES_DIVIDER) + +#if SAMPLE_TIME_IMPLEMENTATION +/** Define Host specific (POSIX), or target specific global time variables. */ +static CORETIMETYPE start_time_val, stop_time_val; + +/* Function: start_time + This function will be called right before starting the timed portion of the benchmark. + + Implementation may be capturing a system timer (as implemented in the example code) + or zeroing some system parameters - e.g. setting the cpu clocks cycles to 0. +*/ +void start_time(void) { + GETMYTIME(&start_time_val ); +#if CALLGRIND_RUN + CALLGRIND_START_INSTRUMENTATION +#endif +#if MICA + asm volatile("int3");/*1 */ +#endif +} +/* Function: stop_time + This function will be called right after ending the timed portion of the benchmark. + + Implementation may be capturing a system timer (as implemented in the example code) + or other system parameters - e.g. reading the current value of cpu cycles counter. +*/ +void stop_time(void) { +#if CALLGRIND_RUN + CALLGRIND_STOP_INSTRUMENTATION +#endif +#if MICA + asm volatile("int3");/*1 */ +#endif + GETMYTIME(&stop_time_val ); +} +/* Function: get_time + Return an abstract "ticks" number that signifies time on the system. + + Actual value returned may be cpu cycles, milliseconds or any other value, + as long as it can be converted to seconds by . + This methodology is taken to accomodate any hardware or simulated platform. + The sample implementation returns millisecs by default, + and the resolution is controlled by +*/ +CORE_TICKS get_time(void) { + CORE_TICKS elapsed=(CORE_TICKS)(MYTIMEDIFF(stop_time_val, start_time_val)); + return elapsed; +} +/* Function: time_in_secs + Convert the value returned by get_time to seconds. + + The type is used to accomodate systems with no support for floating point. + Default implementation implemented by the EE_TICKS_PER_SEC macro above. +*/ +secs_ret time_in_secs(CORE_TICKS ticks) { + secs_ret retval=((secs_ret)ticks) / (secs_ret)EE_TICKS_PER_SEC; + return retval; +} +#else +#error "Please implement timing functionality in core_portme.c" +#endif /* SAMPLE_TIME_IMPLEMENTATION */ + +ee_u32 default_num_contexts=MULTITHREAD; + +/* Function: portable_init + Target specific initialization code + Test for some common mistakes. +*/ +void portable_init(core_portable *p, int *argc, char *argv[]) +{ +#if PRINT_ARGS + int i; + for (i=0; i<*argc; i++) { + ee_printf("Arg[%d]=%s\n",i,argv[i]); + } +#endif + if (sizeof(ee_ptr_int) != sizeof(ee_u8 *)) { + ee_printf("ERROR! Please define ee_ptr_int to a type that holds a pointer!\n"); + } + if (sizeof(ee_u32) != 4) { + ee_printf("ERROR! Please define ee_u32 to a 32b unsigned type!\n"); + } +#if (MAIN_HAS_NOARGC && (SEED_METHOD==SEED_ARG)) + ee_printf("ERROR! Main has no argc, but SEED_METHOD defined to SEED_ARG!\n"); +#endif + +#if (MULTITHREAD>1) && (SEED_METHOD==SEED_ARG) + int nargs=*argc,i; + if ((nargs>1) && (*argv[1]=='M')) { + default_num_contexts=parseval(argv[1]+1); + if (default_num_contexts>MULTITHREAD) + default_num_contexts=MULTITHREAD; + /* Shift args since first arg is directed to the portable part and not to coremark main */ + --nargs; + for (i=1; i*/ + p->portable_id=1; +} +/* Function: portable_fini + Target specific final code +*/ +void portable_fini(core_portable *p) +{ + p->portable_id=0; +} + +#if (MULTITHREAD>1) + +/* Function: core_start_parallel + Start benchmarking in a parallel context. + + Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets. + Other implementations using MCAPI or other standards can easily be devised. +*/ +/* Function: core_stop_parallel + Stop a parallel context execution of coremark, and gather the results. + + Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets. + Other implementations using MCAPI or other standards can easily be devised. +*/ +#if USE_PTHREAD +ee_u8 core_start_parallel(core_results *res) { + return (ee_u8)pthread_create(&(res->port.thread),NULL,iterate,(void *)res); +} +ee_u8 core_stop_parallel(core_results *res) { + void *retval; + return (ee_u8)pthread_join(res->port.thread,&retval); +} +#elif USE_FORK +static int key_id=0; +ee_u8 core_start_parallel(core_results *res) { + key_t key=4321+key_id; + key_id++; + res->port.pid=fork(); + res->port.shmid=shmget(key, 8, IPC_CREAT | 0666); + if (res->port.shmid<0) { + ee_printf("ERROR in shmget!\n"); + } + if (res->port.pid==0) { + iterate(res); + res->port.shm=shmat(res->port.shmid, NULL, 0); + /* copy the validation values to the shared memory area and quit*/ + if (res->port.shm == (char *) -1) { + ee_printf("ERROR in child shmat!\n"); + } else { + memcpy(res->port.shm,&(res->crc),8); + shmdt(res->port.shm); + } + exit(0); + } + return 1; +} +ee_u8 core_stop_parallel(core_results *res) { + int status; + pid_t wpid = waitpid(res->port.pid,&status,WUNTRACED); + if (wpid != res->port.pid) { + ee_printf("ERROR waiting for child.\n"); + if (errno == ECHILD) ee_printf("errno=No such child %d\n",res->port.pid); + if (errno == EINTR) ee_printf("errno=Interrupted\n"); + return 0; + } + /* after process is done, get the values from the shared memory area */ + res->port.shm=shmat(res->port.shmid, NULL, 0); + if (res->port.shm == (char *) -1) { + ee_printf("ERROR in parent shmat!\n"); + return 0; + } + memcpy(&(res->crc),res->port.shm,8); + shmdt(res->port.shm); + return 1; +} +#elif USE_SOCKET +static int key_id=0; +ee_u8 core_start_parallel(core_results *res) { + int bound, buffer_length=8; + res->port.sa.sin_family = AF_INET; + res->port.sa.sin_addr.s_addr = htonl(0x7F000001); + res->port.sa.sin_port = htons(7654+key_id); + key_id++; + res->port.pid=fork(); + if (res->port.pid==0) { /* benchmark child */ + iterate(res); + res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); + if (-1 == res->port.sock) /* if socket failed to initialize, exit */ { + ee_printf("Error Creating Socket"); + } else { + int bytes_sent = sendto(res->port.sock, &(res->crc), buffer_length, 0,(struct sockaddr*)&(res->port.sa), sizeof (struct sockaddr_in)); + if (bytes_sent < 0) + ee_printf("Error sending packet: %s\n", strerror(errno)); + close(res->port.sock); /* close the socket */ + } + exit(0); + } + /* parent process, open the socket */ + res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); + bound = bind(res->port.sock,(struct sockaddr*)&(res->port.sa), sizeof(struct sockaddr)); + if (bound < 0) + ee_printf("bind(): %s\n",strerror(errno)); + return 1; +} +ee_u8 core_stop_parallel(core_results *res) { + int status; + int fromlen=sizeof(struct sockaddr); + int recsize = recvfrom(res->port.sock, &(res->crc), 8, 0, (struct sockaddr*)&(res->port.sa), &fromlen); + if (recsize < 0) { + ee_printf("Error in receive: %s\n", strerror(errno)); + return 0; + } + pid_t wpid = waitpid(res->port.pid,&status,WUNTRACED); + if (wpid != res->port.pid) { + ee_printf("ERROR waiting for child.\n"); + if (errno == ECHILD) ee_printf("errno=No such child %d\n",res->port.pid); + if (errno == EINTR) ee_printf("errno=Interrupted\n"); + return 0; + } + return 1; +} +#else /* no standard multicore implementation */ +#error "Please implement multicore functionality in core_portme.c to use multiple contexts." +#endif /* multithread implementations */ +#endif diff --git a/benchmarks/riscv-coremark/extraPortmes/linux64/core_portme.h b/benchmarks/riscv-coremark/extraPortmes/linux64/core_portme.h new file mode 100755 index 000000000..1228a679b --- /dev/null +++ b/benchmarks/riscv-coremark/extraPortmes/linux64/core_portme.h @@ -0,0 +1,291 @@ +/* +Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +Original Author: Shay Gal-on +*/ + +/* Topic: Description + This file contains configuration constants required to execute on different platforms +*/ +#ifndef CORE_PORTME_H +#define CORE_PORTME_H +/************************/ +/* Data types and settings */ +/************************/ +/* Configuration: HAS_FLOAT + Define to 1 if the platform supports floating point. +*/ +#ifndef HAS_FLOAT +#define HAS_FLOAT 1 +#endif +/* Configuration: HAS_TIME_H + Define to 1 if platform has the time.h header file, + and implementation of functions thereof. +*/ +#ifndef HAS_TIME_H +#define HAS_TIME_H 1 +#endif +/* Configuration: USE_CLOCK + Define to 1 if platform has the time.h header file, + and implementation of functions thereof. +*/ +#ifndef USE_CLOCK +#define USE_CLOCK 0 +#endif +/* Configuration: HAS_STDIO + Define to 1 if the platform has stdio.h. +*/ +#ifndef HAS_STDIO +#define HAS_STDIO 1 +#endif +/* Configuration: HAS_PRINTF + Define to 1 if the platform has stdio.h and implements the printf function. +*/ +#ifndef HAS_PRINTF +#define HAS_PRINTF 1 +#endif + +/* Configuration: CORE_TICKS + Define type of return from the timing functions. + */ +#if defined(_MSC_VER) +#include +typedef size_t CORE_TICKS; +#elif HAS_TIME_H +#include +typedef clock_t CORE_TICKS; +#else +#error "Please define type of CORE_TICKS and implement start_time, end_time get_time and time_in_secs functions!" +#endif + +/* Definitions: COMPILER_VERSION, COMPILER_FLAGS, MEM_LOCATION + Initialize these strings per platform +*/ +#ifndef COMPILER_VERSION + #ifdef __GNUC__ + #define COMPILER_VERSION "GCC"__VERSION__ + #else + #define COMPILER_VERSION "Please put compiler version here (e.g. gcc 4.1)" + #endif +#endif +#ifndef COMPILER_FLAGS + #define COMPILER_FLAGS FLAGS_STR /* "Please put compiler flags here (e.g. -o3)" */ +#endif +#ifndef MEM_LOCATION + #define MEM_LOCATION "Please put data memory location here\n\t\t\t(e.g. code in flash, data on heap etc)" + #define MEM_LOCATION_UNSPEC 1 +#endif + +/* Data Types: + To avoid compiler issues, define the data types that need ot be used for 8b, 16b and 32b in . + + *Imprtant*: + ee_ptr_int needs to be the data type used to hold pointers, otherwise coremark may fail!!! +*/ +typedef signed short ee_s16; +typedef unsigned short ee_u16; +typedef signed int ee_s32; +typedef double ee_f32; +typedef unsigned char ee_u8; +typedef unsigned int ee_u32; +typedef unsigned long long ee_ptr_int; +typedef size_t ee_size_t; +/* align an offset to point to a 32b value */ +#define align_mem(x) (void *)(4 + (((ee_ptr_int)(x) - 1) & ~3)) + +/* Configuration: SEED_METHOD + Defines method to get seed values that cannot be computed at compile time. + + Valid values: + SEED_ARG - from command line. + SEED_FUNC - from a system function. + SEED_VOLATILE - from volatile variables. +*/ +#ifndef SEED_METHOD +#define SEED_METHOD SEED_ARG +#endif + +/* Configuration: MEM_METHOD + Defines method to get a block of memry. + + Valid values: + MEM_MALLOC - for platforms that implement malloc and have malloc.h. + MEM_STATIC - to use a static memory array. + MEM_STACK - to allocate the data block on the stack (NYI). +*/ +#ifndef MEM_METHOD +#define MEM_METHOD MEM_MALLOC +#endif + +/* Configuration: MULTITHREAD + Define for parallel execution + + Valid values: + 1 - only one context (default). + N>1 - will execute N copies in parallel. + + Note: + If this flag is defined to more then 1, an implementation for launching parallel contexts must be defined. + + Two sample implementations are provided. Use or to enable them. + + It is valid to have a different implementation of and in , + to fit a particular architecture. +*/ +#ifndef MULTITHREAD +#define MULTITHREAD 1 +#endif + +/* Configuration: USE_PTHREAD + Sample implementation for launching parallel contexts + This implementation uses pthread_thread_create and pthread_join. + + Valid values: + 0 - Do not use pthreads API. + 1 - Use pthreads API + + Note: + This flag only matters if MULTITHREAD has been defined to a value greater then 1. +*/ +#ifndef USE_PTHREAD +#define USE_PTHREAD 0 +#endif + +/* Configuration: USE_FORK + Sample implementation for launching parallel contexts + This implementation uses fork, waitpid, shmget,shmat and shmdt. + + Valid values: + 0 - Do not use fork API. + 1 - Use fork API + + Note: + This flag only matters if MULTITHREAD has been defined to a value greater then 1. +*/ +#ifndef USE_FORK +#define USE_FORK 0 +#endif + +/* Configuration: USE_SOCKET + Sample implementation for launching parallel contexts + This implementation uses fork, socket, sendto and recvfrom + + Valid values: + 0 - Do not use fork and sockets API. + 1 - Use fork and sockets API + + Note: + This flag only matters if MULTITHREAD has been defined to a value greater then 1. +*/ +#ifndef USE_SOCKET +#define USE_SOCKET 0 +#endif + +/* Configuration: MAIN_HAS_NOARGC + Needed if platform does not support getting arguments to main. + + Valid values: + 0 - argc/argv to main is supported + 1 - argc/argv to main is not supported +*/ +#ifndef MAIN_HAS_NOARGC +#define MAIN_HAS_NOARGC 0 +#endif + +/* Configuration: MAIN_HAS_NORETURN + Needed if platform does not support returning a value from main. + + Valid values: + 0 - main returns an int, and return value will be 0. + 1 - platform does not support returning a value from main +*/ +#ifndef MAIN_HAS_NORETURN +#define MAIN_HAS_NORETURN 0 +#endif + +/* Variable: default_num_contexts + Number of contexts to spawn in multicore context. + Override this global value to change number of contexts used. + + Note: + This value may not be set higher then the define. + + To experiment, you can set the define to the highest value expected, and use argc/argv in the to set this value from the command line. +*/ +extern ee_u32 default_num_contexts; + +#if (MULTITHREAD>1) +#if USE_PTHREAD + #include + #define PARALLEL_METHOD "PThreads" +#elif USE_FORK + #include + #include + #include + #include + #include /* for memcpy */ + #define PARALLEL_METHOD "Fork" +#elif USE_SOCKET + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #define PARALLEL_METHOD "Sockets" +#else + #define PARALLEL_METHOD "Proprietary" + #error "Please implement multicore functionality in core_portme.c to use multiple contexts." +#endif /* Method for multithreading */ +#endif /* MULTITHREAD > 1 */ + +typedef struct CORE_PORTABLE_S { +#if (MULTITHREAD>1) + #if USE_PTHREAD + pthread_t thread; + #elif USE_FORK + pid_t pid; + int shmid; + void *shm; + #elif USE_SOCKET + pid_t pid; + int sock; + struct sockaddr_in sa; + #endif /* Method for multithreading */ +#endif /* MULTITHREAD>1 */ + ee_u8 portable_id; +} core_portable; + +/* target specific init/fini */ +void portable_init(core_portable *p, int *argc, char *argv[]); +void portable_fini(core_portable *p); + +#if (SEED_METHOD==SEED_VOLATILE) + #if (VALIDATION_RUN || PERFORMANCE_RUN || PROFILE_RUN) + #define RUN_TYPE_FLAG 1 + #else + #if (TOTAL_DATA_SIZE==1200) + #define PROFILE_RUN 1 + #else + #define PERFORMANCE_RUN 1 + #endif + #endif +#endif /* SEED_METHOD==SEED_VOLATILE */ + +#endif /* CORE_PORTME_H */ diff --git a/benchmarks/riscv-coremark/extraPortmes/linux64/core_portme.mak b/benchmarks/riscv-coremark/extraPortmes/linux64/core_portme.mak new file mode 100755 index 000000000..5cfabee32 --- /dev/null +++ b/benchmarks/riscv-coremark/extraPortmes/linux64/core_portme.mak @@ -0,0 +1,140 @@ +# Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Original Author: Shay Gal-on + +#File: core_portme.mak + +# Flag: OUTFLAG +# Use this flag to define how to to get an executable (e.g -o) +OUTFLAG= -o +# Flag: CC +# Use this flag to define compiler to use +CC = gcc +# Flag: CFLAGS +# Use this flag to define compiler options. Note, you can add compiler options from the command line using XCFLAGS="other flags" +PORT_CFLAGS = -O2 +FLAGS_STR = "$(PORT_CFLAGS) $(XCFLAGS) $(XLFLAGS) $(LFLAGS_END)" +CFLAGS = $(PORT_CFLAGS) -I$(PORT_DIR) -I. -DFLAGS_STR=\"$(FLAGS_STR)\" +#Flag: LFLAGS_END +# Define any libraries needed for linking or other flags that should come at the end of the link line (e.g. linker scripts). +# Note: On certain platforms, the default clock_gettime implementation is supported but requires linking of librt. +LFLAGS_END += -lrt +# Flag: PORT_SRCS +# Port specific source files can be added here +PORT_SRCS = $(PORT_DIR)/core_portme.c +# Flag: LOAD +# Define this flag if you need to load to a target, as in a cross compile environment. + +# Flag: RUN +# Define this flag if running does not consist of simple invocation of the binary. +# In a cross compile environment, you need to define this. + +#For flashing and using a tera term macro, you could use +#LOAD = flash ADDR +#RUN = ttpmacro coremark.ttl + +#For copying to target and executing via SSH connection, you could use +#LOAD = scp $(OUTFILE) user@target:~ +#RUN = ssh user@target -c + +#For native compilation and execution +LOAD = echo Loading done +RUN = + +OEXT = .o +EXE = .exe + +# Flag: SEPARATE_COMPILE +# Define if you need to separate compilation from link stage. +# In this case, you also need to define below how to create an object file, and how to link. +ifdef SEPARATE_COMPILE + +LD = gcc +OBJOUT = -o +LFLAGS = +OFLAG = -o +COUT = -c +# Flag: PORT_OBJS +# Port specific object files can be added here +PORT_OBJS = $(PORT_DIR)/core_portme$(OEXT) +PORT_CLEAN = *$(OEXT) + +$(OPATH)%$(OEXT) : %.c + $(CC) $(CFLAGS) $(XCFLAGS) $(COUT) $< $(OBJOUT) $@ + +endif + +# Target: port_prebuild +# Generate any files that are needed before actual build starts. +# E.g. generate profile guidance files. Sample PGO generation for gcc enabled with PGO=1 +# - First, check if PGO was defined on the command line, if so, need to add -fprofile-use to compile line. +# - Second, if PGO reference has not yet been generated, add a step to the prebuild that will build a profile-generate version and run it. +# Note - Using REBUILD=1 +# +# Use make PGO=1 to invoke this sample processing. + +ifdef PGO + ifeq (,$(findstring $(PGO),gen)) + PGO_STAGE=build_pgo_gcc + CFLAGS+=-fprofile-use + endif + PORT_CLEAN+=*.gcda *.gcno gmon.out +endif + +.PHONY: port_prebuild +port_prebuild: $(PGO_STAGE) + +.PHONY: build_pgo_gcc +build_pgo_gcc: + $(MAKE) PGO=gen XCFLAGS="$(XCFLAGS) -fprofile-generate -DTOTAL_DATA_SIZE=1200" ITERATIONS=10 gen_pgo_data REBUILD=1 + +# Target: port_postbuild +# Generate any files that are needed after actual build end. +# E.g. change format to srec, bin, zip in order to be able to load into flash +.PHONY: port_postbuild +port_postbuild: + +# Target: port_postrun +# Do platform specific after run stuff. +# E.g. reset the board, backup the logfiles etc. +.PHONY: port_postrun +port_postrun: + +# Target: port_prerun +# Do platform specific after run stuff. +# E.g. reset the board, backup the logfiles etc. +.PHONY: port_prerun +port_prerun: + +# Target: port_postload +# Do platform specific after load stuff. +# E.g. reset the reset power to the flash eraser +.PHONY: port_postload +port_postload: + +# Target: port_preload +# Do platform specific before load stuff. +# E.g. reset the reset power to the flash eraser +.PHONY: port_preload +port_preload: + +# FLAG: OPATH +# Path to the output folder. Default - current folder. +OPATH = ./ +MKDIR = mkdir -p + +# FLAG: PERL +# Define perl executable to calculate the geomean if running separate. +PERL=/usr/bin/perl diff --git a/benchmarks/riscv-coremark/riscv64-baremetal/core_portme.c b/benchmarks/riscv-coremark/riscv64-baremetal/core_portme.c new file mode 100755 index 000000000..cad8b766d --- /dev/null +++ b/benchmarks/riscv-coremark/riscv64-baremetal/core_portme.c @@ -0,0 +1,382 @@ +/* +Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +Original Author: Shay Gal-on +*/ + +#include +#include +#include "coremark.h" +#if CALLGRIND_RUN +#include +#endif + +#if (MEM_METHOD==MEM_MALLOC) +#include +/* Function: portable_malloc + Provide malloc() functionality in a platform specific way. +*/ +void *portable_malloc(size_t size) { + return malloc(size); +} +/* Function: portable_free + Provide free() functionality in a platform specific way. +*/ +void portable_free(void *p) { + free(p); +} +#else +void *portable_malloc(size_t size) { + return NULL; +} +void portable_free(void *p) { + p=NULL; +} +#endif + +#if (SEED_METHOD==SEED_VOLATILE) +#if VALIDATION_RUN + volatile ee_s32 seed1_volatile=0x3415; + volatile ee_s32 seed2_volatile=0x3415; + volatile ee_s32 seed3_volatile=0x66; +#endif +#if PERFORMANCE_RUN + volatile ee_s32 seed1_volatile=0x0; + volatile ee_s32 seed2_volatile=0x0; + volatile ee_s32 seed3_volatile=0x66; +#endif +#if PROFILE_RUN + volatile ee_s32 seed1_volatile=0x8; + volatile ee_s32 seed2_volatile=0x8; + volatile ee_s32 seed3_volatile=0x8; +#endif + volatile ee_s32 seed4_volatile=ITERATIONS; + volatile ee_s32 seed5_volatile=0; +#endif +/* Porting: Timing functions + How to capture time and convert to seconds must be ported to whatever is supported by the platform. + e.g. Read value from on board RTC, read value from cpu clock cycles performance counter etc. + Sample implementation for standard time.h and windows.h definitions included. +*/ +/* Define: TIMER_RES_DIVIDER + Divider to trade off timer resolution and total time that can be measured. + + Use lower values to increase resolution, but make sure that overflow does not occur. + If there are issues with the return value overflowing, increase this value. + */ +#if USE_CLOCK + #define NSECS_PER_SEC CLOCKS_PER_SEC + #define EE_TIMER_TICKER_RATE 1000 + #define CORETIMETYPE clock_t + #define GETMYTIME(_t) (*_t=clock()) + #define MYTIMEDIFF(fin,ini) ((fin)-(ini)) + #define TIMER_RES_DIVIDER 1 + #define SAMPLE_TIME_IMPLEMENTATION 1 +#elif defined(_MSC_VER) + #define NSECS_PER_SEC 10000000 + #define EE_TIMER_TICKER_RATE 1000 + #define CORETIMETYPE FILETIME + #define GETMYTIME(_t) GetSystemTimeAsFileTime(_t) + #define MYTIMEDIFF(fin,ini) (((*(__int64*)&fin)-(*(__int64*)&ini))/TIMER_RES_DIVIDER) + /* setting to millisces resolution by default with MSDEV */ + #ifndef TIMER_RES_DIVIDER + #define TIMER_RES_DIVIDER 1000 + #endif + #define SAMPLE_TIME_IMPLEMENTATION 1 +#elif HAS_TIME_H + #define NSECS_PER_SEC 1000000000 + #define EE_TIMER_TICKER_RATE 1000 + #define CORETIMETYPE struct timespec + #define GETMYTIME(_t) clock_gettime(CLOCK_REALTIME,_t) + #define MYTIMEDIFF(fin,ini) ((fin.tv_sec-ini.tv_sec)*(NSECS_PER_SEC/TIMER_RES_DIVIDER)+(fin.tv_nsec-ini.tv_nsec)/TIMER_RES_DIVIDER) + /* setting to 1/1000 of a second resolution by default with linux */ + #ifndef TIMER_RES_DIVIDER + #define TIMER_RES_DIVIDER 1000000 + #endif + #define SAMPLE_TIME_IMPLEMENTATION 1 +#else + // Defined for RISCV + #define NSECS_PER_SEC 1000000000 // TODO: What freq are we assuming? + #define EE_TIMER_TICKER_RATE 1000 // TODO: What is this? + #define CORETIMETYPE clock_t + #define read_csr(reg) ({ unsigned long __tmp; \ + asm volatile ("csrr %0, " #reg : "=r"(__tmp)); \ + __tmp; }) + #define GETMYTIME(_t) (_t = *(volatile unsigned long long*)0x0200BFF8) + #define MYTIMEDIFF(fin,ini) ((fin)-(ini)) + // Changing TIMER_RES_DIVIDER to 1000000 sets EE_TICKS_PER_SEC to 1000 (now counting ticks per ms) + #define TIMER_RES_DIVIDER 10000 + #define SAMPLE_TIME_IMPLEMENTATION 1 +#endif +#define EE_TICKS_PER_SEC (NSECS_PER_SEC / TIMER_RES_DIVIDER) + +#if SAMPLE_TIME_IMPLEMENTATION +/** Define Host specific (POSIX), or target specific global time variables. */ +static CORETIMETYPE start_time_val, stop_time_val; +static unsigned long start_instr_val, stop_instr_val; + +/* Function: minstretFunc + This function will count the number of instructions. +*/ +unsigned long minstretFunc(void) +{ + unsigned long minstretRead = read_csr(minstret); + //ee_printf("Minstret is %lu\n", minstretRead); + return minstretRead; +} + +/* Function: minstretDiff + This function will take the difference between the first and second reads from the + MINSTRET csr to determine the number of machine instructions retired between two points + of time +*/ +unsigned long minstretDiff(void) +{ + unsigned long minstretDifference = MYTIMEDIFF(stop_instr_val, start_instr_val); + return minstretDifference; +} + +/* Function: start_time + This function will be called right before starting the timed portion of the benchmark. + + Implementation may be capturing a system timer (as implemented in the example code) + or zeroing some system parameters - e.g. setting the cpu clocks cycles to 0. +*/ +void start_time(void) { + start_instr_val = minstretFunc(); + GETMYTIME(start_time_val); + //ee_printf("Timer started\n"); + //ee_printf(" MTIME: %u\n", start_time_val); +#if CALLGRIND_RUN + CALLGRIND_START_INSTRUMENTATION +#endif +#if MICA + asm volatile("int3");/*1 */ +#endif +} +/* Function: stop_time + This function will be called right after ending the timed portion of the benchmark. + + Implementation may be capturing a system timer (as implemented in the example code) + or other system parameters - e.g. reading the current value of cpu cycles counter. +*/ +void stop_time(void) { +#if CALLGRIND_RUN + CALLGRIND_STOP_INSTRUMENTATION +#endif +#if MICA + asm volatile("int3");/*1 */ +#endif + GETMYTIME(stop_time_val); + stop_instr_val = minstretFunc(); + //ee_printf("Timer stopped\n"); + //ee_printf(" MTIME: %u\n", stop_time_val); +} +/* Function: get_time + Return an abstract "ticks" number that signifies time on the system. + + Actual value returned may be cpu cycles, milliseconds or any other value, + as long as it can be converted to seconds by . + This methodology is taken to accomodate any hardware or simulated platform. + The sample implementation returns millisecs by default, + and the resolution is controlled by +*/ +CORE_TICKS get_time(void) { + CORE_TICKS elapsed=(CORE_TICKS)(MYTIMEDIFF(stop_time_val, start_time_val)); + unsigned long instructions = minstretDiff(); +/* double CPI = elapsed / instructions; + ee_printf(" Elapsed MTIME: %u\n", elapsed); + ee_printf(" Elapsed MINSTRET: %lu\n", instructions); + ee_printf(" CPI: %lf", CPI); */ + return elapsed; +} +/* Function: time_in_secs + Convert the value returned by get_time to seconds. + + The type is used to accomodate systems with no support for floating point. + Default implementation implemented by the EE_TICKS_PER_SEC macro above. +*/ +secs_ret time_in_secs(CORE_TICKS ticks) { + secs_ret retval=((secs_ret)ticks) / (secs_ret)EE_TICKS_PER_SEC; + int retvalint = (int)retval; + //ee_printf("RETURN VALUE FROM TIME IN SECS FUNCTION: %d\n", retvalint); + return retval; +} +#else +#error "Please implement timing functionality in core_portme.c" +#endif /* SAMPLE_TIME_IMPLEMENTATION */ + +ee_u32 default_num_contexts = MULTITHREAD; + +/* Function: portable_init + Target specific initialization code + Test for some common mistakes. +*/ +void portable_init(core_portable *p, int *argc, char *argv[]) +{ +#if PRINT_ARGS + int i; + for (i=0; i<*argc; i++) { + ee_printf("Arg[%d]=%s\n",i,argv[i]); + } +#endif + if (sizeof(ee_ptr_int) != sizeof(ee_u8 *)) { + ee_printf("ERROR! Please define ee_ptr_int to a type that holds a pointer!\n"); + } + if (sizeof(ee_u32) != 4) { + ee_printf("ERROR! Please define ee_u32 to a 32b unsigned type!\n"); + } +#if (MAIN_HAS_NOARGC && (SEED_METHOD==SEED_ARG)) + ee_printf("ERROR! Main has no argc, but SEED_METHOD defined to SEED_ARG!\n"); +#endif + +#if (MULTITHREAD>1) && (SEED_METHOD==SEED_ARG) + int nargs=*argc,i; + if ((nargs>1) && (*argv[1]=='M')) { + default_num_contexts=parseval(argv[1]+1); + if (default_num_contexts>MULTITHREAD) + default_num_contexts=MULTITHREAD; + /* Shift args since first arg is directed to the portable part and not to coremark main */ + --nargs; + for (i=1; i*/ + p->portable_id=1; +} +/* Function: portable_fini + Target specific final code +*/ +void portable_fini(core_portable *p) +{ + p->portable_id=0; +} + +#if (MULTITHREAD>1) + +/* Function: core_start_parallel + Start benchmarking in a parallel context. + + Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets. + Other implementations using MCAPI or other standards can easily be devised. +*/ +/* Function: core_stop_parallel + Stop a parallel context execution of coremark, and gather the results. + + Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets. + Other implementations using MCAPI or other standards can easily be devised. +*/ +#if USE_PTHREAD +ee_u8 core_start_parallel(core_results *res) { + return (ee_u8)pthread_create(&(res->port.thread),NULL,iterate,(void *)res); +} +ee_u8 core_stop_parallel(core_results *res) { + void *retval; + return (ee_u8)pthread_join(res->port.thread,&retval); +} +#elif USE_FORK +static int key_id=0; +ee_u8 core_start_parallel(core_results *res) { + key_t key=4321+key_id; + key_id++; + res->port.pid=fork(); + res->port.shmid=shmget(key, 8, IPC_CREAT | 0666); + if (res->port.shmid<0) { + ee_printf("ERROR in shmget!\n"); + } + if (res->port.pid==0) { + iterate(res); + res->port.shm=shmat(res->port.shmid, NULL, 0); + /* copy the validation values to the shared memory area and quit*/ + if (res->port.shm == (char *) -1) { + ee_printf("ERROR in child shmat!\n"); + } else { + memcpy(res->port.shm,&(res->crc),8); + shmdt(res->port.shm); + } + exit(0); + } + return 1; +} +ee_u8 core_stop_parallel(core_results *res) { + int status; + pid_t wpid = waitpid(res->port.pid,&status,WUNTRACED); + if (wpid != res->port.pid) { + ee_printf("ERROR waiting for child.\n"); + if (errno == ECHILD) ee_printf("errno=No such child %d\n",res->port.pid); + if (errno == EINTR) ee_printf("errno=Interrupted\n"); + return 0; + } + /* after process is done, get the values from the shared memory area */ + res->port.shm=shmat(res->port.shmid, NULL, 0); + if (res->port.shm == (char *) -1) { + ee_printf("ERROR in parent shmat!\n"); + return 0; + } + memcpy(&(res->crc),res->port.shm,8); + shmdt(res->port.shm); + return 1; +} +#elif USE_SOCKET +static int key_id=0; +ee_u8 core_start_parallel(core_results *res) { + int bound, buffer_length=8; + res->port.sa.sin_family = AF_INET; + res->port.sa.sin_addr.s_addr = htonl(0x7F000001); + res->port.sa.sin_port = htons(7654+key_id); + key_id++; + res->port.pid=fork(); + if (res->port.pid==0) { /* benchmark child */ + iterate(res); + res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); + if (-1 == res->port.sock) /* if socket failed to initialize, exit */ { + ee_printf("Error Creating Socket"); + } else { + int bytes_sent = sendto(res->port.sock, &(res->crc), buffer_length, 0,(struct sockaddr*)&(res->port.sa), sizeof (struct sockaddr_in)); + if (bytes_sent < 0) + ee_printf("Error sending packet: %s\n", strerror(errno)); + close(res->port.sock); /* close the socket */ + } + exit(0); + } + /* parent process, open the socket */ + res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); + bound = bind(res->port.sock,(struct sockaddr*)&(res->port.sa), sizeof(struct sockaddr)); + if (bound < 0) + ee_printf("bind(): %s\n",strerror(errno)); + return 1; +} +ee_u8 core_stop_parallel(core_results *res) { + int status; + int fromlen=sizeof(struct sockaddr); + int recsize = recvfrom(res->port.sock, &(res->crc), 8, 0, (struct sockaddr*)&(res->port.sa), &fromlen); + if (recsize < 0) { + ee_printf("Error in receive: %s\n", strerror(errno)); + return 0; + } + pid_t wpid = waitpid(res->port.pid,&status,WUNTRACED); + if (wpid != res->port.pid) { + ee_printf("ERROR waiting for child.\n"); + if (errno == ECHILD) ee_printf("errno=No such child %d\n",res->port.pid); + if (errno == EINTR) ee_printf("errno=Interrupted\n"); + return 0; + } + return 1; +} +#else /* no standard multicore implementation */ +#error "Please implement multicore functionality in core_portme.c to use multiple contexts." +#endif /* multithread implementations */ +#endif diff --git a/benchmarks/riscv-coremark/riscv64-baremetal/core_portme.h b/benchmarks/riscv-coremark/riscv64-baremetal/core_portme.h new file mode 100755 index 000000000..ef26e88ad --- /dev/null +++ b/benchmarks/riscv-coremark/riscv64-baremetal/core_portme.h @@ -0,0 +1,296 @@ +/* +Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +Original Author: Shay Gal-on +*/ + +/* Topic: Description + This file contains configuration constants required to execute on different platforms +*/ +#ifndef CORE_PORTME_H +#define CORE_PORTME_H +/************************/ +/* Data types and settings */ +/************************/ +/* Configuration: HAS_FLOAT + Define to 1 if the platform supports floating point. +*/ +#ifndef HAS_FLOAT +#define HAS_FLOAT 1 +#endif +/* Configuration: HAS_TIME_H + Define to 1 if platform has the time.h header file, + and implementation of functions thereof. +*/ +#ifndef HAS_TIME_H +#define HAS_TIME_H 0 +#endif +/* Configuration: USE_CLOCK + Define to 1 if platform has the time.h header file, + and implementation of functions thereof. +*/ +#ifndef USE_CLOCK +#define USE_CLOCK 0 +#endif +/* Configuration: HAS_STDIO + Define to 1 if the platform has stdio.h. +*/ +#ifndef HAS_STDIO +#define HAS_STDIO 1 +#endif +/* Configuration: HAS_PRINTF + Define to 1 if the platform has stdio.h and implements the printf function. +*/ +#ifndef HAS_PRINTF +#define HAS_PRINTF 1 +#endif + +/* Configuration: CORE_TICKS + Define type of return from the timing functions. + */ +#if defined(_MSC_VER) +#include +typedef size_t CORE_TICKS; +#elif HAS_TIME_H +#include +typedef clock_t CORE_TICKS; +#else +/* Configuration: size_t and clock_t + Note these need to match the size of the clock output and the xLen the processor supports + */ +typedef unsigned long int size_t; +typedef unsigned long int clock_t; +typedef clock_t CORE_TICKS; +#endif + +/* Definitions: COMPILER_VERSION, COMPILER_FLAGS, MEM_LOCATION + Initialize these strings per platform +*/ +#ifndef COMPILER_VERSION + #ifdef __GNUC__ + #define COMPILER_VERSION "GCC"__VERSION__ + #else + #define COMPILER_VERSION "Please put compiler version here (e.g. gcc 4.1)" + #endif +#endif +#ifndef COMPILER_FLAGS + #define COMPILER_FLAGS FLAGS_STR /* "Please put compiler flags here (e.g. -o3)" */ +#endif +#ifndef MEM_LOCATION + #define MEM_LOCATION "Please put data memory location here\n\t\t\t(e.g. code in flash, data on heap etc)" + #define MEM_LOCATION_UNSPEC 1 +#endif + +/* Data Types: + To avoid compiler issues, define the data types that need ot be used for 8b, 16b and 32b in . + + *Imprtant*: + ee_ptr_int needs to be the data type used to hold pointers, otherwise coremark may fail!!! +*/ +typedef signed short ee_s16; +typedef unsigned short ee_u16; +typedef signed int ee_s32; +typedef double ee_f32; +typedef unsigned char ee_u8; +typedef unsigned int ee_u32; +typedef unsigned long long ee_ptr_int; +typedef size_t ee_size_t; +/* align an offset to point to a 32b value */ +#define align_mem(x) (void *)(4 + (((ee_ptr_int)(x) - 1) & ~3)) + +/* Configuration: SEED_METHOD + Defines method to get seed values that cannot be computed at compile time. + + Valid values: + SEED_ARG - from command line. + SEED_FUNC - from a system function. + SEED_VOLATILE - from volatile variables. +*/ +#ifndef SEED_METHOD +#define SEED_METHOD SEED_VOLATILE +#endif + +/* Configuration: MEM_METHOD + Defines method to get a block of memry. + + Valid values: + MEM_MALLOC - for platforms that implement malloc and have malloc.h. + MEM_STATIC - to use a static memory array. + MEM_STACK - to allocate the data block on the stack (NYI). +*/ +#ifndef MEM_METHOD +#define MEM_METHOD MEM_STATIC +#endif + +/* Configuration: MULTITHREAD + Define for parallel execution + + Valid values: + 1 - only one context (default). + N>1 - will execute N copies in parallel. + + Note: + If this flag is defined to more then 1, an implementation for launching parallel contexts must be defined. + + Two sample implementations are provided. Use or to enable them. + + It is valid to have a different implementation of and in , + to fit a particular architecture. +*/ +#ifndef MULTITHREAD +#define MULTITHREAD 1 +#endif + +/* Configuration: USE_PTHREAD + Sample implementation for launching parallel contexts + This implementation uses pthread_thread_create and pthread_join. + + Valid values: + 0 - Do not use pthreads API. + 1 - Use pthreads API + + Note: + This flag only matters if MULTITHREAD has been defined to a value greater then 1. +*/ +#ifndef USE_PTHREAD +#define USE_PTHREAD 0 +#endif + +/* Configuration: USE_FORK + Sample implementation for launching parallel contexts + This implementation uses fork, waitpid, shmget,shmat and shmdt. + + Valid values: + 0 - Do not use fork API. + 1 - Use fork API + + Note: + This flag only matters if MULTITHREAD has been defined to a value greater then 1. +*/ +#ifndef USE_FORK +#define USE_FORK 0 +#endif + +/* Configuration: USE_SOCKET + Sample implementation for launching parallel contexts + This implementation uses fork, socket, sendto and recvfrom + + Valid values: + 0 - Do not use fork and sockets API. + 1 - Use fork and sockets API + + Note: + This flag only matters if MULTITHREAD has been defined to a value greater then 1. +*/ +#ifndef USE_SOCKET +#define USE_SOCKET 0 +#endif + +/* Configuration: MAIN_HAS_NOARGC + Needed if platform does not support getting arguments to main. + + Valid values: + 0 - argc/argv to main is supported + 1 - argc/argv to main is not supported +*/ +#ifndef MAIN_HAS_NOARGC +#define MAIN_HAS_NOARGC 1 +#endif + +/* Configuration: MAIN_HAS_NORETURN + Needed if platform does not support returning a value from main. + + Valid values: + 0 - main returns an int, and return value will be 0. + 1 - platform does not support returning a value from main +*/ +#ifndef MAIN_HAS_NORETURN +#define MAIN_HAS_NORETURN 0 +#endif + +/* Variable: default_num_contexts + Number of contexts to spawn in multicore context. + Override this global value to change number of contexts used. + + Note: + This value may not be set higher then the define. + + To experiment, you can set the define to the highest value expected, and use argc/argv in the to set this value from the command line. +*/ +extern ee_u32 default_num_contexts; + +#if (MULTITHREAD>1) +#if USE_PTHREAD + #include + #define PARALLEL_METHOD "PThreads" +#elif USE_FORK + #include + #include + #include + #include + #include /* for memcpy */ + #define PARALLEL_METHOD "Fork" +#elif USE_SOCKET + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #define PARALLEL_METHOD "Sockets" +#else + #define PARALLEL_METHOD "Proprietary" + #error "Please implement multicore functionality in core_portme.c to use multiple contexts." +#endif /* Method for multithreading */ +#endif /* MULTITHREAD > 1 */ + +typedef struct CORE_PORTABLE_S { +#if (MULTITHREAD>1) + #if USE_PTHREAD + pthread_t thread; + #elif USE_FORK + pid_t pid; + int shmid; + void *shm; + #elif USE_SOCKET + pid_t pid; + int sock; + struct sockaddr_in sa; + #endif /* Method for multithreading */ +#endif /* MULTITHREAD>1 */ + ee_u8 portable_id; +} core_portable; + +/* target specific init/fini */ +void portable_init(core_portable *p, int *argc, char *argv[]); +void portable_fini(core_portable *p); + +#if (SEED_METHOD==SEED_VOLATILE) + #if (VALIDATION_RUN || PERFORMANCE_RUN || PROFILE_RUN) + #define RUN_TYPE_FLAG 1 + #else + #if (TOTAL_DATA_SIZE==1200) + #define PROFILE_RUN 1 + #else + #define PERFORMANCE_RUN 1 + #endif + #endif +#endif /* SEED_METHOD==SEED_VOLATILE */ + +#endif /* CORE_PORTME_H */ diff --git a/benchmarks/riscv-coremark/riscv64-baremetal/core_portme.mak b/benchmarks/riscv-coremark/riscv64-baremetal/core_portme.mak new file mode 100755 index 000000000..8600ce0a0 --- /dev/null +++ b/benchmarks/riscv-coremark/riscv64-baremetal/core_portme.mak @@ -0,0 +1,147 @@ +# Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Original Author: Shay Gal-on + +#File: core_portme.mak + +# Flag: RISCVTOOLS +# Use this flag to point to your RISCV tools +RISCVTOOLS=$(RISCV) +# Flag: RISCVTYPE +# Type of toolchain to use +RISCVTYPE=riscv64-unknown-elf +# Flag: OUTFLAG +# Use this flag to define how to to get an executable (e.g -o) +OUTFLAG= -o +# Flag: CC +# Use this flag to define compiler to use +CC = $(RISCVTOOLS)/bin/$(RISCVTYPE)-gcc +# Flag: CFLAGS +# Use this flag to define compiler options. Note, you can add compiler options from the command line using XCFLAGS="other flags" +#PORT_CFLAGS = -O2 -static -std=gnu99 +PORT_CFLAGS = -O2 -mcmodel=medany -static -fno-tree-loop-distribute-patterns -std=gnu99 -fno-common -nostartfiles -lm -lgcc -T $(PORT_DIR)/link.ld +FLAGS_STR = "$(PORT_CFLAGS) $(XCFLAGS) $(XLFLAGS) $(LFLAGS_END)" +CFLAGS = $(PORT_CFLAGS) -I$(PORT_DIR) -I. -DFLAGS_STR=\"$(FLAGS_STR)\" +#Flag: LFLAGS_END +# Define any libraries needed for linking or other flags that should come at the end of the link line (e.g. linker scripts). +# Note: On certain platforms, the default clock_gettime implementation is supported but requires linking of librt. +LFLAGS_END += +# Flag: PORT_SRCS +# Port specific source files can be added here +PORT_SRCS = $(PORT_DIR)/core_portme.c $(PORT_DIR)/syscalls.c $(PORT_DIR)/crt.S +# Flag: LOAD +# Define this flag if you need to load to a target, as in a cross compile environment. + +# Flag: RUN +# Define this flag if running does not consist of simple invocation of the binary. +# In a cross compile environment, you need to define this. + +#For flashing and using a tera term macro, you could use +#LOAD = flash ADDR +#RUN = ttpmacro coremark.ttl + +#For copying to target and executing via SSH connection, you could use +#LOAD = scp $(OUTFILE) user@target:~ +#RUN = ssh user@target -c + +#For native compilation and execution +LOAD = echo Loading done +RUN = spike pk + +OEXT = .o +EXE = .bare.riscv + +# Flag: SEPARATE_COMPILE +# Define if you need to separate compilation from link stage. +# In this case, you also need to define below how to create an object file, and how to link. +ifdef SEPARATE_COMPILE + +LD = $(RISCVTOOLS)/bin/$(RISCVTYPE)-gcc +OBJOUT = -o +LFLAGS = +OFLAG = -o +COUT = -c +# Flag: PORT_OBJS +# Port specific object files can be added here +PORT_OBJS = $(PORT_DIR)/core_portme$(OEXT) +PORT_CLEAN = *$(OEXT) + +$(OPATH)%$(OEXT) : %.c + $(CC) $(CFLAGS) $(XCFLAGS) $(COUT) $< $(OBJOUT) $@ + +endif + +# Target: port_prebuild +# Generate any files that are needed before actual build starts. +# E.g. generate profile guidance files. Sample PGO generation for gcc enabled with PGO=1 +# - First, check if PGO was defined on the command line, if so, need to add -fprofile-use to compile line. +# - Second, if PGO reference has not yet been generated, add a step to the prebuild that will build a profile-generate version and run it. +# Note - Using REBUILD=1 +# +# Use make PGO=1 to invoke this sample processing. + +ifdef PGO + ifeq (,$(findstring $(PGO),gen)) + PGO_STAGE=build_pgo_gcc + CFLAGS+=-fprofile-use + endif + PORT_CLEAN+=*.gcda *.gcno gmon.out +endif + +.PHONY: port_prebuild +port_prebuild: $(PGO_STAGE) + +.PHONY: build_pgo_gcc +build_pgo_gcc: + $(MAKE) PGO=gen XCFLAGS="$(XCFLAGS) -fprofile-generate -DTOTAL_DATA_SIZE=1200" ITERATIONS=10 gen_pgo_data REBUILD=1 + +# Target: port_postbuild +# Generate any files that are needed after actual build end. +# E.g. change format to srec, bin, zip in order to be able to load into flash +.PHONY: port_postbuild +port_postbuild: + +# Target: port_postrun +# Do platform specific after run stuff. +# E.g. reset the board, backup the logfiles etc. +.PHONY: port_postrun +port_postrun: + +# Target: port_prerun +# Do platform specific after run stuff. +# E.g. reset the board, backup the logfiles etc. +.PHONY: port_prerun +port_prerun: + +# Target: port_postload +# Do platform specific after load stuff. +# E.g. reset the reset power to the flash eraser +.PHONY: port_postload +port_postload: + +# Target: port_preload +# Do platform specific before load stuff. +# E.g. reset the reset power to the flash eraser +.PHONY: port_preload +port_preload: + +# FLAG: OPATH +# Path to the output folder. Default - current folder. +OPATH = ./ +MKDIR = mkdir -p + +# FLAG: PERL +# Define perl executable to calculate the geomean if running separate. +PERL=/usr/bin/perl diff --git a/benchmarks/riscv-coremark/riscv64-baremetal/crt.S b/benchmarks/riscv-coremark/riscv64-baremetal/crt.S new file mode 100644 index 000000000..d75e81e06 --- /dev/null +++ b/benchmarks/riscv-coremark/riscv64-baremetal/crt.S @@ -0,0 +1,237 @@ +# See LICENSE for license details. + +#include "encoding.h" + +#if __riscv_xlen == 64 +# define LREG ld +# define SREG sd +# define REGBYTES 8 +#else +# define LREG lw +# define SREG sw +# define REGBYTES 4 +#endif + + .section ".text.init" + .globl _start +_start: + li x1, 0 + li x2, 0 + li x3, 0 + li x4, 0 + li x5, 0 + li x6, 0 + li x7, 0 + li x8, 0 + li x9, 0 + li x10,0 + li x11,0 + li x12,0 + li x13,0 + li x14,0 + li x15,0 + li x16,0 + li x17,0 + li x18,0 + li x19,0 + li x20,0 + li x21,0 + li x22,0 + li x23,0 + li x24,0 + li x25,0 + li x26,0 + li x27,0 + li x28,0 + li x29,0 + li x30,0 + li x31,0 + + # enable FPU and accelerator if present + li t0, MSTATUS_FS | MSTATUS_XS + csrs mstatus, t0 + + # make sure XLEN agrees with compilation choice + li t0, 1 + slli t0, t0, 31 +#if __riscv_xlen == 64 + bgez t0, 1f +#else + bltz t0, 1f +#endif +2: + li a0, 1 + sw a0, tohost, t0 + j 2b +1: + +#ifdef __riscv_flen + # initialize FPU if we have one + la t0, 1f + csrw mtvec, t0 + + fssr x0 + fmv.s.x f0, x0 + fmv.s.x f1, x0 + fmv.s.x f2, x0 + fmv.s.x f3, x0 + fmv.s.x f4, x0 + fmv.s.x f5, x0 + fmv.s.x f6, x0 + fmv.s.x f7, x0 + fmv.s.x f8, x0 + fmv.s.x f9, x0 + fmv.s.x f10,x0 + fmv.s.x f11,x0 + fmv.s.x f12,x0 + fmv.s.x f13,x0 + fmv.s.x f14,x0 + fmv.s.x f15,x0 + fmv.s.x f16,x0 + fmv.s.x f17,x0 + fmv.s.x f18,x0 + fmv.s.x f19,x0 + fmv.s.x f20,x0 + fmv.s.x f21,x0 + fmv.s.x f22,x0 + fmv.s.x f23,x0 + fmv.s.x f24,x0 + fmv.s.x f25,x0 + fmv.s.x f26,x0 + fmv.s.x f27,x0 + fmv.s.x f28,x0 + fmv.s.x f29,x0 + fmv.s.x f30,x0 + fmv.s.x f31,x0 +1: +#endif + + # initialize trap vector + la t0, trap_entry + csrw mtvec, t0 + + # initialize global pointer +.option push +.option norelax + la gp, __global_pointer$ +.option pop + + la tp, _end + 63 + and tp, tp, -64 + + # get core id + csrr a0, mhartid + # for now, assume only 1 core + li a1, 1 +1:bgeu a0, a1, 1b + + # give each core 128KB of stack + TLS +#define STKSHIFT 17 + sll a2, a0, STKSHIFT + add tp, tp, a2 + add sp, a0, 1 + sll sp, sp, STKSHIFT + add sp, sp, tp + + j _init + + .align 2 +trap_entry: + addi sp, sp, -272 + + SREG x1, 1*REGBYTES(sp) + SREG x2, 2*REGBYTES(sp) + SREG x3, 3*REGBYTES(sp) + SREG x4, 4*REGBYTES(sp) + SREG x5, 5*REGBYTES(sp) + SREG x6, 6*REGBYTES(sp) + SREG x7, 7*REGBYTES(sp) + SREG x8, 8*REGBYTES(sp) + SREG x9, 9*REGBYTES(sp) + SREG x10, 10*REGBYTES(sp) + SREG x11, 11*REGBYTES(sp) + SREG x12, 12*REGBYTES(sp) + SREG x13, 13*REGBYTES(sp) + SREG x14, 14*REGBYTES(sp) + SREG x15, 15*REGBYTES(sp) + SREG x16, 16*REGBYTES(sp) + SREG x17, 17*REGBYTES(sp) + SREG x18, 18*REGBYTES(sp) + SREG x19, 19*REGBYTES(sp) + SREG x20, 20*REGBYTES(sp) + SREG x21, 21*REGBYTES(sp) + SREG x22, 22*REGBYTES(sp) + SREG x23, 23*REGBYTES(sp) + SREG x24, 24*REGBYTES(sp) + SREG x25, 25*REGBYTES(sp) + SREG x26, 26*REGBYTES(sp) + SREG x27, 27*REGBYTES(sp) + SREG x28, 28*REGBYTES(sp) + SREG x29, 29*REGBYTES(sp) + SREG x30, 30*REGBYTES(sp) + SREG x31, 31*REGBYTES(sp) + + csrr a0, mcause + csrr a1, mepc + mv a2, sp + jal handle_trap + csrw mepc, a0 + + # Remain in M-mode after eret + li t0, MSTATUS_MPP + csrs mstatus, t0 + + LREG x1, 1*REGBYTES(sp) + LREG x2, 2*REGBYTES(sp) + LREG x3, 3*REGBYTES(sp) + LREG x4, 4*REGBYTES(sp) + LREG x5, 5*REGBYTES(sp) + LREG x6, 6*REGBYTES(sp) + LREG x7, 7*REGBYTES(sp) + LREG x8, 8*REGBYTES(sp) + LREG x9, 9*REGBYTES(sp) + LREG x10, 10*REGBYTES(sp) + LREG x11, 11*REGBYTES(sp) + LREG x12, 12*REGBYTES(sp) + LREG x13, 13*REGBYTES(sp) + LREG x14, 14*REGBYTES(sp) + LREG x15, 15*REGBYTES(sp) + LREG x16, 16*REGBYTES(sp) + LREG x17, 17*REGBYTES(sp) + LREG x18, 18*REGBYTES(sp) + LREG x19, 19*REGBYTES(sp) + LREG x20, 20*REGBYTES(sp) + LREG x21, 21*REGBYTES(sp) + LREG x22, 22*REGBYTES(sp) + LREG x23, 23*REGBYTES(sp) + LREG x24, 24*REGBYTES(sp) + LREG x25, 25*REGBYTES(sp) + LREG x26, 26*REGBYTES(sp) + LREG x27, 27*REGBYTES(sp) + LREG x28, 28*REGBYTES(sp) + LREG x29, 29*REGBYTES(sp) + LREG x30, 30*REGBYTES(sp) + LREG x31, 31*REGBYTES(sp) + + addi sp, sp, 272 + mret + +.section ".tdata.begin" +.globl _tdata_begin +_tdata_begin: + +.section ".tdata.end" +.globl _tdata_end +_tdata_end: + +.section ".tbss.end" +.globl _tbss_end +_tbss_end: + +.section ".tohost","aw",@progbits +.align 6 +.globl tohost +tohost: .dword 0 +.align 6 +.globl fromhost +fromhost: .dword 0 diff --git a/benchmarks/riscv-coremark/riscv64-baremetal/encoding.h b/benchmarks/riscv-coremark/riscv64-baremetal/encoding.h new file mode 100644 index 000000000..c109ce189 --- /dev/null +++ b/benchmarks/riscv-coremark/riscv64-baremetal/encoding.h @@ -0,0 +1,1471 @@ +// See LICENSE for license details. + +#ifndef RISCV_CSR_ENCODING_H +#define RISCV_CSR_ENCODING_H + +#define MSTATUS_UIE 0x00000001 +#define MSTATUS_SIE 0x00000002 +#define MSTATUS_HIE 0x00000004 +#define MSTATUS_MIE 0x00000008 +#define MSTATUS_UPIE 0x00000010 +#define MSTATUS_SPIE 0x00000020 +#define MSTATUS_HPIE 0x00000040 +#define MSTATUS_MPIE 0x00000080 +#define MSTATUS_SPP 0x00000100 +#define MSTATUS_HPP 0x00000600 +#define MSTATUS_MPP 0x00001800 +#define MSTATUS_FS 0x00006000 +#define MSTATUS_XS 0x00018000 +#define MSTATUS_MPRV 0x00020000 +#define MSTATUS_SUM 0x00040000 +#define MSTATUS_MXR 0x00080000 +#define MSTATUS_TVM 0x00100000 +#define MSTATUS_TW 0x00200000 +#define MSTATUS_TSR 0x00400000 +#define MSTATUS32_SD 0x80000000 +#define MSTATUS_UXL 0x0000000300000000 +#define MSTATUS_SXL 0x0000000C00000000 +#define MSTATUS64_SD 0x8000000000000000 + +#define SSTATUS_UIE 0x00000001 +#define SSTATUS_SIE 0x00000002 +#define SSTATUS_UPIE 0x00000010 +#define SSTATUS_SPIE 0x00000020 +#define SSTATUS_SPP 0x00000100 +#define SSTATUS_FS 0x00006000 +#define SSTATUS_XS 0x00018000 +#define SSTATUS_SUM 0x00040000 +#define SSTATUS_MXR 0x00080000 +#define SSTATUS32_SD 0x80000000 +#define SSTATUS_UXL 0x0000000300000000 +#define SSTATUS64_SD 0x8000000000000000 + +#define DCSR_XDEBUGVER (3U<<30) +#define DCSR_NDRESET (1<<29) +#define DCSR_FULLRESET (1<<28) +#define DCSR_EBREAKM (1<<15) +#define DCSR_EBREAKH (1<<14) +#define DCSR_EBREAKS (1<<13) +#define DCSR_EBREAKU (1<<12) +#define DCSR_STOPCYCLE (1<<10) +#define DCSR_STOPTIME (1<<9) +#define DCSR_CAUSE (7<<6) +#define DCSR_DEBUGINT (1<<5) +#define DCSR_HALT (1<<3) +#define DCSR_STEP (1<<2) +#define DCSR_PRV (3<<0) + +#define DCSR_CAUSE_NONE 0 +#define DCSR_CAUSE_SWBP 1 +#define DCSR_CAUSE_HWBP 2 +#define DCSR_CAUSE_DEBUGINT 3 +#define DCSR_CAUSE_STEP 4 +#define DCSR_CAUSE_HALT 5 + +#define MCONTROL_TYPE(xlen) (0xfULL<<((xlen)-4)) +#define MCONTROL_DMODE(xlen) (1ULL<<((xlen)-5)) +#define MCONTROL_MASKMAX(xlen) (0x3fULL<<((xlen)-11)) + +#define MCONTROL_SELECT (1<<19) +#define MCONTROL_TIMING (1<<18) +#define MCONTROL_ACTION (0x3f<<12) +#define MCONTROL_CHAIN (1<<11) +#define MCONTROL_MATCH (0xf<<7) +#define MCONTROL_M (1<<6) +#define MCONTROL_H (1<<5) +#define MCONTROL_S (1<<4) +#define MCONTROL_U (1<<3) +#define MCONTROL_EXECUTE (1<<2) +#define MCONTROL_STORE (1<<1) +#define MCONTROL_LOAD (1<<0) + +#define MCONTROL_TYPE_NONE 0 +#define MCONTROL_TYPE_MATCH 2 + +#define MCONTROL_ACTION_DEBUG_EXCEPTION 0 +#define MCONTROL_ACTION_DEBUG_MODE 1 +#define MCONTROL_ACTION_TRACE_START 2 +#define MCONTROL_ACTION_TRACE_STOP 3 +#define MCONTROL_ACTION_TRACE_EMIT 4 + +#define MCONTROL_MATCH_EQUAL 0 +#define MCONTROL_MATCH_NAPOT 1 +#define MCONTROL_MATCH_GE 2 +#define MCONTROL_MATCH_LT 3 +#define MCONTROL_MATCH_MASK_LOW 4 +#define MCONTROL_MATCH_MASK_HIGH 5 + +#define MIP_SSIP (1 << IRQ_S_SOFT) +#define MIP_HSIP (1 << IRQ_H_SOFT) +#define MIP_MSIP (1 << IRQ_M_SOFT) +#define MIP_STIP (1 << IRQ_S_TIMER) +#define MIP_HTIP (1 << IRQ_H_TIMER) +#define MIP_MTIP (1 << IRQ_M_TIMER) +#define MIP_SEIP (1 << IRQ_S_EXT) +#define MIP_HEIP (1 << IRQ_H_EXT) +#define MIP_MEIP (1 << IRQ_M_EXT) + +#define SIP_SSIP MIP_SSIP +#define SIP_STIP MIP_STIP + +#define PRV_U 0 +#define PRV_S 1 +#define PRV_H 2 +#define PRV_M 3 + +#define SATP32_MODE 0x80000000 +#define SATP32_ASID 0x7FC00000 +#define SATP32_PPN 0x003FFFFF +#define SATP64_MODE 0xF000000000000000 +#define SATP64_ASID 0x0FFFF00000000000 +#define SATP64_PPN 0x00000FFFFFFFFFFF + +#define SATP_MODE_OFF 0 +#define SATP_MODE_SV32 1 +#define SATP_MODE_SV39 8 +#define SATP_MODE_SV48 9 +#define SATP_MODE_SV57 10 +#define SATP_MODE_SV64 11 + +#define PMP_R 0x01 +#define PMP_W 0x02 +#define PMP_X 0x04 +#define PMP_A 0x18 +#define PMP_L 0x80 +#define PMP_SHIFT 2 + +#define PMP_TOR 0x08 +#define PMP_NA4 0x10 +#define PMP_NAPOT 0x18 + +#define IRQ_S_SOFT 1 +#define IRQ_H_SOFT 2 +#define IRQ_M_SOFT 3 +#define IRQ_S_TIMER 5 +#define IRQ_H_TIMER 6 +#define IRQ_M_TIMER 7 +#define IRQ_S_EXT 9 +#define IRQ_H_EXT 10 +#define IRQ_M_EXT 11 +#define IRQ_COP 12 +#define IRQ_HOST 13 + +#define DEFAULT_RSTVEC 0x00001000 +#define CLINT_BASE 0x02000000 +#define CLINT_SIZE 0x000c0000 +#define EXT_IO_BASE 0x40000000 +#define DRAM_BASE 0x80000000 + +// page table entry (PTE) fields +#define PTE_V 0x001 // Valid +#define PTE_R 0x002 // Read +#define PTE_W 0x004 // Write +#define PTE_X 0x008 // Execute +#define PTE_U 0x010 // User +#define PTE_G 0x020 // Global +#define PTE_A 0x040 // Accessed +#define PTE_D 0x080 // Dirty +#define PTE_SOFT 0x300 // Reserved for Software + +#define PTE_PPN_SHIFT 10 + +#define PTE_TABLE(PTE) (((PTE) & (PTE_V | PTE_R | PTE_W | PTE_X)) == PTE_V) + +#ifdef __riscv + +#if __riscv_xlen == 64 +# define MSTATUS_SD MSTATUS64_SD +# define SSTATUS_SD SSTATUS64_SD +# define RISCV_PGLEVEL_BITS 9 +# define SATP_MODE SATP64_MODE +#else +# define MSTATUS_SD MSTATUS32_SD +# define SSTATUS_SD SSTATUS32_SD +# define RISCV_PGLEVEL_BITS 10 +# define SATP_MODE SATP32_MODE +#endif +#define RISCV_PGSHIFT 12 +#define RISCV_PGSIZE (1 << RISCV_PGSHIFT) + +#ifndef __ASSEMBLER__ + +#ifdef __GNUC__ + +#define read_csr(reg) ({ unsigned long __tmp; \ + asm volatile ("csrr %0, " #reg : "=r"(__tmp)); \ + __tmp; }) + +#define write_csr(reg, val) ({ \ + asm volatile ("csrw " #reg ", %0" :: "rK"(val)); }) + +#define swap_csr(reg, val) ({ unsigned long __tmp; \ + asm volatile ("csrrw %0, " #reg ", %1" : "=r"(__tmp) : "rK"(val)); \ + __tmp; }) + +#define set_csr(reg, bit) ({ unsigned long __tmp; \ + asm volatile ("csrrs %0, " #reg ", %1" : "=r"(__tmp) : "rK"(bit)); \ + __tmp; }) + +#define clear_csr(reg, bit) ({ unsigned long __tmp; \ + asm volatile ("csrrc %0, " #reg ", %1" : "=r"(__tmp) : "rK"(bit)); \ + __tmp; }) + +#define rdtime() read_csr(time) +#define rdcycle() read_csr(cycle) +#define rdinstret() read_csr(instret) + +#endif + +#endif + +#endif + +#endif +/* Automatically generated by parse-opcodes. */ +#ifndef RISCV_ENCODING_H +#define RISCV_ENCODING_H +#define MATCH_BEQ 0x63 +#define MASK_BEQ 0x707f +#define MATCH_BNE 0x1063 +#define MASK_BNE 0x707f +#define MATCH_BLT 0x4063 +#define MASK_BLT 0x707f +#define MATCH_BGE 0x5063 +#define MASK_BGE 0x707f +#define MATCH_BLTU 0x6063 +#define MASK_BLTU 0x707f +#define MATCH_BGEU 0x7063 +#define MASK_BGEU 0x707f +#define MATCH_JALR 0x67 +#define MASK_JALR 0x707f +#define MATCH_JAL 0x6f +#define MASK_JAL 0x7f +#define MATCH_LUI 0x37 +#define MASK_LUI 0x7f +#define MATCH_AUIPC 0x17 +#define MASK_AUIPC 0x7f +#define MATCH_ADDI 0x13 +#define MASK_ADDI 0x707f +#define MATCH_SLLI 0x1013 +#define MASK_SLLI 0xfc00707f +#define MATCH_SLTI 0x2013 +#define MASK_SLTI 0x707f +#define MATCH_SLTIU 0x3013 +#define MASK_SLTIU 0x707f +#define MATCH_XORI 0x4013 +#define MASK_XORI 0x707f +#define MATCH_SRLI 0x5013 +#define MASK_SRLI 0xfc00707f +#define MATCH_SRAI 0x40005013 +#define MASK_SRAI 0xfc00707f +#define MATCH_ORI 0x6013 +#define MASK_ORI 0x707f +#define MATCH_ANDI 0x7013 +#define MASK_ANDI 0x707f +#define MATCH_ADD 0x33 +#define MASK_ADD 0xfe00707f +#define MATCH_SUB 0x40000033 +#define MASK_SUB 0xfe00707f +#define MATCH_SLL 0x1033 +#define MASK_SLL 0xfe00707f +#define MATCH_SLT 0x2033 +#define MASK_SLT 0xfe00707f +#define MATCH_SLTU 0x3033 +#define MASK_SLTU 0xfe00707f +#define MATCH_XOR 0x4033 +#define MASK_XOR 0xfe00707f +#define MATCH_SRL 0x5033 +#define MASK_SRL 0xfe00707f +#define MATCH_SRA 0x40005033 +#define MASK_SRA 0xfe00707f +#define MATCH_OR 0x6033 +#define MASK_OR 0xfe00707f +#define MATCH_AND 0x7033 +#define MASK_AND 0xfe00707f +#define MATCH_ADDIW 0x1b +#define MASK_ADDIW 0x707f +#define MATCH_SLLIW 0x101b +#define MASK_SLLIW 0xfe00707f +#define MATCH_SRLIW 0x501b +#define MASK_SRLIW 0xfe00707f +#define MATCH_SRAIW 0x4000501b +#define MASK_SRAIW 0xfe00707f +#define MATCH_ADDW 0x3b +#define MASK_ADDW 0xfe00707f +#define MATCH_SUBW 0x4000003b +#define MASK_SUBW 0xfe00707f +#define MATCH_SLLW 0x103b +#define MASK_SLLW 0xfe00707f +#define MATCH_SRLW 0x503b +#define MASK_SRLW 0xfe00707f +#define MATCH_SRAW 0x4000503b +#define MASK_SRAW 0xfe00707f +#define MATCH_LB 0x3 +#define MASK_LB 0x707f +#define MATCH_LH 0x1003 +#define MASK_LH 0x707f +#define MATCH_LW 0x2003 +#define MASK_LW 0x707f +#define MATCH_LD 0x3003 +#define MASK_LD 0x707f +#define MATCH_LBU 0x4003 +#define MASK_LBU 0x707f +#define MATCH_LHU 0x5003 +#define MASK_LHU 0x707f +#define MATCH_LWU 0x6003 +#define MASK_LWU 0x707f +#define MATCH_SB 0x23 +#define MASK_SB 0x707f +#define MATCH_SH 0x1023 +#define MASK_SH 0x707f +#define MATCH_SW 0x2023 +#define MASK_SW 0x707f +#define MATCH_SD 0x3023 +#define MASK_SD 0x707f +#define MATCH_FENCE 0xf +#define MASK_FENCE 0x707f +#define MATCH_FENCE_I 0x100f +#define MASK_FENCE_I 0x707f +#define MATCH_MUL 0x2000033 +#define MASK_MUL 0xfe00707f +#define MATCH_MULH 0x2001033 +#define MASK_MULH 0xfe00707f +#define MATCH_MULHSU 0x2002033 +#define MASK_MULHSU 0xfe00707f +#define MATCH_MULHU 0x2003033 +#define MASK_MULHU 0xfe00707f +#define MATCH_DIV 0x2004033 +#define MASK_DIV 0xfe00707f +#define MATCH_DIVU 0x2005033 +#define MASK_DIVU 0xfe00707f +#define MATCH_REM 0x2006033 +#define MASK_REM 0xfe00707f +#define MATCH_REMU 0x2007033 +#define MASK_REMU 0xfe00707f +#define MATCH_MULW 0x200003b +#define MASK_MULW 0xfe00707f +#define MATCH_DIVW 0x200403b +#define MASK_DIVW 0xfe00707f +#define MATCH_DIVUW 0x200503b +#define MASK_DIVUW 0xfe00707f +#define MATCH_REMW 0x200603b +#define MASK_REMW 0xfe00707f +#define MATCH_REMUW 0x200703b +#define MASK_REMUW 0xfe00707f +#define MATCH_AMOADD_W 0x202f +#define MASK_AMOADD_W 0xf800707f +#define MATCH_AMOXOR_W 0x2000202f +#define MASK_AMOXOR_W 0xf800707f +#define MATCH_AMOOR_W 0x4000202f +#define MASK_AMOOR_W 0xf800707f +#define MATCH_AMOAND_W 0x6000202f +#define MASK_AMOAND_W 0xf800707f +#define MATCH_AMOMIN_W 0x8000202f +#define MASK_AMOMIN_W 0xf800707f +#define MATCH_AMOMAX_W 0xa000202f +#define MASK_AMOMAX_W 0xf800707f +#define MATCH_AMOMINU_W 0xc000202f +#define MASK_AMOMINU_W 0xf800707f +#define MATCH_AMOMAXU_W 0xe000202f +#define MASK_AMOMAXU_W 0xf800707f +#define MATCH_AMOSWAP_W 0x800202f +#define MASK_AMOSWAP_W 0xf800707f +#define MATCH_LR_W 0x1000202f +#define MASK_LR_W 0xf9f0707f +#define MATCH_SC_W 0x1800202f +#define MASK_SC_W 0xf800707f +#define MATCH_AMOADD_D 0x302f +#define MASK_AMOADD_D 0xf800707f +#define MATCH_AMOXOR_D 0x2000302f +#define MASK_AMOXOR_D 0xf800707f +#define MATCH_AMOOR_D 0x4000302f +#define MASK_AMOOR_D 0xf800707f +#define MATCH_AMOAND_D 0x6000302f +#define MASK_AMOAND_D 0xf800707f +#define MATCH_AMOMIN_D 0x8000302f +#define MASK_AMOMIN_D 0xf800707f +#define MATCH_AMOMAX_D 0xa000302f +#define MASK_AMOMAX_D 0xf800707f +#define MATCH_AMOMINU_D 0xc000302f +#define MASK_AMOMINU_D 0xf800707f +#define MATCH_AMOMAXU_D 0xe000302f +#define MASK_AMOMAXU_D 0xf800707f +#define MATCH_AMOSWAP_D 0x800302f +#define MASK_AMOSWAP_D 0xf800707f +#define MATCH_LR_D 0x1000302f +#define MASK_LR_D 0xf9f0707f +#define MATCH_SC_D 0x1800302f +#define MASK_SC_D 0xf800707f +#define MATCH_ECALL 0x73 +#define MASK_ECALL 0xffffffff +#define MATCH_EBREAK 0x100073 +#define MASK_EBREAK 0xffffffff +#define MATCH_URET 0x200073 +#define MASK_URET 0xffffffff +#define MATCH_SRET 0x10200073 +#define MASK_SRET 0xffffffff +#define MATCH_MRET 0x30200073 +#define MASK_MRET 0xffffffff +#define MATCH_DRET 0x7b200073 +#define MASK_DRET 0xffffffff +#define MATCH_SFENCE_VMA 0x12000073 +#define MASK_SFENCE_VMA 0xfe007fff +#define MATCH_WFI 0x10500073 +#define MASK_WFI 0xffffffff +#define MATCH_CSRRW 0x1073 +#define MASK_CSRRW 0x707f +#define MATCH_CSRRS 0x2073 +#define MASK_CSRRS 0x707f +#define MATCH_CSRRC 0x3073 +#define MASK_CSRRC 0x707f +#define MATCH_CSRRWI 0x5073 +#define MASK_CSRRWI 0x707f +#define MATCH_CSRRSI 0x6073 +#define MASK_CSRRSI 0x707f +#define MATCH_CSRRCI 0x7073 +#define MASK_CSRRCI 0x707f +#define MATCH_FADD_S 0x53 +#define MASK_FADD_S 0xfe00007f +#define MATCH_FSUB_S 0x8000053 +#define MASK_FSUB_S 0xfe00007f +#define MATCH_FMUL_S 0x10000053 +#define MASK_FMUL_S 0xfe00007f +#define MATCH_FDIV_S 0x18000053 +#define MASK_FDIV_S 0xfe00007f +#define MATCH_FSGNJ_S 0x20000053 +#define MASK_FSGNJ_S 0xfe00707f +#define MATCH_FSGNJN_S 0x20001053 +#define MASK_FSGNJN_S 0xfe00707f +#define MATCH_FSGNJX_S 0x20002053 +#define MASK_FSGNJX_S 0xfe00707f +#define MATCH_FMIN_S 0x28000053 +#define MASK_FMIN_S 0xfe00707f +#define MATCH_FMAX_S 0x28001053 +#define MASK_FMAX_S 0xfe00707f +#define MATCH_FSQRT_S 0x58000053 +#define MASK_FSQRT_S 0xfff0007f +#define MATCH_FADD_D 0x2000053 +#define MASK_FADD_D 0xfe00007f +#define MATCH_FSUB_D 0xa000053 +#define MASK_FSUB_D 0xfe00007f +#define MATCH_FMUL_D 0x12000053 +#define MASK_FMUL_D 0xfe00007f +#define MATCH_FDIV_D 0x1a000053 +#define MASK_FDIV_D 0xfe00007f +#define MATCH_FSGNJ_D 0x22000053 +#define MASK_FSGNJ_D 0xfe00707f +#define MATCH_FSGNJN_D 0x22001053 +#define MASK_FSGNJN_D 0xfe00707f +#define MATCH_FSGNJX_D 0x22002053 +#define MASK_FSGNJX_D 0xfe00707f +#define MATCH_FMIN_D 0x2a000053 +#define MASK_FMIN_D 0xfe00707f +#define MATCH_FMAX_D 0x2a001053 +#define MASK_FMAX_D 0xfe00707f +#define MATCH_FCVT_S_D 0x40100053 +#define MASK_FCVT_S_D 0xfff0007f +#define MATCH_FCVT_D_S 0x42000053 +#define MASK_FCVT_D_S 0xfff0007f +#define MATCH_FSQRT_D 0x5a000053 +#define MASK_FSQRT_D 0xfff0007f +#define MATCH_FADD_Q 0x6000053 +#define MASK_FADD_Q 0xfe00007f +#define MATCH_FSUB_Q 0xe000053 +#define MASK_FSUB_Q 0xfe00007f +#define MATCH_FMUL_Q 0x16000053 +#define MASK_FMUL_Q 0xfe00007f +#define MATCH_FDIV_Q 0x1e000053 +#define MASK_FDIV_Q 0xfe00007f +#define MATCH_FSGNJ_Q 0x26000053 +#define MASK_FSGNJ_Q 0xfe00707f +#define MATCH_FSGNJN_Q 0x26001053 +#define MASK_FSGNJN_Q 0xfe00707f +#define MATCH_FSGNJX_Q 0x26002053 +#define MASK_FSGNJX_Q 0xfe00707f +#define MATCH_FMIN_Q 0x2e000053 +#define MASK_FMIN_Q 0xfe00707f +#define MATCH_FMAX_Q 0x2e001053 +#define MASK_FMAX_Q 0xfe00707f +#define MATCH_FCVT_S_Q 0x40300053 +#define MASK_FCVT_S_Q 0xfff0007f +#define MATCH_FCVT_Q_S 0x46000053 +#define MASK_FCVT_Q_S 0xfff0007f +#define MATCH_FCVT_D_Q 0x42300053 +#define MASK_FCVT_D_Q 0xfff0007f +#define MATCH_FCVT_Q_D 0x46100053 +#define MASK_FCVT_Q_D 0xfff0007f +#define MATCH_FSQRT_Q 0x5e000053 +#define MASK_FSQRT_Q 0xfff0007f +#define MATCH_FLE_S 0xa0000053 +#define MASK_FLE_S 0xfe00707f +#define MATCH_FLT_S 0xa0001053 +#define MASK_FLT_S 0xfe00707f +#define MATCH_FEQ_S 0xa0002053 +#define MASK_FEQ_S 0xfe00707f +#define MATCH_FLE_D 0xa2000053 +#define MASK_FLE_D 0xfe00707f +#define MATCH_FLT_D 0xa2001053 +#define MASK_FLT_D 0xfe00707f +#define MATCH_FEQ_D 0xa2002053 +#define MASK_FEQ_D 0xfe00707f +#define MATCH_FLE_Q 0xa6000053 +#define MASK_FLE_Q 0xfe00707f +#define MATCH_FLT_Q 0xa6001053 +#define MASK_FLT_Q 0xfe00707f +#define MATCH_FEQ_Q 0xa6002053 +#define MASK_FEQ_Q 0xfe00707f +#define MATCH_FCVT_W_S 0xc0000053 +#define MASK_FCVT_W_S 0xfff0007f +#define MATCH_FCVT_WU_S 0xc0100053 +#define MASK_FCVT_WU_S 0xfff0007f +#define MATCH_FCVT_L_S 0xc0200053 +#define MASK_FCVT_L_S 0xfff0007f +#define MATCH_FCVT_LU_S 0xc0300053 +#define MASK_FCVT_LU_S 0xfff0007f +#define MATCH_FMV_X_W 0xe0000053 +#define MASK_FMV_X_W 0xfff0707f +#define MATCH_FCLASS_S 0xe0001053 +#define MASK_FCLASS_S 0xfff0707f +#define MATCH_FCVT_W_D 0xc2000053 +#define MASK_FCVT_W_D 0xfff0007f +#define MATCH_FCVT_WU_D 0xc2100053 +#define MASK_FCVT_WU_D 0xfff0007f +#define MATCH_FCVT_L_D 0xc2200053 +#define MASK_FCVT_L_D 0xfff0007f +#define MATCH_FCVT_LU_D 0xc2300053 +#define MASK_FCVT_LU_D 0xfff0007f +#define MATCH_FMV_X_D 0xe2000053 +#define MASK_FMV_X_D 0xfff0707f +#define MATCH_FCLASS_D 0xe2001053 +#define MASK_FCLASS_D 0xfff0707f +#define MATCH_FCVT_W_Q 0xc6000053 +#define MASK_FCVT_W_Q 0xfff0007f +#define MATCH_FCVT_WU_Q 0xc6100053 +#define MASK_FCVT_WU_Q 0xfff0007f +#define MATCH_FCVT_L_Q 0xc6200053 +#define MASK_FCVT_L_Q 0xfff0007f +#define MATCH_FCVT_LU_Q 0xc6300053 +#define MASK_FCVT_LU_Q 0xfff0007f +#define MATCH_FMV_X_Q 0xe6000053 +#define MASK_FMV_X_Q 0xfff0707f +#define MATCH_FCLASS_Q 0xe6001053 +#define MASK_FCLASS_Q 0xfff0707f +#define MATCH_FCVT_S_W 0xd0000053 +#define MASK_FCVT_S_W 0xfff0007f +#define MATCH_FCVT_S_WU 0xd0100053 +#define MASK_FCVT_S_WU 0xfff0007f +#define MATCH_FCVT_S_L 0xd0200053 +#define MASK_FCVT_S_L 0xfff0007f +#define MATCH_FCVT_S_LU 0xd0300053 +#define MASK_FCVT_S_LU 0xfff0007f +#define MATCH_FMV_W_X 0xf0000053 +#define MASK_FMV_W_X 0xfff0707f +#define MATCH_FCVT_D_W 0xd2000053 +#define MASK_FCVT_D_W 0xfff0007f +#define MATCH_FCVT_D_WU 0xd2100053 +#define MASK_FCVT_D_WU 0xfff0007f +#define MATCH_FCVT_D_L 0xd2200053 +#define MASK_FCVT_D_L 0xfff0007f +#define MATCH_FCVT_D_LU 0xd2300053 +#define MASK_FCVT_D_LU 0xfff0007f +#define MATCH_FMV_D_X 0xf2000053 +#define MASK_FMV_D_X 0xfff0707f +#define MATCH_FCVT_Q_W 0xd6000053 +#define MASK_FCVT_Q_W 0xfff0007f +#define MATCH_FCVT_Q_WU 0xd6100053 +#define MASK_FCVT_Q_WU 0xfff0007f +#define MATCH_FCVT_Q_L 0xd6200053 +#define MASK_FCVT_Q_L 0xfff0007f +#define MATCH_FCVT_Q_LU 0xd6300053 +#define MASK_FCVT_Q_LU 0xfff0007f +#define MATCH_FMV_Q_X 0xf6000053 +#define MASK_FMV_Q_X 0xfff0707f +#define MATCH_FLW 0x2007 +#define MASK_FLW 0x707f +#define MATCH_FLD 0x3007 +#define MASK_FLD 0x707f +#define MATCH_FLQ 0x4007 +#define MASK_FLQ 0x707f +#define MATCH_FSW 0x2027 +#define MASK_FSW 0x707f +#define MATCH_FSD 0x3027 +#define MASK_FSD 0x707f +#define MATCH_FSQ 0x4027 +#define MASK_FSQ 0x707f +#define MATCH_FMADD_S 0x43 +#define MASK_FMADD_S 0x600007f +#define MATCH_FMSUB_S 0x47 +#define MASK_FMSUB_S 0x600007f +#define MATCH_FNMSUB_S 0x4b +#define MASK_FNMSUB_S 0x600007f +#define MATCH_FNMADD_S 0x4f +#define MASK_FNMADD_S 0x600007f +#define MATCH_FMADD_D 0x2000043 +#define MASK_FMADD_D 0x600007f +#define MATCH_FMSUB_D 0x2000047 +#define MASK_FMSUB_D 0x600007f +#define MATCH_FNMSUB_D 0x200004b +#define MASK_FNMSUB_D 0x600007f +#define MATCH_FNMADD_D 0x200004f +#define MASK_FNMADD_D 0x600007f +#define MATCH_FMADD_Q 0x6000043 +#define MASK_FMADD_Q 0x600007f +#define MATCH_FMSUB_Q 0x6000047 +#define MASK_FMSUB_Q 0x600007f +#define MATCH_FNMSUB_Q 0x600004b +#define MASK_FNMSUB_Q 0x600007f +#define MATCH_FNMADD_Q 0x600004f +#define MASK_FNMADD_Q 0x600007f +#define MATCH_C_NOP 0x1 +#define MASK_C_NOP 0xffff +#define MATCH_C_ADDI16SP 0x6101 +#define MASK_C_ADDI16SP 0xef83 +#define MATCH_C_JR 0x8002 +#define MASK_C_JR 0xf07f +#define MATCH_C_JALR 0x9002 +#define MASK_C_JALR 0xf07f +#define MATCH_C_EBREAK 0x9002 +#define MASK_C_EBREAK 0xffff +#define MATCH_C_LD 0x6000 +#define MASK_C_LD 0xe003 +#define MATCH_C_SD 0xe000 +#define MASK_C_SD 0xe003 +#define MATCH_C_ADDIW 0x2001 +#define MASK_C_ADDIW 0xe003 +#define MATCH_C_LDSP 0x6002 +#define MASK_C_LDSP 0xe003 +#define MATCH_C_SDSP 0xe002 +#define MASK_C_SDSP 0xe003 +#define MATCH_C_ADDI4SPN 0x0 +#define MASK_C_ADDI4SPN 0xe003 +#define MATCH_C_FLD 0x2000 +#define MASK_C_FLD 0xe003 +#define MATCH_C_LW 0x4000 +#define MASK_C_LW 0xe003 +#define MATCH_C_FLW 0x6000 +#define MASK_C_FLW 0xe003 +#define MATCH_C_FSD 0xa000 +#define MASK_C_FSD 0xe003 +#define MATCH_C_SW 0xc000 +#define MASK_C_SW 0xe003 +#define MATCH_C_FSW 0xe000 +#define MASK_C_FSW 0xe003 +#define MATCH_C_ADDI 0x1 +#define MASK_C_ADDI 0xe003 +#define MATCH_C_JAL 0x2001 +#define MASK_C_JAL 0xe003 +#define MATCH_C_LI 0x4001 +#define MASK_C_LI 0xe003 +#define MATCH_C_LUI 0x6001 +#define MASK_C_LUI 0xe003 +#define MATCH_C_SRLI 0x8001 +#define MASK_C_SRLI 0xec03 +#define MATCH_C_SRAI 0x8401 +#define MASK_C_SRAI 0xec03 +#define MATCH_C_ANDI 0x8801 +#define MASK_C_ANDI 0xec03 +#define MATCH_C_SUB 0x8c01 +#define MASK_C_SUB 0xfc63 +#define MATCH_C_XOR 0x8c21 +#define MASK_C_XOR 0xfc63 +#define MATCH_C_OR 0x8c41 +#define MASK_C_OR 0xfc63 +#define MATCH_C_AND 0x8c61 +#define MASK_C_AND 0xfc63 +#define MATCH_C_SUBW 0x9c01 +#define MASK_C_SUBW 0xfc63 +#define MATCH_C_ADDW 0x9c21 +#define MASK_C_ADDW 0xfc63 +#define MATCH_C_J 0xa001 +#define MASK_C_J 0xe003 +#define MATCH_C_BEQZ 0xc001 +#define MASK_C_BEQZ 0xe003 +#define MATCH_C_BNEZ 0xe001 +#define MASK_C_BNEZ 0xe003 +#define MATCH_C_SLLI 0x2 +#define MASK_C_SLLI 0xe003 +#define MATCH_C_FLDSP 0x2002 +#define MASK_C_FLDSP 0xe003 +#define MATCH_C_LWSP 0x4002 +#define MASK_C_LWSP 0xe003 +#define MATCH_C_FLWSP 0x6002 +#define MASK_C_FLWSP 0xe003 +#define MATCH_C_MV 0x8002 +#define MASK_C_MV 0xf003 +#define MATCH_C_ADD 0x9002 +#define MASK_C_ADD 0xf003 +#define MATCH_C_FSDSP 0xa002 +#define MASK_C_FSDSP 0xe003 +#define MATCH_C_SWSP 0xc002 +#define MASK_C_SWSP 0xe003 +#define MATCH_C_FSWSP 0xe002 +#define MASK_C_FSWSP 0xe003 +#define MATCH_CUSTOM0 0xb +#define MASK_CUSTOM0 0x707f +#define MATCH_CUSTOM0_RS1 0x200b +#define MASK_CUSTOM0_RS1 0x707f +#define MATCH_CUSTOM0_RS1_RS2 0x300b +#define MASK_CUSTOM0_RS1_RS2 0x707f +#define MATCH_CUSTOM0_RD 0x400b +#define MASK_CUSTOM0_RD 0x707f +#define MATCH_CUSTOM0_RD_RS1 0x600b +#define MASK_CUSTOM0_RD_RS1 0x707f +#define MATCH_CUSTOM0_RD_RS1_RS2 0x700b +#define MASK_CUSTOM0_RD_RS1_RS2 0x707f +#define MATCH_CUSTOM1 0x2b +#define MASK_CUSTOM1 0x707f +#define MATCH_CUSTOM1_RS1 0x202b +#define MASK_CUSTOM1_RS1 0x707f +#define MATCH_CUSTOM1_RS1_RS2 0x302b +#define MASK_CUSTOM1_RS1_RS2 0x707f +#define MATCH_CUSTOM1_RD 0x402b +#define MASK_CUSTOM1_RD 0x707f +#define MATCH_CUSTOM1_RD_RS1 0x602b +#define MASK_CUSTOM1_RD_RS1 0x707f +#define MATCH_CUSTOM1_RD_RS1_RS2 0x702b +#define MASK_CUSTOM1_RD_RS1_RS2 0x707f +#define MATCH_CUSTOM2 0x5b +#define MASK_CUSTOM2 0x707f +#define MATCH_CUSTOM2_RS1 0x205b +#define MASK_CUSTOM2_RS1 0x707f +#define MATCH_CUSTOM2_RS1_RS2 0x305b +#define MASK_CUSTOM2_RS1_RS2 0x707f +#define MATCH_CUSTOM2_RD 0x405b +#define MASK_CUSTOM2_RD 0x707f +#define MATCH_CUSTOM2_RD_RS1 0x605b +#define MASK_CUSTOM2_RD_RS1 0x707f +#define MATCH_CUSTOM2_RD_RS1_RS2 0x705b +#define MASK_CUSTOM2_RD_RS1_RS2 0x707f +#define MATCH_CUSTOM3 0x7b +#define MASK_CUSTOM3 0x707f +#define MATCH_CUSTOM3_RS1 0x207b +#define MASK_CUSTOM3_RS1 0x707f +#define MATCH_CUSTOM3_RS1_RS2 0x307b +#define MASK_CUSTOM3_RS1_RS2 0x707f +#define MATCH_CUSTOM3_RD 0x407b +#define MASK_CUSTOM3_RD 0x707f +#define MATCH_CUSTOM3_RD_RS1 0x607b +#define MASK_CUSTOM3_RD_RS1 0x707f +#define MATCH_CUSTOM3_RD_RS1_RS2 0x707b +#define MASK_CUSTOM3_RD_RS1_RS2 0x707f +#define CSR_FFLAGS 0x1 +#define CSR_FRM 0x2 +#define CSR_FCSR 0x3 +#define CSR_CYCLE 0xc00 +#define CSR_TIME 0xc01 +#define CSR_INSTRET 0xc02 +#define CSR_HPMCOUNTER3 0xc03 +#define CSR_HPMCOUNTER4 0xc04 +#define CSR_HPMCOUNTER5 0xc05 +#define CSR_HPMCOUNTER6 0xc06 +#define CSR_HPMCOUNTER7 0xc07 +#define CSR_HPMCOUNTER8 0xc08 +#define CSR_HPMCOUNTER9 0xc09 +#define CSR_HPMCOUNTER10 0xc0a +#define CSR_HPMCOUNTER11 0xc0b +#define CSR_HPMCOUNTER12 0xc0c +#define CSR_HPMCOUNTER13 0xc0d +#define CSR_HPMCOUNTER14 0xc0e +#define CSR_HPMCOUNTER15 0xc0f +#define CSR_HPMCOUNTER16 0xc10 +#define CSR_HPMCOUNTER17 0xc11 +#define CSR_HPMCOUNTER18 0xc12 +#define CSR_HPMCOUNTER19 0xc13 +#define CSR_HPMCOUNTER20 0xc14 +#define CSR_HPMCOUNTER21 0xc15 +#define CSR_HPMCOUNTER22 0xc16 +#define CSR_HPMCOUNTER23 0xc17 +#define CSR_HPMCOUNTER24 0xc18 +#define CSR_HPMCOUNTER25 0xc19 +#define CSR_HPMCOUNTER26 0xc1a +#define CSR_HPMCOUNTER27 0xc1b +#define CSR_HPMCOUNTER28 0xc1c +#define CSR_HPMCOUNTER29 0xc1d +#define CSR_HPMCOUNTER30 0xc1e +#define CSR_HPMCOUNTER31 0xc1f +#define CSR_SSTATUS 0x100 +#define CSR_SIE 0x104 +#define CSR_STVEC 0x105 +#define CSR_SCOUNTEREN 0x106 +#define CSR_SSCRATCH 0x140 +#define CSR_SEPC 0x141 +#define CSR_SCAUSE 0x142 +#define CSR_STVAL 0x143 +#define CSR_SIP 0x144 +#define CSR_SATP 0x180 +#define CSR_MSTATUS 0x300 +#define CSR_MISA 0x301 +#define CSR_MEDELEG 0x302 +#define CSR_MIDELEG 0x303 +#define CSR_MIE 0x304 +#define CSR_MTVEC 0x305 +#define CSR_MCOUNTEREN 0x306 +#define CSR_MSCRATCH 0x340 +#define CSR_MEPC 0x341 +#define CSR_MCAUSE 0x342 +#define CSR_MTVAL 0x343 +#define CSR_MIP 0x344 +#define CSR_PMPCFG0 0x3a0 +#define CSR_PMPCFG1 0x3a1 +#define CSR_PMPCFG2 0x3a2 +#define CSR_PMPCFG3 0x3a3 +#define CSR_PMPADDR0 0x3b0 +#define CSR_PMPADDR1 0x3b1 +#define CSR_PMPADDR2 0x3b2 +#define CSR_PMPADDR3 0x3b3 +#define CSR_PMPADDR4 0x3b4 +#define CSR_PMPADDR5 0x3b5 +#define CSR_PMPADDR6 0x3b6 +#define CSR_PMPADDR7 0x3b7 +#define CSR_PMPADDR8 0x3b8 +#define CSR_PMPADDR9 0x3b9 +#define CSR_PMPADDR10 0x3ba +#define CSR_PMPADDR11 0x3bb +#define CSR_PMPADDR12 0x3bc +#define CSR_PMPADDR13 0x3bd +#define CSR_PMPADDR14 0x3be +#define CSR_PMPADDR15 0x3bf +#define CSR_TSELECT 0x7a0 +#define CSR_TDATA1 0x7a1 +#define CSR_TDATA2 0x7a2 +#define CSR_TDATA3 0x7a3 +#define CSR_DCSR 0x7b0 +#define CSR_DPC 0x7b1 +#define CSR_DSCRATCH 0x7b2 +#define CSR_MCYCLE 0xb00 +#define CSR_MINSTRET 0xb02 +#define CSR_MHPMCOUNTER3 0xb03 +#define CSR_MHPMCOUNTER4 0xb04 +#define CSR_MHPMCOUNTER5 0xb05 +#define CSR_MHPMCOUNTER6 0xb06 +#define CSR_MHPMCOUNTER7 0xb07 +#define CSR_MHPMCOUNTER8 0xb08 +#define CSR_MHPMCOUNTER9 0xb09 +#define CSR_MHPMCOUNTER10 0xb0a +#define CSR_MHPMCOUNTER11 0xb0b +#define CSR_MHPMCOUNTER12 0xb0c +#define CSR_MHPMCOUNTER13 0xb0d +#define CSR_MHPMCOUNTER14 0xb0e +#define CSR_MHPMCOUNTER15 0xb0f +#define CSR_MHPMCOUNTER16 0xb10 +#define CSR_MHPMCOUNTER17 0xb11 +#define CSR_MHPMCOUNTER18 0xb12 +#define CSR_MHPMCOUNTER19 0xb13 +#define CSR_MHPMCOUNTER20 0xb14 +#define CSR_MHPMCOUNTER21 0xb15 +#define CSR_MHPMCOUNTER22 0xb16 +#define CSR_MHPMCOUNTER23 0xb17 +#define CSR_MHPMCOUNTER24 0xb18 +#define CSR_MHPMCOUNTER25 0xb19 +#define CSR_MHPMCOUNTER26 0xb1a +#define CSR_MHPMCOUNTER27 0xb1b +#define CSR_MHPMCOUNTER28 0xb1c +#define CSR_MHPMCOUNTER29 0xb1d +#define CSR_MHPMCOUNTER30 0xb1e +#define CSR_MHPMCOUNTER31 0xb1f +#define CSR_MHPMEVENT3 0x323 +#define CSR_MHPMEVENT4 0x324 +#define CSR_MHPMEVENT5 0x325 +#define CSR_MHPMEVENT6 0x326 +#define CSR_MHPMEVENT7 0x327 +#define CSR_MHPMEVENT8 0x328 +#define CSR_MHPMEVENT9 0x329 +#define CSR_MHPMEVENT10 0x32a +#define CSR_MHPMEVENT11 0x32b +#define CSR_MHPMEVENT12 0x32c +#define CSR_MHPMEVENT13 0x32d +#define CSR_MHPMEVENT14 0x32e +#define CSR_MHPMEVENT15 0x32f +#define CSR_MHPMEVENT16 0x330 +#define CSR_MHPMEVENT17 0x331 +#define CSR_MHPMEVENT18 0x332 +#define CSR_MHPMEVENT19 0x333 +#define CSR_MHPMEVENT20 0x334 +#define CSR_MHPMEVENT21 0x335 +#define CSR_MHPMEVENT22 0x336 +#define CSR_MHPMEVENT23 0x337 +#define CSR_MHPMEVENT24 0x338 +#define CSR_MHPMEVENT25 0x339 +#define CSR_MHPMEVENT26 0x33a +#define CSR_MHPMEVENT27 0x33b +#define CSR_MHPMEVENT28 0x33c +#define CSR_MHPMEVENT29 0x33d +#define CSR_MHPMEVENT30 0x33e +#define CSR_MHPMEVENT31 0x33f +#define CSR_MVENDORID 0xf11 +#define CSR_MARCHID 0xf12 +#define CSR_MIMPID 0xf13 +#define CSR_MHARTID 0xf14 +#define CSR_CYCLEH 0xc80 +#define CSR_TIMEH 0xc81 +#define CSR_INSTRETH 0xc82 +#define CSR_HPMCOUNTER3H 0xc83 +#define CSR_HPMCOUNTER4H 0xc84 +#define CSR_HPMCOUNTER5H 0xc85 +#define CSR_HPMCOUNTER6H 0xc86 +#define CSR_HPMCOUNTER7H 0xc87 +#define CSR_HPMCOUNTER8H 0xc88 +#define CSR_HPMCOUNTER9H 0xc89 +#define CSR_HPMCOUNTER10H 0xc8a +#define CSR_HPMCOUNTER11H 0xc8b +#define CSR_HPMCOUNTER12H 0xc8c +#define CSR_HPMCOUNTER13H 0xc8d +#define CSR_HPMCOUNTER14H 0xc8e +#define CSR_HPMCOUNTER15H 0xc8f +#define CSR_HPMCOUNTER16H 0xc90 +#define CSR_HPMCOUNTER17H 0xc91 +#define CSR_HPMCOUNTER18H 0xc92 +#define CSR_HPMCOUNTER19H 0xc93 +#define CSR_HPMCOUNTER20H 0xc94 +#define CSR_HPMCOUNTER21H 0xc95 +#define CSR_HPMCOUNTER22H 0xc96 +#define CSR_HPMCOUNTER23H 0xc97 +#define CSR_HPMCOUNTER24H 0xc98 +#define CSR_HPMCOUNTER25H 0xc99 +#define CSR_HPMCOUNTER26H 0xc9a +#define CSR_HPMCOUNTER27H 0xc9b +#define CSR_HPMCOUNTER28H 0xc9c +#define CSR_HPMCOUNTER29H 0xc9d +#define CSR_HPMCOUNTER30H 0xc9e +#define CSR_HPMCOUNTER31H 0xc9f +#define CSR_MCYCLEH 0xb80 +#define CSR_MINSTRETH 0xb82 +#define CSR_MHPMCOUNTER3H 0xb83 +#define CSR_MHPMCOUNTER4H 0xb84 +#define CSR_MHPMCOUNTER5H 0xb85 +#define CSR_MHPMCOUNTER6H 0xb86 +#define CSR_MHPMCOUNTER7H 0xb87 +#define CSR_MHPMCOUNTER8H 0xb88 +#define CSR_MHPMCOUNTER9H 0xb89 +#define CSR_MHPMCOUNTER10H 0xb8a +#define CSR_MHPMCOUNTER11H 0xb8b +#define CSR_MHPMCOUNTER12H 0xb8c +#define CSR_MHPMCOUNTER13H 0xb8d +#define CSR_MHPMCOUNTER14H 0xb8e +#define CSR_MHPMCOUNTER15H 0xb8f +#define CSR_MHPMCOUNTER16H 0xb90 +#define CSR_MHPMCOUNTER17H 0xb91 +#define CSR_MHPMCOUNTER18H 0xb92 +#define CSR_MHPMCOUNTER19H 0xb93 +#define CSR_MHPMCOUNTER20H 0xb94 +#define CSR_MHPMCOUNTER21H 0xb95 +#define CSR_MHPMCOUNTER22H 0xb96 +#define CSR_MHPMCOUNTER23H 0xb97 +#define CSR_MHPMCOUNTER24H 0xb98 +#define CSR_MHPMCOUNTER25H 0xb99 +#define CSR_MHPMCOUNTER26H 0xb9a +#define CSR_MHPMCOUNTER27H 0xb9b +#define CSR_MHPMCOUNTER28H 0xb9c +#define CSR_MHPMCOUNTER29H 0xb9d +#define CSR_MHPMCOUNTER30H 0xb9e +#define CSR_MHPMCOUNTER31H 0xb9f +#define CAUSE_MISALIGNED_FETCH 0x0 +#define CAUSE_FETCH_ACCESS 0x1 +#define CAUSE_ILLEGAL_INSTRUCTION 0x2 +#define CAUSE_BREAKPOINT 0x3 +#define CAUSE_MISALIGNED_LOAD 0x4 +#define CAUSE_LOAD_ACCESS 0x5 +#define CAUSE_MISALIGNED_STORE 0x6 +#define CAUSE_STORE_ACCESS 0x7 +#define CAUSE_USER_ECALL 0x8 +#define CAUSE_SUPERVISOR_ECALL 0x9 +#define CAUSE_HYPERVISOR_ECALL 0xa +#define CAUSE_MACHINE_ECALL 0xb +#define CAUSE_FETCH_PAGE_FAULT 0xc +#define CAUSE_LOAD_PAGE_FAULT 0xd +#define CAUSE_STORE_PAGE_FAULT 0xf +#endif +#ifdef DECLARE_INSN +DECLARE_INSN(beq, MATCH_BEQ, MASK_BEQ) +DECLARE_INSN(bne, MATCH_BNE, MASK_BNE) +DECLARE_INSN(blt, MATCH_BLT, MASK_BLT) +DECLARE_INSN(bge, MATCH_BGE, MASK_BGE) +DECLARE_INSN(bltu, MATCH_BLTU, MASK_BLTU) +DECLARE_INSN(bgeu, MATCH_BGEU, MASK_BGEU) +DECLARE_INSN(jalr, MATCH_JALR, MASK_JALR) +DECLARE_INSN(jal, MATCH_JAL, MASK_JAL) +DECLARE_INSN(lui, MATCH_LUI, MASK_LUI) +DECLARE_INSN(auipc, MATCH_AUIPC, MASK_AUIPC) +DECLARE_INSN(addi, MATCH_ADDI, MASK_ADDI) +DECLARE_INSN(slli, MATCH_SLLI, MASK_SLLI) +DECLARE_INSN(slti, MATCH_SLTI, MASK_SLTI) +DECLARE_INSN(sltiu, MATCH_SLTIU, MASK_SLTIU) +DECLARE_INSN(xori, MATCH_XORI, MASK_XORI) +DECLARE_INSN(srli, MATCH_SRLI, MASK_SRLI) +DECLARE_INSN(srai, MATCH_SRAI, MASK_SRAI) +DECLARE_INSN(ori, MATCH_ORI, MASK_ORI) +DECLARE_INSN(andi, MATCH_ANDI, MASK_ANDI) +DECLARE_INSN(add, MATCH_ADD, MASK_ADD) +DECLARE_INSN(sub, MATCH_SUB, MASK_SUB) +DECLARE_INSN(sll, MATCH_SLL, MASK_SLL) +DECLARE_INSN(slt, MATCH_SLT, MASK_SLT) +DECLARE_INSN(sltu, MATCH_SLTU, MASK_SLTU) +DECLARE_INSN(xor, MATCH_XOR, MASK_XOR) +DECLARE_INSN(srl, MATCH_SRL, MASK_SRL) +DECLARE_INSN(sra, MATCH_SRA, MASK_SRA) +DECLARE_INSN(or, MATCH_OR, MASK_OR) +DECLARE_INSN(and, MATCH_AND, MASK_AND) +DECLARE_INSN(addiw, MATCH_ADDIW, MASK_ADDIW) +DECLARE_INSN(slliw, MATCH_SLLIW, MASK_SLLIW) +DECLARE_INSN(srliw, MATCH_SRLIW, MASK_SRLIW) +DECLARE_INSN(sraiw, MATCH_SRAIW, MASK_SRAIW) +DECLARE_INSN(addw, MATCH_ADDW, MASK_ADDW) +DECLARE_INSN(subw, MATCH_SUBW, MASK_SUBW) +DECLARE_INSN(sllw, MATCH_SLLW, MASK_SLLW) +DECLARE_INSN(srlw, MATCH_SRLW, MASK_SRLW) +DECLARE_INSN(sraw, MATCH_SRAW, MASK_SRAW) +DECLARE_INSN(lb, MATCH_LB, MASK_LB) +DECLARE_INSN(lh, MATCH_LH, MASK_LH) +DECLARE_INSN(lw, MATCH_LW, MASK_LW) +DECLARE_INSN(ld, MATCH_LD, MASK_LD) +DECLARE_INSN(lbu, MATCH_LBU, MASK_LBU) +DECLARE_INSN(lhu, MATCH_LHU, MASK_LHU) +DECLARE_INSN(lwu, MATCH_LWU, MASK_LWU) +DECLARE_INSN(sb, MATCH_SB, MASK_SB) +DECLARE_INSN(sh, MATCH_SH, MASK_SH) +DECLARE_INSN(sw, MATCH_SW, MASK_SW) +DECLARE_INSN(sd, MATCH_SD, MASK_SD) +DECLARE_INSN(fence, MATCH_FENCE, MASK_FENCE) +DECLARE_INSN(fence_i, MATCH_FENCE_I, MASK_FENCE_I) +DECLARE_INSN(mul, MATCH_MUL, MASK_MUL) +DECLARE_INSN(mulh, MATCH_MULH, MASK_MULH) +DECLARE_INSN(mulhsu, MATCH_MULHSU, MASK_MULHSU) +DECLARE_INSN(mulhu, MATCH_MULHU, MASK_MULHU) +DECLARE_INSN(div, MATCH_DIV, MASK_DIV) +DECLARE_INSN(divu, MATCH_DIVU, MASK_DIVU) +DECLARE_INSN(rem, MATCH_REM, MASK_REM) +DECLARE_INSN(remu, MATCH_REMU, MASK_REMU) +DECLARE_INSN(mulw, MATCH_MULW, MASK_MULW) +DECLARE_INSN(divw, MATCH_DIVW, MASK_DIVW) +DECLARE_INSN(divuw, MATCH_DIVUW, MASK_DIVUW) +DECLARE_INSN(remw, MATCH_REMW, MASK_REMW) +DECLARE_INSN(remuw, MATCH_REMUW, MASK_REMUW) +DECLARE_INSN(amoadd_w, MATCH_AMOADD_W, MASK_AMOADD_W) +DECLARE_INSN(amoxor_w, MATCH_AMOXOR_W, MASK_AMOXOR_W) +DECLARE_INSN(amoor_w, MATCH_AMOOR_W, MASK_AMOOR_W) +DECLARE_INSN(amoand_w, MATCH_AMOAND_W, MASK_AMOAND_W) +DECLARE_INSN(amomin_w, MATCH_AMOMIN_W, MASK_AMOMIN_W) +DECLARE_INSN(amomax_w, MATCH_AMOMAX_W, MASK_AMOMAX_W) +DECLARE_INSN(amominu_w, MATCH_AMOMINU_W, MASK_AMOMINU_W) +DECLARE_INSN(amomaxu_w, MATCH_AMOMAXU_W, MASK_AMOMAXU_W) +DECLARE_INSN(amoswap_w, MATCH_AMOSWAP_W, MASK_AMOSWAP_W) +DECLARE_INSN(lr_w, MATCH_LR_W, MASK_LR_W) +DECLARE_INSN(sc_w, MATCH_SC_W, MASK_SC_W) +DECLARE_INSN(amoadd_d, MATCH_AMOADD_D, MASK_AMOADD_D) +DECLARE_INSN(amoxor_d, MATCH_AMOXOR_D, MASK_AMOXOR_D) +DECLARE_INSN(amoor_d, MATCH_AMOOR_D, MASK_AMOOR_D) +DECLARE_INSN(amoand_d, MATCH_AMOAND_D, MASK_AMOAND_D) +DECLARE_INSN(amomin_d, MATCH_AMOMIN_D, MASK_AMOMIN_D) +DECLARE_INSN(amomax_d, MATCH_AMOMAX_D, MASK_AMOMAX_D) +DECLARE_INSN(amominu_d, MATCH_AMOMINU_D, MASK_AMOMINU_D) +DECLARE_INSN(amomaxu_d, MATCH_AMOMAXU_D, MASK_AMOMAXU_D) +DECLARE_INSN(amoswap_d, MATCH_AMOSWAP_D, MASK_AMOSWAP_D) +DECLARE_INSN(lr_d, MATCH_LR_D, MASK_LR_D) +DECLARE_INSN(sc_d, MATCH_SC_D, MASK_SC_D) +DECLARE_INSN(ecall, MATCH_ECALL, MASK_ECALL) +DECLARE_INSN(ebreak, MATCH_EBREAK, MASK_EBREAK) +DECLARE_INSN(uret, MATCH_URET, MASK_URET) +DECLARE_INSN(sret, MATCH_SRET, MASK_SRET) +DECLARE_INSN(mret, MATCH_MRET, MASK_MRET) +DECLARE_INSN(dret, MATCH_DRET, MASK_DRET) +DECLARE_INSN(sfence_vma, MATCH_SFENCE_VMA, MASK_SFENCE_VMA) +DECLARE_INSN(wfi, MATCH_WFI, MASK_WFI) +DECLARE_INSN(csrrw, MATCH_CSRRW, MASK_CSRRW) +DECLARE_INSN(csrrs, MATCH_CSRRS, MASK_CSRRS) +DECLARE_INSN(csrrc, MATCH_CSRRC, MASK_CSRRC) +DECLARE_INSN(csrrwi, MATCH_CSRRWI, MASK_CSRRWI) +DECLARE_INSN(csrrsi, MATCH_CSRRSI, MASK_CSRRSI) +DECLARE_INSN(csrrci, MATCH_CSRRCI, MASK_CSRRCI) +DECLARE_INSN(fadd_s, MATCH_FADD_S, MASK_FADD_S) +DECLARE_INSN(fsub_s, MATCH_FSUB_S, MASK_FSUB_S) +DECLARE_INSN(fmul_s, MATCH_FMUL_S, MASK_FMUL_S) +DECLARE_INSN(fdiv_s, MATCH_FDIV_S, MASK_FDIV_S) +DECLARE_INSN(fsgnj_s, MATCH_FSGNJ_S, MASK_FSGNJ_S) +DECLARE_INSN(fsgnjn_s, MATCH_FSGNJN_S, MASK_FSGNJN_S) +DECLARE_INSN(fsgnjx_s, MATCH_FSGNJX_S, MASK_FSGNJX_S) +DECLARE_INSN(fmin_s, MATCH_FMIN_S, MASK_FMIN_S) +DECLARE_INSN(fmax_s, MATCH_FMAX_S, MASK_FMAX_S) +DECLARE_INSN(fsqrt_s, MATCH_FSQRT_S, MASK_FSQRT_S) +DECLARE_INSN(fadd_d, MATCH_FADD_D, MASK_FADD_D) +DECLARE_INSN(fsub_d, MATCH_FSUB_D, MASK_FSUB_D) +DECLARE_INSN(fmul_d, MATCH_FMUL_D, MASK_FMUL_D) +DECLARE_INSN(fdiv_d, MATCH_FDIV_D, MASK_FDIV_D) +DECLARE_INSN(fsgnj_d, MATCH_FSGNJ_D, MASK_FSGNJ_D) +DECLARE_INSN(fsgnjn_d, MATCH_FSGNJN_D, MASK_FSGNJN_D) +DECLARE_INSN(fsgnjx_d, MATCH_FSGNJX_D, MASK_FSGNJX_D) +DECLARE_INSN(fmin_d, MATCH_FMIN_D, MASK_FMIN_D) +DECLARE_INSN(fmax_d, MATCH_FMAX_D, MASK_FMAX_D) +DECLARE_INSN(fcvt_s_d, MATCH_FCVT_S_D, MASK_FCVT_S_D) +DECLARE_INSN(fcvt_d_s, MATCH_FCVT_D_S, MASK_FCVT_D_S) +DECLARE_INSN(fsqrt_d, MATCH_FSQRT_D, MASK_FSQRT_D) +DECLARE_INSN(fadd_q, MATCH_FADD_Q, MASK_FADD_Q) +DECLARE_INSN(fsub_q, MATCH_FSUB_Q, MASK_FSUB_Q) +DECLARE_INSN(fmul_q, MATCH_FMUL_Q, MASK_FMUL_Q) +DECLARE_INSN(fdiv_q, MATCH_FDIV_Q, MASK_FDIV_Q) +DECLARE_INSN(fsgnj_q, MATCH_FSGNJ_Q, MASK_FSGNJ_Q) +DECLARE_INSN(fsgnjn_q, MATCH_FSGNJN_Q, MASK_FSGNJN_Q) +DECLARE_INSN(fsgnjx_q, MATCH_FSGNJX_Q, MASK_FSGNJX_Q) +DECLARE_INSN(fmin_q, MATCH_FMIN_Q, MASK_FMIN_Q) +DECLARE_INSN(fmax_q, MATCH_FMAX_Q, MASK_FMAX_Q) +DECLARE_INSN(fcvt_s_q, MATCH_FCVT_S_Q, MASK_FCVT_S_Q) +DECLARE_INSN(fcvt_q_s, MATCH_FCVT_Q_S, MASK_FCVT_Q_S) +DECLARE_INSN(fcvt_d_q, MATCH_FCVT_D_Q, MASK_FCVT_D_Q) +DECLARE_INSN(fcvt_q_d, MATCH_FCVT_Q_D, MASK_FCVT_Q_D) +DECLARE_INSN(fsqrt_q, MATCH_FSQRT_Q, MASK_FSQRT_Q) +DECLARE_INSN(fle_s, MATCH_FLE_S, MASK_FLE_S) +DECLARE_INSN(flt_s, MATCH_FLT_S, MASK_FLT_S) +DECLARE_INSN(feq_s, MATCH_FEQ_S, MASK_FEQ_S) +DECLARE_INSN(fle_d, MATCH_FLE_D, MASK_FLE_D) +DECLARE_INSN(flt_d, MATCH_FLT_D, MASK_FLT_D) +DECLARE_INSN(feq_d, MATCH_FEQ_D, MASK_FEQ_D) +DECLARE_INSN(fle_q, MATCH_FLE_Q, MASK_FLE_Q) +DECLARE_INSN(flt_q, MATCH_FLT_Q, MASK_FLT_Q) +DECLARE_INSN(feq_q, MATCH_FEQ_Q, MASK_FEQ_Q) +DECLARE_INSN(fcvt_w_s, MATCH_FCVT_W_S, MASK_FCVT_W_S) +DECLARE_INSN(fcvt_wu_s, MATCH_FCVT_WU_S, MASK_FCVT_WU_S) +DECLARE_INSN(fcvt_l_s, MATCH_FCVT_L_S, MASK_FCVT_L_S) +DECLARE_INSN(fcvt_lu_s, MATCH_FCVT_LU_S, MASK_FCVT_LU_S) +DECLARE_INSN(fmv_x_w, MATCH_FMV_X_W, MASK_FMV_X_W) +DECLARE_INSN(fclass_s, MATCH_FCLASS_S, MASK_FCLASS_S) +DECLARE_INSN(fcvt_w_d, MATCH_FCVT_W_D, MASK_FCVT_W_D) +DECLARE_INSN(fcvt_wu_d, MATCH_FCVT_WU_D, MASK_FCVT_WU_D) +DECLARE_INSN(fcvt_l_d, MATCH_FCVT_L_D, MASK_FCVT_L_D) +DECLARE_INSN(fcvt_lu_d, MATCH_FCVT_LU_D, MASK_FCVT_LU_D) +DECLARE_INSN(fmv_x_d, MATCH_FMV_X_D, MASK_FMV_X_D) +DECLARE_INSN(fclass_d, MATCH_FCLASS_D, MASK_FCLASS_D) +DECLARE_INSN(fcvt_w_q, MATCH_FCVT_W_Q, MASK_FCVT_W_Q) +DECLARE_INSN(fcvt_wu_q, MATCH_FCVT_WU_Q, MASK_FCVT_WU_Q) +DECLARE_INSN(fcvt_l_q, MATCH_FCVT_L_Q, MASK_FCVT_L_Q) +DECLARE_INSN(fcvt_lu_q, MATCH_FCVT_LU_Q, MASK_FCVT_LU_Q) +DECLARE_INSN(fmv_x_q, MATCH_FMV_X_Q, MASK_FMV_X_Q) +DECLARE_INSN(fclass_q, MATCH_FCLASS_Q, MASK_FCLASS_Q) +DECLARE_INSN(fcvt_s_w, MATCH_FCVT_S_W, MASK_FCVT_S_W) +DECLARE_INSN(fcvt_s_wu, MATCH_FCVT_S_WU, MASK_FCVT_S_WU) +DECLARE_INSN(fcvt_s_l, MATCH_FCVT_S_L, MASK_FCVT_S_L) +DECLARE_INSN(fcvt_s_lu, MATCH_FCVT_S_LU, MASK_FCVT_S_LU) +DECLARE_INSN(fmv_w_x, MATCH_FMV_W_X, MASK_FMV_W_X) +DECLARE_INSN(fcvt_d_w, MATCH_FCVT_D_W, MASK_FCVT_D_W) +DECLARE_INSN(fcvt_d_wu, MATCH_FCVT_D_WU, MASK_FCVT_D_WU) +DECLARE_INSN(fcvt_d_l, MATCH_FCVT_D_L, MASK_FCVT_D_L) +DECLARE_INSN(fcvt_d_lu, MATCH_FCVT_D_LU, MASK_FCVT_D_LU) +DECLARE_INSN(fmv_d_x, MATCH_FMV_D_X, MASK_FMV_D_X) +DECLARE_INSN(fcvt_q_w, MATCH_FCVT_Q_W, MASK_FCVT_Q_W) +DECLARE_INSN(fcvt_q_wu, MATCH_FCVT_Q_WU, MASK_FCVT_Q_WU) +DECLARE_INSN(fcvt_q_l, MATCH_FCVT_Q_L, MASK_FCVT_Q_L) +DECLARE_INSN(fcvt_q_lu, MATCH_FCVT_Q_LU, MASK_FCVT_Q_LU) +DECLARE_INSN(fmv_q_x, MATCH_FMV_Q_X, MASK_FMV_Q_X) +DECLARE_INSN(flw, MATCH_FLW, MASK_FLW) +DECLARE_INSN(fld, MATCH_FLD, MASK_FLD) +DECLARE_INSN(flq, MATCH_FLQ, MASK_FLQ) +DECLARE_INSN(fsw, MATCH_FSW, MASK_FSW) +DECLARE_INSN(fsd, MATCH_FSD, MASK_FSD) +DECLARE_INSN(fsq, MATCH_FSQ, MASK_FSQ) +DECLARE_INSN(fmadd_s, MATCH_FMADD_S, MASK_FMADD_S) +DECLARE_INSN(fmsub_s, MATCH_FMSUB_S, MASK_FMSUB_S) +DECLARE_INSN(fnmsub_s, MATCH_FNMSUB_S, MASK_FNMSUB_S) +DECLARE_INSN(fnmadd_s, MATCH_FNMADD_S, MASK_FNMADD_S) +DECLARE_INSN(fmadd_d, MATCH_FMADD_D, MASK_FMADD_D) +DECLARE_INSN(fmsub_d, MATCH_FMSUB_D, MASK_FMSUB_D) +DECLARE_INSN(fnmsub_d, MATCH_FNMSUB_D, MASK_FNMSUB_D) +DECLARE_INSN(fnmadd_d, MATCH_FNMADD_D, MASK_FNMADD_D) +DECLARE_INSN(fmadd_q, MATCH_FMADD_Q, MASK_FMADD_Q) +DECLARE_INSN(fmsub_q, MATCH_FMSUB_Q, MASK_FMSUB_Q) +DECLARE_INSN(fnmsub_q, MATCH_FNMSUB_Q, MASK_FNMSUB_Q) +DECLARE_INSN(fnmadd_q, MATCH_FNMADD_Q, MASK_FNMADD_Q) +DECLARE_INSN(c_nop, MATCH_C_NOP, MASK_C_NOP) +DECLARE_INSN(c_addi16sp, MATCH_C_ADDI16SP, MASK_C_ADDI16SP) +DECLARE_INSN(c_jr, MATCH_C_JR, MASK_C_JR) +DECLARE_INSN(c_jalr, MATCH_C_JALR, MASK_C_JALR) +DECLARE_INSN(c_ebreak, MATCH_C_EBREAK, MASK_C_EBREAK) +DECLARE_INSN(c_ld, MATCH_C_LD, MASK_C_LD) +DECLARE_INSN(c_sd, MATCH_C_SD, MASK_C_SD) +DECLARE_INSN(c_addiw, MATCH_C_ADDIW, MASK_C_ADDIW) +DECLARE_INSN(c_ldsp, MATCH_C_LDSP, MASK_C_LDSP) +DECLARE_INSN(c_sdsp, MATCH_C_SDSP, MASK_C_SDSP) +DECLARE_INSN(c_addi4spn, MATCH_C_ADDI4SPN, MASK_C_ADDI4SPN) +DECLARE_INSN(c_fld, MATCH_C_FLD, MASK_C_FLD) +DECLARE_INSN(c_lw, MATCH_C_LW, MASK_C_LW) +DECLARE_INSN(c_flw, MATCH_C_FLW, MASK_C_FLW) +DECLARE_INSN(c_fsd, MATCH_C_FSD, MASK_C_FSD) +DECLARE_INSN(c_sw, MATCH_C_SW, MASK_C_SW) +DECLARE_INSN(c_fsw, MATCH_C_FSW, MASK_C_FSW) +DECLARE_INSN(c_addi, MATCH_C_ADDI, MASK_C_ADDI) +DECLARE_INSN(c_jal, MATCH_C_JAL, MASK_C_JAL) +DECLARE_INSN(c_li, MATCH_C_LI, MASK_C_LI) +DECLARE_INSN(c_lui, MATCH_C_LUI, MASK_C_LUI) +DECLARE_INSN(c_srli, MATCH_C_SRLI, MASK_C_SRLI) +DECLARE_INSN(c_srai, MATCH_C_SRAI, MASK_C_SRAI) +DECLARE_INSN(c_andi, MATCH_C_ANDI, MASK_C_ANDI) +DECLARE_INSN(c_sub, MATCH_C_SUB, MASK_C_SUB) +DECLARE_INSN(c_xor, MATCH_C_XOR, MASK_C_XOR) +DECLARE_INSN(c_or, MATCH_C_OR, MASK_C_OR) +DECLARE_INSN(c_and, MATCH_C_AND, MASK_C_AND) +DECLARE_INSN(c_subw, MATCH_C_SUBW, MASK_C_SUBW) +DECLARE_INSN(c_addw, MATCH_C_ADDW, MASK_C_ADDW) +DECLARE_INSN(c_j, MATCH_C_J, MASK_C_J) +DECLARE_INSN(c_beqz, MATCH_C_BEQZ, MASK_C_BEQZ) +DECLARE_INSN(c_bnez, MATCH_C_BNEZ, MASK_C_BNEZ) +DECLARE_INSN(c_slli, MATCH_C_SLLI, MASK_C_SLLI) +DECLARE_INSN(c_fldsp, MATCH_C_FLDSP, MASK_C_FLDSP) +DECLARE_INSN(c_lwsp, MATCH_C_LWSP, MASK_C_LWSP) +DECLARE_INSN(c_flwsp, MATCH_C_FLWSP, MASK_C_FLWSP) +DECLARE_INSN(c_mv, MATCH_C_MV, MASK_C_MV) +DECLARE_INSN(c_add, MATCH_C_ADD, MASK_C_ADD) +DECLARE_INSN(c_fsdsp, MATCH_C_FSDSP, MASK_C_FSDSP) +DECLARE_INSN(c_swsp, MATCH_C_SWSP, MASK_C_SWSP) +DECLARE_INSN(c_fswsp, MATCH_C_FSWSP, MASK_C_FSWSP) +DECLARE_INSN(custom0, MATCH_CUSTOM0, MASK_CUSTOM0) +DECLARE_INSN(custom0_rs1, MATCH_CUSTOM0_RS1, MASK_CUSTOM0_RS1) +DECLARE_INSN(custom0_rs1_rs2, MATCH_CUSTOM0_RS1_RS2, MASK_CUSTOM0_RS1_RS2) +DECLARE_INSN(custom0_rd, MATCH_CUSTOM0_RD, MASK_CUSTOM0_RD) +DECLARE_INSN(custom0_rd_rs1, MATCH_CUSTOM0_RD_RS1, MASK_CUSTOM0_RD_RS1) +DECLARE_INSN(custom0_rd_rs1_rs2, MATCH_CUSTOM0_RD_RS1_RS2, MASK_CUSTOM0_RD_RS1_RS2) +DECLARE_INSN(custom1, MATCH_CUSTOM1, MASK_CUSTOM1) +DECLARE_INSN(custom1_rs1, MATCH_CUSTOM1_RS1, MASK_CUSTOM1_RS1) +DECLARE_INSN(custom1_rs1_rs2, MATCH_CUSTOM1_RS1_RS2, MASK_CUSTOM1_RS1_RS2) +DECLARE_INSN(custom1_rd, MATCH_CUSTOM1_RD, MASK_CUSTOM1_RD) +DECLARE_INSN(custom1_rd_rs1, MATCH_CUSTOM1_RD_RS1, MASK_CUSTOM1_RD_RS1) +DECLARE_INSN(custom1_rd_rs1_rs2, MATCH_CUSTOM1_RD_RS1_RS2, MASK_CUSTOM1_RD_RS1_RS2) +DECLARE_INSN(custom2, MATCH_CUSTOM2, MASK_CUSTOM2) +DECLARE_INSN(custom2_rs1, MATCH_CUSTOM2_RS1, MASK_CUSTOM2_RS1) +DECLARE_INSN(custom2_rs1_rs2, MATCH_CUSTOM2_RS1_RS2, MASK_CUSTOM2_RS1_RS2) +DECLARE_INSN(custom2_rd, MATCH_CUSTOM2_RD, MASK_CUSTOM2_RD) +DECLARE_INSN(custom2_rd_rs1, MATCH_CUSTOM2_RD_RS1, MASK_CUSTOM2_RD_RS1) +DECLARE_INSN(custom2_rd_rs1_rs2, MATCH_CUSTOM2_RD_RS1_RS2, MASK_CUSTOM2_RD_RS1_RS2) +DECLARE_INSN(custom3, MATCH_CUSTOM3, MASK_CUSTOM3) +DECLARE_INSN(custom3_rs1, MATCH_CUSTOM3_RS1, MASK_CUSTOM3_RS1) +DECLARE_INSN(custom3_rs1_rs2, MATCH_CUSTOM3_RS1_RS2, MASK_CUSTOM3_RS1_RS2) +DECLARE_INSN(custom3_rd, MATCH_CUSTOM3_RD, MASK_CUSTOM3_RD) +DECLARE_INSN(custom3_rd_rs1, MATCH_CUSTOM3_RD_RS1, MASK_CUSTOM3_RD_RS1) +DECLARE_INSN(custom3_rd_rs1_rs2, MATCH_CUSTOM3_RD_RS1_RS2, MASK_CUSTOM3_RD_RS1_RS2) +#endif +#ifdef DECLARE_CSR +DECLARE_CSR(fflags, CSR_FFLAGS) +DECLARE_CSR(frm, CSR_FRM) +DECLARE_CSR(fcsr, CSR_FCSR) +DECLARE_CSR(cycle, CSR_CYCLE) +DECLARE_CSR(time, CSR_TIME) +DECLARE_CSR(instret, CSR_INSTRET) +DECLARE_CSR(hpmcounter3, CSR_HPMCOUNTER3) +DECLARE_CSR(hpmcounter4, CSR_HPMCOUNTER4) +DECLARE_CSR(hpmcounter5, CSR_HPMCOUNTER5) +DECLARE_CSR(hpmcounter6, CSR_HPMCOUNTER6) +DECLARE_CSR(hpmcounter7, CSR_HPMCOUNTER7) +DECLARE_CSR(hpmcounter8, CSR_HPMCOUNTER8) +DECLARE_CSR(hpmcounter9, CSR_HPMCOUNTER9) +DECLARE_CSR(hpmcounter10, CSR_HPMCOUNTER10) +DECLARE_CSR(hpmcounter11, CSR_HPMCOUNTER11) +DECLARE_CSR(hpmcounter12, CSR_HPMCOUNTER12) +DECLARE_CSR(hpmcounter13, CSR_HPMCOUNTER13) +DECLARE_CSR(hpmcounter14, CSR_HPMCOUNTER14) +DECLARE_CSR(hpmcounter15, CSR_HPMCOUNTER15) +DECLARE_CSR(hpmcounter16, CSR_HPMCOUNTER16) +DECLARE_CSR(hpmcounter17, CSR_HPMCOUNTER17) +DECLARE_CSR(hpmcounter18, CSR_HPMCOUNTER18) +DECLARE_CSR(hpmcounter19, CSR_HPMCOUNTER19) +DECLARE_CSR(hpmcounter20, CSR_HPMCOUNTER20) +DECLARE_CSR(hpmcounter21, CSR_HPMCOUNTER21) +DECLARE_CSR(hpmcounter22, CSR_HPMCOUNTER22) +DECLARE_CSR(hpmcounter23, CSR_HPMCOUNTER23) +DECLARE_CSR(hpmcounter24, CSR_HPMCOUNTER24) +DECLARE_CSR(hpmcounter25, CSR_HPMCOUNTER25) +DECLARE_CSR(hpmcounter26, CSR_HPMCOUNTER26) +DECLARE_CSR(hpmcounter27, CSR_HPMCOUNTER27) +DECLARE_CSR(hpmcounter28, CSR_HPMCOUNTER28) +DECLARE_CSR(hpmcounter29, CSR_HPMCOUNTER29) +DECLARE_CSR(hpmcounter30, CSR_HPMCOUNTER30) +DECLARE_CSR(hpmcounter31, CSR_HPMCOUNTER31) +DECLARE_CSR(sstatus, CSR_SSTATUS) +DECLARE_CSR(sie, CSR_SIE) +DECLARE_CSR(stvec, CSR_STVEC) +DECLARE_CSR(scounteren, CSR_SCOUNTEREN) +DECLARE_CSR(sscratch, CSR_SSCRATCH) +DECLARE_CSR(sepc, CSR_SEPC) +DECLARE_CSR(scause, CSR_SCAUSE) +DECLARE_CSR(stval, CSR_STVAL) +DECLARE_CSR(sip, CSR_SIP) +DECLARE_CSR(satp, CSR_SATP) +DECLARE_CSR(mstatus, CSR_MSTATUS) +DECLARE_CSR(misa, CSR_MISA) +DECLARE_CSR(medeleg, CSR_MEDELEG) +DECLARE_CSR(mideleg, CSR_MIDELEG) +DECLARE_CSR(mie, CSR_MIE) +DECLARE_CSR(mtvec, CSR_MTVEC) +DECLARE_CSR(mcounteren, CSR_MCOUNTEREN) +DECLARE_CSR(mscratch, CSR_MSCRATCH) +DECLARE_CSR(mepc, CSR_MEPC) +DECLARE_CSR(mcause, CSR_MCAUSE) +DECLARE_CSR(mtval, CSR_MTVAL) +DECLARE_CSR(mip, CSR_MIP) +DECLARE_CSR(pmpcfg0, CSR_PMPCFG0) +DECLARE_CSR(pmpcfg1, CSR_PMPCFG1) +DECLARE_CSR(pmpcfg2, CSR_PMPCFG2) +DECLARE_CSR(pmpcfg3, CSR_PMPCFG3) +DECLARE_CSR(pmpaddr0, CSR_PMPADDR0) +DECLARE_CSR(pmpaddr1, CSR_PMPADDR1) +DECLARE_CSR(pmpaddr2, CSR_PMPADDR2) +DECLARE_CSR(pmpaddr3, CSR_PMPADDR3) +DECLARE_CSR(pmpaddr4, CSR_PMPADDR4) +DECLARE_CSR(pmpaddr5, CSR_PMPADDR5) +DECLARE_CSR(pmpaddr6, CSR_PMPADDR6) +DECLARE_CSR(pmpaddr7, CSR_PMPADDR7) +DECLARE_CSR(pmpaddr8, CSR_PMPADDR8) +DECLARE_CSR(pmpaddr9, CSR_PMPADDR9) +DECLARE_CSR(pmpaddr10, CSR_PMPADDR10) +DECLARE_CSR(pmpaddr11, CSR_PMPADDR11) +DECLARE_CSR(pmpaddr12, CSR_PMPADDR12) +DECLARE_CSR(pmpaddr13, CSR_PMPADDR13) +DECLARE_CSR(pmpaddr14, CSR_PMPADDR14) +DECLARE_CSR(pmpaddr15, CSR_PMPADDR15) +DECLARE_CSR(tselect, CSR_TSELECT) +DECLARE_CSR(tdata1, CSR_TDATA1) +DECLARE_CSR(tdata2, CSR_TDATA2) +DECLARE_CSR(tdata3, CSR_TDATA3) +DECLARE_CSR(dcsr, CSR_DCSR) +DECLARE_CSR(dpc, CSR_DPC) +DECLARE_CSR(dscratch, CSR_DSCRATCH) +DECLARE_CSR(mcycle, CSR_MCYCLE) +DECLARE_CSR(minstret, CSR_MINSTRET) +DECLARE_CSR(mhpmcounter3, CSR_MHPMCOUNTER3) +DECLARE_CSR(mhpmcounter4, CSR_MHPMCOUNTER4) +DECLARE_CSR(mhpmcounter5, CSR_MHPMCOUNTER5) +DECLARE_CSR(mhpmcounter6, CSR_MHPMCOUNTER6) +DECLARE_CSR(mhpmcounter7, CSR_MHPMCOUNTER7) +DECLARE_CSR(mhpmcounter8, CSR_MHPMCOUNTER8) +DECLARE_CSR(mhpmcounter9, CSR_MHPMCOUNTER9) +DECLARE_CSR(mhpmcounter10, CSR_MHPMCOUNTER10) +DECLARE_CSR(mhpmcounter11, CSR_MHPMCOUNTER11) +DECLARE_CSR(mhpmcounter12, CSR_MHPMCOUNTER12) +DECLARE_CSR(mhpmcounter13, CSR_MHPMCOUNTER13) +DECLARE_CSR(mhpmcounter14, CSR_MHPMCOUNTER14) +DECLARE_CSR(mhpmcounter15, CSR_MHPMCOUNTER15) +DECLARE_CSR(mhpmcounter16, CSR_MHPMCOUNTER16) +DECLARE_CSR(mhpmcounter17, CSR_MHPMCOUNTER17) +DECLARE_CSR(mhpmcounter18, CSR_MHPMCOUNTER18) +DECLARE_CSR(mhpmcounter19, CSR_MHPMCOUNTER19) +DECLARE_CSR(mhpmcounter20, CSR_MHPMCOUNTER20) +DECLARE_CSR(mhpmcounter21, CSR_MHPMCOUNTER21) +DECLARE_CSR(mhpmcounter22, CSR_MHPMCOUNTER22) +DECLARE_CSR(mhpmcounter23, CSR_MHPMCOUNTER23) +DECLARE_CSR(mhpmcounter24, CSR_MHPMCOUNTER24) +DECLARE_CSR(mhpmcounter25, CSR_MHPMCOUNTER25) +DECLARE_CSR(mhpmcounter26, CSR_MHPMCOUNTER26) +DECLARE_CSR(mhpmcounter27, CSR_MHPMCOUNTER27) +DECLARE_CSR(mhpmcounter28, CSR_MHPMCOUNTER28) +DECLARE_CSR(mhpmcounter29, CSR_MHPMCOUNTER29) +DECLARE_CSR(mhpmcounter30, CSR_MHPMCOUNTER30) +DECLARE_CSR(mhpmcounter31, CSR_MHPMCOUNTER31) +DECLARE_CSR(mhpmevent3, CSR_MHPMEVENT3) +DECLARE_CSR(mhpmevent4, CSR_MHPMEVENT4) +DECLARE_CSR(mhpmevent5, CSR_MHPMEVENT5) +DECLARE_CSR(mhpmevent6, CSR_MHPMEVENT6) +DECLARE_CSR(mhpmevent7, CSR_MHPMEVENT7) +DECLARE_CSR(mhpmevent8, CSR_MHPMEVENT8) +DECLARE_CSR(mhpmevent9, CSR_MHPMEVENT9) +DECLARE_CSR(mhpmevent10, CSR_MHPMEVENT10) +DECLARE_CSR(mhpmevent11, CSR_MHPMEVENT11) +DECLARE_CSR(mhpmevent12, CSR_MHPMEVENT12) +DECLARE_CSR(mhpmevent13, CSR_MHPMEVENT13) +DECLARE_CSR(mhpmevent14, CSR_MHPMEVENT14) +DECLARE_CSR(mhpmevent15, CSR_MHPMEVENT15) +DECLARE_CSR(mhpmevent16, CSR_MHPMEVENT16) +DECLARE_CSR(mhpmevent17, CSR_MHPMEVENT17) +DECLARE_CSR(mhpmevent18, CSR_MHPMEVENT18) +DECLARE_CSR(mhpmevent19, CSR_MHPMEVENT19) +DECLARE_CSR(mhpmevent20, CSR_MHPMEVENT20) +DECLARE_CSR(mhpmevent21, CSR_MHPMEVENT21) +DECLARE_CSR(mhpmevent22, CSR_MHPMEVENT22) +DECLARE_CSR(mhpmevent23, CSR_MHPMEVENT23) +DECLARE_CSR(mhpmevent24, CSR_MHPMEVENT24) +DECLARE_CSR(mhpmevent25, CSR_MHPMEVENT25) +DECLARE_CSR(mhpmevent26, CSR_MHPMEVENT26) +DECLARE_CSR(mhpmevent27, CSR_MHPMEVENT27) +DECLARE_CSR(mhpmevent28, CSR_MHPMEVENT28) +DECLARE_CSR(mhpmevent29, CSR_MHPMEVENT29) +DECLARE_CSR(mhpmevent30, CSR_MHPMEVENT30) +DECLARE_CSR(mhpmevent31, CSR_MHPMEVENT31) +DECLARE_CSR(mvendorid, CSR_MVENDORID) +DECLARE_CSR(marchid, CSR_MARCHID) +DECLARE_CSR(mimpid, CSR_MIMPID) +DECLARE_CSR(mhartid, CSR_MHARTID) +DECLARE_CSR(cycleh, CSR_CYCLEH) +DECLARE_CSR(timeh, CSR_TIMEH) +DECLARE_CSR(instreth, CSR_INSTRETH) +DECLARE_CSR(hpmcounter3h, CSR_HPMCOUNTER3H) +DECLARE_CSR(hpmcounter4h, CSR_HPMCOUNTER4H) +DECLARE_CSR(hpmcounter5h, CSR_HPMCOUNTER5H) +DECLARE_CSR(hpmcounter6h, CSR_HPMCOUNTER6H) +DECLARE_CSR(hpmcounter7h, CSR_HPMCOUNTER7H) +DECLARE_CSR(hpmcounter8h, CSR_HPMCOUNTER8H) +DECLARE_CSR(hpmcounter9h, CSR_HPMCOUNTER9H) +DECLARE_CSR(hpmcounter10h, CSR_HPMCOUNTER10H) +DECLARE_CSR(hpmcounter11h, CSR_HPMCOUNTER11H) +DECLARE_CSR(hpmcounter12h, CSR_HPMCOUNTER12H) +DECLARE_CSR(hpmcounter13h, CSR_HPMCOUNTER13H) +DECLARE_CSR(hpmcounter14h, CSR_HPMCOUNTER14H) +DECLARE_CSR(hpmcounter15h, CSR_HPMCOUNTER15H) +DECLARE_CSR(hpmcounter16h, CSR_HPMCOUNTER16H) +DECLARE_CSR(hpmcounter17h, CSR_HPMCOUNTER17H) +DECLARE_CSR(hpmcounter18h, CSR_HPMCOUNTER18H) +DECLARE_CSR(hpmcounter19h, CSR_HPMCOUNTER19H) +DECLARE_CSR(hpmcounter20h, CSR_HPMCOUNTER20H) +DECLARE_CSR(hpmcounter21h, CSR_HPMCOUNTER21H) +DECLARE_CSR(hpmcounter22h, CSR_HPMCOUNTER22H) +DECLARE_CSR(hpmcounter23h, CSR_HPMCOUNTER23H) +DECLARE_CSR(hpmcounter24h, CSR_HPMCOUNTER24H) +DECLARE_CSR(hpmcounter25h, CSR_HPMCOUNTER25H) +DECLARE_CSR(hpmcounter26h, CSR_HPMCOUNTER26H) +DECLARE_CSR(hpmcounter27h, CSR_HPMCOUNTER27H) +DECLARE_CSR(hpmcounter28h, CSR_HPMCOUNTER28H) +DECLARE_CSR(hpmcounter29h, CSR_HPMCOUNTER29H) +DECLARE_CSR(hpmcounter30h, CSR_HPMCOUNTER30H) +DECLARE_CSR(hpmcounter31h, CSR_HPMCOUNTER31H) +DECLARE_CSR(mcycleh, CSR_MCYCLEH) +DECLARE_CSR(minstreth, CSR_MINSTRETH) +DECLARE_CSR(mhpmcounter3h, CSR_MHPMCOUNTER3H) +DECLARE_CSR(mhpmcounter4h, CSR_MHPMCOUNTER4H) +DECLARE_CSR(mhpmcounter5h, CSR_MHPMCOUNTER5H) +DECLARE_CSR(mhpmcounter6h, CSR_MHPMCOUNTER6H) +DECLARE_CSR(mhpmcounter7h, CSR_MHPMCOUNTER7H) +DECLARE_CSR(mhpmcounter8h, CSR_MHPMCOUNTER8H) +DECLARE_CSR(mhpmcounter9h, CSR_MHPMCOUNTER9H) +DECLARE_CSR(mhpmcounter10h, CSR_MHPMCOUNTER10H) +DECLARE_CSR(mhpmcounter11h, CSR_MHPMCOUNTER11H) +DECLARE_CSR(mhpmcounter12h, CSR_MHPMCOUNTER12H) +DECLARE_CSR(mhpmcounter13h, CSR_MHPMCOUNTER13H) +DECLARE_CSR(mhpmcounter14h, CSR_MHPMCOUNTER14H) +DECLARE_CSR(mhpmcounter15h, CSR_MHPMCOUNTER15H) +DECLARE_CSR(mhpmcounter16h, CSR_MHPMCOUNTER16H) +DECLARE_CSR(mhpmcounter17h, CSR_MHPMCOUNTER17H) +DECLARE_CSR(mhpmcounter18h, CSR_MHPMCOUNTER18H) +DECLARE_CSR(mhpmcounter19h, CSR_MHPMCOUNTER19H) +DECLARE_CSR(mhpmcounter20h, CSR_MHPMCOUNTER20H) +DECLARE_CSR(mhpmcounter21h, CSR_MHPMCOUNTER21H) +DECLARE_CSR(mhpmcounter22h, CSR_MHPMCOUNTER22H) +DECLARE_CSR(mhpmcounter23h, CSR_MHPMCOUNTER23H) +DECLARE_CSR(mhpmcounter24h, CSR_MHPMCOUNTER24H) +DECLARE_CSR(mhpmcounter25h, CSR_MHPMCOUNTER25H) +DECLARE_CSR(mhpmcounter26h, CSR_MHPMCOUNTER26H) +DECLARE_CSR(mhpmcounter27h, CSR_MHPMCOUNTER27H) +DECLARE_CSR(mhpmcounter28h, CSR_MHPMCOUNTER28H) +DECLARE_CSR(mhpmcounter29h, CSR_MHPMCOUNTER29H) +DECLARE_CSR(mhpmcounter30h, CSR_MHPMCOUNTER30H) +DECLARE_CSR(mhpmcounter31h, CSR_MHPMCOUNTER31H) +#endif +#ifdef DECLARE_CAUSE +DECLARE_CAUSE("misaligned fetch", CAUSE_MISALIGNED_FETCH) +DECLARE_CAUSE("fetch access", CAUSE_FETCH_ACCESS) +DECLARE_CAUSE("illegal instruction", CAUSE_ILLEGAL_INSTRUCTION) +DECLARE_CAUSE("breakpoint", CAUSE_BREAKPOINT) +DECLARE_CAUSE("misaligned load", CAUSE_MISALIGNED_LOAD) +DECLARE_CAUSE("load access", CAUSE_LOAD_ACCESS) +DECLARE_CAUSE("misaligned store", CAUSE_MISALIGNED_STORE) +DECLARE_CAUSE("store access", CAUSE_STORE_ACCESS) +DECLARE_CAUSE("user_ecall", CAUSE_USER_ECALL) +DECLARE_CAUSE("supervisor_ecall", CAUSE_SUPERVISOR_ECALL) +DECLARE_CAUSE("hypervisor_ecall", CAUSE_HYPERVISOR_ECALL) +DECLARE_CAUSE("machine_ecall", CAUSE_MACHINE_ECALL) +DECLARE_CAUSE("fetch page fault", CAUSE_FETCH_PAGE_FAULT) +DECLARE_CAUSE("load page fault", CAUSE_LOAD_PAGE_FAULT) +DECLARE_CAUSE("store page fault", CAUSE_STORE_PAGE_FAULT) +#endif diff --git a/benchmarks/riscv-coremark/riscv64-baremetal/link.ld b/benchmarks/riscv-coremark/riscv64-baremetal/link.ld new file mode 100644 index 000000000..4f8892ee2 --- /dev/null +++ b/benchmarks/riscv-coremark/riscv64-baremetal/link.ld @@ -0,0 +1,66 @@ +/*======================================================================*/ +/* Proxy kernel linker script */ +/*======================================================================*/ +/* This is the linker script used when building the proxy kernel. */ + +/*----------------------------------------------------------------------*/ +/* Setup */ +/*----------------------------------------------------------------------*/ + +/* The OUTPUT_ARCH command specifies the machine architecture where the + argument is one of the names used in the BFD library. More + specifically one of the entires in bfd/cpu-mips.c */ + +OUTPUT_ARCH( "riscv" ) +ENTRY(_start) + +/*----------------------------------------------------------------------*/ +/* Sections */ +/*----------------------------------------------------------------------*/ + +SECTIONS +{ + + /* text: test code section */ + . = 0x80000000; + .text.init : { *(.text.init) } + + . = ALIGN(0x1000); + .tohost : { *(.tohost) } + + .text : { *(.text) } + + /* data segment */ + .data : { *(.data) } + + .sdata : { + __global_pointer$ = . + 0x800; + *(.srodata.cst16) *(.srodata.cst8) *(.srodata.cst4) *(.srodata.cst2) *(.srodata*) + *(.sdata .sdata.* .gnu.linkonce.s.*) + } + + /* bss segment */ + .sbss : { + *(.sbss .sbss.* .gnu.linkonce.sb.*) + *(.scommon) + } + .bss : { *(.bss) } + + /* thread-local data segment */ + .tdata : + { + _tls_data = .; + *(.tdata.begin) + *(.tdata) + *(.tdata.end) + } + .tbss : + { + *(.tbss) + *(.tbss.end) + } + + /* End of uninitalized data segement */ + _end = .; +} + diff --git a/benchmarks/riscv-coremark/riscv64-baremetal/syscallbackup.c b/benchmarks/riscv-coremark/riscv64-baremetal/syscallbackup.c new file mode 100644 index 000000000..e4322563c --- /dev/null +++ b/benchmarks/riscv-coremark/riscv64-baremetal/syscallbackup.c @@ -0,0 +1,1072 @@ +// See LICENSE for license details. + +#include +#include +#include +#include +#include +#include +#include "util.h" +#undef printf +#define SYS_write 64 +#define ZEROPAD (1<<0) /* Pad with zero */ +#define SIGN (1<<1) /* Unsigned/signed long */ +#define PLUS (1<<2) /* Show plus */ +#define SPACE (1<<3) /* Spacer */ +#define LEFT (1<<4) /* Left justified */ +#define HEX_PREP (1<<5) /* 0x */ +#define UPPERCASE (1<<6) /* 'ABCDEF' */ +typedef size_t ee_size_t; +#define is_digit(c) ((c) >= '0' && (c) <= '9') +/*static ee_size_t strnlen(const char *s, ee_size_t count);*/ +#undef strcmp +static char *digits = "0123456789abcdefghijklmnopqrstuvwxyz"; +static char *upper_digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; +char *ecvtbuf(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); +extern volatile uint64_t tohost; +extern volatile uint64_t fromhost; +ee_size_t strnlen(const char *s, ee_size_t count) +{ + const char *sc; + for (sc = s; *sc != '\0' && count--; ++sc); + return sc - s; +} +static char *number(char *str, long num, int base, int size, int precision, int type) +{ + char c, sign, tmp[66]; + char *dig = digits; + int i; + + if (type & UPPERCASE) dig = upper_digits; + if (type & LEFT) type &= ~ZEROPAD; + if (base < 2 || base > 36) return 0; + + c = (type & ZEROPAD) ? '0' : ' '; + sign = 0; + if (type & SIGN) + { + if (num < 0) + { + sign = '-'; + num = -num; + size--; + } + else if (type & PLUS) + { + sign = '+'; + size--; + } + else if (type & SPACE) + { + sign = ' '; + size--; + } + } + + if (type & HEX_PREP) + { + if (base == 16) + size -= 2; + else if (base == 8) + size--; + } + + i = 0; + + if (num == 0) + tmp[i++] = '0'; + else + { + while (num != 0) + { + tmp[i++] = dig[((unsigned long) num) % (unsigned) base]; + num = ((unsigned long) num) / (unsigned) base; + } + } + + if (i > precision) precision = i; + size -= precision; + if (!(type & (ZEROPAD | LEFT))) while (size-- > 0) *str++ = ' '; + if (sign) *str++ = sign; + + if (type & HEX_PREP) + { + if (base == 8) + *str++ = '0'; + else if (base == 16) + { + *str++ = '0'; + *str++ = digits[33]; + } + } + + if (!(type & LEFT)) while (size-- > 0) *str++ = c; + while (i < precision--) *str++ = '0'; + while (i-- > 0) *str++ = tmp[i]; + while (size-- > 0) *str++ = ' '; + + return str; +} + +static char *eaddr(char *str, unsigned char *addr, int size, int precision, int type) +{ + char tmp[24]; + char *dig = digits; + int i, len; + + if (type & UPPERCASE) dig = upper_digits; + len = 0; + for (i = 0; i < 6; i++) + { + if (i != 0) tmp[len++] = ':'; + tmp[len++] = dig[addr[i] >> 4]; + tmp[len++] = dig[addr[i] & 0x0F]; + } + + if (!(type & LEFT)) while (len < size--) *str++ = ' '; + for (i = 0; i < len; ++i) *str++ = tmp[i]; + while (len < size--) *str++ = ' '; + + return str; +} +static int skip_atoi(const char **s) +{ + int i = 0; + while (is_digit(**s)) i = i*10 + *((*s)++) - '0'; + return i; +} +static char *iaddr(char *str, unsigned char *addr, int size, int precision, int type) +{ + char tmp[24]; + int i, n, len; + + len = 0; + for (i = 0; i < 4; i++) + { + if (i != 0) tmp[len++] = '.'; + n = addr[i]; + + if (n == 0) + tmp[len++] = digits[0]; + else + { + if (n >= 100) + { + tmp[len++] = digits[n / 100]; + n = n % 100; + tmp[len++] = digits[n / 10]; + n = n % 10; + } + else if (n >= 10) + { + tmp[len++] = digits[n / 10]; + n = n % 10; + } + + tmp[len++] = digits[n]; + } + } + + if (!(type & LEFT)) while (len < size--) *str++ = ' '; + for (i = 0; i < len; ++i) *str++ = tmp[i]; + while (len < size--) *str++ = ' '; + + return str; +} + +void ee_bufcpy(char *pd, char *ps, int count) { + char *pe=ps+count; + while (ps!=pe) + *pd++=*ps++; +} + +#if HAS_FLOAT + + + +static void parse_float(double value, char *buffer, char fmt, int precision) +{ + int decpt, sign, exp, pos; + char *digits = NULL; + char cvtbuf[80]; + int capexp = 0; + int magnitude; + + if (fmt == 'G' || fmt == 'E') + { + capexp = 1; + fmt += 'a' - 'A'; + } + + if (fmt == 'g') + { + digits = ecvtbuf(value, precision, &decpt, &sign, cvtbuf); + magnitude = decpt - 1; + if (magnitude < -4 || magnitude > precision - 1) + { + fmt = 'e'; + precision -= 1; + } + else + { + fmt = 'f'; + precision -= decpt; + } + } + + if (fmt == 'e') + { + digits = ecvtbuf(value, precision + 1, &decpt, &sign, cvtbuf); + + if (sign) *buffer++ = '-'; + *buffer++ = *digits; + if (precision > 0) *buffer++ = '.'; + ee_bufcpy(buffer, digits + 1, precision); + buffer += precision; + *buffer++ = capexp ? 'E' : 'e'; + + if (decpt == 0) + { + if (value == 0.0) + exp = 0; + else + exp = -1; + } + else + exp = decpt - 1; + + if (exp < 0) + { + *buffer++ = '-'; + exp = -exp; + } + else + *buffer++ = '+'; + + buffer[2] = (exp % 10) + '0'; + exp = exp / 10; + buffer[1] = (exp % 10) + '0'; + exp = exp / 10; + buffer[0] = (exp % 10) + '0'; + buffer += 3; + } + else if (fmt == 'f') + { + digits = fcvtbuf(value, precision, &decpt, &sign, cvtbuf); + if (sign) *buffer++ = '-'; + if (*digits) + { + if (decpt <= 0) + { + *buffer++ = '0'; + *buffer++ = '.'; + for (pos = 0; pos < -decpt; pos++) *buffer++ = '0'; + while (*digits) *buffer++ = *digits++; + } + else + { + pos = 0; + while (*digits) + { + if (pos++ == decpt) *buffer++ = '.'; + *buffer++ = *digits++; + } + } + } + else + { + *buffer++ = '0'; + if (precision > 0) + { + *buffer++ = '.'; + for (pos = 0; pos < precision; pos++) *buffer++ = '0'; + } + } + } + + *buffer = '\0'; +} + + +static char *flt(char *str, double num, int size, int precision, char fmt, int flags) +{ + char tmp[80]; + char c, sign; + int n, i; + + // Left align means no zero padding + if (flags & LEFT) flags &= ~ZEROPAD; + + // Determine padding and sign char + c = (flags & ZEROPAD) ? '0' : ' '; + sign = 0; + if (flags & SIGN) + { + if (num < 0.0) + { + sign = '-'; + num = -num; + size--; + } + else if (flags & PLUS) + { + sign = '+'; + size--; + } + else if (flags & SPACE) + { + sign = ' '; + size--; + } + } + + // Compute the precision value + if (precision < 0) + precision = 6; // Default precision: 6 + + // Convert floating point number to text + parse_float(num, tmp, fmt, precision); + + if ((flags & HEX_PREP) && precision == 0) decimal_point(tmp); + if (fmt == 'g' && !(flags & HEX_PREP)) cropzeros(tmp); + + n = strnlen(tmp,256); + + // Output number with alignment and padding + size -= n; + if (!(flags & (ZEROPAD | LEFT))) while (size-- > 0) *str++ = ' '; + if (sign) *str++ = sign; + if (!(flags & LEFT)) while (size-- > 0) *str++ = c; + for (i = 0; i < n; i++) *str++ = tmp[i]; + while (size-- > 0) *str++ = ' '; + + return str; +} + + +#endif +static void decimal_point(char *buffer) +{ + while (*buffer) + { + if (*buffer == '.') return; + if (*buffer == 'e' || *buffer == 'E') break; + buffer++; + } + + if (*buffer) + { + int n = strnlen(buffer,256); + while (n > 0) + { + buffer[n + 1] = buffer[n]; + n--; + } + + *buffer = '.'; + } + else + { + *buffer++ = '.'; + *buffer = '\0'; + } +} + +static void cropzeros(char *buffer) +{ + char *stop; + + while (*buffer && *buffer != '.') buffer++; + if (*buffer++) + { + while (*buffer && *buffer != 'e' && *buffer != 'E') buffer++; + stop = buffer--; + while (*buffer == '0') buffer--; + if (*buffer == '.') buffer--; + while (buffer!=stop) + *++buffer=0; + } +} + +static int ee_vsprintf(char *buf, const char *fmt, va_list args) +{ + int len; + unsigned long num; + int i, base; + char *str; + char *s; + + int flags; // Flags to number() + + int field_width; // Width of output field + int precision; // Min. # of digits for integers; max number of chars for from string + int qualifier; // 'h', 'l', or 'L' for integer fields + + for (str = buf; *fmt; fmt++) + { + if (*fmt != '%') + { + *str++ = *fmt; + continue; + } + + // Process flags + flags = 0; +repeat: + fmt++; // This also skips first '%' + switch (*fmt) + { + case '-': flags |= LEFT; goto repeat; + case '+': flags |= PLUS; goto repeat; + case ' ': flags |= SPACE; goto repeat; + case '#': flags |= HEX_PREP; goto repeat; + case '0': flags |= ZEROPAD; goto repeat; + } + + // Get field width + field_width = -1; + if (is_digit(*fmt)) + field_width = skip_atoi(&fmt); + else if (*fmt == '*') + { + fmt++; + field_width = va_arg(args, int); + if (field_width < 0) + { + field_width = -field_width; + flags |= LEFT; + } + } + + // Get the precision + precision = -1; + if (*fmt == '.') + { + ++fmt; + if (is_digit(*fmt)) + precision = skip_atoi(&fmt); + else if (*fmt == '*') + { + ++fmt; + precision = va_arg(args, int); + } + if (precision < 0) precision = 0; + } + + // Get the conversion qualifier + qualifier = -1; + if (*fmt == 'l' || *fmt == 'L') + { + qualifier = *fmt; + fmt++; + } + + // Default base + base = 10; + + switch (*fmt) + { + case 'c': + if (!(flags & LEFT)) while (--field_width > 0) *str++ = ' '; + *str++ = (unsigned char) va_arg(args, int); + while (--field_width > 0) *str++ = ' '; + continue; + + case 's': + s = va_arg(args, char *); + if (!s) s = ""; + len = strnlen(s, precision); + if (!(flags & LEFT)) while (len < field_width--) *str++ = ' '; + for (i = 0; i < len; ++i) *str++ = *s++; + while (len < field_width--) *str++ = ' '; + continue; + + case 'p': + if (field_width == -1) + { + field_width = 2 * sizeof(void *); + flags |= ZEROPAD; + } + str = number(str, (unsigned long) va_arg(args, void *), 16, field_width, precision, flags); + continue; + + case 'A': + flags |= UPPERCASE; + + case 'a': + if (qualifier == 'l') + str = eaddr(str, va_arg(args, unsigned char *), field_width, precision, flags); + else + str = iaddr(str, va_arg(args, unsigned char *), field_width, precision, flags); + continue; + + // Integer number formats - set up the flags and "break" + case 'o': + base = 8; + break; + + case 'X': + flags |= UPPERCASE; + + case 'x': + base = 16; + break; + + case 'd': + case 'i': + flags |= SIGN; + + case 'u': + break; + +#if HAS_FLOAT + + case 'f': + str = flt(str, va_arg(args, double), field_width, precision, *fmt, flags | SIGN); + continue; + +#endif + + default: + if (*fmt != '%') *str++ = '%'; + if (*fmt) + *str++ = *fmt; + else + --fmt; + continue; + } + + if (qualifier == 'l') + num = va_arg(args, unsigned long); + else if (flags & SIGN) + num = va_arg(args, int); + else + num = va_arg(args, unsigned int); + + str = number(str, num, base, field_width, precision, flags); + } + + *str = '\0'; + return str - buf; +} + +static uintptr_t syscall(uintptr_t which, uint64_t arg0, uint64_t arg1, uint64_t arg2) +{ + volatile uint64_t magic_mem[8] __attribute__((aligned(64))); + magic_mem[0] = which; + magic_mem[1] = arg0; + magic_mem[2] = arg1; + magic_mem[3] = arg2; + __sync_synchronize(); + + tohost = (uintptr_t)magic_mem; + while (fromhost == 0) + ; + fromhost = 0; + + __sync_synchronize(); + return magic_mem[0]; +} + +#define NUM_COUNTERS 2 +static uintptr_t counters[NUM_COUNTERS]; +static char* counter_names[NUM_COUNTERS]; + +void setStats(int enable) +{ + int i = 0; +#define READ_CTR(name) do { \ + while (i >= NUM_COUNTERS) ; \ + uintptr_t csr = read_csr(name); \ + if (!enable) { csr -= counters[i]; counter_names[i] = #name; } \ + counters[i++] = csr; \ + } while (0) + + READ_CTR(mcycle); + READ_CTR(minstret); + +#undef READ_CTR +} + +/*void __attribute__((noreturn)) tohost_exit(uintptr_t code) +{ + tohost = (code << 1) | 1; + while (1); +}*/ +void __attribute__((noreturn))tohost_exit(uintptr_t code){ + tohost=(code<<1)|1; + asm ("ecall"); + } + + +uintptr_t __attribute__((weak)) handle_trap(uintptr_t cause, uintptr_t epc, uintptr_t regs[32]) +{ + tohost_exit(1337); +} + +void exit(int code) +{ + tohost_exit(code); +} + +void abort() +{ + exit(128 + SIGABRT); +} + +void printstr(const char* s) +{ + syscall(SYS_write, 1, (uintptr_t)s, strlen(s)); +} + +void __attribute__((weak)) thread_entry(int cid, int nc) +{ + // multi-threaded programs override this function. + // for the case of single-threaded programs, only let core 0 proceed. + while (cid != 0); +} + +int __attribute__((weak)) main(int argc, char** argv) +{ + // single-threaded programs override this function. + printstr("Implement main(), foo!\n"); + return -1; +} + +static void init_tls() +{ + register void* thread_pointer asm("tp"); + extern char _tls_data; + extern __thread char _tdata_begin, _tdata_end, _tbss_end; + size_t tdata_size = &_tdata_end - &_tdata_begin; + memcpy(thread_pointer, &_tls_data, tdata_size); + size_t tbss_size = &_tbss_end - &_tdata_end; + memset(thread_pointer + tdata_size, 0, tbss_size); +} + +void _init(int cid, int nc) +{ + init_tls(); + thread_entry(cid, nc); + + // only single-threaded programs should ever get here. + int ret = main(0, 0); + + char buf[NUM_COUNTERS * 32] __attribute__((aligned(64))); + char* pbuf = buf; + for (int i = 0; i < NUM_COUNTERS; i++) + if (counters[i]) + pbuf += sprintf(pbuf, "%s = %d\n", counter_names[i], counters[i]); + if (pbuf != buf) + printstr(buf); + + exit(ret); +} + +#undef putchar +int putchar(int ch) +{ + static __thread char buf[64] __attribute__((aligned(64))); + static __thread int buflen = 0; + + buf[buflen++] = ch; + + if (ch == '\n' || buflen == sizeof(buf)) + { + syscall(SYS_write, 1, (uintptr_t)buf, buflen); + buflen = 0; + } + + return 0; +} + +void printhex(uint64_t x) +{ + char str[17]; + int i; + for (i = 0; i < 16; i++) + { + str[15-i] = (x & 0xF) + ((x & 0xF) < 10 ? '0' : 'a'-10); + x >>= 4; + } + str[16] = 0; + + printstr(str); +} + +static inline void printnum(void (*putch)(int, void**), void **putdat, + unsigned long long num, unsigned base, int width, int padc) +{ + unsigned digs[sizeof(num)*CHAR_BIT]; + int pos = 0; + + while (1) + { + digs[pos++] = num % base; + if (num < base) + break; + num /= base; + } + + while (width-- > pos) + putch(padc, putdat); + + while (pos-- > 0) + putch(digs[pos] + (digs[pos] >= 10 ? 'a' - 10 : '0'), putdat); +} + +static unsigned long long getuint(va_list *ap, int lflag) +{ + if (lflag >= 2) + return va_arg(*ap, unsigned long long); + else if (lflag) + return va_arg(*ap, unsigned long); + else + return va_arg(*ap, unsigned int); +} + +static long long getint(va_list *ap, int lflag) +{ + if (lflag >= 2) + return va_arg(*ap, long long); + else if (lflag) + return va_arg(*ap, long); + else + return va_arg(*ap, int); +} + +static void vprintfmt(void (*putch)(int, void**), void **putdat, const char *fmt, va_list ap) +{ + register const char* p; + const char* last_fmt; + register int ch, err; + unsigned long long num; + int base, lflag, width, precision, altflag; + char padc; + + while (1) { + while ((ch = *(unsigned char *) fmt) != '%') { + if (ch == '\0') + return; + fmt++; + putch(ch, putdat); + } + fmt++; + + // Process a %-escape sequence + last_fmt = fmt; + padc = ' '; + width = -1; + precision = -1; + lflag = 0; + altflag = 0; + reswitch: + switch (ch = *(unsigned char *) fmt++) { + + // flag to pad on the right + case '-': + padc = '-'; + goto reswitch; + + // flag to pad with 0's instead of spaces + case '0': + padc = '0'; + goto reswitch; + + // width field + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + for (precision = 0; ; ++fmt) { + precision = precision * 10 + ch - '0'; + ch = *fmt; + if (ch < '0' || ch > '9') + break; + } + goto process_precision; + + case '*': + precision = va_arg(ap, int); + goto process_precision; + + case '.': + if (width < 0) + width = 0; + goto reswitch; + + case '#': + altflag = 1; + goto reswitch; + + process_precision: + if (width < 0) + width = precision, precision = -1; + goto reswitch; + + // long flag (doubled for long long) + case 'l': + lflag++; + goto reswitch; + + // character + case 'c': + putch(va_arg(ap, int), putdat); + break; + + // string + case 's': + if ((p = va_arg(ap, char *)) == NULL) + p = "(null)"; + if (width > 0 && padc != '-') + for (width -= strnlen(p, precision); width > 0; width--) + putch(padc, putdat); + for (; (ch = *p) != '\0' && (precision < 0 || --precision >= 0); width--) { + putch(ch, putdat); + p++; + } + for (; width > 0; width--) + putch(' ', putdat); + break; + + // (signed) decimal + case 'd': + num = getint(&ap, lflag); + if ((long long) num < 0) { + putch('-', putdat); + num = -(long long) num; + } + base = 10; + goto signed_number; + + // unsigned decimal + case 'u': + base = 10; + goto unsigned_number; + + // (unsigned) octal + case 'o': + // should do something with padding so it's always 3 octits + base = 8; + goto unsigned_number; + + // pointer + case 'p': + static_assert(sizeof(long) == sizeof(void*)); + lflag = 1; + putch('0', putdat); + putch('x', putdat); + /* fall through to 'x' */ + + // (unsigned) hexadecimal + case 'X': + case 'x': + base = 16; + unsigned_number: + num = getuint(&ap, lflag); + signed_number: + printnum(putch, putdat, num, base, width, padc); + break; + + // escaped '%' character + case '%': + putch(ch, putdat); + break; + + // unrecognized escape sequence - just print it literally + default: + putch('%', putdat); + fmt = last_fmt; + break; + } + } +} +/* +int printf(const char* fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + + vprintfmt((void*)putchar, 0, fmt, ap); + + va_end(ap); + return 0; // incorrect return value, but who cares, anyway? +}*/ + + +void _send_char(char c) { +/*#error "You must implement the method _send_char to use this file!\n"; +*/ +volatile unsigned char *THR=(unsigned char *)0x10000000; +volatile unsigned char *LSR=(unsigned char *)0x10000005; + +while(!(*LSR&0b100000)); +*THR=c; +while(!(*LSR&0b100000)); +} + + +int sprintf(char* str, const char* fmt, ...) +{ + va_list ap; + char* str0 = str; + va_start(ap, fmt); + + void sprintf_putch(int ch, void** data) + { + char** pstr = (char**)data; + **pstr = ch; + (*pstr)++; + } + + vprintfmt(sprintf_putch, (void**)&str, fmt, ap); + *str = 0; + + va_end(ap); + return str - str0; +} + +void* memcpy(void* dest, const void* src, size_t len) +{ + if ((((uintptr_t)dest | (uintptr_t)src | len) & (sizeof(uintptr_t)-1)) == 0) { + const uintptr_t* s = src; + uintptr_t *d = dest; + while (d < (uintptr_t*)(dest + len)) + *d++ = *s++; + } else { + const char* s = src; + char *d = dest; + while (d < (char*)(dest + len)) + *d++ = *s++; + } + return dest; +} + +void* memset(void* dest, int byte, size_t len) +{ + if ((((uintptr_t)dest | len) & (sizeof(uintptr_t)-1)) == 0) { + uintptr_t word = byte & 0xFF; + word |= word << 8; + word |= word << 16; + word |= word << 16 << 16; + + uintptr_t *d = dest; + while (d < (uintptr_t*)(dest + len)){ + *d = word; + d++;} + } else { + char *d = dest; + while (d < (char*)(dest + len)){ + *d = byte; + d++;} + } + return dest; +} +//recompile pls +size_t strlen(const char *s) +{ + const char *p = s; + while (*p) + p++; + return p - s; +} + +/*size_t strnlen(const char *s, size_t n) +{ + const char *p = s; + while (n-- && *p) + p++; + return p - s; +}*/ + +int strcmp(const char* s1, const char* s2) +{ + unsigned char c1, c2; + + do { + c1 = *s1++; + c2 = *s2++; + } while (c1 != 0 && c1 == c2); + + return c1 - c2; +} + +char* strcpy(char* dest, const char* src) +{ + char* d = dest; + while ((*d++ = *src++)) + ; + return dest; +} + +long atol(const char* str) +{ + long res = 0; + int sign = 0; + + while (*str == ' ') + str++; + + if (*str == '-' || *str == '+') { + sign = *str == '-'; + str++; + } + + while (*str) { + res *= 10; + res += *str++ - '0'; + } + + return sign ? -res : res; +} + +int sendstring(const char *p){ + int n=0; + while (*p) { + _send_char(*p); + n++; + p++; + } + + return n; +} +int gg_printf(const char *fmt, ...) +{ + char buf[256],*p; + va_list args; + int n=0; + + va_start(args, fmt); + ee_vsprintf(buf, fmt, args); + va_end(args); + p=buf; + /* while (*p) { + _send_char(*p); + n++; + p++; + } +*/ +n=sendstring(p); + return n; +} + + +int puts(const char* s) +{ + gg_printf(s); + gg_printf("\n"); + return 0; // incorrect return value, but who cares, anyway? +} + +unsigned long getTimer(void){ + unsigned long *MTIME = (unsigned long*)0x0200BFF8; + return *MTIME; + +} diff --git a/benchmarks/riscv-coremark/riscv64-baremetal/syscalls.c b/benchmarks/riscv-coremark/riscv64-baremetal/syscalls.c new file mode 100644 index 000000000..c1824954f --- /dev/null +++ b/benchmarks/riscv-coremark/riscv64-baremetal/syscalls.c @@ -0,0 +1,505 @@ +// See LICENSE for license details. + +#include +#include +#include +#include +#include +#include +#include "util.h" + +#define SYS_write 64 + +#undef strcmp + +extern volatile uint64_t tohost; +extern volatile uint64_t fromhost; + + +void _send_char(char c) { +/*#error "You must implement the method _send_char to use this file!\n"; +*/ +volatile unsigned char *THR=(unsigned char *)0x10000000; +volatile unsigned char *LSR=(unsigned char *)0x10000005; + +while(!(*LSR&0b100000)); +*THR=c; +while(!(*LSR&0b100000)); +} + +int sendstring(const char *p){ + int n=0; + while (*p) { + _send_char(*p); + n++; + p++; + } + + return n; +} + +static uintptr_t syscall(uintptr_t which, uint64_t arg0, uint64_t arg1, uint64_t arg2) +{ + volatile uint64_t magic_mem[8] __attribute__((aligned(64))); + magic_mem[0] = which; + magic_mem[1] = arg0; + magic_mem[2] = arg1; + magic_mem[3] = arg2; + __sync_synchronize(); + + tohost = (uintptr_t)magic_mem; + while (fromhost == 0) + ; + fromhost = 0; + + __sync_synchronize(); + return magic_mem[0]; +} + +#define NUM_COUNTERS 2 +static uintptr_t counters[NUM_COUNTERS]; +static char* counter_names[NUM_COUNTERS]; + +void setStats(int enable) +{ + int i = 0; +#define READ_CTR(name) do { \ + while (i >= NUM_COUNTERS) ; \ + uintptr_t csr = read_csr(name); \ + if (!enable) { csr -= counters[i]; counter_names[i] = #name; } \ + counters[i++] = csr; \ + } while (0) + + READ_CTR(mcycle); + READ_CTR(minstret); + +#undef READ_CTR +} + +void __attribute__((noreturn)) tohost_exit(uintptr_t code) +{ + tohost = (code << 1) | 1; + asm ("ecall"); +} + +uintptr_t __attribute__((weak)) handle_trap(uintptr_t cause, uintptr_t epc, uintptr_t regs[32]) +{ + tohost_exit(1337); +} + +void exit(int code) +{ + tohost_exit(code); +} + +void abort() +{ + exit(128 + SIGABRT); +} + +void printstr(const char* s) +{ + syscall(SYS_write, 1, (uintptr_t)s, strlen(s)); +} + +void __attribute__((weak)) thread_entry(int cid, int nc) +{ + // multi-threaded programs override this function. + // for the case of single-threaded programs, only let core 0 proceed. + while (cid != 0); +} + +int __attribute__((weak)) main(int argc, char** argv) +{ + // single-threaded programs override this function. + printstr("Implement main(), foo!\n"); + return -1; +} + +static void init_tls() +{ + register void* thread_pointer asm("tp"); + extern char _tls_data; + extern __thread char _tdata_begin, _tdata_end, _tbss_end; + size_t tdata_size = &_tdata_end - &_tdata_begin; + memcpy(thread_pointer, &_tls_data, tdata_size); + size_t tbss_size = &_tbss_end - &_tdata_end; + memset(thread_pointer + tdata_size, 0, tbss_size); +} + +void _init(int cid, int nc) +{ + init_tls(); + thread_entry(cid, nc); + + // only single-threaded programs should ever get here. + int ret = main(0, 0); + + char buf[NUM_COUNTERS * 32] __attribute__((aligned(64))); + char* pbuf = buf; + for (int i = 0; i < NUM_COUNTERS; i++) + if (counters[i]) + pbuf += sprintf(pbuf, "%s = %d\n", counter_names[i], counters[i]); + if (pbuf != buf) + printstr(buf); + + exit(ret); +} + +#undef putchar +int putchar(int ch) +{ + /*static __thread char buf[64] __attribute__((aligned(64))); + static __thread int buflen = 0; + + buf[buflen++] = ch; + + if (ch == '\n' || buflen == sizeof(buf)) + { + syscall(SYS_write, 1, (uintptr_t)buf, buflen); + buflen = 0; + } + + return 0;*/ + _send_char(ch); + return 0; + +} + +void printhex(uint64_t x) +{ + char str[17]; + int i; + for (i = 0; i < 16; i++) + { + str[15-i] = (x & 0xF) + ((x & 0xF) < 10 ? '0' : 'a'-10); + x >>= 4; + } + str[16] = 0; + + printstr(str); +} + +static inline void printnum(void (*putch)(int, void**), void **putdat, + unsigned long long num, unsigned base, int width, int padc) +{ + unsigned digs[sizeof(num)*CHAR_BIT]; + int pos = 0; + + while (1) + { + digs[pos++] = num % base; + if (num < base) + break; + num /= base; + } + + while (width-- > pos) + putch(padc, putdat); + + while (pos-- > 0) + putch(digs[pos] + (digs[pos] >= 10 ? 'a' - 10 : '0'), putdat); +} + +static unsigned long long getuint(va_list *ap, int lflag) +{ + if (lflag >= 2) + return va_arg(*ap, unsigned long long); + else if (lflag) + return va_arg(*ap, unsigned long); + else + return va_arg(*ap, unsigned int); +} + +static long long getint(va_list *ap, int lflag) +{ + if (lflag >= 2) + return va_arg(*ap, long long); + else if (lflag) + return va_arg(*ap, long); + else + return va_arg(*ap, int); +} + +static void vprintfmt(void (*putch)(int, void**), void **putdat, const char *fmt, va_list ap) +{ + register const char* p; + const char* last_fmt; + register int ch, err; + unsigned long long num; + int base, lflag, width, precision, altflag; + char padc; + + while (1) { + while ((ch = *(unsigned char *) fmt) != '%') { + if (ch == '\0') + return; + fmt++; + putch(ch, putdat); + } + fmt++; + + // Process a %-escape sequence + last_fmt = fmt; + padc = ' '; + width = -1; + precision = -1; + lflag = 0; + altflag = 0; + reswitch: + switch (ch = *(unsigned char *) fmt++) { + + // flag to pad on the right + case '-': + padc = '-'; + goto reswitch; + + // flag to pad with 0's instead of spaces + case '0': + padc = '0'; + goto reswitch; + + // width field + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + for (precision = 0; ; ++fmt) { + precision = precision * 10 + ch - '0'; + ch = *fmt; + if (ch < '0' || ch > '9') + break; + } + goto process_precision; + + case '*': + precision = va_arg(ap, int); + goto process_precision; + + case '.': + if (width < 0) + width = 0; + goto reswitch; + + case '#': + altflag = 1; + goto reswitch; + + process_precision: + if (width < 0) + width = precision, precision = -1; + goto reswitch; + + // long flag (doubled for long long) + case 'l': + lflag++; + goto reswitch; + + // character + case 'c': + putch(va_arg(ap, int), putdat); + break; + + // string + case 's': + if ((p = va_arg(ap, char *)) == NULL) + p = "(null)"; + if (width > 0 && padc != '-') + for (width -= strnlen(p, precision); width > 0; width--) + putch(padc, putdat); + for (; (ch = *p) != '\0' && (precision < 0 || --precision >= 0); width--) { + putch(ch, putdat); + p++; + } + for (; width > 0; width--) + putch(' ', putdat); + break; + + // (signed) decimal + case 'd': + num = getint(&ap, lflag); + if ((long long) num < 0) { + putch('-', putdat); + num = -(long long) num; + } + base = 10; + goto signed_number; + + // unsigned decimal + case 'u': + base = 10; + goto unsigned_number; + + // (unsigned) octal + case 'o': + // should do something with padding so it's always 3 octits + base = 8; + goto unsigned_number; + + // pointer + case 'p': + static_assert(sizeof(long) == sizeof(void*)); + lflag = 1; + putch('0', putdat); + putch('x', putdat); + /* fall through to 'x' */ + + // (unsigned) hexadecimal + case 'X': + case 'x': + base = 16; + unsigned_number: + num = getuint(&ap, lflag); + signed_number: + printnum(putch, putdat, num, base, width, padc); + break; + + // escaped '%' character + case '%': + putch(ch, putdat); + break; + + // unrecognized escape sequence - just print it literally + default: + putch('%', putdat); + fmt = last_fmt; + break; + } + } +} + +int printf(const char* fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + + vprintfmt((void*)putchar, 0, fmt, ap); + + va_end(ap); + return 0; // incorrect return value, but who cares, anyway? +} + +int puts(const char* s) +{ + printf(s); + printf("\n"); + return 0; // incorrect return value, but who cares, anyway? +} + +int sprintf(char* str, const char* fmt, ...) +{ + va_list ap; + char* str0 = str; + va_start(ap, fmt); + + void sprintf_putch(int ch, void** data) + { + char** pstr = (char**)data; + **pstr = ch; + (*pstr)++; + } + + vprintfmt(sprintf_putch, (void**)&str, fmt, ap); + *str = 0; + + va_end(ap); + return str - str0; +} + +void* memcpy(void* dest, const void* src, size_t len) +{ + if ((((uintptr_t)dest | (uintptr_t)src | len) & (sizeof(uintptr_t)-1)) == 0) { + const uintptr_t* s = src; + uintptr_t *d = dest; + while (d < (uintptr_t*)(dest + len)) + *d++ = *s++; + } else { + const char* s = src; + char *d = dest; + while (d < (char*)(dest + len)) + *d++ = *s++; + } + return dest; +} +void* memset(void* dest, int byte, size_t len) +{ + if ((((uintptr_t)dest | len) & (sizeof(uintptr_t)-1)) == 0) { + uintptr_t word = byte & 0xFF; + word |= word << 8; + word |= word << 16; + word |= word << 16 << 16; + + uintptr_t *d = dest; + while (d < (uintptr_t*)(dest + len)){ + *d = word; + d++;} + } else { + char *d = dest; + while (d < (char*)(dest + len)){ + *d = byte; + d++;} + } + return dest; +} + +size_t strlen(const char *s) +{ + const char *p = s; + while (*p) + p++; + return p - s; +} + +size_t strnlen(const char *s, size_t n) +{ + const char *p = s; + while (n-- && *p) + p++; + return p - s; +} + +int strcmp(const char* s1, const char* s2) +{ + unsigned char c1, c2; + + do { + c1 = *s1++; + c2 = *s2++; + } while (c1 != 0 && c1 == c2); + + return c1 - c2; +} + +char* strcpy(char* dest, const char* src) +{ + char* d = dest; + while ((*d++ = *src++)) + ; + return dest; +} + +long atol(const char* str) +{ + long res = 0; + int sign = 0; + + while (*str == ' ') + str++; + + if (*str == '-' || *str == '+') { + sign = *str == '-'; + str++; + } + + while (*str) { + res *= 10; + res += *str++ - '0'; + } + + return sign ? -res : res; +} diff --git a/benchmarks/riscv-coremark/riscv64-baremetal/util.h b/benchmarks/riscv-coremark/riscv64-baremetal/util.h new file mode 100644 index 000000000..081cfd634 --- /dev/null +++ b/benchmarks/riscv-coremark/riscv64-baremetal/util.h @@ -0,0 +1,90 @@ +// See LICENSE for license details. + +#ifndef __UTIL_H +#define __UTIL_H + +extern void setStats(int enable); + +#include + +#define static_assert(cond) switch(0) { case 0: case !!(long)(cond): ; } + +static int verify(int n, const volatile int* test, const int* verify) +{ + int i; + // Unrolled for faster verification + for (i = 0; i < n/2*2; i+=2) + { + int t0 = test[i], t1 = test[i+1]; + int v0 = verify[i], v1 = verify[i+1]; + if (t0 != v0) return i+1; + if (t1 != v1) return i+2; + } + if (n % 2 != 0 && test[n-1] != verify[n-1]) + return n; + return 0; +} + +static int verifyDouble(int n, const volatile double* test, const double* verify) +{ + int i; + // Unrolled for faster verification + for (i = 0; i < n/2*2; i+=2) + { + double t0 = test[i], t1 = test[i+1]; + double v0 = verify[i], v1 = verify[i+1]; + int eq1 = t0 == v0, eq2 = t1 == v1; + if (!(eq1 & eq2)) return i+1+eq1; + } + if (n % 2 != 0 && test[n-1] != verify[n-1]) + return n; + return 0; +} + +static void __attribute__((noinline)) barrier(int ncores) +{ + static volatile int sense; + static volatile int count; + static __thread int threadsense; + + __sync_synchronize(); + + threadsense = !threadsense; + if (__sync_fetch_and_add(&count, 1) == ncores-1) + { + count = 0; + sense = threadsense; + } + else while(sense != threadsense) + ; + + __sync_synchronize(); +} + +static uint64_t lfsr(uint64_t x) +{ + uint64_t bit = (x ^ (x >> 1)) & 1; + return (x >> 1) | (bit << 62); +} + +static uintptr_t insn_len(uintptr_t pc) +{ + return (*(unsigned short*)pc & 3) ? 4 : 2; +} + +#ifdef __riscv +#include "encoding.h" +#endif + +#define stringify_1(s) #s +#define stringify(s) stringify_1(s) +#define stats(code, iter) do { \ + unsigned long _c = -read_csr(mcycle), _i = -read_csr(minstret); \ + code; \ + _c += read_csr(mcycle), _i += read_csr(minstret); \ + if (cid == 0) \ + printf("\n%s: %ld cycles, %ld.%ld cycles/iter, %ld.%ld CPI\n", \ + stringify(code), _c, _c/iter, 10*_c/iter%10, _c/_i, 10*_c/_i%10); \ + } while(0) + +#endif //__UTIL_H diff --git a/benchmarks/riscv-coremark/riscv64/core_portme.c b/benchmarks/riscv-coremark/riscv64/core_portme.c new file mode 100755 index 000000000..8f17cb8bd --- /dev/null +++ b/benchmarks/riscv-coremark/riscv64/core_portme.c @@ -0,0 +1,346 @@ +/* +Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +Original Author: Shay Gal-on +*/ + +#include +#include +#include "coremark.h" +#if CALLGRIND_RUN +#include +#endif + +#if (MEM_METHOD==MEM_MALLOC) +#include +/* Function: portable_malloc + Provide malloc() functionality in a platform specific way. +*/ +void *portable_malloc(size_t size) { + return malloc(size); +} +/* Function: portable_free + Provide free() functionality in a platform specific way. +*/ +void portable_free(void *p) { + free(p); +} +#else +void *portable_malloc(size_t size) { + return NULL; +} +void portable_free(void *p) { + p=NULL; +} +#endif + +#if (SEED_METHOD==SEED_VOLATILE) +#if VALIDATION_RUN + volatile ee_s32 seed1_volatile=0x3415; + volatile ee_s32 seed2_volatile=0x3415; + volatile ee_s32 seed3_volatile=0x66; +#endif +#if PERFORMANCE_RUN + volatile ee_s32 seed1_volatile=0x0; + volatile ee_s32 seed2_volatile=0x0; + volatile ee_s32 seed3_volatile=0x66; +#endif +#if PROFILE_RUN + volatile ee_s32 seed1_volatile=0x8; + volatile ee_s32 seed2_volatile=0x8; + volatile ee_s32 seed3_volatile=0x8; +#endif + volatile ee_s32 seed4_volatile=ITERATIONS; + volatile ee_s32 seed5_volatile=0; +#endif +/* Porting: Timing functions + How to capture time and convert to seconds must be ported to whatever is supported by the platform. + e.g. Read value from on board RTC, read value from cpu clock cycles performance counter etc. + Sample implementation for standard time.h and windows.h definitions included. +*/ +/* Define: TIMER_RES_DIVIDER + Divider to trade off timer resolution and total time that can be measured. + + Use lower values to increase resolution, but make sure that overflow does not occur. + If there are issues with the return value overflowing, increase this value. + */ +#if USE_CLOCK + #define NSECS_PER_SEC CLOCKS_PER_SEC + #define EE_TIMER_TICKER_RATE 1000 + #define CORETIMETYPE clock_t + #define GETMYTIME(_t) (*_t=clock()) + #define MYTIMEDIFF(fin,ini) ((fin)-(ini)) + #define TIMER_RES_DIVIDER 1 + #define SAMPLE_TIME_IMPLEMENTATION 1 +#elif defined(_MSC_VER) + #define NSECS_PER_SEC 10000000 + #define EE_TIMER_TICKER_RATE 1000 + #define CORETIMETYPE FILETIME + #define GETMYTIME(_t) GetSystemTimeAsFileTime(_t) + #define MYTIMEDIFF(fin,ini) (((*(__int64*)&fin)-(*(__int64*)&ini))/TIMER_RES_DIVIDER) + /* setting to millisces resolution by default with MSDEV */ + #ifndef TIMER_RES_DIVIDER + #define TIMER_RES_DIVIDER 1000 + #endif + #define SAMPLE_TIME_IMPLEMENTATION 1 +#elif HAS_TIME_H + #define NSECS_PER_SEC 1000000000 + #define EE_TIMER_TICKER_RATE 1000 + #define CORETIMETYPE struct timespec + #define GETMYTIME(_t) clock_gettime(CLOCK_REALTIME,_t) + #define MYTIMEDIFF(fin,ini) ((fin.tv_sec-ini.tv_sec)*(NSECS_PER_SEC/TIMER_RES_DIVIDER)+(fin.tv_nsec-ini.tv_nsec)/TIMER_RES_DIVIDER) + /* setting to 1/1000 of a second resolution by default with linux */ + #ifndef TIMER_RES_DIVIDER + #define TIMER_RES_DIVIDER 1000000 + #endif + #define SAMPLE_TIME_IMPLEMENTATION 1 +#else + // Defined for RISCV + #define NSECS_PER_SEC 1000000000 // TODO: What freq are we assuming? + #define EE_TIMER_TICKER_RATE 1000 // TODO: What is this? + #define CORETIMETYPE clock_t + #define read_csr(reg) ({ unsigned long __tmp; \ + asm volatile ("csrr %0, " #reg : "=r"(__tmp)); \ + __tmp; }) + #define GETMYTIME(_t) (*_t=read_csr(cycle)) + #define MYTIMEDIFF(fin,ini) ((fin)-(ini)) + #define TIMER_RES_DIVIDER 1 + #define SAMPLE_TIME_IMPLEMENTATION 1 +#endif +#define EE_TICKS_PER_SEC (NSECS_PER_SEC / TIMER_RES_DIVIDER) + +#if SAMPLE_TIME_IMPLEMENTATION +/** Define Host specific (POSIX), or target specific global time variables. */ +static CORETIMETYPE start_time_val, stop_time_val; + +/* Function: start_time + This function will be called right before starting the timed portion of the benchmark. + + Implementation may be capturing a system timer (as implemented in the example code) + or zeroing some system parameters - e.g. setting the cpu clocks cycles to 0. +*/ +void start_time(void) { + GETMYTIME(&start_time_val ); +#if CALLGRIND_RUN + CALLGRIND_START_INSTRUMENTATION +#endif +#if MICA + asm volatile("int3");/*1 */ +#endif +} +/* Function: stop_time + This function will be called right after ending the timed portion of the benchmark. + + Implementation may be capturing a system timer (as implemented in the example code) + or other system parameters - e.g. reading the current value of cpu cycles counter. +*/ +void stop_time(void) { +#if CALLGRIND_RUN + CALLGRIND_STOP_INSTRUMENTATION +#endif +#if MICA + asm volatile("int3");/*1 */ +#endif + GETMYTIME(&stop_time_val ); +} +/* Function: get_time + Return an abstract "ticks" number that signifies time on the system. + + Actual value returned may be cpu cycles, milliseconds or any other value, + as long as it can be converted to seconds by . + This methodology is taken to accomodate any hardware or simulated platform. + The sample implementation returns millisecs by default, + and the resolution is controlled by +*/ +CORE_TICKS get_time(void) { + CORE_TICKS elapsed=(CORE_TICKS)(MYTIMEDIFF(stop_time_val, start_time_val)); + return elapsed; +} +/* Function: time_in_secs + Convert the value returned by get_time to seconds. + + The type is used to accomodate systems with no support for floating point. + Default implementation implemented by the EE_TICKS_PER_SEC macro above. +*/ +secs_ret time_in_secs(CORE_TICKS ticks) { + secs_ret retval=((secs_ret)ticks) / (secs_ret)EE_TICKS_PER_SEC; + return retval; +} +#else +#error "Please implement timing functionality in core_portme.c" +#endif /* SAMPLE_TIME_IMPLEMENTATION */ + +ee_u32 default_num_contexts=MULTITHREAD; + +/* Function: portable_init + Target specific initialization code + Test for some common mistakes. +*/ +void portable_init(core_portable *p, int *argc, char *argv[]) +{ +#if PRINT_ARGS + int i; + for (i=0; i<*argc; i++) { + ee_printf("Arg[%d]=%s\n",i,argv[i]); + } +#endif + if (sizeof(ee_ptr_int) != sizeof(ee_u8 *)) { + ee_printf("ERROR! Please define ee_ptr_int to a type that holds a pointer!\n"); + } + if (sizeof(ee_u32) != 4) { + ee_printf("ERROR! Please define ee_u32 to a 32b unsigned type!\n"); + } +#if (MAIN_HAS_NOARGC && (SEED_METHOD==SEED_ARG)) + ee_printf("ERROR! Main has no argc, but SEED_METHOD defined to SEED_ARG!\n"); +#endif + +#if (MULTITHREAD>1) && (SEED_METHOD==SEED_ARG) + int nargs=*argc,i; + if ((nargs>1) && (*argv[1]=='M')) { + default_num_contexts=parseval(argv[1]+1); + if (default_num_contexts>MULTITHREAD) + default_num_contexts=MULTITHREAD; + /* Shift args since first arg is directed to the portable part and not to coremark main */ + --nargs; + for (i=1; i*/ + p->portable_id=1; +} +/* Function: portable_fini + Target specific final code +*/ +void portable_fini(core_portable *p) +{ + p->portable_id=0; +} + +#if (MULTITHREAD>1) + +/* Function: core_start_parallel + Start benchmarking in a parallel context. + + Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets. + Other implementations using MCAPI or other standards can easily be devised. +*/ +/* Function: core_stop_parallel + Stop a parallel context execution of coremark, and gather the results. + + Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets. + Other implementations using MCAPI or other standards can easily be devised. +*/ +#if USE_PTHREAD +ee_u8 core_start_parallel(core_results *res) { + return (ee_u8)pthread_create(&(res->port.thread),NULL,iterate,(void *)res); +} +ee_u8 core_stop_parallel(core_results *res) { + void *retval; + return (ee_u8)pthread_join(res->port.thread,&retval); +} +#elif USE_FORK +static int key_id=0; +ee_u8 core_start_parallel(core_results *res) { + key_t key=4321+key_id; + key_id++; + res->port.pid=fork(); + res->port.shmid=shmget(key, 8, IPC_CREAT | 0666); + if (res->port.shmid<0) { + ee_printf("ERROR in shmget!\n"); + } + if (res->port.pid==0) { + iterate(res); + res->port.shm=shmat(res->port.shmid, NULL, 0); + /* copy the validation values to the shared memory area and quit*/ + if (res->port.shm == (char *) -1) { + ee_printf("ERROR in child shmat!\n"); + } else { + memcpy(res->port.shm,&(res->crc),8); + shmdt(res->port.shm); + } + exit(0); + } + return 1; +} +ee_u8 core_stop_parallel(core_results *res) { + int status; + pid_t wpid = waitpid(res->port.pid,&status,WUNTRACED); + if (wpid != res->port.pid) { + ee_printf("ERROR waiting for child.\n"); + if (errno == ECHILD) ee_printf("errno=No such child %d\n",res->port.pid); + if (errno == EINTR) ee_printf("errno=Interrupted\n"); + return 0; + } + /* after process is done, get the values from the shared memory area */ + res->port.shm=shmat(res->port.shmid, NULL, 0); + if (res->port.shm == (char *) -1) { + ee_printf("ERROR in parent shmat!\n"); + return 0; + } + memcpy(&(res->crc),res->port.shm,8); + shmdt(res->port.shm); + return 1; +} +#elif USE_SOCKET +static int key_id=0; +ee_u8 core_start_parallel(core_results *res) { + int bound, buffer_length=8; + res->port.sa.sin_family = AF_INET; + res->port.sa.sin_addr.s_addr = htonl(0x7F000001); + res->port.sa.sin_port = htons(7654+key_id); + key_id++; + res->port.pid=fork(); + if (res->port.pid==0) { /* benchmark child */ + iterate(res); + res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); + if (-1 == res->port.sock) /* if socket failed to initialize, exit */ { + ee_printf("Error Creating Socket"); + } else { + int bytes_sent = sendto(res->port.sock, &(res->crc), buffer_length, 0,(struct sockaddr*)&(res->port.sa), sizeof (struct sockaddr_in)); + if (bytes_sent < 0) + ee_printf("Error sending packet: %s\n", strerror(errno)); + close(res->port.sock); /* close the socket */ + } + exit(0); + } + /* parent process, open the socket */ + res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); + bound = bind(res->port.sock,(struct sockaddr*)&(res->port.sa), sizeof(struct sockaddr)); + if (bound < 0) + ee_printf("bind(): %s\n",strerror(errno)); + return 1; +} +ee_u8 core_stop_parallel(core_results *res) { + int status; + int fromlen=sizeof(struct sockaddr); + int recsize = recvfrom(res->port.sock, &(res->crc), 8, 0, (struct sockaddr*)&(res->port.sa), &fromlen); + if (recsize < 0) { + ee_printf("Error in receive: %s\n", strerror(errno)); + return 0; + } + pid_t wpid = waitpid(res->port.pid,&status,WUNTRACED); + if (wpid != res->port.pid) { + ee_printf("ERROR waiting for child.\n"); + if (errno == ECHILD) ee_printf("errno=No such child %d\n",res->port.pid); + if (errno == EINTR) ee_printf("errno=Interrupted\n"); + return 0; + } + return 1; +} +#else /* no standard multicore implementation */ +#error "Please implement multicore functionality in core_portme.c to use multiple contexts." +#endif /* multithread implementations */ +#endif diff --git a/benchmarks/riscv-coremark/riscv64/core_portme.h b/benchmarks/riscv-coremark/riscv64/core_portme.h new file mode 100755 index 000000000..4e28afd36 --- /dev/null +++ b/benchmarks/riscv-coremark/riscv64/core_portme.h @@ -0,0 +1,296 @@ +/* +Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +Original Author: Shay Gal-on +*/ + +/* Topic: Description + This file contains configuration constants required to execute on different platforms +*/ +#ifndef CORE_PORTME_H +#define CORE_PORTME_H +/************************/ +/* Data types and settings */ +/************************/ +/* Configuration: HAS_FLOAT + Define to 1 if the platform supports floating point. +*/ +#ifndef HAS_FLOAT +#define HAS_FLOAT 1 +#endif +/* Configuration: HAS_TIME_H + Define to 1 if platform has the time.h header file, + and implementation of functions thereof. +*/ +#ifndef HAS_TIME_H +#define HAS_TIME_H 0 +#endif +/* Configuration: USE_CLOCK + Define to 1 if platform has the time.h header file, + and implementation of functions thereof. +*/ +#ifndef USE_CLOCK +#define USE_CLOCK 0 +#endif +/* Configuration: HAS_STDIO + Define to 1 if the platform has stdio.h. +*/ +#ifndef HAS_STDIO +#define HAS_STDIO 1 +#endif +/* Configuration: HAS_PRINTF + Define to 1 if the platform has stdio.h and implements the printf function. +*/ +#ifndef HAS_PRINTF +#define HAS_PRINTF 1 +#endif + +/* Configuration: CORE_TICKS + Define type of return from the timing functions. + */ +#if defined(_MSC_VER) +#include +typedef size_t CORE_TICKS; +#elif HAS_TIME_H +#include +typedef clock_t CORE_TICKS; +#else +/* Configuration: size_t and clock_t + Note these need to match the size of the clock output and the xLen the processor supports + */ +typedef unsigned long int size_t; +typedef unsigned long int clock_t; +typedef clock_t CORE_TICKS; +#endif + +/* Definitions: COMPILER_VERSION, COMPILER_FLAGS, MEM_LOCATION + Initialize these strings per platform +*/ +#ifndef COMPILER_VERSION + #ifdef __GNUC__ + #define COMPILER_VERSION "GCC"__VERSION__ + #else + #define COMPILER_VERSION "Please put compiler version here (e.g. gcc 4.1)" + #endif +#endif +#ifndef COMPILER_FLAGS + #define COMPILER_FLAGS FLAGS_STR /* "Please put compiler flags here (e.g. -o3)" */ +#endif +#ifndef MEM_LOCATION + #define MEM_LOCATION "Please put data memory location here\n\t\t\t(e.g. code in flash, data on heap etc)" + #define MEM_LOCATION_UNSPEC 1 +#endif + +/* Data Types: + To avoid compiler issues, define the data types that need ot be used for 8b, 16b and 32b in . + + *Imprtant*: + ee_ptr_int needs to be the data type used to hold pointers, otherwise coremark may fail!!! +*/ +typedef signed short ee_s16; +typedef unsigned short ee_u16; +typedef signed int ee_s32; +typedef double ee_f32; +typedef unsigned char ee_u8; +typedef unsigned int ee_u32; +typedef unsigned long long ee_ptr_int; +typedef size_t ee_size_t; +/* align an offset to point to a 32b value */ +#define align_mem(x) (void *)(4 + (((ee_ptr_int)(x) - 1) & ~3)) + +/* Configuration: SEED_METHOD + Defines method to get seed values that cannot be computed at compile time. + + Valid values: + SEED_ARG - from command line. + SEED_FUNC - from a system function. + SEED_VOLATILE - from volatile variables. +*/ +#ifndef SEED_METHOD +#define SEED_METHOD SEED_ARG +#endif + +/* Configuration: MEM_METHOD + Defines method to get a block of memry. + + Valid values: + MEM_MALLOC - for platforms that implement malloc and have malloc.h. + MEM_STATIC - to use a static memory array. + MEM_STACK - to allocate the data block on the stack (NYI). +*/ +#ifndef MEM_METHOD +#define MEM_METHOD MEM_MALLOC +#endif + +/* Configuration: MULTITHREAD + Define for parallel execution + + Valid values: + 1 - only one context (default). + N>1 - will execute N copies in parallel. + + Note: + If this flag is defined to more then 1, an implementation for launching parallel contexts must be defined. + + Two sample implementations are provided. Use or to enable them. + + It is valid to have a different implementation of and in , + to fit a particular architecture. +*/ +#ifndef MULTITHREAD +#define MULTITHREAD 1 +#endif + +/* Configuration: USE_PTHREAD + Sample implementation for launching parallel contexts + This implementation uses pthread_thread_create and pthread_join. + + Valid values: + 0 - Do not use pthreads API. + 1 - Use pthreads API + + Note: + This flag only matters if MULTITHREAD has been defined to a value greater then 1. +*/ +#ifndef USE_PTHREAD +#define USE_PTHREAD 0 +#endif + +/* Configuration: USE_FORK + Sample implementation for launching parallel contexts + This implementation uses fork, waitpid, shmget,shmat and shmdt. + + Valid values: + 0 - Do not use fork API. + 1 - Use fork API + + Note: + This flag only matters if MULTITHREAD has been defined to a value greater then 1. +*/ +#ifndef USE_FORK +#define USE_FORK 0 +#endif + +/* Configuration: USE_SOCKET + Sample implementation for launching parallel contexts + This implementation uses fork, socket, sendto and recvfrom + + Valid values: + 0 - Do not use fork and sockets API. + 1 - Use fork and sockets API + + Note: + This flag only matters if MULTITHREAD has been defined to a value greater then 1. +*/ +#ifndef USE_SOCKET +#define USE_SOCKET 0 +#endif + +/* Configuration: MAIN_HAS_NOARGC + Needed if platform does not support getting arguments to main. + + Valid values: + 0 - argc/argv to main is supported + 1 - argc/argv to main is not supported +*/ +#ifndef MAIN_HAS_NOARGC +#define MAIN_HAS_NOARGC 0 +#endif + +/* Configuration: MAIN_HAS_NORETURN + Needed if platform does not support returning a value from main. + + Valid values: + 0 - main returns an int, and return value will be 0. + 1 - platform does not support returning a value from main +*/ +#ifndef MAIN_HAS_NORETURN +#define MAIN_HAS_NORETURN 0 +#endif + +/* Variable: default_num_contexts + Number of contexts to spawn in multicore context. + Override this global value to change number of contexts used. + + Note: + This value may not be set higher then the define. + + To experiment, you can set the define to the highest value expected, and use argc/argv in the to set this value from the command line. +*/ +extern ee_u32 default_num_contexts; + +#if (MULTITHREAD>1) +#if USE_PTHREAD + #include + #define PARALLEL_METHOD "PThreads" +#elif USE_FORK + #include + #include + #include + #include + #include /* for memcpy */ + #define PARALLEL_METHOD "Fork" +#elif USE_SOCKET + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #define PARALLEL_METHOD "Sockets" +#else + #define PARALLEL_METHOD "Proprietary" + #error "Please implement multicore functionality in core_portme.c to use multiple contexts." +#endif /* Method for multithreading */ +#endif /* MULTITHREAD > 1 */ + +typedef struct CORE_PORTABLE_S { +#if (MULTITHREAD>1) + #if USE_PTHREAD + pthread_t thread; + #elif USE_FORK + pid_t pid; + int shmid; + void *shm; + #elif USE_SOCKET + pid_t pid; + int sock; + struct sockaddr_in sa; + #endif /* Method for multithreading */ +#endif /* MULTITHREAD>1 */ + ee_u8 portable_id; +} core_portable; + +/* target specific init/fini */ +void portable_init(core_portable *p, int *argc, char *argv[]); +void portable_fini(core_portable *p); + +#if (SEED_METHOD==SEED_VOLATILE) + #if (VALIDATION_RUN || PERFORMANCE_RUN || PROFILE_RUN) + #define RUN_TYPE_FLAG 1 + #else + #if (TOTAL_DATA_SIZE==1200) + #define PROFILE_RUN 1 + #else + #define PERFORMANCE_RUN 1 + #endif + #endif +#endif /* SEED_METHOD==SEED_VOLATILE */ + +#endif /* CORE_PORTME_H */ diff --git a/benchmarks/riscv-coremark/riscv64/core_portme.mak b/benchmarks/riscv-coremark/riscv64/core_portme.mak new file mode 100755 index 000000000..edc341abc --- /dev/null +++ b/benchmarks/riscv-coremark/riscv64/core_portme.mak @@ -0,0 +1,147 @@ +# Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Original Author: Shay Gal-on + +#File: core_portme.mak + +# Flag: RISCVTOOLS +# Use this flag to point to your RISCV tools +RISCVTOOLS=$(RISCV) +# Flag: RISCVTYPE +# Type of toolchain to use +RISCVTYPE=riscv64-unknown-elf +# Flag: OUTFLAG +# Use this flag to define how to to get an executable (e.g -o) +OUTFLAG= -o +# Flag: CC +# Use this flag to define compiler to use +CC = $(RISCVTOOLS)/bin/$(RISCVTYPE)-gcc +# Flag: CFLAGS +# Use this flag to define compiler options. Note, you can add compiler options from the command line using XCFLAGS="other flags" +#PORT_CFLAGS = -O2 -static -std=gnu99 +PORT_CFLAGS = -O2 +FLAGS_STR = "$(PORT_CFLAGS) $(XCFLAGS) $(XLFLAGS) $(LFLAGS_END)" +CFLAGS = $(PORT_CFLAGS) -I$(PORT_DIR) -I. -DFLAGS_STR=\"$(FLAGS_STR)\" +#Flag: LFLAGS_END +# Define any libraries needed for linking or other flags that should come at the end of the link line (e.g. linker scripts). +# Note: On certain platforms, the default clock_gettime implementation is supported but requires linking of librt. +LFLAGS_END += +# Flag: PORT_SRCS +# Port specific source files can be added here +PORT_SRCS = $(PORT_DIR)/core_portme.c +# Flag: LOAD +# Define this flag if you need to load to a target, as in a cross compile environment. + +# Flag: RUN +# Define this flag if running does not consist of simple invocation of the binary. +# In a cross compile environment, you need to define this. + +#For flashing and using a tera term macro, you could use +#LOAD = flash ADDR +#RUN = ttpmacro coremark.ttl + +#For copying to target and executing via SSH connection, you could use +#LOAD = scp $(OUTFILE) user@target:~ +#RUN = ssh user@target -c + +#For native compilation and execution +LOAD = echo Loading done +RUN = spike pk + +OEXT = .o +EXE = .riscv + +# Flag: SEPARATE_COMPILE +# Define if you need to separate compilation from link stage. +# In this case, you also need to define below how to create an object file, and how to link. +ifdef SEPARATE_COMPILE + +LD = $(RISCVTOOLS)/bin/$(RISCVTYPE)-gcc +OBJOUT = -o +LFLAGS = +OFLAG = -o +COUT = -c +# Flag: PORT_OBJS +# Port specific object files can be added here +PORT_OBJS = $(PORT_DIR)/core_portme$(OEXT) +PORT_CLEAN = *$(OEXT) + +$(OPATH)%$(OEXT) : %.c + $(CC) $(CFLAGS) $(XCFLAGS) $(COUT) $< $(OBJOUT) $@ + +endif + +# Target: port_prebuild +# Generate any files that are needed before actual build starts. +# E.g. generate profile guidance files. Sample PGO generation for gcc enabled with PGO=1 +# - First, check if PGO was defined on the command line, if so, need to add -fprofile-use to compile line. +# - Second, if PGO reference has not yet been generated, add a step to the prebuild that will build a profile-generate version and run it. +# Note - Using REBUILD=1 +# +# Use make PGO=1 to invoke this sample processing. + +ifdef PGO + ifeq (,$(findstring $(PGO),gen)) + PGO_STAGE=build_pgo_gcc + CFLAGS+=-fprofile-use + endif + PORT_CLEAN+=*.gcda *.gcno gmon.out +endif + +.PHONY: port_prebuild +port_prebuild: $(PGO_STAGE) + +.PHONY: build_pgo_gcc +build_pgo_gcc: + $(MAKE) PGO=gen XCFLAGS="$(XCFLAGS) -fprofile-generate -DTOTAL_DATA_SIZE=1200" ITERATIONS=10 gen_pgo_data REBUILD=1 + +# Target: port_postbuild +# Generate any files that are needed after actual build end. +# E.g. change format to srec, bin, zip in order to be able to load into flash +.PHONY: port_postbuild +port_postbuild: + +# Target: port_postrun +# Do platform specific after run stuff. +# E.g. reset the board, backup the logfiles etc. +.PHONY: port_postrun +port_postrun: + +# Target: port_prerun +# Do platform specific after run stuff. +# E.g. reset the board, backup the logfiles etc. +.PHONY: port_prerun +port_prerun: + +# Target: port_postload +# Do platform specific after load stuff. +# E.g. reset the reset power to the flash eraser +.PHONY: port_postload +port_postload: + +# Target: port_preload +# Do platform specific before load stuff. +# E.g. reset the reset power to the flash eraser +.PHONY: port_preload +port_preload: + +# FLAG: OPATH +# Path to the output folder. Default - current folder. +OPATH = ./ +MKDIR = mkdir -p + +# FLAG: PERL +# Define perl executable to calculate the geomean if running separate. +PERL=/usr/bin/perl diff --git a/benchmarks/riscv-coremark/trace b/benchmarks/riscv-coremark/trace new file mode 100644 index 000000000..7c76d0bfa --- /dev/null +++ b/benchmarks/riscv-coremark/trace @@ -0,0 +1,48 @@ +Imperas riscvOVPsimPlus + + +riscvOVPsimPlus (64-Bit) v20210329.0 Open Virtual Platform simulator from www.IMPERAS.com. +Copyright (c) 2005-2021 Imperas Software Ltd. Contains Imperas Proprietary Information. +Licensed Software, All Rights Reserved. +Visit www.IMPERAS.com for multicore debug, verification and analysis solutions. + +riscvOVPsimPlus started: Wed May 12 17:55:33 2021 + + +Info (GDBT_PORT) Host: Tera.Eng.HMC.Edu, Port: 55460 +Info (DBC_LGDB) Starting Debugger /cad/riscv/imperas-riscv-tests/riscv-ovpsim-plus/bin/Linux64/riscv-none-embed-gdb +Info (GDBT_WAIT) Waiting for remote debugger to connect... +Info (OR_OF) Target 'riscvOVPsim/cpu' has object file read from 'coremark.bare.riscv' +Info (OR_PH) Program Headers: +Info (OR_PH) Type Offset VirtAddr PhysAddr +Info (OR_PH) FileSiz MemSiz Flags Align +Info (OR_PD) LOAD 0x0000000000001000 0x0000000080000000 0x0000000080000000 +Info (OR_PD) 0x0000000000000204 0x0000000000000204 R-E 1000 +Info (OR_PD) LOAD 0x0000000000002000 0x0000000080001000 0x0000000080001000 +Info (OR_PD) 0x00000000000047e0 0x0000000000004ff0 RWE 1000 +Info (GDBT_CONNECTED) Client connected +Info (GDBT_GON) Client disappeared 'riscvOVPsim/cpu' +Info +Info --------------------------------------------------- +Info CPU 'riscvOVPsim/cpu' STATISTICS +Info Type : riscv (RV64GC) +Info Nominal MIPS : 100 +Info Final program counter : 0x80003558 +Info Simulated instructions: 1,455,608 +Info Simulated MIPS : 0.0 +Info --------------------------------------------------- +Info +Info --------------------------------------------------- +Info SIMULATION TIME STATISTICS +Info Simulated time : 0.02 seconds +Info User time : 99.23 seconds +Info System time : 254.08 seconds +Info Elapsed time : 1107.49 seconds +Info --------------------------------------------------- + +riscvOVPsimPlus finished: Wed May 12 18:14:04 2021 + + +riscvOVPsimPlus (64-Bit) v20210329.0 Open Virtual Platform simulator from www.IMPERAS.com. +Visit www.IMPERAS.com for multicore debug, verification and analysis solutions. + diff --git a/benchmarks/riscv-coremark/transferobjdump.sh b/benchmarks/riscv-coremark/transferobjdump.sh new file mode 100755 index 000000000..69578566a --- /dev/null +++ b/benchmarks/riscv-coremark/transferobjdump.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash +./build-coremark.sh + +riscv64-unknown-elf-objdump -D coremark.bare.riscv > coremarkcodemod.bare.riscv.objdump +cp coremarkcodemod.bare.riscv.objdump ~/riscv-wally/tests/imperas-riscv-tests/riscv-ovpsim-plus/examples/CoreMark/. +pushd ~/riscv-wally/tests/imperas-riscv-tests/riscv-ovpsim-plus/examples/CoreMark +./exe2memfile.pl coremarkcodemod.bare.riscv +popd From c45f276f866abcdc147bcdfbeff6fc660072c788 Mon Sep 17 00:00:00 2001 From: David Harris Date: Thu, 18 Nov 2021 20:32:13 -0800 Subject: [PATCH 120/132] Moved exe2memfile.pl --- benchmarks/riscv-coremark/Makefile | 11 ++--------- {wally-pipelined/bin => bin}/exe2memfile.pl | 0 {wally-pipelined/bin => bin}/exe2memfile.pl.old | 0 {wally-pipelined/bin => bin}/extractFunctionRadix.sh | 0 4 files changed, 2 insertions(+), 9 deletions(-) rename {wally-pipelined/bin => bin}/exe2memfile.pl (100%) rename {wally-pipelined/bin => bin}/exe2memfile.pl.old (100%) rename {wally-pipelined/bin => bin}/extractFunctionRadix.sh (100%) diff --git a/benchmarks/riscv-coremark/Makefile b/benchmarks/riscv-coremark/Makefile index b66b8cb75..fe5d196ba 100644 --- a/benchmarks/riscv-coremark/Makefile +++ b/benchmarks/riscv-coremark/Makefile @@ -5,15 +5,8 @@ coremark.bare.riscv.objdump: coremark.bare.riscv riscv64-unknown-elf-objdump -D coremark.bare.riscv > coremark.bare.riscv.objdump coremark.bare.riscv: - BASEDIR=${CUR_DIR} - RISCV=/courses/e190ax/riscvcompiler - CMPATH=coremark - #pushd ../../addins/coremark - # run the compile - echo "Start compilation" - - make -C ${CMPATH} PORT_DIR=${BASEDIR}/riscv64-baremetal compile RISCV=/courses/e190ax/riscvcompiler XCFLAGS=-march=rv64im - mv ${CMPATH}/coremark.bare.riscv . + make -C coremark PORT_DIR=./riscv64-baremetal compile RISCV=/courses/e190ax/riscvcompiler XCFLAGS="-march=rv64im" + mv coremark/coremark.bare.riscv . .PHONY: clean diff --git a/wally-pipelined/bin/exe2memfile.pl b/bin/exe2memfile.pl similarity index 100% rename from wally-pipelined/bin/exe2memfile.pl rename to bin/exe2memfile.pl diff --git a/wally-pipelined/bin/exe2memfile.pl.old b/bin/exe2memfile.pl.old similarity index 100% rename from wally-pipelined/bin/exe2memfile.pl.old rename to bin/exe2memfile.pl.old diff --git a/wally-pipelined/bin/extractFunctionRadix.sh b/bin/extractFunctionRadix.sh similarity index 100% rename from wally-pipelined/bin/extractFunctionRadix.sh rename to bin/extractFunctionRadix.sh From 7bdd9b2860a0ff32fc791080b9892057664f0a23 Mon Sep 17 00:00:00 2001 From: David Harris Date: Thu, 18 Nov 2021 20:37:53 -0800 Subject: [PATCH 121/132] exe2memfile don't print when only 1 file --- bin/exe2memfile.pl | 6 +- bin/exe2memfile.pl.old | 200 ----------------------------------------- 2 files changed, 4 insertions(+), 202 deletions(-) delete mode 100755 bin/exe2memfile.pl.old diff --git a/bin/exe2memfile.pl b/bin/exe2memfile.pl index 26d0d2f42..70666b1f3 100755 --- a/bin/exe2memfile.pl +++ b/bin/exe2memfile.pl @@ -19,10 +19,12 @@ my $maxaddress = 0; STDOUT->autoflush(1); my $numfiles = $#ARGV+1; -print ("Processing $numfiles memfiles: "); +if ($numfiles > 1) { + print ("Processing $numfiles memfiles: "); +} my $frac = $#ARGV/10; for(my $i=0; $i<=$#ARGV; $i++) { - if ($i < 10 || $i % $frac == 0) { print ("$i ") }; + if ($i > 0 && ($i < 10 || $i % $frac == 0)) { print ("$i ") }; my $fname = $ARGV[$i]; # print "fname = $fname"; my $ofile = $fname.".objdump"; diff --git a/bin/exe2memfile.pl.old b/bin/exe2memfile.pl.old deleted file mode 100755 index f02068d90..000000000 --- a/bin/exe2memfile.pl.old +++ /dev/null @@ -1,200 +0,0 @@ -#!/usr/bin/perl -w - -# exe2memfile.pl -# David_Harris@hmc.edu 26 November 2020 -# Converts an executable file to a series of 32-bit hex instructions -# to read into a Verilog simulation with $readmemh - -use File::stat; -use IO::Handle; - -if ($#ARGV == -1) { - die("Usage: $0 executable_file"); -} - -# array to hold contents of memory file -my @memfilebytes = (0)*16384*4; -my $maxaddress = 0; - -STDOUT->autoflush(1); -# *** Ross Thompson I think there is a bug here needs to be +1 -print ("Processing $#ARGV memfiles: \n"); -my $frac = $#ARGV/10; -for(my $i=0; $i<=$#ARGV; $i++) { - if ($i < 10 || $i % $frac == 0) { print ("$i ") }; - my $fname = $ARGV[$i]; -# print "fname = $fname"; - my $ofile = $fname.".objdump"; - my $memfile = $fname.".memfile"; - - my $needsprocessing = 0; - if (!-e $memfile) { $needsprocessing = 1; } # create memfile if it doesn't exist - else { - my $osb = stat($ofile) || die("Can't stat $ofile"); - my $msb = stat($memfile) || die("Can't stat $memfile"); - my $otime = $osb->mtime; - my $mtime = $msb->mtime; - if ($otime > $mtime) { $needsprocessing = 1; } # is memfile out of date? - } - - if ($needsprocessing == 1) { - open(FILE, $ofile) || die("Can't read $ofile"); - my $mode = 0; # parse for code - my $section = ""; - my $data = ""; - my $address; - my $first = 0; - my $firstAddress; - - # initialize to all zeros; - # *** need to fix the zeroing range. Not always 64K - for (my $i=0; $i < 65536*4; $i++) { - $memfilebytes[$i] = "00"; - } - - while() { - # objdump fill is divided into several .sections of which only some we want to actually process. - # In general we want everything except the .comment and .*attributes - if (/Disassembly of section (.*):/) { - $section = $1; - print ("setting section to $section\n"); - } else { - # now check if the section is one we are interested in processing. - #if ($section ne ".comment" && $section ne ".riscv.attributes" && $section =~ /\.debug.*/) { - if ($section =~ "\.init|\.text|\..*data|\..*bss") { - # the structure is: possible space(s) hex number: possible space(s) hex number space(s) junk - # there are also lines we need to skip: possible space(s) hex number : - if (/^\s*([0-9A-Fa-f]{1,16}):\s+([0-9A-Fa-f]+).*$/) { - $address = &fixadr($1); - if ($first == 0) { - $first = 1; - $firstAddress = $address; - } - $data = $2; - &emitData($address, $data); - # my $len = length($data); - # for (my $i=0; $i<$len/2; $i++) { - # $memfilebytes[$address+$i] = substr($data, $len-2-2*$i, 2); - # } -# print ("Addr $address $data\n"); -# } elsif (/^\s*\.\.\./) { -# print ("Got ...\n"); -# } else { -# print ("No match\n"); - } - } - } -# # *** this mode stuff does not work if a section is missing or reordered. -# if ($mode == 0) { # Parse code -# # print("Examining $_\n"); -# if (/^\s*(\S{1,16}):\s+(\S+)\s+/) { -# $address = &fixadr($1); -# my $instr = $2; -# my $len = length($instr); -# for (my $i=0; $i<$len/2; $i++) { -# $memfilebytes[$address+$i] = substr($instr, $len-2-2*$i, 2); -# } -# print ("address $address $instr\n"); -# } -# if (/Disassembly of section .data:/) { $mode = 1;} -# } elsif ($mode == 1) { # Parse data segment -# if (/^\s*(\S{1,16}):\s+(.*)/) { -# $address = &fixadr($1); -# # print "addresss $address maxaddress $maxaddress\n"; -# if ($address > $maxaddress) { $maxaddress = $address; } -# my $line = $2; -# # merge chunks with spaces -# # *** might need to change -# $line =~ s/(\S)\s(\S)/$1$2/g; -# # strip off comments -# $line =~ /^(\S*)/; -# $payload = $1; -# &emitData($address, $payload); -# } -# if (/Disassembly of section .comment:/) { $mode = 2; } -# } elsif ($mode == 2) { # parse the comment section -# if (/Disassembly of section .riscv.attributes:/) { $mode = 3; } -# } - } - close(FILE); - $maxaddress = $address + 32; # pad some zeros at the end - - # print to memory file - # *** this is a problem - if ($fname =~ /rv32/) { - open(MEMFILE, ">$memfile") || die("Can't write $memfile"); - for (my $i=$firstAddress; $i<= $maxaddress; $i = $i + 4) { - for ($j=3; $j>=0; $j--) { - no warnings 'uninitialized'; - my $value = $memfilebytes[$i+$j]; - if ($value eq ""){ - print MEMFILE "00"; - } else { - print MEMFILE "$memfilebytes[$i+$j]"; - } - } - print MEMFILE "\n"; - } - close(MEMFILE); - } else { - open(MEMFILE, ">$memfile") || die("Can't write $memfile"); - for (my $i=$firstAddress; $i<= $maxaddress; $i = $i + 8) { - for ($j=7; $j>=0; $j--) { - no warnings 'uninitialized'; - my $value = $memfilebytes[$i+$j]; - if ($value eq ""){ - print MEMFILE "00"; - } else { - print MEMFILE "$memfilebytes[$i+$j]"; - } - } - print MEMFILE "\n"; - } - close(MEMFILE); - } - } -} -print("\n"); - -sub emitData { - # print the data portion of the ELF into a memroy file, including 0s for empty stuff - # deal with endianness - my $address = shift; - my $payload = shift; - -# print("Emitting data. address = $address payload = $payload\n"); - - my $len = length($payload); - if ($len <= 8) { - # print word or halfword - for(my $i=0; $i<$len/2; $i++) { - my $adr = $address+$i; - my $b = substr($payload, $len-2-2*$i, 2); - $memfilebytes[$adr] = $b; -# print(" $adr $b\n"); - } - } elsif ($len == 12) { - # weird case of three halfwords on line - &emitData($address, substr($payload, 0, 4)); - &emitData($address+2, substr($payload, 4, 4)); - &emitData($address+4, substr($payload, 8, 4)); - } else { - &emitData($address, substr($payload, 0, 8)); - &emitData($address+4, substr($payload, 8, $len-8)); - } -} - -sub fixadr { - # strip off leading 8 from address and convert to decimal - # if the leading 8 is not present don't remove. - my $adr = shift; - #print "addr $adr\n"; - - # start at 0 - return hex($adr); - - # start at 8 - #if ($adr =~ s/^8/0/) { return hex($adr); } - #else { return hex($adr) } - -} From c06a7e2bbdda1d17063f633e2f0a3ed38c677180 Mon Sep 17 00:00:00 2001 From: David Harris Date: Thu, 18 Nov 2021 20:46:59 -0800 Subject: [PATCH 122/132] Replaced build-coremark.sh with Makefile --- benchmarks/riscv-coremark/Makefile | 4 ++-- benchmarks/riscv-coremark/build-coremark.sh | 15 --------------- 2 files changed, 2 insertions(+), 17 deletions(-) delete mode 100755 benchmarks/riscv-coremark/build-coremark.sh diff --git a/benchmarks/riscv-coremark/Makefile b/benchmarks/riscv-coremark/Makefile index fe5d196ba..718b438f5 100644 --- a/benchmarks/riscv-coremark/Makefile +++ b/benchmarks/riscv-coremark/Makefile @@ -5,10 +5,10 @@ coremark.bare.riscv.objdump: coremark.bare.riscv riscv64-unknown-elf-objdump -D coremark.bare.riscv > coremark.bare.riscv.objdump coremark.bare.riscv: - make -C coremark PORT_DIR=./riscv64-baremetal compile RISCV=/courses/e190ax/riscvcompiler XCFLAGS="-march=rv64im" + make -C coremark PORT_DIR=/home/harris/riscv-wally/benchmarks/riscv-coremark/riscv64-baremetal compile RISCV=/courses/e190ax/riscvcompiler XCFLAGS="-march=rv64im" mv coremark/coremark.bare.riscv . .PHONY: clean clean: - rm coremark.bare.riscv* \ No newline at end of file + rm -f coremark.bare.riscv* \ No newline at end of file diff --git a/benchmarks/riscv-coremark/build-coremark.sh b/benchmarks/riscv-coremark/build-coremark.sh deleted file mode 100755 index 78c3d709c..000000000 --- a/benchmarks/riscv-coremark/build-coremark.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/bash - -set -e - -BASEDIR=$PWD - -# run the compile -echo "Start compilation" - -#make -C ../../addins/coremark PORT_DIR=$BASEDIR/riscv64-baremetal compile RISCV=/courses/e190ax/riscvcompiler XCFLAGS="-march=rv64im" -#mv ../../addins/coremark/coremark.bare.riscv $BASEDIR -make -C coremark PORT_DIR=$BASEDIR/riscv64-baremetal compile RISCV=/courses/e190ax/riscvcompiler XCFLAGS="-march=rv64im" -mv coremark/coremark.bare.riscv $BASEDIR -riscv64-unknown-elf-objdump -D coremark.bare.riscv > coremark.bare.riscv.objdump #> coremarkcodemod.bare.riscv.objdump -exe2memfile.pl coremark.bare.riscv From fb3f26764534f451e61f147ac4f81f3cc09c2427 Mon Sep 17 00:00:00 2001 From: David Harris Date: Fri, 19 Nov 2021 06:09:04 -0800 Subject: [PATCH 123/132] Coremark Cleanup, trying compile from addins --- benchmarks/riscv-coremark/Makefile | 18 +- benchmarks/riscv-coremark/README.md | 23 -- .../{ => old}/extraPortmes/README.md | 0 .../extraPortmes/cygwin/core_portme.c | 0 .../extraPortmes/cygwin/core_portme.h | 0 .../extraPortmes/cygwin/core_portme.mak | 0 .../extraPortmes/linux/core_portme.c | 0 .../extraPortmes/linux/core_portme.h | 0 .../extraPortmes/linux/core_portme.mak | 0 .../extraPortmes/linux64/core_portme.c | 0 .../extraPortmes/linux64/core_portme.h | 0 .../extraPortmes/linux64/core_portme.mak | 0 .../riscv-coremark/riscv64/core_portme.c | 346 ------------------ .../riscv-coremark/riscv64/core_portme.h | 296 --------------- .../riscv-coremark/riscv64/core_portme.mak | 147 -------- benchmarks/riscv-coremark/trace | 48 --- benchmarks/riscv-coremark/transferobjdump.sh | 8 - .../testbench/testbench-coremark_bare.sv | 2 +- 18 files changed, 11 insertions(+), 877 deletions(-) delete mode 100644 benchmarks/riscv-coremark/README.md rename benchmarks/riscv-coremark/{ => old}/extraPortmes/README.md (100%) rename benchmarks/riscv-coremark/{ => old}/extraPortmes/cygwin/core_portme.c (100%) rename benchmarks/riscv-coremark/{ => old}/extraPortmes/cygwin/core_portme.h (100%) rename benchmarks/riscv-coremark/{ => old}/extraPortmes/cygwin/core_portme.mak (100%) rename benchmarks/riscv-coremark/{ => old}/extraPortmes/linux/core_portme.c (100%) rename benchmarks/riscv-coremark/{ => old}/extraPortmes/linux/core_portme.h (100%) rename benchmarks/riscv-coremark/{ => old}/extraPortmes/linux/core_portme.mak (100%) rename benchmarks/riscv-coremark/{ => old}/extraPortmes/linux64/core_portme.c (100%) rename benchmarks/riscv-coremark/{ => old}/extraPortmes/linux64/core_portme.h (100%) rename benchmarks/riscv-coremark/{ => old}/extraPortmes/linux64/core_portme.mak (100%) delete mode 100755 benchmarks/riscv-coremark/riscv64/core_portme.c delete mode 100755 benchmarks/riscv-coremark/riscv64/core_portme.h delete mode 100755 benchmarks/riscv-coremark/riscv64/core_portme.mak delete mode 100644 benchmarks/riscv-coremark/trace delete mode 100755 benchmarks/riscv-coremark/transferobjdump.sh diff --git a/benchmarks/riscv-coremark/Makefile b/benchmarks/riscv-coremark/Makefile index 718b438f5..90097249f 100644 --- a/benchmarks/riscv-coremark/Makefile +++ b/benchmarks/riscv-coremark/Makefile @@ -1,14 +1,16 @@ -coremark.bare.riscv.memfile: coremark.bare.riscv.objdump - exe2memfile.pl coremark.bare.riscv +work/coremark.bare.riscv.memfile: work/coremark.bare.riscv.objdump + exe2memfile.pl work/coremark.bare.riscv -coremark.bare.riscv.objdump: coremark.bare.riscv - riscv64-unknown-elf-objdump -D coremark.bare.riscv > coremark.bare.riscv.objdump +work/coremark.bare.riscv.objdump: work/coremark.bare.riscv + riscv64-unknown-elf-objdump -D work/coremark.bare.riscv > work/coremark.bare.riscv.objdump -coremark.bare.riscv: - make -C coremark PORT_DIR=/home/harris/riscv-wally/benchmarks/riscv-coremark/riscv64-baremetal compile RISCV=/courses/e190ax/riscvcompiler XCFLAGS="-march=rv64im" - mv coremark/coremark.bare.riscv . +work/coremark.bare.riscv: + #make -C coremark PORT_DIR=/home/harris/riscv-wally/benchmarks/riscv-coremark/riscv64-baremetal compile RISCV=/courses/e190ax/riscvcompiler XCFLAGS="-march=rv64im" + #mv coremark/coremark.bare.riscv work + make -C ../../addins/coremark PORT_DIR=/home/harris/riscv-wally/benchmarks/riscv-coremark/riscv64-baremetal compile RISCV=/courses/e190ax/riscvcompiler XCFLAGS="-march=rv64im" + mv ../../addins/coremark/coremark.bare.riscv work .PHONY: clean clean: - rm -f coremark.bare.riscv* \ No newline at end of file + rm -f work/* \ No newline at end of file diff --git a/benchmarks/riscv-coremark/README.md b/benchmarks/riscv-coremark/README.md deleted file mode 100644 index 7c02eb1bf..000000000 --- a/benchmarks/riscv-coremark/README.md +++ /dev/null @@ -1,23 +0,0 @@ -Coremark EEMBC Wrapper -====================== - -This repository provides the utility files to port [CoreMark EEMBC](https://www.eembc.org/coremark/) to RISC-V. - -### Requirements - - - You must have installed the RISC-V tools - -### Setup - - - `git submodule update --init` - - Run the `./build-coremark.sh` script that does the following - - Builds a version of Coremark for Linux or pk (coremark.riscv) - - Builds a version of Coremark for bare-metal (coremark.bare.riscv) - - Copies the output binaries into this directory - -### Default Files - -The default files target **RV64GC** and use minimal amount of compilation flags. Additionally, the `*.mak` file in the `riscv64` -folder setups `spike pk` as the default `run` rule. - -Feel free to change these to suit your needs. diff --git a/benchmarks/riscv-coremark/extraPortmes/README.md b/benchmarks/riscv-coremark/old/extraPortmes/README.md similarity index 100% rename from benchmarks/riscv-coremark/extraPortmes/README.md rename to benchmarks/riscv-coremark/old/extraPortmes/README.md diff --git a/benchmarks/riscv-coremark/extraPortmes/cygwin/core_portme.c b/benchmarks/riscv-coremark/old/extraPortmes/cygwin/core_portme.c similarity index 100% rename from benchmarks/riscv-coremark/extraPortmes/cygwin/core_portme.c rename to benchmarks/riscv-coremark/old/extraPortmes/cygwin/core_portme.c diff --git a/benchmarks/riscv-coremark/extraPortmes/cygwin/core_portme.h b/benchmarks/riscv-coremark/old/extraPortmes/cygwin/core_portme.h similarity index 100% rename from benchmarks/riscv-coremark/extraPortmes/cygwin/core_portme.h rename to benchmarks/riscv-coremark/old/extraPortmes/cygwin/core_portme.h diff --git a/benchmarks/riscv-coremark/extraPortmes/cygwin/core_portme.mak b/benchmarks/riscv-coremark/old/extraPortmes/cygwin/core_portme.mak similarity index 100% rename from benchmarks/riscv-coremark/extraPortmes/cygwin/core_portme.mak rename to benchmarks/riscv-coremark/old/extraPortmes/cygwin/core_portme.mak diff --git a/benchmarks/riscv-coremark/extraPortmes/linux/core_portme.c b/benchmarks/riscv-coremark/old/extraPortmes/linux/core_portme.c similarity index 100% rename from benchmarks/riscv-coremark/extraPortmes/linux/core_portme.c rename to benchmarks/riscv-coremark/old/extraPortmes/linux/core_portme.c diff --git a/benchmarks/riscv-coremark/extraPortmes/linux/core_portme.h b/benchmarks/riscv-coremark/old/extraPortmes/linux/core_portme.h similarity index 100% rename from benchmarks/riscv-coremark/extraPortmes/linux/core_portme.h rename to benchmarks/riscv-coremark/old/extraPortmes/linux/core_portme.h diff --git a/benchmarks/riscv-coremark/extraPortmes/linux/core_portme.mak b/benchmarks/riscv-coremark/old/extraPortmes/linux/core_portme.mak similarity index 100% rename from benchmarks/riscv-coremark/extraPortmes/linux/core_portme.mak rename to benchmarks/riscv-coremark/old/extraPortmes/linux/core_portme.mak diff --git a/benchmarks/riscv-coremark/extraPortmes/linux64/core_portme.c b/benchmarks/riscv-coremark/old/extraPortmes/linux64/core_portme.c similarity index 100% rename from benchmarks/riscv-coremark/extraPortmes/linux64/core_portme.c rename to benchmarks/riscv-coremark/old/extraPortmes/linux64/core_portme.c diff --git a/benchmarks/riscv-coremark/extraPortmes/linux64/core_portme.h b/benchmarks/riscv-coremark/old/extraPortmes/linux64/core_portme.h similarity index 100% rename from benchmarks/riscv-coremark/extraPortmes/linux64/core_portme.h rename to benchmarks/riscv-coremark/old/extraPortmes/linux64/core_portme.h diff --git a/benchmarks/riscv-coremark/extraPortmes/linux64/core_portme.mak b/benchmarks/riscv-coremark/old/extraPortmes/linux64/core_portme.mak similarity index 100% rename from benchmarks/riscv-coremark/extraPortmes/linux64/core_portme.mak rename to benchmarks/riscv-coremark/old/extraPortmes/linux64/core_portme.mak diff --git a/benchmarks/riscv-coremark/riscv64/core_portme.c b/benchmarks/riscv-coremark/riscv64/core_portme.c deleted file mode 100755 index 8f17cb8bd..000000000 --- a/benchmarks/riscv-coremark/riscv64/core_portme.c +++ /dev/null @@ -1,346 +0,0 @@ -/* -Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Original Author: Shay Gal-on -*/ - -#include -#include -#include "coremark.h" -#if CALLGRIND_RUN -#include -#endif - -#if (MEM_METHOD==MEM_MALLOC) -#include -/* Function: portable_malloc - Provide malloc() functionality in a platform specific way. -*/ -void *portable_malloc(size_t size) { - return malloc(size); -} -/* Function: portable_free - Provide free() functionality in a platform specific way. -*/ -void portable_free(void *p) { - free(p); -} -#else -void *portable_malloc(size_t size) { - return NULL; -} -void portable_free(void *p) { - p=NULL; -} -#endif - -#if (SEED_METHOD==SEED_VOLATILE) -#if VALIDATION_RUN - volatile ee_s32 seed1_volatile=0x3415; - volatile ee_s32 seed2_volatile=0x3415; - volatile ee_s32 seed3_volatile=0x66; -#endif -#if PERFORMANCE_RUN - volatile ee_s32 seed1_volatile=0x0; - volatile ee_s32 seed2_volatile=0x0; - volatile ee_s32 seed3_volatile=0x66; -#endif -#if PROFILE_RUN - volatile ee_s32 seed1_volatile=0x8; - volatile ee_s32 seed2_volatile=0x8; - volatile ee_s32 seed3_volatile=0x8; -#endif - volatile ee_s32 seed4_volatile=ITERATIONS; - volatile ee_s32 seed5_volatile=0; -#endif -/* Porting: Timing functions - How to capture time and convert to seconds must be ported to whatever is supported by the platform. - e.g. Read value from on board RTC, read value from cpu clock cycles performance counter etc. - Sample implementation for standard time.h and windows.h definitions included. -*/ -/* Define: TIMER_RES_DIVIDER - Divider to trade off timer resolution and total time that can be measured. - - Use lower values to increase resolution, but make sure that overflow does not occur. - If there are issues with the return value overflowing, increase this value. - */ -#if USE_CLOCK - #define NSECS_PER_SEC CLOCKS_PER_SEC - #define EE_TIMER_TICKER_RATE 1000 - #define CORETIMETYPE clock_t - #define GETMYTIME(_t) (*_t=clock()) - #define MYTIMEDIFF(fin,ini) ((fin)-(ini)) - #define TIMER_RES_DIVIDER 1 - #define SAMPLE_TIME_IMPLEMENTATION 1 -#elif defined(_MSC_VER) - #define NSECS_PER_SEC 10000000 - #define EE_TIMER_TICKER_RATE 1000 - #define CORETIMETYPE FILETIME - #define GETMYTIME(_t) GetSystemTimeAsFileTime(_t) - #define MYTIMEDIFF(fin,ini) (((*(__int64*)&fin)-(*(__int64*)&ini))/TIMER_RES_DIVIDER) - /* setting to millisces resolution by default with MSDEV */ - #ifndef TIMER_RES_DIVIDER - #define TIMER_RES_DIVIDER 1000 - #endif - #define SAMPLE_TIME_IMPLEMENTATION 1 -#elif HAS_TIME_H - #define NSECS_PER_SEC 1000000000 - #define EE_TIMER_TICKER_RATE 1000 - #define CORETIMETYPE struct timespec - #define GETMYTIME(_t) clock_gettime(CLOCK_REALTIME,_t) - #define MYTIMEDIFF(fin,ini) ((fin.tv_sec-ini.tv_sec)*(NSECS_PER_SEC/TIMER_RES_DIVIDER)+(fin.tv_nsec-ini.tv_nsec)/TIMER_RES_DIVIDER) - /* setting to 1/1000 of a second resolution by default with linux */ - #ifndef TIMER_RES_DIVIDER - #define TIMER_RES_DIVIDER 1000000 - #endif - #define SAMPLE_TIME_IMPLEMENTATION 1 -#else - // Defined for RISCV - #define NSECS_PER_SEC 1000000000 // TODO: What freq are we assuming? - #define EE_TIMER_TICKER_RATE 1000 // TODO: What is this? - #define CORETIMETYPE clock_t - #define read_csr(reg) ({ unsigned long __tmp; \ - asm volatile ("csrr %0, " #reg : "=r"(__tmp)); \ - __tmp; }) - #define GETMYTIME(_t) (*_t=read_csr(cycle)) - #define MYTIMEDIFF(fin,ini) ((fin)-(ini)) - #define TIMER_RES_DIVIDER 1 - #define SAMPLE_TIME_IMPLEMENTATION 1 -#endif -#define EE_TICKS_PER_SEC (NSECS_PER_SEC / TIMER_RES_DIVIDER) - -#if SAMPLE_TIME_IMPLEMENTATION -/** Define Host specific (POSIX), or target specific global time variables. */ -static CORETIMETYPE start_time_val, stop_time_val; - -/* Function: start_time - This function will be called right before starting the timed portion of the benchmark. - - Implementation may be capturing a system timer (as implemented in the example code) - or zeroing some system parameters - e.g. setting the cpu clocks cycles to 0. -*/ -void start_time(void) { - GETMYTIME(&start_time_val ); -#if CALLGRIND_RUN - CALLGRIND_START_INSTRUMENTATION -#endif -#if MICA - asm volatile("int3");/*1 */ -#endif -} -/* Function: stop_time - This function will be called right after ending the timed portion of the benchmark. - - Implementation may be capturing a system timer (as implemented in the example code) - or other system parameters - e.g. reading the current value of cpu cycles counter. -*/ -void stop_time(void) { -#if CALLGRIND_RUN - CALLGRIND_STOP_INSTRUMENTATION -#endif -#if MICA - asm volatile("int3");/*1 */ -#endif - GETMYTIME(&stop_time_val ); -} -/* Function: get_time - Return an abstract "ticks" number that signifies time on the system. - - Actual value returned may be cpu cycles, milliseconds or any other value, - as long as it can be converted to seconds by . - This methodology is taken to accomodate any hardware or simulated platform. - The sample implementation returns millisecs by default, - and the resolution is controlled by -*/ -CORE_TICKS get_time(void) { - CORE_TICKS elapsed=(CORE_TICKS)(MYTIMEDIFF(stop_time_val, start_time_val)); - return elapsed; -} -/* Function: time_in_secs - Convert the value returned by get_time to seconds. - - The type is used to accomodate systems with no support for floating point. - Default implementation implemented by the EE_TICKS_PER_SEC macro above. -*/ -secs_ret time_in_secs(CORE_TICKS ticks) { - secs_ret retval=((secs_ret)ticks) / (secs_ret)EE_TICKS_PER_SEC; - return retval; -} -#else -#error "Please implement timing functionality in core_portme.c" -#endif /* SAMPLE_TIME_IMPLEMENTATION */ - -ee_u32 default_num_contexts=MULTITHREAD; - -/* Function: portable_init - Target specific initialization code - Test for some common mistakes. -*/ -void portable_init(core_portable *p, int *argc, char *argv[]) -{ -#if PRINT_ARGS - int i; - for (i=0; i<*argc; i++) { - ee_printf("Arg[%d]=%s\n",i,argv[i]); - } -#endif - if (sizeof(ee_ptr_int) != sizeof(ee_u8 *)) { - ee_printf("ERROR! Please define ee_ptr_int to a type that holds a pointer!\n"); - } - if (sizeof(ee_u32) != 4) { - ee_printf("ERROR! Please define ee_u32 to a 32b unsigned type!\n"); - } -#if (MAIN_HAS_NOARGC && (SEED_METHOD==SEED_ARG)) - ee_printf("ERROR! Main has no argc, but SEED_METHOD defined to SEED_ARG!\n"); -#endif - -#if (MULTITHREAD>1) && (SEED_METHOD==SEED_ARG) - int nargs=*argc,i; - if ((nargs>1) && (*argv[1]=='M')) { - default_num_contexts=parseval(argv[1]+1); - if (default_num_contexts>MULTITHREAD) - default_num_contexts=MULTITHREAD; - /* Shift args since first arg is directed to the portable part and not to coremark main */ - --nargs; - for (i=1; i*/ - p->portable_id=1; -} -/* Function: portable_fini - Target specific final code -*/ -void portable_fini(core_portable *p) -{ - p->portable_id=0; -} - -#if (MULTITHREAD>1) - -/* Function: core_start_parallel - Start benchmarking in a parallel context. - - Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets. - Other implementations using MCAPI or other standards can easily be devised. -*/ -/* Function: core_stop_parallel - Stop a parallel context execution of coremark, and gather the results. - - Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets. - Other implementations using MCAPI or other standards can easily be devised. -*/ -#if USE_PTHREAD -ee_u8 core_start_parallel(core_results *res) { - return (ee_u8)pthread_create(&(res->port.thread),NULL,iterate,(void *)res); -} -ee_u8 core_stop_parallel(core_results *res) { - void *retval; - return (ee_u8)pthread_join(res->port.thread,&retval); -} -#elif USE_FORK -static int key_id=0; -ee_u8 core_start_parallel(core_results *res) { - key_t key=4321+key_id; - key_id++; - res->port.pid=fork(); - res->port.shmid=shmget(key, 8, IPC_CREAT | 0666); - if (res->port.shmid<0) { - ee_printf("ERROR in shmget!\n"); - } - if (res->port.pid==0) { - iterate(res); - res->port.shm=shmat(res->port.shmid, NULL, 0); - /* copy the validation values to the shared memory area and quit*/ - if (res->port.shm == (char *) -1) { - ee_printf("ERROR in child shmat!\n"); - } else { - memcpy(res->port.shm,&(res->crc),8); - shmdt(res->port.shm); - } - exit(0); - } - return 1; -} -ee_u8 core_stop_parallel(core_results *res) { - int status; - pid_t wpid = waitpid(res->port.pid,&status,WUNTRACED); - if (wpid != res->port.pid) { - ee_printf("ERROR waiting for child.\n"); - if (errno == ECHILD) ee_printf("errno=No such child %d\n",res->port.pid); - if (errno == EINTR) ee_printf("errno=Interrupted\n"); - return 0; - } - /* after process is done, get the values from the shared memory area */ - res->port.shm=shmat(res->port.shmid, NULL, 0); - if (res->port.shm == (char *) -1) { - ee_printf("ERROR in parent shmat!\n"); - return 0; - } - memcpy(&(res->crc),res->port.shm,8); - shmdt(res->port.shm); - return 1; -} -#elif USE_SOCKET -static int key_id=0; -ee_u8 core_start_parallel(core_results *res) { - int bound, buffer_length=8; - res->port.sa.sin_family = AF_INET; - res->port.sa.sin_addr.s_addr = htonl(0x7F000001); - res->port.sa.sin_port = htons(7654+key_id); - key_id++; - res->port.pid=fork(); - if (res->port.pid==0) { /* benchmark child */ - iterate(res); - res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); - if (-1 == res->port.sock) /* if socket failed to initialize, exit */ { - ee_printf("Error Creating Socket"); - } else { - int bytes_sent = sendto(res->port.sock, &(res->crc), buffer_length, 0,(struct sockaddr*)&(res->port.sa), sizeof (struct sockaddr_in)); - if (bytes_sent < 0) - ee_printf("Error sending packet: %s\n", strerror(errno)); - close(res->port.sock); /* close the socket */ - } - exit(0); - } - /* parent process, open the socket */ - res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); - bound = bind(res->port.sock,(struct sockaddr*)&(res->port.sa), sizeof(struct sockaddr)); - if (bound < 0) - ee_printf("bind(): %s\n",strerror(errno)); - return 1; -} -ee_u8 core_stop_parallel(core_results *res) { - int status; - int fromlen=sizeof(struct sockaddr); - int recsize = recvfrom(res->port.sock, &(res->crc), 8, 0, (struct sockaddr*)&(res->port.sa), &fromlen); - if (recsize < 0) { - ee_printf("Error in receive: %s\n", strerror(errno)); - return 0; - } - pid_t wpid = waitpid(res->port.pid,&status,WUNTRACED); - if (wpid != res->port.pid) { - ee_printf("ERROR waiting for child.\n"); - if (errno == ECHILD) ee_printf("errno=No such child %d\n",res->port.pid); - if (errno == EINTR) ee_printf("errno=Interrupted\n"); - return 0; - } - return 1; -} -#else /* no standard multicore implementation */ -#error "Please implement multicore functionality in core_portme.c to use multiple contexts." -#endif /* multithread implementations */ -#endif diff --git a/benchmarks/riscv-coremark/riscv64/core_portme.h b/benchmarks/riscv-coremark/riscv64/core_portme.h deleted file mode 100755 index 4e28afd36..000000000 --- a/benchmarks/riscv-coremark/riscv64/core_portme.h +++ /dev/null @@ -1,296 +0,0 @@ -/* -Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Original Author: Shay Gal-on -*/ - -/* Topic: Description - This file contains configuration constants required to execute on different platforms -*/ -#ifndef CORE_PORTME_H -#define CORE_PORTME_H -/************************/ -/* Data types and settings */ -/************************/ -/* Configuration: HAS_FLOAT - Define to 1 if the platform supports floating point. -*/ -#ifndef HAS_FLOAT -#define HAS_FLOAT 1 -#endif -/* Configuration: HAS_TIME_H - Define to 1 if platform has the time.h header file, - and implementation of functions thereof. -*/ -#ifndef HAS_TIME_H -#define HAS_TIME_H 0 -#endif -/* Configuration: USE_CLOCK - Define to 1 if platform has the time.h header file, - and implementation of functions thereof. -*/ -#ifndef USE_CLOCK -#define USE_CLOCK 0 -#endif -/* Configuration: HAS_STDIO - Define to 1 if the platform has stdio.h. -*/ -#ifndef HAS_STDIO -#define HAS_STDIO 1 -#endif -/* Configuration: HAS_PRINTF - Define to 1 if the platform has stdio.h and implements the printf function. -*/ -#ifndef HAS_PRINTF -#define HAS_PRINTF 1 -#endif - -/* Configuration: CORE_TICKS - Define type of return from the timing functions. - */ -#if defined(_MSC_VER) -#include -typedef size_t CORE_TICKS; -#elif HAS_TIME_H -#include -typedef clock_t CORE_TICKS; -#else -/* Configuration: size_t and clock_t - Note these need to match the size of the clock output and the xLen the processor supports - */ -typedef unsigned long int size_t; -typedef unsigned long int clock_t; -typedef clock_t CORE_TICKS; -#endif - -/* Definitions: COMPILER_VERSION, COMPILER_FLAGS, MEM_LOCATION - Initialize these strings per platform -*/ -#ifndef COMPILER_VERSION - #ifdef __GNUC__ - #define COMPILER_VERSION "GCC"__VERSION__ - #else - #define COMPILER_VERSION "Please put compiler version here (e.g. gcc 4.1)" - #endif -#endif -#ifndef COMPILER_FLAGS - #define COMPILER_FLAGS FLAGS_STR /* "Please put compiler flags here (e.g. -o3)" */ -#endif -#ifndef MEM_LOCATION - #define MEM_LOCATION "Please put data memory location here\n\t\t\t(e.g. code in flash, data on heap etc)" - #define MEM_LOCATION_UNSPEC 1 -#endif - -/* Data Types: - To avoid compiler issues, define the data types that need ot be used for 8b, 16b and 32b in . - - *Imprtant*: - ee_ptr_int needs to be the data type used to hold pointers, otherwise coremark may fail!!! -*/ -typedef signed short ee_s16; -typedef unsigned short ee_u16; -typedef signed int ee_s32; -typedef double ee_f32; -typedef unsigned char ee_u8; -typedef unsigned int ee_u32; -typedef unsigned long long ee_ptr_int; -typedef size_t ee_size_t; -/* align an offset to point to a 32b value */ -#define align_mem(x) (void *)(4 + (((ee_ptr_int)(x) - 1) & ~3)) - -/* Configuration: SEED_METHOD - Defines method to get seed values that cannot be computed at compile time. - - Valid values: - SEED_ARG - from command line. - SEED_FUNC - from a system function. - SEED_VOLATILE - from volatile variables. -*/ -#ifndef SEED_METHOD -#define SEED_METHOD SEED_ARG -#endif - -/* Configuration: MEM_METHOD - Defines method to get a block of memry. - - Valid values: - MEM_MALLOC - for platforms that implement malloc and have malloc.h. - MEM_STATIC - to use a static memory array. - MEM_STACK - to allocate the data block on the stack (NYI). -*/ -#ifndef MEM_METHOD -#define MEM_METHOD MEM_MALLOC -#endif - -/* Configuration: MULTITHREAD - Define for parallel execution - - Valid values: - 1 - only one context (default). - N>1 - will execute N copies in parallel. - - Note: - If this flag is defined to more then 1, an implementation for launching parallel contexts must be defined. - - Two sample implementations are provided. Use or to enable them. - - It is valid to have a different implementation of and in , - to fit a particular architecture. -*/ -#ifndef MULTITHREAD -#define MULTITHREAD 1 -#endif - -/* Configuration: USE_PTHREAD - Sample implementation for launching parallel contexts - This implementation uses pthread_thread_create and pthread_join. - - Valid values: - 0 - Do not use pthreads API. - 1 - Use pthreads API - - Note: - This flag only matters if MULTITHREAD has been defined to a value greater then 1. -*/ -#ifndef USE_PTHREAD -#define USE_PTHREAD 0 -#endif - -/* Configuration: USE_FORK - Sample implementation for launching parallel contexts - This implementation uses fork, waitpid, shmget,shmat and shmdt. - - Valid values: - 0 - Do not use fork API. - 1 - Use fork API - - Note: - This flag only matters if MULTITHREAD has been defined to a value greater then 1. -*/ -#ifndef USE_FORK -#define USE_FORK 0 -#endif - -/* Configuration: USE_SOCKET - Sample implementation for launching parallel contexts - This implementation uses fork, socket, sendto and recvfrom - - Valid values: - 0 - Do not use fork and sockets API. - 1 - Use fork and sockets API - - Note: - This flag only matters if MULTITHREAD has been defined to a value greater then 1. -*/ -#ifndef USE_SOCKET -#define USE_SOCKET 0 -#endif - -/* Configuration: MAIN_HAS_NOARGC - Needed if platform does not support getting arguments to main. - - Valid values: - 0 - argc/argv to main is supported - 1 - argc/argv to main is not supported -*/ -#ifndef MAIN_HAS_NOARGC -#define MAIN_HAS_NOARGC 0 -#endif - -/* Configuration: MAIN_HAS_NORETURN - Needed if platform does not support returning a value from main. - - Valid values: - 0 - main returns an int, and return value will be 0. - 1 - platform does not support returning a value from main -*/ -#ifndef MAIN_HAS_NORETURN -#define MAIN_HAS_NORETURN 0 -#endif - -/* Variable: default_num_contexts - Number of contexts to spawn in multicore context. - Override this global value to change number of contexts used. - - Note: - This value may not be set higher then the define. - - To experiment, you can set the define to the highest value expected, and use argc/argv in the to set this value from the command line. -*/ -extern ee_u32 default_num_contexts; - -#if (MULTITHREAD>1) -#if USE_PTHREAD - #include - #define PARALLEL_METHOD "PThreads" -#elif USE_FORK - #include - #include - #include - #include - #include /* for memcpy */ - #define PARALLEL_METHOD "Fork" -#elif USE_SOCKET - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #define PARALLEL_METHOD "Sockets" -#else - #define PARALLEL_METHOD "Proprietary" - #error "Please implement multicore functionality in core_portme.c to use multiple contexts." -#endif /* Method for multithreading */ -#endif /* MULTITHREAD > 1 */ - -typedef struct CORE_PORTABLE_S { -#if (MULTITHREAD>1) - #if USE_PTHREAD - pthread_t thread; - #elif USE_FORK - pid_t pid; - int shmid; - void *shm; - #elif USE_SOCKET - pid_t pid; - int sock; - struct sockaddr_in sa; - #endif /* Method for multithreading */ -#endif /* MULTITHREAD>1 */ - ee_u8 portable_id; -} core_portable; - -/* target specific init/fini */ -void portable_init(core_portable *p, int *argc, char *argv[]); -void portable_fini(core_portable *p); - -#if (SEED_METHOD==SEED_VOLATILE) - #if (VALIDATION_RUN || PERFORMANCE_RUN || PROFILE_RUN) - #define RUN_TYPE_FLAG 1 - #else - #if (TOTAL_DATA_SIZE==1200) - #define PROFILE_RUN 1 - #else - #define PERFORMANCE_RUN 1 - #endif - #endif -#endif /* SEED_METHOD==SEED_VOLATILE */ - -#endif /* CORE_PORTME_H */ diff --git a/benchmarks/riscv-coremark/riscv64/core_portme.mak b/benchmarks/riscv-coremark/riscv64/core_portme.mak deleted file mode 100755 index edc341abc..000000000 --- a/benchmarks/riscv-coremark/riscv64/core_portme.mak +++ /dev/null @@ -1,147 +0,0 @@ -# Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# Original Author: Shay Gal-on - -#File: core_portme.mak - -# Flag: RISCVTOOLS -# Use this flag to point to your RISCV tools -RISCVTOOLS=$(RISCV) -# Flag: RISCVTYPE -# Type of toolchain to use -RISCVTYPE=riscv64-unknown-elf -# Flag: OUTFLAG -# Use this flag to define how to to get an executable (e.g -o) -OUTFLAG= -o -# Flag: CC -# Use this flag to define compiler to use -CC = $(RISCVTOOLS)/bin/$(RISCVTYPE)-gcc -# Flag: CFLAGS -# Use this flag to define compiler options. Note, you can add compiler options from the command line using XCFLAGS="other flags" -#PORT_CFLAGS = -O2 -static -std=gnu99 -PORT_CFLAGS = -O2 -FLAGS_STR = "$(PORT_CFLAGS) $(XCFLAGS) $(XLFLAGS) $(LFLAGS_END)" -CFLAGS = $(PORT_CFLAGS) -I$(PORT_DIR) -I. -DFLAGS_STR=\"$(FLAGS_STR)\" -#Flag: LFLAGS_END -# Define any libraries needed for linking or other flags that should come at the end of the link line (e.g. linker scripts). -# Note: On certain platforms, the default clock_gettime implementation is supported but requires linking of librt. -LFLAGS_END += -# Flag: PORT_SRCS -# Port specific source files can be added here -PORT_SRCS = $(PORT_DIR)/core_portme.c -# Flag: LOAD -# Define this flag if you need to load to a target, as in a cross compile environment. - -# Flag: RUN -# Define this flag if running does not consist of simple invocation of the binary. -# In a cross compile environment, you need to define this. - -#For flashing and using a tera term macro, you could use -#LOAD = flash ADDR -#RUN = ttpmacro coremark.ttl - -#For copying to target and executing via SSH connection, you could use -#LOAD = scp $(OUTFILE) user@target:~ -#RUN = ssh user@target -c - -#For native compilation and execution -LOAD = echo Loading done -RUN = spike pk - -OEXT = .o -EXE = .riscv - -# Flag: SEPARATE_COMPILE -# Define if you need to separate compilation from link stage. -# In this case, you also need to define below how to create an object file, and how to link. -ifdef SEPARATE_COMPILE - -LD = $(RISCVTOOLS)/bin/$(RISCVTYPE)-gcc -OBJOUT = -o -LFLAGS = -OFLAG = -o -COUT = -c -# Flag: PORT_OBJS -# Port specific object files can be added here -PORT_OBJS = $(PORT_DIR)/core_portme$(OEXT) -PORT_CLEAN = *$(OEXT) - -$(OPATH)%$(OEXT) : %.c - $(CC) $(CFLAGS) $(XCFLAGS) $(COUT) $< $(OBJOUT) $@ - -endif - -# Target: port_prebuild -# Generate any files that are needed before actual build starts. -# E.g. generate profile guidance files. Sample PGO generation for gcc enabled with PGO=1 -# - First, check if PGO was defined on the command line, if so, need to add -fprofile-use to compile line. -# - Second, if PGO reference has not yet been generated, add a step to the prebuild that will build a profile-generate version and run it. -# Note - Using REBUILD=1 -# -# Use make PGO=1 to invoke this sample processing. - -ifdef PGO - ifeq (,$(findstring $(PGO),gen)) - PGO_STAGE=build_pgo_gcc - CFLAGS+=-fprofile-use - endif - PORT_CLEAN+=*.gcda *.gcno gmon.out -endif - -.PHONY: port_prebuild -port_prebuild: $(PGO_STAGE) - -.PHONY: build_pgo_gcc -build_pgo_gcc: - $(MAKE) PGO=gen XCFLAGS="$(XCFLAGS) -fprofile-generate -DTOTAL_DATA_SIZE=1200" ITERATIONS=10 gen_pgo_data REBUILD=1 - -# Target: port_postbuild -# Generate any files that are needed after actual build end. -# E.g. change format to srec, bin, zip in order to be able to load into flash -.PHONY: port_postbuild -port_postbuild: - -# Target: port_postrun -# Do platform specific after run stuff. -# E.g. reset the board, backup the logfiles etc. -.PHONY: port_postrun -port_postrun: - -# Target: port_prerun -# Do platform specific after run stuff. -# E.g. reset the board, backup the logfiles etc. -.PHONY: port_prerun -port_prerun: - -# Target: port_postload -# Do platform specific after load stuff. -# E.g. reset the reset power to the flash eraser -.PHONY: port_postload -port_postload: - -# Target: port_preload -# Do platform specific before load stuff. -# E.g. reset the reset power to the flash eraser -.PHONY: port_preload -port_preload: - -# FLAG: OPATH -# Path to the output folder. Default - current folder. -OPATH = ./ -MKDIR = mkdir -p - -# FLAG: PERL -# Define perl executable to calculate the geomean if running separate. -PERL=/usr/bin/perl diff --git a/benchmarks/riscv-coremark/trace b/benchmarks/riscv-coremark/trace deleted file mode 100644 index 7c76d0bfa..000000000 --- a/benchmarks/riscv-coremark/trace +++ /dev/null @@ -1,48 +0,0 @@ -Imperas riscvOVPsimPlus - - -riscvOVPsimPlus (64-Bit) v20210329.0 Open Virtual Platform simulator from www.IMPERAS.com. -Copyright (c) 2005-2021 Imperas Software Ltd. Contains Imperas Proprietary Information. -Licensed Software, All Rights Reserved. -Visit www.IMPERAS.com for multicore debug, verification and analysis solutions. - -riscvOVPsimPlus started: Wed May 12 17:55:33 2021 - - -Info (GDBT_PORT) Host: Tera.Eng.HMC.Edu, Port: 55460 -Info (DBC_LGDB) Starting Debugger /cad/riscv/imperas-riscv-tests/riscv-ovpsim-plus/bin/Linux64/riscv-none-embed-gdb -Info (GDBT_WAIT) Waiting for remote debugger to connect... -Info (OR_OF) Target 'riscvOVPsim/cpu' has object file read from 'coremark.bare.riscv' -Info (OR_PH) Program Headers: -Info (OR_PH) Type Offset VirtAddr PhysAddr -Info (OR_PH) FileSiz MemSiz Flags Align -Info (OR_PD) LOAD 0x0000000000001000 0x0000000080000000 0x0000000080000000 -Info (OR_PD) 0x0000000000000204 0x0000000000000204 R-E 1000 -Info (OR_PD) LOAD 0x0000000000002000 0x0000000080001000 0x0000000080001000 -Info (OR_PD) 0x00000000000047e0 0x0000000000004ff0 RWE 1000 -Info (GDBT_CONNECTED) Client connected -Info (GDBT_GON) Client disappeared 'riscvOVPsim/cpu' -Info -Info --------------------------------------------------- -Info CPU 'riscvOVPsim/cpu' STATISTICS -Info Type : riscv (RV64GC) -Info Nominal MIPS : 100 -Info Final program counter : 0x80003558 -Info Simulated instructions: 1,455,608 -Info Simulated MIPS : 0.0 -Info --------------------------------------------------- -Info -Info --------------------------------------------------- -Info SIMULATION TIME STATISTICS -Info Simulated time : 0.02 seconds -Info User time : 99.23 seconds -Info System time : 254.08 seconds -Info Elapsed time : 1107.49 seconds -Info --------------------------------------------------- - -riscvOVPsimPlus finished: Wed May 12 18:14:04 2021 - - -riscvOVPsimPlus (64-Bit) v20210329.0 Open Virtual Platform simulator from www.IMPERAS.com. -Visit www.IMPERAS.com for multicore debug, verification and analysis solutions. - diff --git a/benchmarks/riscv-coremark/transferobjdump.sh b/benchmarks/riscv-coremark/transferobjdump.sh deleted file mode 100755 index 69578566a..000000000 --- a/benchmarks/riscv-coremark/transferobjdump.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env bash -./build-coremark.sh - -riscv64-unknown-elf-objdump -D coremark.bare.riscv > coremarkcodemod.bare.riscv.objdump -cp coremarkcodemod.bare.riscv.objdump ~/riscv-wally/tests/imperas-riscv-tests/riscv-ovpsim-plus/examples/CoreMark/. -pushd ~/riscv-wally/tests/imperas-riscv-tests/riscv-ovpsim-plus/examples/CoreMark -./exe2memfile.pl coremarkcodemod.bare.riscv -popd diff --git a/wally-pipelined/testbench/testbench-coremark_bare.sv b/wally-pipelined/testbench/testbench-coremark_bare.sv index 0b4590aaf..07f3ed80f 100644 --- a/wally-pipelined/testbench/testbench-coremark_bare.sv +++ b/wally-pipelined/testbench/testbench-coremark_bare.sv @@ -49,7 +49,7 @@ module testbench(); // pick tests based on modes supported initial // tests = {"../../tests/imperas-riscv-tests/riscv-ovpsim-plus/examples/CoreMark/coremarkcodemod.bare.riscv.memfile", "1000"}; - tests = {"../../benchmarks/riscv-coremark/coremark.bare.riscv.memfile", "1000"}; + tests = {"../../benchmarks/riscv-coremark/work/coremark.bare.riscv.memfile", "1000"}; string signame, memfilename; logic [31:0] GPIOPinsIn, GPIOPinsOut, GPIOPinsEn; logic UARTSin, UARTSout; From cde1bbfed4c0ae8fee39f9a3a6b50323101d6a30 Mon Sep 17 00:00:00 2001 From: David Harris Date: Fri, 19 Nov 2021 07:39:15 -0800 Subject: [PATCH 124/132] Coremark Diretory cleanup, removed syscall warning about noreturn, rresults are good. --- benchmarks/riscv-coremark/Makefile | 8 +- benchmarks/riscv-coremark/old/README.md | 23 ++ .../riscv-coremark/old/riscv64/core_portme.c | 346 ++++++++++++++++++ .../riscv-coremark/old/riscv64/core_portme.h | 296 +++++++++++++++ .../old/riscv64/core_portme.mak | 147 ++++++++ benchmarks/riscv-coremark/old/trace | 48 +++ .../riscv-coremark/old/transferobjdump.sh | 8 + .../riscv64-baremetal/syscalls.c | 2 + 8 files changed, 874 insertions(+), 4 deletions(-) create mode 100644 benchmarks/riscv-coremark/old/README.md create mode 100755 benchmarks/riscv-coremark/old/riscv64/core_portme.c create mode 100755 benchmarks/riscv-coremark/old/riscv64/core_portme.h create mode 100755 benchmarks/riscv-coremark/old/riscv64/core_portme.mak create mode 100644 benchmarks/riscv-coremark/old/trace create mode 100755 benchmarks/riscv-coremark/old/transferobjdump.sh diff --git a/benchmarks/riscv-coremark/Makefile b/benchmarks/riscv-coremark/Makefile index 90097249f..a6c819592 100644 --- a/benchmarks/riscv-coremark/Makefile +++ b/benchmarks/riscv-coremark/Makefile @@ -5,10 +5,10 @@ work/coremark.bare.riscv.objdump: work/coremark.bare.riscv riscv64-unknown-elf-objdump -D work/coremark.bare.riscv > work/coremark.bare.riscv.objdump work/coremark.bare.riscv: - #make -C coremark PORT_DIR=/home/harris/riscv-wally/benchmarks/riscv-coremark/riscv64-baremetal compile RISCV=/courses/e190ax/riscvcompiler XCFLAGS="-march=rv64im" - #mv coremark/coremark.bare.riscv work - make -C ../../addins/coremark PORT_DIR=/home/harris/riscv-wally/benchmarks/riscv-coremark/riscv64-baremetal compile RISCV=/courses/e190ax/riscvcompiler XCFLAGS="-march=rv64im" - mv ../../addins/coremark/coremark.bare.riscv work + make -C coremark PORT_DIR=/home/harris/riscv-wally/benchmarks/riscv-coremark/riscv64-baremetal compile RISCV=/courses/e190ax/riscvcompiler XCFLAGS="-march=rv64im" + mv coremark/coremark.bare.riscv work + #make -C ../../addins/coremark PORT_DIR=/home/harris/riscv-wally/benchmarks/riscv-coremark/riscv64-baremetal compile RISCV=/courses/e190ax/riscvcompiler XCFLAGS="-march=rv64im" + #mv ../../addins/coremark/coremark.bare.riscv work .PHONY: clean diff --git a/benchmarks/riscv-coremark/old/README.md b/benchmarks/riscv-coremark/old/README.md new file mode 100644 index 000000000..7c02eb1bf --- /dev/null +++ b/benchmarks/riscv-coremark/old/README.md @@ -0,0 +1,23 @@ +Coremark EEMBC Wrapper +====================== + +This repository provides the utility files to port [CoreMark EEMBC](https://www.eembc.org/coremark/) to RISC-V. + +### Requirements + + - You must have installed the RISC-V tools + +### Setup + + - `git submodule update --init` + - Run the `./build-coremark.sh` script that does the following + - Builds a version of Coremark for Linux or pk (coremark.riscv) + - Builds a version of Coremark for bare-metal (coremark.bare.riscv) + - Copies the output binaries into this directory + +### Default Files + +The default files target **RV64GC** and use minimal amount of compilation flags. Additionally, the `*.mak` file in the `riscv64` +folder setups `spike pk` as the default `run` rule. + +Feel free to change these to suit your needs. diff --git a/benchmarks/riscv-coremark/old/riscv64/core_portme.c b/benchmarks/riscv-coremark/old/riscv64/core_portme.c new file mode 100755 index 000000000..8f17cb8bd --- /dev/null +++ b/benchmarks/riscv-coremark/old/riscv64/core_portme.c @@ -0,0 +1,346 @@ +/* +Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +Original Author: Shay Gal-on +*/ + +#include +#include +#include "coremark.h" +#if CALLGRIND_RUN +#include +#endif + +#if (MEM_METHOD==MEM_MALLOC) +#include +/* Function: portable_malloc + Provide malloc() functionality in a platform specific way. +*/ +void *portable_malloc(size_t size) { + return malloc(size); +} +/* Function: portable_free + Provide free() functionality in a platform specific way. +*/ +void portable_free(void *p) { + free(p); +} +#else +void *portable_malloc(size_t size) { + return NULL; +} +void portable_free(void *p) { + p=NULL; +} +#endif + +#if (SEED_METHOD==SEED_VOLATILE) +#if VALIDATION_RUN + volatile ee_s32 seed1_volatile=0x3415; + volatile ee_s32 seed2_volatile=0x3415; + volatile ee_s32 seed3_volatile=0x66; +#endif +#if PERFORMANCE_RUN + volatile ee_s32 seed1_volatile=0x0; + volatile ee_s32 seed2_volatile=0x0; + volatile ee_s32 seed3_volatile=0x66; +#endif +#if PROFILE_RUN + volatile ee_s32 seed1_volatile=0x8; + volatile ee_s32 seed2_volatile=0x8; + volatile ee_s32 seed3_volatile=0x8; +#endif + volatile ee_s32 seed4_volatile=ITERATIONS; + volatile ee_s32 seed5_volatile=0; +#endif +/* Porting: Timing functions + How to capture time and convert to seconds must be ported to whatever is supported by the platform. + e.g. Read value from on board RTC, read value from cpu clock cycles performance counter etc. + Sample implementation for standard time.h and windows.h definitions included. +*/ +/* Define: TIMER_RES_DIVIDER + Divider to trade off timer resolution and total time that can be measured. + + Use lower values to increase resolution, but make sure that overflow does not occur. + If there are issues with the return value overflowing, increase this value. + */ +#if USE_CLOCK + #define NSECS_PER_SEC CLOCKS_PER_SEC + #define EE_TIMER_TICKER_RATE 1000 + #define CORETIMETYPE clock_t + #define GETMYTIME(_t) (*_t=clock()) + #define MYTIMEDIFF(fin,ini) ((fin)-(ini)) + #define TIMER_RES_DIVIDER 1 + #define SAMPLE_TIME_IMPLEMENTATION 1 +#elif defined(_MSC_VER) + #define NSECS_PER_SEC 10000000 + #define EE_TIMER_TICKER_RATE 1000 + #define CORETIMETYPE FILETIME + #define GETMYTIME(_t) GetSystemTimeAsFileTime(_t) + #define MYTIMEDIFF(fin,ini) (((*(__int64*)&fin)-(*(__int64*)&ini))/TIMER_RES_DIVIDER) + /* setting to millisces resolution by default with MSDEV */ + #ifndef TIMER_RES_DIVIDER + #define TIMER_RES_DIVIDER 1000 + #endif + #define SAMPLE_TIME_IMPLEMENTATION 1 +#elif HAS_TIME_H + #define NSECS_PER_SEC 1000000000 + #define EE_TIMER_TICKER_RATE 1000 + #define CORETIMETYPE struct timespec + #define GETMYTIME(_t) clock_gettime(CLOCK_REALTIME,_t) + #define MYTIMEDIFF(fin,ini) ((fin.tv_sec-ini.tv_sec)*(NSECS_PER_SEC/TIMER_RES_DIVIDER)+(fin.tv_nsec-ini.tv_nsec)/TIMER_RES_DIVIDER) + /* setting to 1/1000 of a second resolution by default with linux */ + #ifndef TIMER_RES_DIVIDER + #define TIMER_RES_DIVIDER 1000000 + #endif + #define SAMPLE_TIME_IMPLEMENTATION 1 +#else + // Defined for RISCV + #define NSECS_PER_SEC 1000000000 // TODO: What freq are we assuming? + #define EE_TIMER_TICKER_RATE 1000 // TODO: What is this? + #define CORETIMETYPE clock_t + #define read_csr(reg) ({ unsigned long __tmp; \ + asm volatile ("csrr %0, " #reg : "=r"(__tmp)); \ + __tmp; }) + #define GETMYTIME(_t) (*_t=read_csr(cycle)) + #define MYTIMEDIFF(fin,ini) ((fin)-(ini)) + #define TIMER_RES_DIVIDER 1 + #define SAMPLE_TIME_IMPLEMENTATION 1 +#endif +#define EE_TICKS_PER_SEC (NSECS_PER_SEC / TIMER_RES_DIVIDER) + +#if SAMPLE_TIME_IMPLEMENTATION +/** Define Host specific (POSIX), or target specific global time variables. */ +static CORETIMETYPE start_time_val, stop_time_val; + +/* Function: start_time + This function will be called right before starting the timed portion of the benchmark. + + Implementation may be capturing a system timer (as implemented in the example code) + or zeroing some system parameters - e.g. setting the cpu clocks cycles to 0. +*/ +void start_time(void) { + GETMYTIME(&start_time_val ); +#if CALLGRIND_RUN + CALLGRIND_START_INSTRUMENTATION +#endif +#if MICA + asm volatile("int3");/*1 */ +#endif +} +/* Function: stop_time + This function will be called right after ending the timed portion of the benchmark. + + Implementation may be capturing a system timer (as implemented in the example code) + or other system parameters - e.g. reading the current value of cpu cycles counter. +*/ +void stop_time(void) { +#if CALLGRIND_RUN + CALLGRIND_STOP_INSTRUMENTATION +#endif +#if MICA + asm volatile("int3");/*1 */ +#endif + GETMYTIME(&stop_time_val ); +} +/* Function: get_time + Return an abstract "ticks" number that signifies time on the system. + + Actual value returned may be cpu cycles, milliseconds or any other value, + as long as it can be converted to seconds by . + This methodology is taken to accomodate any hardware or simulated platform. + The sample implementation returns millisecs by default, + and the resolution is controlled by +*/ +CORE_TICKS get_time(void) { + CORE_TICKS elapsed=(CORE_TICKS)(MYTIMEDIFF(stop_time_val, start_time_val)); + return elapsed; +} +/* Function: time_in_secs + Convert the value returned by get_time to seconds. + + The type is used to accomodate systems with no support for floating point. + Default implementation implemented by the EE_TICKS_PER_SEC macro above. +*/ +secs_ret time_in_secs(CORE_TICKS ticks) { + secs_ret retval=((secs_ret)ticks) / (secs_ret)EE_TICKS_PER_SEC; + return retval; +} +#else +#error "Please implement timing functionality in core_portme.c" +#endif /* SAMPLE_TIME_IMPLEMENTATION */ + +ee_u32 default_num_contexts=MULTITHREAD; + +/* Function: portable_init + Target specific initialization code + Test for some common mistakes. +*/ +void portable_init(core_portable *p, int *argc, char *argv[]) +{ +#if PRINT_ARGS + int i; + for (i=0; i<*argc; i++) { + ee_printf("Arg[%d]=%s\n",i,argv[i]); + } +#endif + if (sizeof(ee_ptr_int) != sizeof(ee_u8 *)) { + ee_printf("ERROR! Please define ee_ptr_int to a type that holds a pointer!\n"); + } + if (sizeof(ee_u32) != 4) { + ee_printf("ERROR! Please define ee_u32 to a 32b unsigned type!\n"); + } +#if (MAIN_HAS_NOARGC && (SEED_METHOD==SEED_ARG)) + ee_printf("ERROR! Main has no argc, but SEED_METHOD defined to SEED_ARG!\n"); +#endif + +#if (MULTITHREAD>1) && (SEED_METHOD==SEED_ARG) + int nargs=*argc,i; + if ((nargs>1) && (*argv[1]=='M')) { + default_num_contexts=parseval(argv[1]+1); + if (default_num_contexts>MULTITHREAD) + default_num_contexts=MULTITHREAD; + /* Shift args since first arg is directed to the portable part and not to coremark main */ + --nargs; + for (i=1; i*/ + p->portable_id=1; +} +/* Function: portable_fini + Target specific final code +*/ +void portable_fini(core_portable *p) +{ + p->portable_id=0; +} + +#if (MULTITHREAD>1) + +/* Function: core_start_parallel + Start benchmarking in a parallel context. + + Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets. + Other implementations using MCAPI or other standards can easily be devised. +*/ +/* Function: core_stop_parallel + Stop a parallel context execution of coremark, and gather the results. + + Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets. + Other implementations using MCAPI or other standards can easily be devised. +*/ +#if USE_PTHREAD +ee_u8 core_start_parallel(core_results *res) { + return (ee_u8)pthread_create(&(res->port.thread),NULL,iterate,(void *)res); +} +ee_u8 core_stop_parallel(core_results *res) { + void *retval; + return (ee_u8)pthread_join(res->port.thread,&retval); +} +#elif USE_FORK +static int key_id=0; +ee_u8 core_start_parallel(core_results *res) { + key_t key=4321+key_id; + key_id++; + res->port.pid=fork(); + res->port.shmid=shmget(key, 8, IPC_CREAT | 0666); + if (res->port.shmid<0) { + ee_printf("ERROR in shmget!\n"); + } + if (res->port.pid==0) { + iterate(res); + res->port.shm=shmat(res->port.shmid, NULL, 0); + /* copy the validation values to the shared memory area and quit*/ + if (res->port.shm == (char *) -1) { + ee_printf("ERROR in child shmat!\n"); + } else { + memcpy(res->port.shm,&(res->crc),8); + shmdt(res->port.shm); + } + exit(0); + } + return 1; +} +ee_u8 core_stop_parallel(core_results *res) { + int status; + pid_t wpid = waitpid(res->port.pid,&status,WUNTRACED); + if (wpid != res->port.pid) { + ee_printf("ERROR waiting for child.\n"); + if (errno == ECHILD) ee_printf("errno=No such child %d\n",res->port.pid); + if (errno == EINTR) ee_printf("errno=Interrupted\n"); + return 0; + } + /* after process is done, get the values from the shared memory area */ + res->port.shm=shmat(res->port.shmid, NULL, 0); + if (res->port.shm == (char *) -1) { + ee_printf("ERROR in parent shmat!\n"); + return 0; + } + memcpy(&(res->crc),res->port.shm,8); + shmdt(res->port.shm); + return 1; +} +#elif USE_SOCKET +static int key_id=0; +ee_u8 core_start_parallel(core_results *res) { + int bound, buffer_length=8; + res->port.sa.sin_family = AF_INET; + res->port.sa.sin_addr.s_addr = htonl(0x7F000001); + res->port.sa.sin_port = htons(7654+key_id); + key_id++; + res->port.pid=fork(); + if (res->port.pid==0) { /* benchmark child */ + iterate(res); + res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); + if (-1 == res->port.sock) /* if socket failed to initialize, exit */ { + ee_printf("Error Creating Socket"); + } else { + int bytes_sent = sendto(res->port.sock, &(res->crc), buffer_length, 0,(struct sockaddr*)&(res->port.sa), sizeof (struct sockaddr_in)); + if (bytes_sent < 0) + ee_printf("Error sending packet: %s\n", strerror(errno)); + close(res->port.sock); /* close the socket */ + } + exit(0); + } + /* parent process, open the socket */ + res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); + bound = bind(res->port.sock,(struct sockaddr*)&(res->port.sa), sizeof(struct sockaddr)); + if (bound < 0) + ee_printf("bind(): %s\n",strerror(errno)); + return 1; +} +ee_u8 core_stop_parallel(core_results *res) { + int status; + int fromlen=sizeof(struct sockaddr); + int recsize = recvfrom(res->port.sock, &(res->crc), 8, 0, (struct sockaddr*)&(res->port.sa), &fromlen); + if (recsize < 0) { + ee_printf("Error in receive: %s\n", strerror(errno)); + return 0; + } + pid_t wpid = waitpid(res->port.pid,&status,WUNTRACED); + if (wpid != res->port.pid) { + ee_printf("ERROR waiting for child.\n"); + if (errno == ECHILD) ee_printf("errno=No such child %d\n",res->port.pid); + if (errno == EINTR) ee_printf("errno=Interrupted\n"); + return 0; + } + return 1; +} +#else /* no standard multicore implementation */ +#error "Please implement multicore functionality in core_portme.c to use multiple contexts." +#endif /* multithread implementations */ +#endif diff --git a/benchmarks/riscv-coremark/old/riscv64/core_portme.h b/benchmarks/riscv-coremark/old/riscv64/core_portme.h new file mode 100755 index 000000000..4e28afd36 --- /dev/null +++ b/benchmarks/riscv-coremark/old/riscv64/core_portme.h @@ -0,0 +1,296 @@ +/* +Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +Original Author: Shay Gal-on +*/ + +/* Topic: Description + This file contains configuration constants required to execute on different platforms +*/ +#ifndef CORE_PORTME_H +#define CORE_PORTME_H +/************************/ +/* Data types and settings */ +/************************/ +/* Configuration: HAS_FLOAT + Define to 1 if the platform supports floating point. +*/ +#ifndef HAS_FLOAT +#define HAS_FLOAT 1 +#endif +/* Configuration: HAS_TIME_H + Define to 1 if platform has the time.h header file, + and implementation of functions thereof. +*/ +#ifndef HAS_TIME_H +#define HAS_TIME_H 0 +#endif +/* Configuration: USE_CLOCK + Define to 1 if platform has the time.h header file, + and implementation of functions thereof. +*/ +#ifndef USE_CLOCK +#define USE_CLOCK 0 +#endif +/* Configuration: HAS_STDIO + Define to 1 if the platform has stdio.h. +*/ +#ifndef HAS_STDIO +#define HAS_STDIO 1 +#endif +/* Configuration: HAS_PRINTF + Define to 1 if the platform has stdio.h and implements the printf function. +*/ +#ifndef HAS_PRINTF +#define HAS_PRINTF 1 +#endif + +/* Configuration: CORE_TICKS + Define type of return from the timing functions. + */ +#if defined(_MSC_VER) +#include +typedef size_t CORE_TICKS; +#elif HAS_TIME_H +#include +typedef clock_t CORE_TICKS; +#else +/* Configuration: size_t and clock_t + Note these need to match the size of the clock output and the xLen the processor supports + */ +typedef unsigned long int size_t; +typedef unsigned long int clock_t; +typedef clock_t CORE_TICKS; +#endif + +/* Definitions: COMPILER_VERSION, COMPILER_FLAGS, MEM_LOCATION + Initialize these strings per platform +*/ +#ifndef COMPILER_VERSION + #ifdef __GNUC__ + #define COMPILER_VERSION "GCC"__VERSION__ + #else + #define COMPILER_VERSION "Please put compiler version here (e.g. gcc 4.1)" + #endif +#endif +#ifndef COMPILER_FLAGS + #define COMPILER_FLAGS FLAGS_STR /* "Please put compiler flags here (e.g. -o3)" */ +#endif +#ifndef MEM_LOCATION + #define MEM_LOCATION "Please put data memory location here\n\t\t\t(e.g. code in flash, data on heap etc)" + #define MEM_LOCATION_UNSPEC 1 +#endif + +/* Data Types: + To avoid compiler issues, define the data types that need ot be used for 8b, 16b and 32b in . + + *Imprtant*: + ee_ptr_int needs to be the data type used to hold pointers, otherwise coremark may fail!!! +*/ +typedef signed short ee_s16; +typedef unsigned short ee_u16; +typedef signed int ee_s32; +typedef double ee_f32; +typedef unsigned char ee_u8; +typedef unsigned int ee_u32; +typedef unsigned long long ee_ptr_int; +typedef size_t ee_size_t; +/* align an offset to point to a 32b value */ +#define align_mem(x) (void *)(4 + (((ee_ptr_int)(x) - 1) & ~3)) + +/* Configuration: SEED_METHOD + Defines method to get seed values that cannot be computed at compile time. + + Valid values: + SEED_ARG - from command line. + SEED_FUNC - from a system function. + SEED_VOLATILE - from volatile variables. +*/ +#ifndef SEED_METHOD +#define SEED_METHOD SEED_ARG +#endif + +/* Configuration: MEM_METHOD + Defines method to get a block of memry. + + Valid values: + MEM_MALLOC - for platforms that implement malloc and have malloc.h. + MEM_STATIC - to use a static memory array. + MEM_STACK - to allocate the data block on the stack (NYI). +*/ +#ifndef MEM_METHOD +#define MEM_METHOD MEM_MALLOC +#endif + +/* Configuration: MULTITHREAD + Define for parallel execution + + Valid values: + 1 - only one context (default). + N>1 - will execute N copies in parallel. + + Note: + If this flag is defined to more then 1, an implementation for launching parallel contexts must be defined. + + Two sample implementations are provided. Use or to enable them. + + It is valid to have a different implementation of and in , + to fit a particular architecture. +*/ +#ifndef MULTITHREAD +#define MULTITHREAD 1 +#endif + +/* Configuration: USE_PTHREAD + Sample implementation for launching parallel contexts + This implementation uses pthread_thread_create and pthread_join. + + Valid values: + 0 - Do not use pthreads API. + 1 - Use pthreads API + + Note: + This flag only matters if MULTITHREAD has been defined to a value greater then 1. +*/ +#ifndef USE_PTHREAD +#define USE_PTHREAD 0 +#endif + +/* Configuration: USE_FORK + Sample implementation for launching parallel contexts + This implementation uses fork, waitpid, shmget,shmat and shmdt. + + Valid values: + 0 - Do not use fork API. + 1 - Use fork API + + Note: + This flag only matters if MULTITHREAD has been defined to a value greater then 1. +*/ +#ifndef USE_FORK +#define USE_FORK 0 +#endif + +/* Configuration: USE_SOCKET + Sample implementation for launching parallel contexts + This implementation uses fork, socket, sendto and recvfrom + + Valid values: + 0 - Do not use fork and sockets API. + 1 - Use fork and sockets API + + Note: + This flag only matters if MULTITHREAD has been defined to a value greater then 1. +*/ +#ifndef USE_SOCKET +#define USE_SOCKET 0 +#endif + +/* Configuration: MAIN_HAS_NOARGC + Needed if platform does not support getting arguments to main. + + Valid values: + 0 - argc/argv to main is supported + 1 - argc/argv to main is not supported +*/ +#ifndef MAIN_HAS_NOARGC +#define MAIN_HAS_NOARGC 0 +#endif + +/* Configuration: MAIN_HAS_NORETURN + Needed if platform does not support returning a value from main. + + Valid values: + 0 - main returns an int, and return value will be 0. + 1 - platform does not support returning a value from main +*/ +#ifndef MAIN_HAS_NORETURN +#define MAIN_HAS_NORETURN 0 +#endif + +/* Variable: default_num_contexts + Number of contexts to spawn in multicore context. + Override this global value to change number of contexts used. + + Note: + This value may not be set higher then the define. + + To experiment, you can set the define to the highest value expected, and use argc/argv in the to set this value from the command line. +*/ +extern ee_u32 default_num_contexts; + +#if (MULTITHREAD>1) +#if USE_PTHREAD + #include + #define PARALLEL_METHOD "PThreads" +#elif USE_FORK + #include + #include + #include + #include + #include /* for memcpy */ + #define PARALLEL_METHOD "Fork" +#elif USE_SOCKET + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #define PARALLEL_METHOD "Sockets" +#else + #define PARALLEL_METHOD "Proprietary" + #error "Please implement multicore functionality in core_portme.c to use multiple contexts." +#endif /* Method for multithreading */ +#endif /* MULTITHREAD > 1 */ + +typedef struct CORE_PORTABLE_S { +#if (MULTITHREAD>1) + #if USE_PTHREAD + pthread_t thread; + #elif USE_FORK + pid_t pid; + int shmid; + void *shm; + #elif USE_SOCKET + pid_t pid; + int sock; + struct sockaddr_in sa; + #endif /* Method for multithreading */ +#endif /* MULTITHREAD>1 */ + ee_u8 portable_id; +} core_portable; + +/* target specific init/fini */ +void portable_init(core_portable *p, int *argc, char *argv[]); +void portable_fini(core_portable *p); + +#if (SEED_METHOD==SEED_VOLATILE) + #if (VALIDATION_RUN || PERFORMANCE_RUN || PROFILE_RUN) + #define RUN_TYPE_FLAG 1 + #else + #if (TOTAL_DATA_SIZE==1200) + #define PROFILE_RUN 1 + #else + #define PERFORMANCE_RUN 1 + #endif + #endif +#endif /* SEED_METHOD==SEED_VOLATILE */ + +#endif /* CORE_PORTME_H */ diff --git a/benchmarks/riscv-coremark/old/riscv64/core_portme.mak b/benchmarks/riscv-coremark/old/riscv64/core_portme.mak new file mode 100755 index 000000000..edc341abc --- /dev/null +++ b/benchmarks/riscv-coremark/old/riscv64/core_portme.mak @@ -0,0 +1,147 @@ +# Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Original Author: Shay Gal-on + +#File: core_portme.mak + +# Flag: RISCVTOOLS +# Use this flag to point to your RISCV tools +RISCVTOOLS=$(RISCV) +# Flag: RISCVTYPE +# Type of toolchain to use +RISCVTYPE=riscv64-unknown-elf +# Flag: OUTFLAG +# Use this flag to define how to to get an executable (e.g -o) +OUTFLAG= -o +# Flag: CC +# Use this flag to define compiler to use +CC = $(RISCVTOOLS)/bin/$(RISCVTYPE)-gcc +# Flag: CFLAGS +# Use this flag to define compiler options. Note, you can add compiler options from the command line using XCFLAGS="other flags" +#PORT_CFLAGS = -O2 -static -std=gnu99 +PORT_CFLAGS = -O2 +FLAGS_STR = "$(PORT_CFLAGS) $(XCFLAGS) $(XLFLAGS) $(LFLAGS_END)" +CFLAGS = $(PORT_CFLAGS) -I$(PORT_DIR) -I. -DFLAGS_STR=\"$(FLAGS_STR)\" +#Flag: LFLAGS_END +# Define any libraries needed for linking or other flags that should come at the end of the link line (e.g. linker scripts). +# Note: On certain platforms, the default clock_gettime implementation is supported but requires linking of librt. +LFLAGS_END += +# Flag: PORT_SRCS +# Port specific source files can be added here +PORT_SRCS = $(PORT_DIR)/core_portme.c +# Flag: LOAD +# Define this flag if you need to load to a target, as in a cross compile environment. + +# Flag: RUN +# Define this flag if running does not consist of simple invocation of the binary. +# In a cross compile environment, you need to define this. + +#For flashing and using a tera term macro, you could use +#LOAD = flash ADDR +#RUN = ttpmacro coremark.ttl + +#For copying to target and executing via SSH connection, you could use +#LOAD = scp $(OUTFILE) user@target:~ +#RUN = ssh user@target -c + +#For native compilation and execution +LOAD = echo Loading done +RUN = spike pk + +OEXT = .o +EXE = .riscv + +# Flag: SEPARATE_COMPILE +# Define if you need to separate compilation from link stage. +# In this case, you also need to define below how to create an object file, and how to link. +ifdef SEPARATE_COMPILE + +LD = $(RISCVTOOLS)/bin/$(RISCVTYPE)-gcc +OBJOUT = -o +LFLAGS = +OFLAG = -o +COUT = -c +# Flag: PORT_OBJS +# Port specific object files can be added here +PORT_OBJS = $(PORT_DIR)/core_portme$(OEXT) +PORT_CLEAN = *$(OEXT) + +$(OPATH)%$(OEXT) : %.c + $(CC) $(CFLAGS) $(XCFLAGS) $(COUT) $< $(OBJOUT) $@ + +endif + +# Target: port_prebuild +# Generate any files that are needed before actual build starts. +# E.g. generate profile guidance files. Sample PGO generation for gcc enabled with PGO=1 +# - First, check if PGO was defined on the command line, if so, need to add -fprofile-use to compile line. +# - Second, if PGO reference has not yet been generated, add a step to the prebuild that will build a profile-generate version and run it. +# Note - Using REBUILD=1 +# +# Use make PGO=1 to invoke this sample processing. + +ifdef PGO + ifeq (,$(findstring $(PGO),gen)) + PGO_STAGE=build_pgo_gcc + CFLAGS+=-fprofile-use + endif + PORT_CLEAN+=*.gcda *.gcno gmon.out +endif + +.PHONY: port_prebuild +port_prebuild: $(PGO_STAGE) + +.PHONY: build_pgo_gcc +build_pgo_gcc: + $(MAKE) PGO=gen XCFLAGS="$(XCFLAGS) -fprofile-generate -DTOTAL_DATA_SIZE=1200" ITERATIONS=10 gen_pgo_data REBUILD=1 + +# Target: port_postbuild +# Generate any files that are needed after actual build end. +# E.g. change format to srec, bin, zip in order to be able to load into flash +.PHONY: port_postbuild +port_postbuild: + +# Target: port_postrun +# Do platform specific after run stuff. +# E.g. reset the board, backup the logfiles etc. +.PHONY: port_postrun +port_postrun: + +# Target: port_prerun +# Do platform specific after run stuff. +# E.g. reset the board, backup the logfiles etc. +.PHONY: port_prerun +port_prerun: + +# Target: port_postload +# Do platform specific after load stuff. +# E.g. reset the reset power to the flash eraser +.PHONY: port_postload +port_postload: + +# Target: port_preload +# Do platform specific before load stuff. +# E.g. reset the reset power to the flash eraser +.PHONY: port_preload +port_preload: + +# FLAG: OPATH +# Path to the output folder. Default - current folder. +OPATH = ./ +MKDIR = mkdir -p + +# FLAG: PERL +# Define perl executable to calculate the geomean if running separate. +PERL=/usr/bin/perl diff --git a/benchmarks/riscv-coremark/old/trace b/benchmarks/riscv-coremark/old/trace new file mode 100644 index 000000000..7c76d0bfa --- /dev/null +++ b/benchmarks/riscv-coremark/old/trace @@ -0,0 +1,48 @@ +Imperas riscvOVPsimPlus + + +riscvOVPsimPlus (64-Bit) v20210329.0 Open Virtual Platform simulator from www.IMPERAS.com. +Copyright (c) 2005-2021 Imperas Software Ltd. Contains Imperas Proprietary Information. +Licensed Software, All Rights Reserved. +Visit www.IMPERAS.com for multicore debug, verification and analysis solutions. + +riscvOVPsimPlus started: Wed May 12 17:55:33 2021 + + +Info (GDBT_PORT) Host: Tera.Eng.HMC.Edu, Port: 55460 +Info (DBC_LGDB) Starting Debugger /cad/riscv/imperas-riscv-tests/riscv-ovpsim-plus/bin/Linux64/riscv-none-embed-gdb +Info (GDBT_WAIT) Waiting for remote debugger to connect... +Info (OR_OF) Target 'riscvOVPsim/cpu' has object file read from 'coremark.bare.riscv' +Info (OR_PH) Program Headers: +Info (OR_PH) Type Offset VirtAddr PhysAddr +Info (OR_PH) FileSiz MemSiz Flags Align +Info (OR_PD) LOAD 0x0000000000001000 0x0000000080000000 0x0000000080000000 +Info (OR_PD) 0x0000000000000204 0x0000000000000204 R-E 1000 +Info (OR_PD) LOAD 0x0000000000002000 0x0000000080001000 0x0000000080001000 +Info (OR_PD) 0x00000000000047e0 0x0000000000004ff0 RWE 1000 +Info (GDBT_CONNECTED) Client connected +Info (GDBT_GON) Client disappeared 'riscvOVPsim/cpu' +Info +Info --------------------------------------------------- +Info CPU 'riscvOVPsim/cpu' STATISTICS +Info Type : riscv (RV64GC) +Info Nominal MIPS : 100 +Info Final program counter : 0x80003558 +Info Simulated instructions: 1,455,608 +Info Simulated MIPS : 0.0 +Info --------------------------------------------------- +Info +Info --------------------------------------------------- +Info SIMULATION TIME STATISTICS +Info Simulated time : 0.02 seconds +Info User time : 99.23 seconds +Info System time : 254.08 seconds +Info Elapsed time : 1107.49 seconds +Info --------------------------------------------------- + +riscvOVPsimPlus finished: Wed May 12 18:14:04 2021 + + +riscvOVPsimPlus (64-Bit) v20210329.0 Open Virtual Platform simulator from www.IMPERAS.com. +Visit www.IMPERAS.com for multicore debug, verification and analysis solutions. + diff --git a/benchmarks/riscv-coremark/old/transferobjdump.sh b/benchmarks/riscv-coremark/old/transferobjdump.sh new file mode 100755 index 000000000..69578566a --- /dev/null +++ b/benchmarks/riscv-coremark/old/transferobjdump.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash +./build-coremark.sh + +riscv64-unknown-elf-objdump -D coremark.bare.riscv > coremarkcodemod.bare.riscv.objdump +cp coremarkcodemod.bare.riscv.objdump ~/riscv-wally/tests/imperas-riscv-tests/riscv-ovpsim-plus/examples/CoreMark/. +pushd ~/riscv-wally/tests/imperas-riscv-tests/riscv-ovpsim-plus/examples/CoreMark +./exe2memfile.pl coremarkcodemod.bare.riscv +popd diff --git a/benchmarks/riscv-coremark/riscv64-baremetal/syscalls.c b/benchmarks/riscv-coremark/riscv64-baremetal/syscalls.c index c1824954f..093c6fa23 100644 --- a/benchmarks/riscv-coremark/riscv64-baremetal/syscalls.c +++ b/benchmarks/riscv-coremark/riscv64-baremetal/syscalls.c @@ -7,6 +7,7 @@ #include #include #include "util.h" +#include #define SYS_write 64 @@ -80,6 +81,7 @@ void __attribute__((noreturn)) tohost_exit(uintptr_t code) { tohost = (code << 1) | 1; asm ("ecall"); + exit(0); } uintptr_t __attribute__((weak)) handle_trap(uintptr_t cause, uintptr_t epc, uintptr_t regs[32]) From 5a2a2ca4f52dd0d99cc82e61128fc577e01cd8ce Mon Sep 17 00:00:00 2001 From: bbracker Date: Fri, 19 Nov 2021 12:52:11 -0800 Subject: [PATCH 125/132] increase buildroot progress expecttions; increase timeout to 20 hours --- wally-pipelined/regression/regression-wally.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wally-pipelined/regression/regression-wally.py b/wally-pipelined/regression/regression-wally.py index d1008532b..2e16d82ba 100755 --- a/wally-pipelined/regression/regression-wally.py +++ b/wally-pipelined/regression/regression-wally.py @@ -32,7 +32,7 @@ configs = [ ] def getBuildrootTC(short): INSTR_LIMIT = 100000 # multiple of 100000 - MAX_EXPECTED = 14000000 + MAX_EXPECTED = 182000000 if short: BRcmd="vsim > {} -c < Date: Fri, 19 Nov 2021 20:25:00 -0800 Subject: [PATCH 126/132] automatic bug finder script --- .../regression/buildrootBugFinder.py | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100755 wally-pipelined/regression/buildrootBugFinder.py diff --git a/wally-pipelined/regression/buildrootBugFinder.py b/wally-pipelined/regression/buildrootBugFinder.py new file mode 100755 index 000000000..a20b7bf57 --- /dev/null +++ b/wally-pipelined/regression/buildrootBugFinder.py @@ -0,0 +1,41 @@ +#!/usr/bin/python3 +import sys, os, subprocess + +def main(): + maxGoodCount = 400e6 # num instrs that execute sucessfully starting from 0 + currInstrCount = maxGoodCount + linuxTestvectors = "../../tests/linux-testgen/linux-testvectors" + if not os.path.exists(linuxTestvectors): + sys.stderr.write("Error: Linux testvectors not found at "+linuxTestvectors+"\n") + exit(1) + checkpointList = [int(fileName.strip('checkpoint')) for fileName in os.listdir(linuxTestvectors) if 'checkpoint' in fileName] + checkpointList.sort() + + logDir = "./logs/buildrootBugFinderLogs/" + os.system("mkdir -p "+logDir) + summaryLogFilePath = logDir+"summary.log" + summaryLogFile = open(summaryLogFilePath,'w') + summaryLogFile.close() + while True: + checkpointList = [checkpoint for checkpoint in checkpointList if checkpoint > currInstrCount] + if len(checkpointList)==0: + break + checkpoint = checkpointList[0] + logFile = logDir+"checkpoint"+str(checkpoint)+".log" + runCommand="{\nvsim -c < Date: Sat, 20 Nov 2021 12:48:23 -0800 Subject: [PATCH 127/132] increase niceness of automatic checkpoint generation --- .../linux-testgen/testvector-generation/checkpointSweep.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/linux-testgen/testvector-generation/checkpointSweep.sh b/tests/linux-testgen/testvector-generation/checkpointSweep.sh index bc04bbf78..01f05ea65 100755 --- a/tests/linux-testgen/testvector-generation/checkpointSweep.sh +++ b/tests/linux-testgen/testvector-generation/checkpointSweep.sh @@ -1,5 +1,5 @@ -for index in {0..105} +for index in {89..181} do - instrs=$(((400+$index)*1000000)) - echo "y" | ./genCheckpoint.sh $instrs + instrs=$(($index*1000000)) + echo "y" | nice -n 5 ./genCheckpoint.sh $instrs done From 9e4033935f4baafdc08b6d9dd3ead14fbd04fccb Mon Sep 17 00:00:00 2001 From: bbracker Date: Sat, 20 Nov 2021 19:42:53 -0800 Subject: [PATCH 128/132] add checkpoints to regression --- wally-pipelined/regression/linux-wave.do | 118 +++++++++--------- .../regression/regression-wally.py | 6 + 2 files changed, 66 insertions(+), 58 deletions(-) diff --git a/wally-pipelined/regression/linux-wave.do b/wally-pipelined/regression/linux-wave.do index d2350d0ec..54801f94f 100644 --- a/wally-pipelined/regression/linux-wave.do +++ b/wally-pipelined/regression/linux-wave.do @@ -5,42 +5,42 @@ add wave -noupdate /testbench/reset add wave -noupdate /testbench/reset_ext add wave -noupdate -radix unsigned /testbench/InstrCountW add wave -noupdate /testbench/dut/hart/SATP_REGW -add wave -noupdate -group HDU -expand -group traps /testbench/dut/hart/priv/trap/InstrMisalignedFaultM -add wave -noupdate -group HDU -expand -group traps /testbench/dut/hart/priv/trap/InstrAccessFaultM -add wave -noupdate -group HDU -expand -group traps /testbench/dut/hart/priv/trap/IllegalInstrFaultM -add wave -noupdate -group HDU -expand -group traps /testbench/dut/hart/priv/trap/BreakpointFaultM -add wave -noupdate -group HDU -expand -group traps /testbench/dut/hart/priv/trap/LoadMisalignedFaultM -add wave -noupdate -group HDU -expand -group traps /testbench/dut/hart/priv/trap/StoreMisalignedFaultM -add wave -noupdate -group HDU -expand -group traps /testbench/dut/hart/priv/trap/LoadAccessFaultM -add wave -noupdate -group HDU -expand -group traps /testbench/dut/hart/priv/trap/StoreAccessFaultM -add wave -noupdate -group HDU -expand -group traps /testbench/dut/hart/priv/trap/EcallFaultM -add wave -noupdate -group HDU -expand -group traps /testbench/dut/hart/priv/trap/InstrPageFaultM -add wave -noupdate -group HDU -expand -group traps /testbench/dut/hart/priv/trap/LoadPageFaultM -add wave -noupdate -group HDU -expand -group traps /testbench/dut/hart/priv/trap/StorePageFaultM -add wave -noupdate -group HDU -expand -group traps /testbench/dut/hart/priv/trap/InterruptM -add wave -noupdate -group HDU -group interrupts /testbench/dut/hart/priv/trap/PendingIntsM -add wave -noupdate -group HDU -group interrupts /testbench/dut/hart/priv/trap/CommittedM -add wave -noupdate -group HDU -group interrupts /testbench/dut/hart/priv/trap/InstrValidM -add wave -noupdate -group HDU -group hazards /testbench/dut/hart/hzu/BPPredWrongE -add wave -noupdate -group HDU -group hazards /testbench/dut/hart/hzu/CSRWritePendingDEM -add wave -noupdate -group HDU -group hazards /testbench/dut/hart/hzu/RetM -add wave -noupdate -group HDU -group hazards -color Pink /testbench/dut/hart/hzu/TrapM -add wave -noupdate -group HDU -group hazards /testbench/dut/hart/hzu/LoadStallD -add wave -noupdate -group HDU -group hazards /testbench/dut/hart/hzu/StoreStallD -add wave -noupdate -group HDU -group hazards /testbench/dut/hart/hzu/ICacheStallF -add wave -noupdate -group HDU -group hazards /testbench/dut/hart/hzu/LSUStall -add wave -noupdate -group HDU -group hazards /testbench/dut/hart/MulDivStallD -add wave -noupdate -group HDU -group hazards /testbench/dut/hart/hzu/DivBusyE -add wave -noupdate -group HDU -expand -group Flush -color Yellow /testbench/dut/hart/hzu/FlushF -add wave -noupdate -group HDU -expand -group Flush -color Yellow /testbench/dut/hart/FlushD -add wave -noupdate -group HDU -expand -group Flush -color Yellow /testbench/dut/hart/FlushE -add wave -noupdate -group HDU -expand -group Flush -color Yellow /testbench/dut/hart/FlushM -add wave -noupdate -group HDU -expand -group Flush -color Yellow /testbench/dut/hart/FlushW -add wave -noupdate -group HDU -group Stall -color Orange /testbench/dut/hart/StallF -add wave -noupdate -group HDU -group Stall -color Orange /testbench/dut/hart/StallD -add wave -noupdate -group HDU -group Stall -color Orange /testbench/dut/hart/StallE -add wave -noupdate -group HDU -group Stall -color Orange /testbench/dut/hart/StallM -add wave -noupdate -group HDU -group Stall -color Orange /testbench/dut/hart/StallW +add wave -noupdate -expand -group HDU -expand -group traps /testbench/dut/hart/priv/trap/InstrMisalignedFaultM +add wave -noupdate -expand -group HDU -expand -group traps /testbench/dut/hart/priv/trap/InstrAccessFaultM +add wave -noupdate -expand -group HDU -expand -group traps /testbench/dut/hart/priv/trap/IllegalInstrFaultM +add wave -noupdate -expand -group HDU -expand -group traps /testbench/dut/hart/priv/trap/BreakpointFaultM +add wave -noupdate -expand -group HDU -expand -group traps /testbench/dut/hart/priv/trap/LoadMisalignedFaultM +add wave -noupdate -expand -group HDU -expand -group traps /testbench/dut/hart/priv/trap/StoreMisalignedFaultM +add wave -noupdate -expand -group HDU -expand -group traps /testbench/dut/hart/priv/trap/LoadAccessFaultM +add wave -noupdate -expand -group HDU -expand -group traps /testbench/dut/hart/priv/trap/StoreAccessFaultM +add wave -noupdate -expand -group HDU -expand -group traps /testbench/dut/hart/priv/trap/EcallFaultM +add wave -noupdate -expand -group HDU -expand -group traps /testbench/dut/hart/priv/trap/InstrPageFaultM +add wave -noupdate -expand -group HDU -expand -group traps /testbench/dut/hart/priv/trap/LoadPageFaultM +add wave -noupdate -expand -group HDU -expand -group traps /testbench/dut/hart/priv/trap/StorePageFaultM +add wave -noupdate -expand -group HDU -expand -group traps /testbench/dut/hart/priv/trap/InterruptM +add wave -noupdate -expand -group HDU -group interrupts /testbench/dut/hart/priv/trap/PendingIntsM +add wave -noupdate -expand -group HDU -group interrupts /testbench/dut/hart/priv/trap/CommittedM +add wave -noupdate -expand -group HDU -group interrupts /testbench/dut/hart/priv/trap/InstrValidM +add wave -noupdate -expand -group HDU -expand -group hazards /testbench/dut/hart/hzu/BPPredWrongE +add wave -noupdate -expand -group HDU -expand -group hazards /testbench/dut/hart/hzu/CSRWritePendingDEM +add wave -noupdate -expand -group HDU -expand -group hazards /testbench/dut/hart/hzu/RetM +add wave -noupdate -expand -group HDU -expand -group hazards -color Pink /testbench/dut/hart/hzu/TrapM +add wave -noupdate -expand -group HDU -expand -group hazards /testbench/dut/hart/hzu/LoadStallD +add wave -noupdate -expand -group HDU -expand -group hazards /testbench/dut/hart/hzu/StoreStallD +add wave -noupdate -expand -group HDU -expand -group hazards /testbench/dut/hart/hzu/ICacheStallF +add wave -noupdate -expand -group HDU -expand -group hazards /testbench/dut/hart/hzu/LSUStall +add wave -noupdate -expand -group HDU -expand -group hazards /testbench/dut/hart/MulDivStallD +add wave -noupdate -expand -group HDU -expand -group hazards /testbench/dut/hart/hzu/DivBusyE +add wave -noupdate -expand -group HDU -expand -group Flush -color Yellow /testbench/dut/hart/hzu/FlushF +add wave -noupdate -expand -group HDU -expand -group Flush -color Yellow /testbench/dut/hart/FlushD +add wave -noupdate -expand -group HDU -expand -group Flush -color Yellow /testbench/dut/hart/FlushE +add wave -noupdate -expand -group HDU -expand -group Flush -color Yellow /testbench/dut/hart/FlushM +add wave -noupdate -expand -group HDU -expand -group Flush -color Yellow /testbench/dut/hart/FlushW +add wave -noupdate -expand -group HDU -expand -group Stall -color Orange /testbench/dut/hart/StallF +add wave -noupdate -expand -group HDU -expand -group Stall -color Orange /testbench/dut/hart/StallD +add wave -noupdate -expand -group HDU -expand -group Stall -color Orange /testbench/dut/hart/StallE +add wave -noupdate -expand -group HDU -expand -group Stall -color Orange /testbench/dut/hart/StallM +add wave -noupdate -expand -group HDU -expand -group Stall -color Orange /testbench/dut/hart/StallW add wave -noupdate -group PCS /testbench/dut/hart/ifu/PCNextF add wave -noupdate -group PCS /testbench/dut/hart/PCF add wave -noupdate -group PCS /testbench/dut/hart/ifu/PCD @@ -61,8 +61,11 @@ add wave -noupdate -group {Decode Stage} /testbench/dut/hart/ieu/dp/RdD add wave -noupdate -group {Decode Stage} /testbench/dut/hart/ieu/dp/Rs1D add wave -noupdate -group {Decode Stage} /testbench/dut/hart/ieu/dp/Rs2D add wave -noupdate -expand -group {Execution Stage} /testbench/dut/hart/ifu/PCE +add wave -noupdate -expand -group {Execution Stage} /testbench/ExpectedPCE +add wave -noupdate -expand -group {Execution Stage} /testbench/MepcExpected add wave -noupdate -expand -group {Execution Stage} /testbench/dut/hart/ifu/InstrE add wave -noupdate -expand -group {Execution Stage} /testbench/InstrEName +add wave -noupdate -expand -group {Execution Stage} /testbench/dut/hart/ieu/c/InstrValidE add wave -noupdate -expand -group {Execution Stage} /testbench/textE add wave -noupdate -expand -group {Execution Stage} -color {Cornflower Blue} /testbench/FunctionName/FunctionName add wave -noupdate -expand -group {Memory Stage} /testbench/checkInstrM @@ -177,8 +180,6 @@ add wave -noupdate -group {alu execution stage} /testbench/dut/hart/ieu/dp/Write add wave -noupdate -group {alu execution stage} /testbench/dut/hart/ieu/dp/ALUResultE add wave -noupdate -group {alu execution stage} /testbench/dut/hart/ieu/dp/SrcAE add wave -noupdate -group {alu execution stage} /testbench/dut/hart/ieu/dp/SrcBE -add wave -noupdate -group muldiv /testbench/dut/hart/mdu/SrcAE -add wave -noupdate -group muldiv /testbench/dut/hart/mdu/SrcBE add wave -noupdate -group muldiv /testbench/dut/hart/mdu/Funct3E add wave -noupdate -group muldiv /testbench/dut/hart/mdu/MulDivE add wave -noupdate -group muldiv /testbench/dut/hart/mdu/W64E @@ -397,23 +398,24 @@ add wave -noupdate -group lsu -expand -group ptwalker -expand -group types /test add wave -noupdate -group lsu -expand -group ptwalker -expand -group types /testbench/dut/hart/lsu/hptw/WalkerInstrPageFaultF add wave -noupdate -group lsu -expand -group ptwalker -expand -group types /testbench/dut/hart/lsu/hptw/WalkerLoadPageFaultM add wave -noupdate -group lsu -expand -group ptwalker -expand -group types /testbench/dut/hart/lsu/hptw/WalkerStorePageFaultM -add wave -noupdate -group csr -color Gray90 -radix unsigned /testbench/dut/hart/priv/csr/genblk1/counters/genblk1/INSTRET_REGW -add wave -noupdate -group csr /testbench/dut/hart/priv/csr/genblk1/counters/genblk1/HPMCOUNTER_REGW -add wave -noupdate -group csr -expand -group machine /testbench/dut/hart/priv/csr/genblk1/csrm/MIE_REGW -add wave -noupdate -group csr -expand -group machine /testbench/dut/hart/priv/csr/MIP_REGW -add wave -noupdate -group csr -expand -group machine /testbench/dut/hart/priv/csr/genblk1/csrm/MSTATUS_REGW -add wave -noupdate -group csr -expand -group machine /testbench/dut/hart/priv/csr/genblk1/csrm/MEPC_REGW -add wave -noupdate -group csr -expand -group machine /testbench/dut/hart/priv/csr/genblk1/csrm/MTVAL_REGW -add wave -noupdate -group csr -expand -group machine /testbench/dut/hart/priv/csr/MTVEC_REGW -add wave -noupdate -group csr -expand -group machine /testbench/dut/hart/priv/csr/genblk1/csrm/MCAUSE_REGW -add wave -noupdate -group csr -expand -group machine /testbench/dut/hart/priv/csr/genblk1/csrm/MEDELEG_REGW -add wave -noupdate -group csr -expand -group machine /testbench/dut/hart/priv/csr/genblk1/csrm/MIDELEG_REGW -add wave -noupdate -group csr -expand -group machine -color Brown /testbench/dut/hart/priv/PrivilegeModeW -add wave -noupdate -group csr -expand -group supervisor /testbench/dut/hart/priv/csr/STVEC_REGW -add wave -noupdate -group csr -expand -group supervisor /testbench/dut/hart/priv/csr/genblk1/csrs/genblk1/SCAUSE_REGW -add wave -noupdate -group csr -expand -group supervisor /testbench/dut/hart/priv/csr/genblk1/csrs/SIP_REGW -add wave -noupdate -group csr -expand -group supervisor /testbench/dut/hart/priv/csr/genblk1/csrs/SIE_REGW -add wave -noupdate -group csr -expand -group supervisor /testbench/dut/hart/priv/csr/genblk1/csrs/SEPC_REGW +add wave -noupdate -expand -group csr -color Gray90 -radix unsigned /testbench/dut/hart/priv/csr/genblk1/counters/genblk1/INSTRET_REGW +add wave -noupdate -expand -group csr /testbench/dut/hart/priv/csr/genblk1/counters/genblk1/HPMCOUNTER_REGW +add wave -noupdate -expand -group csr -expand -group machine /testbench/dut/hart/priv/csr/genblk1/csrm/MIE_REGW +add wave -noupdate -expand -group csr -expand -group machine /testbench/dut/hart/priv/csr/MIP_REGW +add wave -noupdate -expand -group csr -expand -group machine /testbench/dut/hart/priv/csr/genblk1/csrm/MSTATUS_REGW +add wave -noupdate -expand -group csr -expand -group machine /testbench/dut/hart/priv/csr/genblk1/csrm/MEPC_REGW +add wave -noupdate -expand -group csr -expand -group machine /testbench/dut/hart/priv/csr/genblk1/csrm/MTVAL_REGW +add wave -noupdate -expand -group csr -expand -group machine /testbench/dut/hart/priv/csr/MTVEC_REGW +add wave -noupdate -expand -group csr -expand -group machine /testbench/dut/hart/priv/csr/genblk1/csrm/MCAUSE_REGW +add wave -noupdate -expand -group csr -expand -group machine /testbench/dut/hart/priv/csr/genblk1/csrm/MEDELEG_REGW +add wave -noupdate -expand -group csr -expand -group machine /testbench/dut/hart/priv/csr/genblk1/csrm/MIDELEG_REGW +add wave -noupdate -expand -group csr -expand -group machine -color Brown /testbench/dut/hart/priv/PrivilegeModeW +add wave -noupdate -expand -group csr -expand -group supervisor /testbench/dut/hart/priv/csr/STVEC_REGW +add wave -noupdate -expand -group csr -expand -group supervisor /testbench/dut/hart/priv/csr/genblk1/csrs/STVAL +add wave -noupdate -expand -group csr -expand -group supervisor /testbench/dut/hart/priv/csr/genblk1/csrs/genblk1/SCAUSE_REGW +add wave -noupdate -expand -group csr -expand -group supervisor /testbench/dut/hart/priv/csr/genblk1/csrs/SIP_REGW +add wave -noupdate -expand -group csr -expand -group supervisor /testbench/dut/hart/priv/csr/genblk1/csrs/SIE_REGW +add wave -noupdate -expand -group csr -expand -group supervisor /testbench/dut/hart/priv/csr/genblk1/csrs/SEPC_REGW add wave -noupdate -group itlb /testbench/dut/hart/ifu/immu/TLBWrite add wave -noupdate -group itlb /testbench/dut/hart/ifu/ITLBMissF add wave -noupdate -group itlb /testbench/dut/hart/ifu/immu/PhysicalAddress @@ -515,8 +517,8 @@ add wave -noupdate /testbench/dut/uncore/dtim/memwrite add wave -noupdate /testbench/dut/uncore/dtim/HWDATA add wave -noupdate /testbench/dut/uncore/dtim/risingHREADYTim TreeUpdate [SetDefaultTree] -WaveRestoreCursors {{Cursor 23} {209183247 ns} 0} {{Cursor 5} {5672440 ns} 0} -quietly wave cursor active 2 +WaveRestoreCursors {{Cursor 23} {29707 ns} 0} {{Cursor 3} {29725 ns} 1} +quietly wave cursor active 1 configure wave -namecolwidth 250 configure wave -valuecolwidth 314 configure wave -justifyvalue left @@ -531,4 +533,4 @@ configure wave -griddelta 40 configure wave -timeline 0 configure wave -timelineunits ns update -WaveRestoreZoom {5672937 ns} {5673085 ns} +WaveRestoreZoom {29429 ns} {30021 ns} diff --git a/wally-pipelined/regression/regression-wally.py b/wally-pipelined/regression/regression-wally.py index 2e16d82ba..c55e8b617 100755 --- a/wally-pipelined/regression/regression-wally.py +++ b/wally-pipelined/regression/regression-wally.py @@ -41,6 +41,12 @@ def getBuildrootTC(short): BRgrepstr=str(MAX_EXPECTED)+" instructions" return TestCase(name="buildroot",cmd=BRcmd,grepstr=BRgrepstr) +tc = TestCase( + name="buildroot-checkpoint", + cmd="vsim > {} -c < Date: Sat, 20 Nov 2021 22:35:47 -0600 Subject: [PATCH 129/132] Fixed a very complex interaction between interrupts, the icache, dcache, and hptw. If an interrupt occurred at the start of an ITLB miss or DTLB miss the page table walk should be aborted before starting. --- .../cache/dcache_ptw_interaction_README.txt | 18 +++- wally-pipelined/src/cache/dcachefsm.sv | 21 +++-- wally-pipelined/src/cache/icache.sv | 7 +- wally-pipelined/src/cache/icachefsm.sv | 4 +- wally-pipelined/src/ifu/ifu.sv | 84 ++++++++++--------- wally-pipelined/src/lsu/lsu.sv | 4 +- .../src/wally/wallypipelinedhart.sv | 1 + 7 files changed, 84 insertions(+), 55 deletions(-) diff --git a/wally-pipelined/src/cache/dcache_ptw_interaction_README.txt b/wally-pipelined/src/cache/dcache_ptw_interaction_README.txt index 59d768fce..cc7a96cc1 100644 --- a/wally-pipelined/src/cache/dcache_ptw_interaction_README.txt +++ b/wally-pipelined/src/cache/dcache_ptw_interaction_README.txt @@ -24,7 +24,7 @@ in the memory stage. This is the core reason for the complexity. The above table classifies the operations into 8 categories. 2 of the 8 are not possible because a DTLB miss implies a memory operation. Each (I/D)TLB miss results in either a write to the corresponding TLB or a TLB fault. -To complicate things it is possilbe to have current ITLB and DTLB misses, which +To complicate things it is possilbe to have concurrent ITLB and DTLB misses, which both can result in either a write or a fault. The table belows shows the possible scenarios and the sequence of operations. @@ -72,3 +72,19 @@ to normal mode. Type 5a is a Type 4a with a current memory operation. The Dcache first switches to walker mode +Other traps. +A new problem has emerged. What happens when an interrupt occurs during a page table walk? +The dcache has an output called CommittedM which tells the CPU if the memory operation is +committed into the memory system. It would be wrong to pin the interrupt to a memory operation +when it is already or partially committed to the memory system. Instead the next instruction +has to be pinned to the interrupt. The complexity occurs with the ITLB miss; types 4, 5 and 7. + +Type 4: The ITLB misses and starts using the dcache to fetch the page table. There is no memory +operation. Depending on where in the walk the operations could be aborted. If the tlb is not yet +updated then the walk could be aborted. However if the TLB is updated then the interrupt must be +delayed until the next instruction. + +What is the meaning of CommittedM? +This signal informs the CPU if a memory operation is not started or if it is between started +and done. Once a memory op is started it should not be interrupted. This is used to prevent the +CPU from generating an interrupt after the operation is partially or completely done. diff --git a/wally-pipelined/src/cache/dcachefsm.sv b/wally-pipelined/src/cache/dcachefsm.sv index 59f90462f..7137fea05 100644 --- a/wally-pipelined/src/cache/dcachefsm.sv +++ b/wally-pipelined/src/cache/dcachefsm.sv @@ -192,16 +192,9 @@ module dcachefsm LRUWriteEn = 1'b0; CommittedM = 1'b0; - if(FlushDCacheM) begin - NextState = STATE_FLUSH; - DCacheStall = 1'b1; - SelAdrM = 2'b11; - FlushAdrCntRst = 1'b1; - FlushWayCntRst = 1'b1; - end // TLB Miss - else if((AnyCPUReqM & DTLBMissM) | ITLBMissF) begin + if(((AnyCPUReqM & DTLBMissM) | ITLBMissF) & ~(ExceptionM | PendingInterruptM)) begin // the LSU arbiter has not yet selected the PTW. // The CPU needs to be stalled until that happens. // If we set DCacheStall for 1 cycle before going to @@ -212,6 +205,16 @@ module dcachefsm DCacheStall = 1'b1; NextState = STATE_PTW_READY; end + + // Flush dcache to next level of memory + else if(FlushDCacheM & ~(ExceptionM | PendingInterruptM)) begin + NextState = STATE_FLUSH; + DCacheStall = 1'b1; + SelAdrM = 2'b11; + FlushAdrCntRst = 1'b1; + FlushWayCntRst = 1'b1; + end + // amo hit else if(AtomicM[1] & (&MemRWM) & CacheableM & ~(ExceptionM | PendingInterruptM) & CacheHit & ~DTLBMissM) begin SelAdrM = 2'b10; @@ -623,7 +626,7 @@ module dcachefsm CntReset = 1'b0; AHBWrite = 1'b0; AHBRead = 1'b0; - CommittedM = 1'b0; + CommittedM = 1'b1; NextState = STATE_READY; diff --git a/wally-pipelined/src/cache/icache.sv b/wally-pipelined/src/cache/icache.sv index d433f6ed3..7df4c4b84 100644 --- a/wally-pipelined/src/cache/icache.sv +++ b/wally-pipelined/src/cache/icache.sv @@ -31,7 +31,10 @@ module icache input logic clk, reset, input logic StallF, input logic [`PA_BITS-1:0] PCNextF, - input logic [`PA_BITS-1:0] PCPF, + input logic [`PA_BITS-1:0] PCPF, + + input logic ExceptionM, PendingInterruptM, + // Data read in from the ebu unit input logic [`XLEN-1:0] InstrInF, input logic InstrAckF, @@ -286,6 +289,8 @@ module icache .ITLBMissF, .ITLBWriteF, .WalkerInstrPageFaultF, + .ExceptionM, + .PendingInterruptM, .InstrAckF, .InstrReadF, .hit, diff --git a/wally-pipelined/src/cache/icachefsm.sv b/wally-pipelined/src/cache/icachefsm.sv index 2461e0dd4..fa0268bb8 100644 --- a/wally-pipelined/src/cache/icachefsm.sv +++ b/wally-pipelined/src/cache/icachefsm.sv @@ -36,6 +36,8 @@ module icachefsm input logic ITLBWriteF, input logic WalkerInstrPageFaultF, + input logic ExceptionM, PendingInterruptM, + // BUS interface input logic InstrAckF, @@ -135,7 +137,7 @@ module icachefsm STATE_READY: begin SelAdr = 2'b00; ICacheReadEn = 1'b1; - if (ITLBMissF) begin + if (ITLBMissF & ~(ExceptionM | PendingInterruptM)) begin NextState = STATE_TLB_MISS; end else if (hit & ~spill) begin ICacheStallF = 1'b0; diff --git a/wally-pipelined/src/ifu/ifu.sv b/wally-pipelined/src/ifu/ifu.sv index 9ddb39019..b18d8bc3c 100644 --- a/wally-pipelined/src/ifu/ifu.sv +++ b/wally-pipelined/src/ifu/ifu.sv @@ -27,60 +27,62 @@ `include "wally-config.vh" module ifu ( - input logic clk, reset, - input logic StallF, StallD, StallE, StallM, StallW, - input logic FlushF, FlushD, FlushE, FlushM, FlushW, + input logic clk, reset, + input logic StallF, StallD, StallE, StallM, StallW, + input logic FlushF, FlushD, FlushE, FlushM, FlushW, // Fetch - input logic [`XLEN-1:0] InstrInF, - input logic InstrAckF, - output logic [`XLEN-1:0] PCF, - output logic [`PA_BITS-1:0] InstrPAdrF, - output logic InstrReadF, - output logic ICacheStallF, + input logic [`XLEN-1:0] InstrInF, + input logic InstrAckF, + output logic [`XLEN-1:0] PCF, + output logic [`PA_BITS-1:0] InstrPAdrF, + output logic InstrReadF, + output logic ICacheStallF, // Execute - output logic [`XLEN-1:0] PCLinkE, - input logic PCSrcE, - input logic [`XLEN-1:0] PCTargetE, - output logic [`XLEN-1:0] PCE, - output logic BPPredWrongE, + output logic [`XLEN-1:0] PCLinkE, + input logic PCSrcE, + input logic [`XLEN-1:0] PCTargetE, + output logic [`XLEN-1:0] PCE, + output logic BPPredWrongE, // Mem - input logic RetM, TrapM, - input logic [`XLEN-1:0] PrivilegedNextPCM, - input logic InvalidateICacheM, - output logic [31:0] InstrD, InstrM, - output logic [`XLEN-1:0] PCM, - output logic [4:0] InstrClassM, - output logic BPPredDirWrongM, - output logic BTBPredPCWrongM, - output logic RASPredPCWrongM, - output logic BPPredClassNonCFIWrongM, + input logic RetM, TrapM, + input logic [`XLEN-1:0] PrivilegedNextPCM, + input logic InvalidateICacheM, + output logic [31:0] InstrD, InstrM, + output logic [`XLEN-1:0] PCM, + output logic [4:0] InstrClassM, + output logic BPPredDirWrongM, + output logic BTBPredPCWrongM, + output logic RASPredPCWrongM, + output logic BPPredClassNonCFIWrongM, // Writeback // output logic [`XLEN-1:0] PCLinkW, // Faults - input logic IllegalBaseInstrFaultD, - output logic ITLBInstrPageFaultF, - output logic IllegalIEUInstrFaultD, - output logic InstrMisalignedFaultM, - output logic [`XLEN-1:0] InstrMisalignedAdrM, + input logic IllegalBaseInstrFaultD, + output logic ITLBInstrPageFaultF, + output logic IllegalIEUInstrFaultD, + output logic InstrMisalignedFaultM, + output logic [`XLEN-1:0] InstrMisalignedAdrM, + input logic ExceptionM, PendingInterruptM, + // mmu management - input logic [1:0] PrivilegeModeW, - input logic [`XLEN-1:0] PTE, - input logic [1:0] PageType, - input logic [`XLEN-1:0] SATP_REGW, - input logic STATUS_MXR, STATUS_SUM, STATUS_MPRV, - input logic [1:0] STATUS_MPP, - input logic ITLBWriteF, ITLBFlushF, - input logic WalkerInstrPageFaultF, + input logic [1:0] PrivilegeModeW, + input logic [`XLEN-1:0] PTE, + input logic [1:0] PageType, + input logic [`XLEN-1:0] SATP_REGW, + input logic STATUS_MXR, STATUS_SUM, STATUS_MPRV, + input logic [1:0] STATUS_MPP, + input logic ITLBWriteF, ITLBFlushF, + input logic WalkerInstrPageFaultF, - output logic ITLBMissF, + output logic ITLBMissF, // pmp/pma (inside mmu) signals. *** temporarily from AHB bus but eventually replace with internal versions pre H - input var logic [7:0] PMPCFG_ARRAY_REGW[`PMP_ENTRIES-1:0], - input var logic [`XLEN-1:0] PMPADDR_ARRAY_REGW[`PMP_ENTRIES-1:0], + input var logic [7:0] PMPCFG_ARRAY_REGW[`PMP_ENTRIES-1:0], + input var logic [`XLEN-1:0] PMPADDR_ARRAY_REGW[`PMP_ENTRIES-1:0], - output logic InstrAccessFaultF + output logic InstrAccessFaultF ); logic [`XLEN-1:0] PCCorrectE, UnalignedPCNextF, PCNextF; diff --git a/wally-pipelined/src/lsu/lsu.sv b/wally-pipelined/src/lsu/lsu.sv index 1a97d6b33..a62502033 100644 --- a/wally-pipelined/src/lsu/lsu.sv +++ b/wally-pipelined/src/lsu/lsu.sv @@ -134,8 +134,8 @@ module lsu .SATP_REGW(SATP_REGW), .PCF(PCF), .MemAdrM(MemAdrM), - .ITLBMissF(ITLBMissF), - .DTLBMissM(DTLBMissM), + .ITLBMissF(ITLBMissF & ~PendingInterruptM), + .DTLBMissM(DTLBMissM & ~PendingInterruptM), .MemRWM(MemRWM), .PTE(PTE), .PageType, diff --git a/wally-pipelined/src/wally/wallypipelinedhart.sv b/wally-pipelined/src/wally/wallypipelinedhart.sv index 15cc61ba5..dd167788a 100644 --- a/wally-pipelined/src/wally/wallypipelinedhart.sv +++ b/wally-pipelined/src/wally/wallypipelinedhart.sv @@ -159,6 +159,7 @@ module wallypipelinedhart ( .StallF, .StallD, .StallE, .StallM, .StallW, .FlushF, .FlushD, .FlushE, .FlushM, .FlushW, + .ExceptionM, .PendingInterruptM, // Fetch .InstrInF(InstrRData), .InstrAckF, .PCF, .InstrPAdrF, .InstrReadF, .ICacheStallF, From baa98e70151f7303fcf9cad976cc2f348b721f40 Mon Sep 17 00:00:00 2001 From: Ross Thompson Date: Sat, 20 Nov 2021 22:42:47 -0600 Subject: [PATCH 130/132] Reversed bit order in uart. --- wally-pipelined/src/uncore/uartPC16550D.sv | 44 ++++++++++++++++------ 1 file changed, 32 insertions(+), 12 deletions(-) diff --git a/wally-pipelined/src/uncore/uartPC16550D.sv b/wally-pipelined/src/uncore/uartPC16550D.sv index bf688d1bb..0438d03dc 100644 --- a/wally-pipelined/src/uncore/uartPC16550D.sv +++ b/wally-pipelined/src/uncore/uartPC16550D.sv @@ -114,6 +114,8 @@ module uartPC16550D( logic rxdataavailintr, modemstatusintr, intrpending; logic [2:0] intrID; + logic baudpulseComb; + /////////////////////////////////////////// // Input synchronization: 2-stage synchronizer /////////////////////////////////////////// @@ -135,14 +137,20 @@ module uartPC16550D( MCR <= #1 5'b0; LSR <= #1 8'b01100000; MSR <= #1 4'b0; - DLL <= #1 8'b0; + DLL <= #1 8'd11; DLM <= #1 8'b0; SCR <= #1 8'b0; // not strictly necessary to reset end else begin if (~MEMWb) begin case (A) +/* -----\/----- EXCLUDED -----\/----- 3'b000: if (DLAB) DLL <= #1 Din; // else TXHR <= #1 Din; // TX handled in TX register/FIFO section 3'b001: if (DLAB) DLM <= #1 Din; else IER <= #1 Din[3:0]; + -----/\----- EXCLUDED -----/\----- */ + // *** BUG FIX ME for now for the divider to be 11. Our clock is 10 Mhz. 10Mhz /(11 * 16) = 56818 baud, which is close enough to 57600 baud + 3'b000: if (DLAB) DLL <= #1 8'd11; // else TXHR <= #1 Din; // TX handled in TX register/FIFO section + 3'b001: if (DLAB) DLM <= #1 8'b0; else IER <= #1 Din[3:0]; + 3'b010: FCR <= #1 {Din[7:6], 2'b0, Din[3], 2'b0, Din[0]}; // Write only FIFO Control Register; 4:5 reserved and 2:1 self-clearing 3'b011: LCR <= #1 Din; 3'b100: MCR <= #1 Din[4:0]; @@ -190,14 +198,26 @@ module uartPC16550D( // Unlike PC16550D, this unit is hardwired with same rx and tx baud clock // *** add table of scale factors to get 16x uart clk /////////////////////////////////////////// + // Ross Thompson: Found a bug. If the baud rate dividers DLM, and DLL are reloaded + // the baudcount is not reset to {DLM, DLL, UART_PRESCALE} always_ff @(posedge HCLK, negedge HRESETn) if (~HRESETn) begin - baudcount <= #1 0; + baudcount <= #1 1; baudpulse <= #1 0; + end else if (~MEMWb & DLAB & (A == 3'b0 || A == 3'b1)) begin + baudcount <= #1 '0; end else begin - baudpulse <= #1 (baudcount == {DLM, DLL, {(`UART_PRESCALE){1'b0}}}); - baudcount <= #1 baudpulse ? 0 : baudcount +1; + // the baudpulse is too long by 2 clock cycles. + // This is cause baudpulse is registered adding 1 cycle and + // baudcount is reset when baudcount equals the threshold {DLM, DLL, UART_PRESCALE} + // rather than 1 less than that value. Alternatively the reset value could be 1 rather + // than 0. + baudpulse <= #1 baudpulseComb; + baudcount <= #1 baudpulseComb ? 1 : baudcount +1; end + + assign baudpulseComb = (baudcount == {DLM, DLL, {(`UART_PRESCALE){1'b0}}}); + assign txbaudpulse = baudpulse; assign BAUDOUTb = ~baudpulse; assign rxbaudpulse = ~RCLK; // usually BAUDOUTb tied to RCLK externally @@ -365,14 +385,14 @@ module uartPC16550D( endcase case({LCR[3], LCR[1:0]}) // parity, data bits // load up start bit (0), 5-8 data bits, 0-1 parity bits, 2 stop bits (only one sometimes used), padding - 3'b000: txdata = {1'b0, nexttxdata[4:0], 6'b111111}; // 5 data, no parity - 3'b001: txdata = {1'b0, nexttxdata[5:0], 5'b11111}; // 6 data, no parity - 3'b010: txdata = {1'b0, nexttxdata[6:0], 4'b1111}; // 7 data, no parity - 3'b011: txdata = {1'b0, nexttxdata[7:0], 3'b111}; // 8 data, no parity - 3'b100: txdata = {1'b0, nexttxdata[4:0], txparity, 5'b11111}; // 5 data, parity - 3'b101: txdata = {1'b0, nexttxdata[5:0], txparity, 4'b1111}; // 6 data, parity - 3'b110: txdata = {1'b0, nexttxdata[6:0], txparity, 3'b111}; // 7 data, parity - 3'b111: txdata = {1'b0, nexttxdata[7:0], txparity, 2'b11}; // 8 data, parity + 3'b000: txdata = {1'b0, nexttxdata[0], nexttxdata[1], nexttxdata[2], nexttxdata[3], nexttxdata[4], 6'b111111}; // 5 data, no parity + 3'b001: txdata = {1'b0, nexttxdata[0], nexttxdata[1], nexttxdata[2], nexttxdata[3], nexttxdata[4], nexttxdata[5], 5'b11111}; // 6 data, no parity + 3'b010: txdata = {1'b0, nexttxdata[0], nexttxdata[1], nexttxdata[2], nexttxdata[3], nexttxdata[4], nexttxdata[5], nexttxdata[6], 4'b1111}; // 7 data, no parity + 3'b011: txdata = {1'b0, nexttxdata[0], nexttxdata[1], nexttxdata[2], nexttxdata[3], nexttxdata[4], nexttxdata[5], nexttxdata[6], nexttxdata[7], 3'b111}; // 8 data, no parity + 3'b100: txdata = {1'b0, nexttxdata[0], nexttxdata[1], nexttxdata[2], nexttxdata[3], nexttxdata[4], txparity, 5'b11111}; // 5 data, parity + 3'b101: txdata = {1'b0, nexttxdata[0], nexttxdata[1], nexttxdata[2], nexttxdata[3], nexttxdata[4], nexttxdata[5], txparity, 4'b1111}; // 6 data, parity + 3'b110: txdata = {1'b0, nexttxdata[0], nexttxdata[1], nexttxdata[2], nexttxdata[3], nexttxdata[4], nexttxdata[5], nexttxdata[6], txparity, 3'b111}; // 7 data, parity + 3'b111: txdata = {1'b0, nexttxdata[0], nexttxdata[1], nexttxdata[2], nexttxdata[3], nexttxdata[4], nexttxdata[5], nexttxdata[6], nexttxdata[7], txparity, 2'b11}; // 8 data, parity endcase end From d080041508e6efaead6e751416040812718c28b3 Mon Sep 17 00:00:00 2001 From: Ross Thompson Date: Sat, 20 Nov 2021 22:44:37 -0600 Subject: [PATCH 131/132] Removed unneeded check for icache ways. --- wally-pipelined/testbench/testbench.sv | 1 - 1 file changed, 1 deletion(-) diff --git a/wally-pipelined/testbench/testbench.sv b/wally-pipelined/testbench/testbench.sv index 13ba7e16a..ee806286c 100644 --- a/wally-pipelined/testbench/testbench.sv +++ b/wally-pipelined/testbench/testbench.sv @@ -317,7 +317,6 @@ module riscvassertions; assert (2**$clog2(`DCACHE_WAYSIZEINBYTES) == `DCACHE_WAYSIZEINBYTES) else $error("DCACHE_WAYSIZEINBYTES must be a power of 2"); assert (2**$clog2(`ICACHE_BLOCKLENINBITS) == `ICACHE_BLOCKLENINBITS) else $error("ICACHE_BLOCKLENINBITS must be a power of 2"); assert (2**$clog2(`ICACHE_WAYSIZEINBYTES) == `ICACHE_WAYSIZEINBYTES) else $error("ICACHE_WAYSIZEINBYTES must be a power of 2"); - assert (`ICACHE_NUMWAYS == 1 || `MEM_ICACHE == 0) else $warning("Multiple Instruction Cache ways not yet implemented"); assert (2**$clog2(`ITLB_ENTRIES) == `ITLB_ENTRIES) else $error("ITLB_ENTRIES must be a power of 2"); assert (2**$clog2(`DTLB_ENTRIES) == `DTLB_ENTRIES) else $error("DTLB_ENTRIES must be a power of 2"); assert (`TIM_RANGE >= 56'h07FFFFFF) else $warning("Some regression tests will fail if TIM_RANGE is less than 56'h07FFFFFF"); From d90d708cf99a404b8fa4fa791ee22c0ee0e84727 Mon Sep 17 00:00:00 2001 From: bbracker Date: Sun, 21 Nov 2021 10:40:28 -0800 Subject: [PATCH 132/132] activate STVAL for buildroot --- wally-pipelined/src/privileged/csrs.sv | 3 +-- wally-pipelined/testbench/testbench-linux.sv | 4 ++-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/wally-pipelined/src/privileged/csrs.sv b/wally-pipelined/src/privileged/csrs.sv index b28101837..01a378f2f 100644 --- a/wally-pipelined/src/privileged/csrs.sv +++ b/wally-pipelined/src/privileged/csrs.sv @@ -89,8 +89,7 @@ module csrs #(parameter flopenr #(`XLEN) SSCRATCHreg(clk, reset, WriteSSCRATCHM, CSRWriteValM, SSCRATCH_REGW); flopenr #(`XLEN) SEPCreg(clk, reset, WriteSEPCM, NextEPCM, SEPC_REGW); flopenr #(`XLEN) SCAUSEreg(clk, reset, WriteSCAUSEM, NextCauseM, SCAUSE_REGW); - if(`QEMU) assign STVAL_REGW = `XLEN'b0; - else flopenr #(`XLEN) STVALreg(clk, reset, WriteSTVALM, NextMtvalM, STVAL_REGW); + flopenr #(`XLEN) STVALreg(clk, reset, WriteSTVALM, NextMtvalM, STVAL_REGW); if (`MEM_VIRTMEM) flopenr #(`XLEN) SATPreg(clk, reset, WriteSATPM, CSRWriteValM, SATP_REGW); else diff --git a/wally-pipelined/testbench/testbench-linux.sv b/wally-pipelined/testbench/testbench-linux.sv index 3db2f8cbc..6f4596baa 100644 --- a/wally-pipelined/testbench/testbench-linux.sv +++ b/wally-pipelined/testbench/testbench-linux.sv @@ -175,12 +175,12 @@ module testbench(); `define MEPC `CSR_BASE.csrm.MEPCreg.q `define SEPC `CSR_BASE.csrs.genblk1.SEPCreg.q `define MCOUNTEREN `CSR_BASE.csrm.genblk3.MCOUNTERENreg.q - `define SCOUNTEREN `CSR_BASE.csrs.genblk1.genblk3.SCOUNTERENreg.q + `define SCOUNTEREN `CSR_BASE.csrs.genblk1.genblk2.SCOUNTERENreg.q `define MSCRATCH `CSR_BASE.csrm.MSCRATCHreg.q `define SSCRATCH `CSR_BASE.csrs.genblk1.SSCRATCHreg.q `define MTVEC `CSR_BASE.csrm.MTVECreg.q `define STVEC `CSR_BASE.csrs.genblk1.STVECreg.q - `define SATP `CSR_BASE.csrs.genblk1.genblk2.SATPreg.q + `define SATP `CSR_BASE.csrs.genblk1.genblk1.SATPreg.q `define MSTATUS `CSR_BASE.csrsr.MSTATUS_REGW `define STATUS_TSR `CSR_BASE.csrsr.STATUS_TSR_INT `define STATUS_TW `CSR_BASE.csrsr.STATUS_TW_INT

core_portme.mak

Summary
core_portme.mak
Variables
OUTFLAGUse this flag to define how to to get an executable (e.g -o)
CFLAGSUse this flag to define compiler options.
LFLAGS_ENDDefine any libraries needed for linking or other flags that should come at the end of the link line (e.g.
SEPARATE_COMPILEDefine if you need to separate compilation from link stage.
PORT_OBJSPort specific object files can be added here
Build Targets
port_prebuildGenerate any files that are needed before actual build starts.
port_postbuildGenerate any files that are needed after actual build end.
port_postrunDo platform specific after run stuff.
port_prerunDo platform specific after run stuff.
port_postloadDo platform specific after load stuff.
port_preloadDo platform specific before load stuff.
Variables
OPATH
PERLDefine perl executable to calculate the geomean if running separate.
- -

Variables

- -

OUTFLAG

Use this flag to define how to to get an executable (e.g -o)

- -

CFLAGS

Use this flag to define compiler options.  Note, you can add compiler options from the command line using XCFLAGS=”other flags”

- -

LFLAGS_END

Define any libraries needed for linking or other flags that should come at the end of the link line (e.g. linker scripts).  Note: On certain platforms, the default clock_gettime implementation is supported but requires linking of librt.

- -

SEPARATE_COMPILE

Define if you need to separate compilation from link stage.  In this case, you also need to define below how to create an object file, and how to link.

- -

PORT_OBJS

Port specific object files can be added here

- -

Build Targets

- -

port_prebuild

Generate any files that are needed before actual build starts.  E.g. generate profile guidance files.  Sample PGO generation for gcc enabled with PGO=1

  • First, check if PGO was defined on the command line, if so, need to add -fprofile-use to compile line.
  • Second, if PGO reference has not yet been generated, add a step to the prebuild that will build a profile-generate version and run it.
NoteUsing REBUILD=1

Use make PGO=1 to invoke this sample processing.

- -

port_postbuild

Generate any files that are needed after actual build end.  E.g. change format to srec, bin, zip in order to be able to load into flash

- -

port_postrun

Do platform specific after run stuff.  E.g. reset the board, backup the logfiles etc.

- -

port_prerun

Do platform specific after run stuff.  E.g. reset the board, backup the logfiles etc.

- -

port_postload

Do platform specific after load stuff.  E.g. reset the reset power to the flash eraser

- -

port_preload

Do platform specific before load stuff.  E.g. reset the reset power to the flash eraser

- -

Variables

- -

OPATH

Path to the output folder.  Defaultcurrent folder.
- -

PERL

Define perl executable to calculate the geomean if running separate.

- -

%*`7y^GxR6mq-e|*?^SIupt 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