mirror of
https://github.com/openhwgroup/cvw
synced 2025-01-23 21:14:37 +00:00
278 lines
5.4 KiB
ArmAsm
278 lines
5.4 KiB
ArmAsm
///////////////////////////////////////////
|
|
// gshare.S
|
|
//
|
|
// Written: Rose Thompson rose@rosethompson.net
|
|
//
|
|
// Purpose: basic check that global history and gshare branch npredictors are working as expected. Requires manual inspection.
|
|
// TODO: *** Automate checking prediction accuracy.
|
|
//
|
|
// A component of the CORE-V-WALLY configurable RISC-V project.
|
|
// https://github.com/openhwgroup/cvw
|
|
//
|
|
// Copyright (C) 2021-24 Harvey Mudd College & Oklahoma State University
|
|
//
|
|
// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.1
|
|
//
|
|
// Licensed under the Solderpad Hardware License v 2.1 (the “License”); you may not use this file
|
|
// except in compliance with the License, or, at your option, the Apache License version 2.0. You
|
|
// may obtain a copy of the License at
|
|
//
|
|
// https://solderpad.org/licenses/SHL-2.1/
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, any work 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.
|
|
////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
// load code to initalize stack, handle interrupts, terminate
|
|
|
|
#include "WALLY-init-lib.h"
|
|
|
|
# run-elf.bash find this in project description
|
|
main:
|
|
|
|
addi sp, sp, 8
|
|
sd ra, 0(sp)
|
|
jal ra, oneLoopTest
|
|
jal ra, global_hist_6_space_test
|
|
jal ra, global_hist_4_space_test
|
|
jal ra, global_hist_3_space_test
|
|
jal ra, global_hist_2_space_test
|
|
jal ra, global_hist_1_space_test
|
|
jal ra, global_hist_0_space_test
|
|
|
|
fence.I
|
|
|
|
finished:
|
|
j done
|
|
|
|
.data
|
|
|
|
.section .text
|
|
.globl oneLoopTest
|
|
.type oneLoopTest, @function
|
|
oneLoopTest:
|
|
li t1, 0
|
|
li t2, 30
|
|
|
|
mv t3, t1
|
|
mv t4, t2
|
|
oneLoopTest1:
|
|
# instruction
|
|
addi t3, t3, 1
|
|
li t5, 10 # filler instructions
|
|
li t6, 100
|
|
li a0, 1000
|
|
li a1, 10000
|
|
bne t3, t4, oneLoopTest1 # this branch toggles between taken and not taken.
|
|
|
|
mv t3, t1
|
|
mv t4, t2
|
|
oneLoopTest2:
|
|
# instruction
|
|
addi t3, t3, 1
|
|
li t5, 10 # filler instructions
|
|
li t6, 100
|
|
li a0, 1000
|
|
bne t3, t4, oneLoopTest2 # this branch toggles between taken and not taken.
|
|
|
|
mv t3, t1
|
|
mv t4, t2
|
|
oneLoopTest3:
|
|
# instruction
|
|
addi t3, t3, 1
|
|
li t5, 10 # filler instructions
|
|
li t6, 100
|
|
bne t3, t4, oneLoopTest3 # this branch toggles between taken and not taken.
|
|
|
|
mv t3, t1
|
|
mv t4, t2
|
|
oneLoopTest4:
|
|
# instruction
|
|
addi t3, t3, 1
|
|
li t5, 10 # filler instructions
|
|
bne t3, t4, oneLoopTest4 # this branch toggles between taken and not taken.
|
|
|
|
mv t3, t1
|
|
mv t4, t2
|
|
oneLoopTest5:
|
|
# instruction
|
|
addi t3, t3, 1
|
|
bne t3, t4, oneLoopTest5 # this branch toggles between taken and not taken.
|
|
|
|
ret
|
|
|
|
.section .text
|
|
.globl global_hist_6_space_test
|
|
.type global_hist_6_space_test, @function
|
|
global_hist_6_space_test:
|
|
li t1, 1
|
|
li t2, 200
|
|
li t3, 0
|
|
li t4, 1
|
|
|
|
loop_6:
|
|
# instruction
|
|
addi t3, t3, 1
|
|
addi t3, t3, 1
|
|
addi t3, t3, 1
|
|
addi t3, t3, 1
|
|
addi t3, t3, 1
|
|
addi t3, t3, 1
|
|
beqz t4, zero_6 # this branch toggles between taken and not taken.
|
|
li t4, 0
|
|
j one_6
|
|
zero_6:
|
|
li t4, 1
|
|
addi t3, t3, 1
|
|
addi t3, t3, 1
|
|
addi t3, t3, 1
|
|
add t1, t1, t4
|
|
|
|
one_6:
|
|
addi t3, t3, 1
|
|
addi t3, t3, 1
|
|
addi t3, t3, 1
|
|
addi t3, t3, 1
|
|
addi t2, t2, -1
|
|
bnez t2, loop_6
|
|
|
|
ret
|
|
|
|
.section .text
|
|
.globl global_hist_4_space_test
|
|
.type global_hist_4_space_test, @function
|
|
global_hist_4_space_test:
|
|
li t1, 1
|
|
li t2, 200
|
|
li t3, 0
|
|
li t4, 1
|
|
|
|
loop_4:
|
|
# instruction
|
|
addi t3, t3, 1
|
|
addi t3, t3, 1
|
|
addi t3, t3, 1
|
|
addi t3, t3, 1
|
|
beqz t4, zero_4 # this branch toggles between taken and not taken.
|
|
li t4, 0
|
|
j one_4
|
|
zero_4:
|
|
li t4, 1
|
|
addi t3, t3, 1
|
|
add t1, t1, t4
|
|
|
|
one_4:
|
|
addi t3, t3, 1
|
|
addi t2, t2, -1
|
|
bnez t2, loop_4
|
|
|
|
ret
|
|
|
|
.section .text
|
|
.globl global_hist_3_space_test
|
|
.type global_hist_3_space_test, @function
|
|
global_hist_3_space_test:
|
|
li t1, 1
|
|
li t2, 200
|
|
li t3, 0
|
|
li t4, 1
|
|
|
|
loop_3:
|
|
# instruction
|
|
addi t3, t3, 1
|
|
addi t3, t3, 1
|
|
addi t3, t3, 1
|
|
addi t3, t3, 1
|
|
beqz t4, zero_3 # this branch toggles between taken and not taken.
|
|
li t4, 0
|
|
j one_3
|
|
zero_3:
|
|
li t4, 1
|
|
addi t3, t3, 1
|
|
add t1, t1, t4
|
|
|
|
one_3:
|
|
addi t3, t3, 1
|
|
addi t2, t2, -1
|
|
bnez t2, loop_3
|
|
|
|
ret
|
|
|
|
|
|
.section .text
|
|
.globl global_hist_2_space_test
|
|
.type global_hist_2_space_test, @function
|
|
global_hist_2_space_test:
|
|
li t1, 1
|
|
li t2, 200
|
|
li t3, 0
|
|
li t4, 1
|
|
|
|
loop_2:
|
|
# instruction
|
|
addi t3, t3, 1
|
|
addi t3, t3, 1
|
|
beqz t4, zero_2 # this branch toggles between taken and not taken.
|
|
li t4, 0
|
|
j one_2
|
|
zero_2:
|
|
li t4, 1
|
|
add t1, t1, t4
|
|
|
|
one_2:
|
|
addi t2, t2, -1
|
|
bnez t2, loop_2
|
|
|
|
ret
|
|
|
|
.section .text
|
|
.globl global_hist_1_space_test
|
|
.type global_hist_1_space_test, @function
|
|
global_hist_1_space_test:
|
|
li t1, 1
|
|
li t2, 200
|
|
li t3, 0
|
|
li t4, 1
|
|
|
|
loop_1:
|
|
# instruction
|
|
addi t3, t3, 1
|
|
beqz t4, zero_1 # this branch toggles between taken and not taken.
|
|
li t4, 0
|
|
j one_1
|
|
zero_1:
|
|
li t4, 1
|
|
add t1, t1, t4
|
|
|
|
one_1:
|
|
addi t2, t2, -1
|
|
bnez t2, loop_1
|
|
|
|
ret
|
|
|
|
.section .text
|
|
.globl global_hist_0_space_test
|
|
.type global_hist_0_space_test, @function
|
|
global_hist_0_space_test:
|
|
li t1, 1
|
|
li t2, 200
|
|
li t3, 0
|
|
li t4, 1
|
|
|
|
loop_0:
|
|
# instruction
|
|
beqz t4, zero_0 # this branch toggles between taken and not taken.
|
|
li t4, 0
|
|
j one_0
|
|
zero_0:
|
|
li t4, 1
|
|
add t1, t1, t4
|
|
|
|
one_0:
|
|
addi t2, t2, -1
|
|
bnez t2, loop_0
|
|
|
|
ret
|