mirror of
https://github.com/Noratrieb/rustv32i.git
synced 2026-01-14 21:35:02 +01:00
69 lines
1.6 KiB
ArmAsm
69 lines
1.6 KiB
ArmAsm
# Atomic Memory Operations
|
|
|
|
#include "../helper.S"
|
|
|
|
.macro CASE_BASE inst reg mem expected_mem
|
|
li t0, 0
|
|
li t1, \mem
|
|
sw t1, (t0)
|
|
li t3, \reg
|
|
\inst t2, t3, (t0)
|
|
ASSERT_EQ t2, \mem
|
|
lw t3, (t0)
|
|
ASSERT_EQ t3, \expected_mem
|
|
.endm
|
|
|
|
.macro CASE inst reg mem expected_mem
|
|
CASE_BASE \inst, \reg, \mem, \expected_mem
|
|
CASE_BASE \inst\().aq, \reg, \mem, \expected_mem
|
|
CASE_BASE \inst\().rl, \reg, \mem, \expected_mem
|
|
CASE_BASE \inst\().aqrl, \reg, \mem, \expected_mem
|
|
.endm
|
|
|
|
START_TEST
|
|
.macro CASE_AMOSWAP a:req b:req
|
|
CASE amoswap.w, \a, \b, \a
|
|
.endm
|
|
WITH_TWO_TEST_NUMBERS CASE_AMOSWAP
|
|
|
|
.macro CASE_AMOADD a:req b:req
|
|
CASE amoadd.w, \a, \b, \a + \b
|
|
.endm
|
|
WITH_TWO_TEST_NUMBERS CASE_AMOADD
|
|
|
|
.macro CASE_AMOAND a:req b:req
|
|
CASE amoand.w, \a, \b, \a & \b
|
|
.endm
|
|
WITH_TWO_TEST_NUMBERS CASE_AMOAND
|
|
|
|
.macro CASE_AMOOR a:req b:req
|
|
CASE amoor.w, \a, \b, \a | \b
|
|
.endm
|
|
WITH_TWO_TEST_NUMBERS CASE_AMOOR
|
|
|
|
.macro CASE_AMOXOR a:req b:req
|
|
CASE amoxor.w, \a, \b, \a ^ \b
|
|
.endm
|
|
WITH_TWO_TEST_NUMBERS CASE_AMOXOR
|
|
|
|
CASE amomax.w, 0, 0, 0
|
|
CASE amomax.w, 0, 1, 1
|
|
CASE amomax.w, -1, 0, 0
|
|
CASE amomax.w 100, -100, 100
|
|
|
|
CASE amomaxu.w, 0, 0, 0
|
|
CASE amomaxu.w, 0, 1, 1
|
|
CASE amomaxu.w, -1, 0, -1
|
|
CASE amomaxu.w 100, -100, -100
|
|
|
|
CASE amomin.w, 0, 0, 0
|
|
CASE amomin.w, 0, 1, 0
|
|
CASE amomin.w, -1, 0, -1
|
|
CASE amomin.w 100, -100, -100
|
|
|
|
CASE amominu.w, 0, 0, 0
|
|
CASE amominu.w, 0, 1, 0
|
|
CASE amominu.w, -1, 0, 0
|
|
CASE amominu.w 100, -100, 100
|
|
|
|
PASS
|