112771Sqtt2@cornell.edu# See LICENSE for license details.
212771Sqtt2@cornell.edu
312771Sqtt2@cornell.edu#*****************************************************************************
412771Sqtt2@cornell.edu# lrsr.S
512771Sqtt2@cornell.edu#-----------------------------------------------------------------------------
612771Sqtt2@cornell.edu#
712771Sqtt2@cornell.edu# Test LR/SC instructions.
812771Sqtt2@cornell.edu#
912771Sqtt2@cornell.edu
1012771Sqtt2@cornell.edu#include "riscv_test.h"
1112771Sqtt2@cornell.edu#include "test_macros.h"
1212771Sqtt2@cornell.edu
1312771Sqtt2@cornell.eduRVTEST_RV64U
1412771Sqtt2@cornell.eduRVTEST_CODE_BEGIN
1512771Sqtt2@cornell.edu
1612771Sqtt2@cornell.edu# get a unique core id
1712771Sqtt2@cornell.edula a0, coreid
1812771Sqtt2@cornell.eduli a1, 1
1912771Sqtt2@cornell.eduamoadd.w a2, a1, (a0)
2012771Sqtt2@cornell.edu
2112771Sqtt2@cornell.edu# for now, only run this on core 0
2212771Sqtt2@cornell.edu1:li a3, 1
2312771Sqtt2@cornell.edubgeu a2, a3, 1b
2412771Sqtt2@cornell.edu
2512771Sqtt2@cornell.edu1: lw a1, (a0)
2612771Sqtt2@cornell.edubltu a1, a3, 1b
2712771Sqtt2@cornell.edu
2812771Sqtt2@cornell.edu# make sure that sc without a reservation fails.
2912771Sqtt2@cornell.eduTEST_CASE( 2, a4, 1, \
3012771Sqtt2@cornell.edu  la a0, foo; \
3112771Sqtt2@cornell.edu  sc.w a4, x0, (a0); \
3212771Sqtt2@cornell.edu)
3312771Sqtt2@cornell.edu
3412771Sqtt2@cornell.edu# make sure that sc with the wrong reservation fails.
3512771Sqtt2@cornell.edu# TODO is this actually mandatory behavior?
3612771Sqtt2@cornell.eduTEST_CASE( 3, a4, 1, \
3712771Sqtt2@cornell.edu  la a0, foo; \
3812771Sqtt2@cornell.edu  add a1, a0, 1024; \
3912771Sqtt2@cornell.edu  lr.w a1, (a1); \
4012771Sqtt2@cornell.edu  sc.w a4, a1, (a0); \
4112771Sqtt2@cornell.edu)
4212771Sqtt2@cornell.edu
4312771Sqtt2@cornell.edu#define LOG_ITERATIONS 10
4412771Sqtt2@cornell.edu
4512771Sqtt2@cornell.edu# have each core add its coreid+1 to foo 1024 times
4612771Sqtt2@cornell.edula a0, foo
4712771Sqtt2@cornell.eduli a1, 1<<LOG_ITERATIONS
4812771Sqtt2@cornell.eduaddi a2, a2, 1
4912771Sqtt2@cornell.edu1: lr.w a4, (a0)
5012771Sqtt2@cornell.eduadd a4, a4, a2
5112771Sqtt2@cornell.edusc.w a4, a4, (a0)
5212771Sqtt2@cornell.edubnez a4, 1b
5312771Sqtt2@cornell.eduadd a1, a1, -1
5412771Sqtt2@cornell.edubnez a1, 1b
5512771Sqtt2@cornell.edu
5612771Sqtt2@cornell.edu# wait for all cores to finish
5712771Sqtt2@cornell.edula a0, barrier
5812771Sqtt2@cornell.eduli a1, 1
5912771Sqtt2@cornell.eduamoadd.w x0, a1, (a0)
6012771Sqtt2@cornell.edu1: lw a1, (a0)
6112771Sqtt2@cornell.edublt a1, a3, 1b
6212771Sqtt2@cornell.edufence
6312771Sqtt2@cornell.edu
6412771Sqtt2@cornell.edu# expected result is 512*ncores*(ncores+1)
6512771Sqtt2@cornell.eduTEST_CASE( 4, a0, 0, \
6612771Sqtt2@cornell.edu  lw a0, foo; \
6712771Sqtt2@cornell.edu  slli a1, a3, LOG_ITERATIONS-1; \
6812771Sqtt2@cornell.edu1:sub a0, a0, a1; \
6912771Sqtt2@cornell.edu  addi a3, a3, -1; \
7012771Sqtt2@cornell.edu  bgez a3, 1b
7112771Sqtt2@cornell.edu)
7212771Sqtt2@cornell.edu
7312771Sqtt2@cornell.eduTEST_PASSFAIL
7412771Sqtt2@cornell.edu
7512771Sqtt2@cornell.eduRVTEST_CODE_END
7612771Sqtt2@cornell.edu
7712771Sqtt2@cornell.edu  .data
7812771Sqtt2@cornell.eduRVTEST_DATA_BEGIN
7912771Sqtt2@cornell.edu
8012771Sqtt2@cornell.edu  TEST_DATA
8112771Sqtt2@cornell.edu
8212771Sqtt2@cornell.educoreid: .word 0
8312771Sqtt2@cornell.edubarrier: .word 0
8412771Sqtt2@cornell.edufoo: .word 0
8512771Sqtt2@cornell.eduRVTEST_DATA_END
86