# See LICENSE for license details. #***************************************************************************** # lrsr.S #----------------------------------------------------------------------------- # # Test LR/SC instructions. # #include "riscv_test.h" #include "test_macros.h" RVTEST_RV64U RVTEST_CODE_BEGIN # get a unique core id la a0, coreid li a1, 1 amoadd.w a2, a1, (a0) # for now, only run this on core 0 1:li a3, 1 bgeu a2, a3, 1b 1: lw a1, (a0) bltu a1, a3, 1b # make sure that sc without a reservation fails. TEST_CASE( 2, a4, 1, \ la a0, foo; \ li a5, 0xdeadbeef; \ sc.w a4, a5, (a0); \ ) # make sure the failing sc did not commit into memory TEST_CASE( 3, a4, 0, \ lw a4, foo; \ ) # # Disable test case 4 for now. It assumes a <1K reservation granule, when # in reality any size granule is valid. After discussion in issue #315, # decided to simply disable the test for now. # (See https://github.com/riscv/riscv-tests/issues/315) # ## make sure that sc with the wrong reservation fails. ## TODO is this actually mandatory behavior? #TEST_CASE( 4, a4, 1, \ # la a0, foo; \ # la a1, fooTest3; \ # lr.w a1, (a1); \ # sc.w a4, a1, (a0); \ #) #define LOG_ITERATIONS 10 # have each core add its coreid+1 to foo 1024 times la a0, foo li a1, 1<