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