summaryrefslogtreecommitdiffstats
path: root/llvm/test/MC/RISCV
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/test/MC/RISCV')
-rw-r--r--llvm/test/MC/RISCV/rv32a-invalid.s7
-rw-r--r--llvm/test/MC/RISCV/rv64a-aliases-valid.s189
-rw-r--r--llvm/test/MC/RISCV/rv64a-invalid.s7
-rw-r--r--llvm/test/MC/RISCV/rva-aliases-invalid.s94
-rw-r--r--llvm/test/MC/RISCV/rva-aliases-valid.s297
5 files changed, 588 insertions, 6 deletions
diff --git a/llvm/test/MC/RISCV/rv32a-invalid.s b/llvm/test/MC/RISCV/rv32a-invalid.s
index 8ee21bc501b..34d51fc30ca 100644
--- a/llvm/test/MC/RISCV/rv32a-invalid.s
+++ b/llvm/test/MC/RISCV/rv32a-invalid.s
@@ -1,9 +1,10 @@
# RUN: not llvm-mc -triple riscv32 -mattr=+a < %s 2>&1 | FileCheck %s
# Final operand must have parentheses
-amoswap.w a1, a2, a3 # CHECK: :[[@LINE]]:19: error: invalid operand for instruction
-amomin.w a1, a2, 1 # CHECK: :[[@LINE]]:18: error: invalid operand for instruction
-lr.w a4, a5 # CHECK: :[[@LINE]]:10: error: invalid operand for instruction
+amoswap.w a1, a2, a3 # CHECK: :[[@LINE]]:19: error: expected '(' or optional integer offset
+amomin.w a1, a2, 1 # CHECK: :[[@LINE]]:20: error: expected '(' after optional integer offset
+amomin.w a1, a2, 1(a3) # CHECK: :[[@LINE]]:18: error: optional integer offset must be 0
+lr.w a4, a5 # CHECK: :[[@LINE]]:10: error: expected '(' or optional integer offset
# Only .aq, .rl, and .aqrl suffixes are valid
amoxor.w.rlqa a2, a3, (a4) # CHECK: :[[@LINE]]:1: error: unrecognized instruction mnemonic
diff --git a/llvm/test/MC/RISCV/rv64a-aliases-valid.s b/llvm/test/MC/RISCV/rv64a-aliases-valid.s
new file mode 100644
index 00000000000..84f911506ec
--- /dev/null
+++ b/llvm/test/MC/RISCV/rv64a-aliases-valid.s
@@ -0,0 +1,189 @@
+# RUN: llvm-mc %s -triple=riscv64 -mattr=+a -riscv-no-aliases \
+# RUN: | FileCheck -check-prefix=CHECK-INST %s
+# RUN: llvm-mc %s -triple=riscv64 -mattr=+a \
+# RUN: | FileCheck -check-prefix=CHECK-ALIAS %s
+# RUN: llvm-mc -filetype=obj -triple riscv64 -mattr=+a < %s \
+# RUN: | llvm-objdump -d -mattr=+a -riscv-no-aliases - \
+# RUN: | FileCheck -check-prefix=CHECK-INST %s
+# RUN: llvm-mc -filetype=obj -triple riscv64 -mattr=+a < %s \
+# RUN: | llvm-objdump -d -mattr=+a - \
+# RUN: | FileCheck -check-prefix=CHECK-ALIAS %s
+
+# The below tests for lr.d, sc.d and amo*.d, using `0(reg)` are actually
+# implemented using a custom parser, but we test them as if they're aliases.
+
+# CHECK-INST: lr.d a1, (a0)
+# CHECK-ALIAS: lr.d a1, (a0)
+lr.d a1, 0(a0)
+
+# CHECK-INST: lr.d.aq a1, (a0)
+# CHECK-ALIAS: lr.d.aq a1, (a0)
+lr.d.aq a1, 0(a0)
+
+# CHECK-INST: lr.d.rl a1, (a0)
+# CHECK-ALIAS: lr.d.rl a1, (a0)
+lr.d.rl a1, 0(a0)
+
+# CHECK-INST: lr.d.aqrl a1, (a0)
+# CHECK-ALIAS: lr.d.aqrl a1, (a0)
+lr.d.aqrl a1, 0(a0)
+
+# CHECK-INST: sc.d a2, a1, (a0)
+# CHECK-ALIAS: sc.d a2, a1, (a0)
+sc.d a2, a1, 0(a0)
+
+# CHECK-INST: sc.d.aq a2, a1, (a0)
+# CHECK-ALIAS: sc.d.aq a2, a1, (a0)
+sc.d.aq a2, a1, 0(a0)
+
+# CHECK-INST: sc.d.rl a2, a1, (a0)
+# CHECK-ALIAS: sc.d.rl a2, a1, (a0)
+sc.d.rl a2, a1, 0(a0)
+
+# CHECK-INST: sc.d.aqrl a2, a1, (a0)
+# CHECK-ALIAS: sc.d.aqrl a2, a1, (a0)
+sc.d.aqrl a2, a1, 0(a0)
+
+# CHECK-INST: amoswap.d a2, a1, (a0)
+# CHECK-ALIAS: amoswap.d a2, a1, (a0)
+amoswap.d a2, a1, 0(a0)
+
+# CHECK-INST: amoswap.d.aq a2, a1, (a0)
+# CHECK-ALIAS: amoswap.d.aq a2, a1, (a0)
+amoswap.d.aq a2, a1, 0(a0)
+
+# CHECK-INST: amoswap.d.rl a2, a1, (a0)
+# CHECK-ALIAS: amoswap.d.rl a2, a1, (a0)
+amoswap.d.rl a2, a1, 0(a0)
+
+# CHECK-INST: amoswap.d.aqrl a2, a1, (a0)
+# CHECK-ALIAS: amoswap.d.aqrl a2, a1, (a0)
+amoswap.d.aqrl a2, a1, 0(a0)
+
+# CHECK-INST: amoadd.d a2, a1, (a0)
+# CHECK-ALIAS: amoadd.d a2, a1, (a0)
+amoadd.d a2, a1, 0(a0)
+
+# CHECK-INST: amoadd.d.aq a2, a1, (a0)
+# CHECK-ALIAS: amoadd.d.aq a2, a1, (a0)
+amoadd.d.aq a2, a1, 0(a0)
+
+# CHECK-INST: amoadd.d.rl a2, a1, (a0)
+# CHECK-ALIAS: amoadd.d.rl a2, a1, (a0)
+amoadd.d.rl a2, a1, 0(a0)
+
+# CHECK-INST: amoadd.d.aqrl a2, a1, (a0)
+# CHECK-ALIAS: amoadd.d.aqrl a2, a1, (a0)
+amoadd.d.aqrl a2, a1, 0(a0)
+
+# CHECK-INST: amoxor.d a2, a1, (a0)
+# CHECK-ALIAS: amoxor.d a2, a1, (a0)
+amoxor.d a2, a1, 0(a0)
+
+# CHECK-INST: amoxor.d.aq a2, a1, (a0)
+# CHECK-ALIAS: amoxor.d.aq a2, a1, (a0)
+amoxor.d.aq a2, a1, 0(a0)
+
+# CHECK-INST: amoxor.d.rl a2, a1, (a0)
+# CHECK-ALIAS: amoxor.d.rl a2, a1, (a0)
+amoxor.d.rl a2, a1, 0(a0)
+
+# CHECK-INST: amoxor.d.aqrl a2, a1, (a0)
+# CHECK-ALIAS: amoxor.d.aqrl a2, a1, (a0)
+amoxor.d.aqrl a2, a1, 0(a0)
+
+# CHECK-INST: amoand.d a2, a1, (a0)
+# CHECK-ALIAS: amoand.d a2, a1, (a0)
+amoand.d a2, a1, 0(a0)
+
+# CHECK-INST: amoand.d.aq a2, a1, (a0)
+# CHECK-ALIAS: amoand.d.aq a2, a1, (a0)
+amoand.d.aq a2, a1, 0(a0)
+
+# CHECK-INST: amoand.d.rl a2, a1, (a0)
+# CHECK-ALIAS: amoand.d.rl a2, a1, (a0)
+amoand.d.rl a2, a1, 0(a0)
+
+# CHECK-INST: amoand.d.aqrl a2, a1, (a0)
+# CHECK-ALIAS: amoand.d.aqrl a2, a1, (a0)
+amoand.d.aqrl a2, a1, 0(a0)
+
+# CHECK-INST: amoor.d a2, a1, (a0)
+# CHECK-ALIAS: amoor.d a2, a1, (a0)
+amoor.d a2, a1, 0(a0)
+
+# CHECK-INST: amoor.d.aq a2, a1, (a0)
+# CHECK-ALIAS: amoor.d.aq a2, a1, (a0)
+amoor.d.aq a2, a1, 0(a0)
+
+# CHECK-INST: amoor.d.rl a2, a1, (a0)
+# CHECK-ALIAS: amoor.d.rl a2, a1, (a0)
+amoor.d.rl a2, a1, 0(a0)
+
+# CHECK-INST: amoor.d.aqrl a2, a1, (a0)
+# CHECK-ALIAS: amoor.d.aqrl a2, a1, (a0)
+amoor.d.aqrl a2, a1, 0(a0)
+
+# CHECK-INST: amomin.d a2, a1, (a0)
+# CHECK-ALIAS: amomin.d a2, a1, (a0)
+amomin.d a2, a1, 0(a0)
+
+# CHECK-INST: amomin.d.aq a2, a1, (a0)
+# CHECK-ALIAS: amomin.d.aq a2, a1, (a0)
+amomin.d.aq a2, a1, 0(a0)
+
+# CHECK-INST: amomin.d.rl a2, a1, (a0)
+# CHECK-ALIAS: amomin.d.rl a2, a1, (a0)
+amomin.d.rl a2, a1, 0(a0)
+
+# CHECK-INST: amomin.d.aqrl a2, a1, (a0)
+# CHECK-ALIAS: amomin.d.aqrl a2, a1, (a0)
+amomin.d.aqrl a2, a1, 0(a0)
+
+# CHECK-INST: amomax.d a2, a1, (a0)
+# CHECK-ALIAS: amomax.d a2, a1, (a0)
+amomax.d a2, a1, 0(a0)
+
+# CHECK-INST: amomax.d.aq a2, a1, (a0)
+# CHECK-ALIAS: amomax.d.aq a2, a1, (a0)
+amomax.d.aq a2, a1, 0(a0)
+
+# CHECK-INST: amomax.d.rl a2, a1, (a0)
+# CHECK-ALIAS: amomax.d.rl a2, a1, (a0)
+amomax.d.rl a2, a1, 0(a0)
+
+# CHECK-INST: amomax.d.aqrl a2, a1, (a0)
+# CHECK-ALIAS: amomax.d.aqrl a2, a1, (a0)
+amomax.d.aqrl a2, a1, 0(a0)
+
+# CHECK-INST: amominu.d a2, a1, (a0)
+# CHECK-ALIAS: amominu.d a2, a1, (a0)
+amominu.d a2, a1, 0(a0)
+
+# CHECK-INST: amominu.d.aq a2, a1, (a0)
+# CHECK-ALIAS: amominu.d.aq a2, a1, (a0)
+amominu.d.aq a2, a1, 0(a0)
+
+# CHECK-INST: amominu.d.rl a2, a1, (a0)
+# CHECK-ALIAS: amominu.d.rl a2, a1, (a0)
+amominu.d.rl a2, a1, 0(a0)
+
+# CHECK-INST: amominu.d.aqrl a2, a1, (a0)
+# CHECK-ALIAS: amominu.d.aqrl a2, a1, (a0)
+amominu.d.aqrl a2, a1, 0(a0)
+
+# CHECK-INST: amomaxu.d a2, a1, (a0)
+# CHECK-ALIAS: amomaxu.d a2, a1, (a0)
+amomaxu.d a2, a1, 0(a0)
+
+# CHECK-INST: amomaxu.d.aq a2, a1, (a0)
+# CHECK-ALIAS: amomaxu.d.aq a2, a1, (a0)
+amomaxu.d.aq a2, a1, 0(a0)
+
+# CHECK-INST: amomaxu.d.rl a2, a1, (a0)
+# CHECK-ALIAS: amomaxu.d.rl a2, a1, (a0)
+amomaxu.d.rl a2, a1, 0(a0)
+
+# CHECK-INST: amomaxu.d.aqrl a2, a1, (a0)
+# CHECK-ALIAS: amomaxu.d.aqrl a2, a1, (a0)
+amomaxu.d.aqrl a2, a1, 0(a0)
diff --git a/llvm/test/MC/RISCV/rv64a-invalid.s b/llvm/test/MC/RISCV/rv64a-invalid.s
index 7ab89ff9994..2816f434e47 100644
--- a/llvm/test/MC/RISCV/rv64a-invalid.s
+++ b/llvm/test/MC/RISCV/rv64a-invalid.s
@@ -1,9 +1,10 @@
# RUN: not llvm-mc -triple riscv64 -mattr=+a < %s 2>&1 | FileCheck %s
# Final operand must have parentheses
-amoswap.d a1, a2, a3 # CHECK: :[[@LINE]]:19: error: invalid operand for instruction
-amomin.d a1, a2, 1 # CHECK: :[[@LINE]]:18: error: invalid operand for instruction
-lr.d a4, a5 # CHECK: :[[@LINE]]:10: error: invalid operand for instruction
+amoswap.d a1, a2, a3 # CHECK: :[[@LINE]]:19: error: expected '(' or optional integer offset
+amomin.d a1, a2, 1 # CHECK: :[[@LINE]]:20: error: expected '(' after optional integer offset
+amomin.d a1, a2, 1(a3) # CHECK: :[[@LINE]]:18: error: optional integer offset must be 0
+lr.d a4, a5 # CHECK: :[[@LINE]]:10: error: expected '(' or optional integer offset
# Only .aq, .rl, and .aqrl suffixes are valid
amoxor.d.rlqa a2, a3, (a4) # CHECK: :[[@LINE]]:1: error: unrecognized instruction mnemonic
diff --git a/llvm/test/MC/RISCV/rva-aliases-invalid.s b/llvm/test/MC/RISCV/rva-aliases-invalid.s
new file mode 100644
index 00000000000..ef101e25814
--- /dev/null
+++ b/llvm/test/MC/RISCV/rva-aliases-invalid.s
@@ -0,0 +1,94 @@
+# RUN: not llvm-mc %s -triple=riscv32 2>&1 | FileCheck %s
+# RUN: not llvm-mc %s -triple=riscv64 2>&1 | FileCheck %s
+
+# The below tests for lr(.w), sc(.w) and amo*(.w), using `0(reg)` are actually
+# implemented using a custom parser. These tests ensure the custom parser gives
+# good error messages.
+
+lr.w a1, a0 # CHECK: :[[@LINE]]:10: error: expected '(' or optional integer offset
+lr.w a1, foo # CHECK: :[[@LINE]]:10: error: expected '(' or optional integer offset
+lr.w a1, 1(a0) # CHECK: :[[@LINE]]:10: error: optional integer offset must be 0
+lr.w a1, (foo) # CHECK: :[[@LINE]]:11: error: expected register
+lr.w a1, 0(foo) # CHECK: :[[@LINE]]:12: error: expected register
+lr.w a1, 0(a0 # CHECK: :[[@LINE]]:17: error: expected ')'
+lr.w a1, (a0 # CHECK: :[[@LINE]]:17: error: expected ')'
+
+sc.w a2, a1, a0 # CHECK: :[[@LINE]]:14: error: expected '(' or optional integer offset
+sc.w a2, a1, foo # CHECK: :[[@LINE]]:14: error: expected '(' or optional integer offset
+sc.w a2, a1, 1(a0) # CHECK: :[[@LINE]]:14: error: optional integer offset must be 0
+sc.w a2, a1, (foo) # CHECK: :[[@LINE]]:15: error: expected register
+sc.w a2, a1, 0(foo) # CHECK: :[[@LINE]]:16: error: expected register
+sc.w a2, a1, 0(a0 # CHECK: :[[@LINE]]:21: error: expected ')'
+sc.w a2, a1, (a0 # CHECK: :[[@LINE]]:21: error: expected ')'
+
+amoswap.w a2, a1, a0 # CHECK: :[[@LINE]]:19: error: expected '(' or optional integer offset
+amoswap.w a2, a1, foo # CHECK: :[[@LINE]]:19: error: expected '(' or optional integer offset
+amoswap.w a2, a1, 1(a0) # CHECK: :[[@LINE]]:19: error: optional integer offset must be 0
+amoswap.w a2, a1, (foo) # CHECK: :[[@LINE]]:20: error: expected register
+amoswap.w a2, a1, 0(foo) # CHECK: :[[@LINE]]:21: error: expected register
+amoswap.w a2, a1, 0(a0 # CHECK: :[[@LINE]]:26: error: expected ')'
+amoswap.w a2, a1, (a0 # CHECK: :[[@LINE]]:26: error: expected ')'
+
+amoadd.w a2, a1, a0 # CHECK: :[[@LINE]]:18: error: expected '(' or optional integer offset
+amoadd.w a2, a1, foo # CHECK: :[[@LINE]]:18: error: expected '(' or optional integer offset
+amoadd.w a2, a1, 1(a0) # CHECK: :[[@LINE]]:18: error: optional integer offset must be 0
+amoadd.w a2, a1, (foo) # CHECK: :[[@LINE]]:19: error: expected register
+amoadd.w a2, a1, 0(foo) # CHECK: :[[@LINE]]:20: error: expected register
+amoadd.w a2, a1, 0(a0 # CHECK: :[[@LINE]]:25: error: expected ')'
+amoadd.w a2, a1, (a0 # CHECK: :[[@LINE]]:25: error: expected ')'
+
+amoxor.w a2, a1, a0 # CHECK: :[[@LINE]]:18: error: expected '(' or optional integer offset
+amoxor.w a2, a1, foo # CHECK: :[[@LINE]]:18: error: expected '(' or optional integer offset
+amoxor.w a2, a1, 1(a0) # CHECK: :[[@LINE]]:18: error: optional integer offset must be 0
+amoxor.w a2, a1, (foo) # CHECK: :[[@LINE]]:19: error: expected register
+amoxor.w a2, a1, 0(foo) # CHECK: :[[@LINE]]:20: error: expected register
+amoxor.w a2, a1, 0(a0 # CHECK: :[[@LINE]]:25: error: expected ')'
+amoxor.w a2, a1, (a0 # CHECK: :[[@LINE]]:25: error: expected ')'
+
+amoand.w a2, a1, a0 # CHECK: :[[@LINE]]:18: error: expected '(' or optional integer offset
+amoand.w a2, a1, foo # CHECK: :[[@LINE]]:18: error: expected '(' or optional integer offset
+amoand.w a2, a1, 1(a0) # CHECK: :[[@LINE]]:18: error: optional integer offset must be 0
+amoand.w a2, a1, (foo) # CHECK: :[[@LINE]]:19: error: expected register
+amoand.w a2, a1, 0(foo) # CHECK: :[[@LINE]]:20: error: expected register
+amoand.w a2, a1, 0(a0 # CHECK: :[[@LINE]]:25: error: expected ')'
+amoand.w a2, a1, (a0 # CHECK: :[[@LINE]]:25: error: expected ')'
+
+amoor.w a2, a1, a0 # CHECK: :[[@LINE]]:17: error: expected '(' or optional integer offset
+amoor.w a2, a1, foo # CHECK: :[[@LINE]]:17: error: expected '(' or optional integer offset
+amoor.w a2, a1, 1(a0) # CHECK: :[[@LINE]]:17: error: optional integer offset must be 0
+amoor.w a2, a1, (foo) # CHECK: :[[@LINE]]:18: error: expected register
+amoor.w a2, a1, 0(foo) # CHECK: :[[@LINE]]:19: error: expected register
+amoor.w a2, a1, 0(a0 # CHECK: :[[@LINE]]:24: error: expected ')'
+amoor.w a2, a1, (a0 # CHECK: :[[@LINE]]:24: error: expected ')'
+
+amomin.w a2, a1, a0 # CHECK: :[[@LINE]]:18: error: expected '(' or optional integer offset
+amomin.w a2, a1, foo # CHECK: :[[@LINE]]:18: error: expected '(' or optional integer offset
+amomin.w a2, a1, 1(a0) # CHECK: :[[@LINE]]:18: error: optional integer offset must be 0
+amomin.w a2, a1, (foo) # CHECK: :[[@LINE]]:19: error: expected register
+amomin.w a2, a1, 0(foo) # CHECK: :[[@LINE]]:20: error: expected register
+amomin.w a2, a1, 0(a0 # CHECK: :[[@LINE]]:25: error: expected ')'
+amomin.w a2, a1, (a0 # CHECK: :[[@LINE]]:25: error: expected ')'
+
+amomax.w a2, a1, a0 # CHECK: :[[@LINE]]:18: error: expected '(' or optional integer offset
+amomax.w a2, a1, foo # CHECK: :[[@LINE]]:18: error: expected '(' or optional integer offset
+amomax.w a2, a1, 1(a0) # CHECK: :[[@LINE]]:18: error: optional integer offset must be 0
+amomax.w a2, a1, (foo) # CHECK: :[[@LINE]]:19: error: expected register
+amomax.w a2, a1, 0(foo) # CHECK: :[[@LINE]]:20: error: expected register
+amomax.w a2, a1, 0(a0 # CHECK: :[[@LINE]]:25: error: expected ')'
+amomax.w a2, a1, (a0 # CHECK: :[[@LINE]]:25: error: expected ')'
+
+amominu.w a2, a1, a0 # CHECK: :[[@LINE]]:19: error: expected '(' or optional integer offset
+amominu.w a2, a1, foo # CHECK: :[[@LINE]]:19: error: expected '(' or optional integer offset
+amominu.w a2, a1, 1(a0) # CHECK: :[[@LINE]]:19: error: optional integer offset must be 0
+amominu.w a2, a1, (foo) # CHECK: :[[@LINE]]:20: error: expected register
+amominu.w a2, a1, 0(foo) # CHECK: :[[@LINE]]:21: error: expected register
+amominu.w a2, a1, 0(a0 # CHECK: :[[@LINE]]:26: error: expected ')'
+amominu.w a2, a1, (a0 # CHECK: :[[@LINE]]:26: error: expected ')'
+
+amomaxu.w a2, a1, a0 # CHECK: :[[@LINE]]:19: error: expected '(' or optional integer offset
+amomaxu.w a2, a1, foo # CHECK: :[[@LINE]]:19: error: expected '(' or optional integer offset
+amomaxu.w a2, a1, 1(a0) # CHECK: :[[@LINE]]:19: error: optional integer offset must be 0
+amomaxu.w a2, a1, (foo) # CHECK: :[[@LINE]]:20: error: expected register
+amomaxu.w a2, a1, 0(foo) # CHECK: :[[@LINE]]:21: error: expected register
+amomaxu.w a2, a1, 0(a0 # CHECK: :[[@LINE]]:26: error: expected ')'
+amomaxu.w a2, a1, (a0 # CHECK: :[[@LINE]]:26: error: expected ')' \ No newline at end of file
diff --git a/llvm/test/MC/RISCV/rva-aliases-valid.s b/llvm/test/MC/RISCV/rva-aliases-valid.s
new file mode 100644
index 00000000000..f6b17325812
--- /dev/null
+++ b/llvm/test/MC/RISCV/rva-aliases-valid.s
@@ -0,0 +1,297 @@
+# RUN: llvm-mc %s -triple=riscv32 -mattr=+a -riscv-no-aliases \
+# RUN: | FileCheck -check-prefixes=CHECK-S-NOALIAS,CHECK-S-OBJ-NOALIAS %s
+# RUN: llvm-mc %s -triple=riscv32 -mattr=+a \
+# RUN: | FileCheck -check-prefixes=CHECK-S,CHECK-S-OBJ %s
+# RUN: llvm-mc %s -triple=riscv64 -mattr=+a -riscv-no-aliases\
+# RUN: | FileCheck -check-prefixes=CHECK-S-NOALIAS,CHECK-S-OBJ-NOALIAS %s
+# RUN: llvm-mc %s -triple=riscv64 -mattr=+a \
+# RUN: | FileCheck -check-prefixes=CHECK-S,CHECK-S-OBJ %s
+# RUN: llvm-mc -filetype=obj -triple riscv32 -mattr=+a < %s \
+# RUN: | llvm-objdump -d -mattr=+a -riscv-no-aliases - \
+# RUN: | FileCheck -check-prefixes=CHECK-OBJ-NOALIAS,CHECK-S-OBJ-NOALIAS %s
+# RUN: llvm-mc -filetype=obj -triple riscv32 -mattr=+a < %s \
+# RUN: | llvm-objdump -d -mattr=+a - \
+# RUN: | FileCheck -check-prefixes=CHECK-OBJ,CHECK-S-OBJ %s
+# RUN: llvm-mc -filetype=obj -triple riscv64 -mattr=+a < %s \
+# RUN: | llvm-objdump -d -mattr=+a -riscv-no-aliases - \
+# RUN: | FileCheck -check-prefixes=CHECK-OBJ-NOALIAS,CHECK-S-OBJ-NOALIAS %s
+# RUN: llvm-mc -filetype=obj -triple riscv64 -mattr=+a < %s \
+# RUN: | llvm-objdump -d -mattr=+a - \
+# RUN: | FileCheck -check-prefixes=CHECK-OBJ,CHECK-S-OBJ %s
+
+# The following check prefixes are used in this test:
+# CHECK-S Match the .s output with aliases enabled
+# CHECK-S-NOALIAS Match the .s output with aliases disabled
+# CHECK-OBJ Match the objdumped object output with aliases enabled
+# CHECK-OBJ-NOALIAS Match the objdumped object output with aliases enabled
+# CHECK-S-OBJ Match both the .s and objdumped object output with
+# aliases enabled
+# CHECK-S-OBJ-NOALIAS Match both the .s and objdumped object output with
+# aliases disabled
+
+# The below tests for lr.w, sc.w and amo*.w, using `0(reg)` are actually
+# implemented using a custom parser, but we test them as if they're aliases.
+
+# CHECK-S: lr.w a1, (a0)
+# CHECK-S-NOALIAS: lr.w a1, (a0)
+# CHECK-OBJ: lr.w a1, (a0)
+# CHECK-OBJ-NOALIAS: lr.w a1, (a0)
+lr.w a1, 0(a0)
+
+# CHECK-S: lr.w.aq a1, (a0)
+# CHECK-S-NOALIAS: lr.w.aq a1, (a0)
+# CHECK-OBJ: lr.w.aq a1, (a0)
+# CHECK-OBJ-NOALIAS: lr.w.aq a1, (a0)
+lr.w.aq a1, 0(a0)
+
+# CHECK-S: lr.w.rl a1, (a0)
+# CHECK-S-NOALIAS: lr.w.rl a1, (a0)
+# CHECK-OBJ: lr.w.rl a1, (a0)
+# CHECK-OBJ-NOALIAS: lr.w.rl a1, (a0)
+lr.w.rl a1, 0(a0)
+
+# CHECK-S: lr.w.aqrl a1, (a0)
+# CHECK-S-NOALIAS: lr.w.aqrl a1, (a0)
+# CHECK-OBJ: lr.w.aqrl a1, (a0)
+# CHECK-OBJ-NOALIAS: lr.w.aqrl a1, (a0)
+lr.w.aqrl a1, 0(a0)
+
+# CHECK-S: sc.w a2, a1, (a0)
+# CHECK-S-NOALIAS: sc.w a2, a1, (a0)
+# CHECK-OBJ: sc.w a2, a1, (a0)
+# CHECK-OBJ-NOALIAS: sc.w a2, a1, (a0)
+sc.w a2, a1, 0(a0)
+
+# CHECK-S: sc.w.aq a2, a1, (a0)
+# CHECK-S-NOALIAS: sc.w.aq a2, a1, (a0)
+# CHECK-OBJ: sc.w.aq a2, a1, (a0)
+# CHECK-OBJ-NOALIAS: sc.w.aq a2, a1, (a0)
+sc.w.aq a2, a1, 0(a0)
+
+# CHECK-S: sc.w.rl a2, a1, (a0)
+# CHECK-S-NOALIAS: sc.w.rl a2, a1, (a0)
+# CHECK-OBJ: sc.w.rl a2, a1, (a0)
+# CHECK-OBJ-NOALIAS: sc.w.rl a2, a1, (a0)
+sc.w.rl a2, a1, 0(a0)
+
+# CHECK-S: sc.w.aqrl a2, a1, (a0)
+# CHECK-S-NOALIAS: sc.w.aqrl a2, a1, (a0)
+# CHECK-OBJ: sc.w.aqrl a2, a1, (a0)
+# CHECK-OBJ-NOALIAS: sc.w.aqrl a2, a1, (a0)
+sc.w.aqrl a2, a1, 0(a0)
+
+# CHECK-S: amoswap.w a2, a1, (a0)
+# CHECK-S-NOALIAS: amoswap.w a2, a1, (a0)
+# CHECK-OBJ: amoswap.w a2, a1, (a0)
+# CHECK-OBJ-NOALIAS: amoswap.w a2, a1, (a0)
+amoswap.w a2, a1, 0(a0)
+
+# CHECK-S: amoswap.w.aq a2, a1, (a0)
+# CHECK-S-NOALIAS: amoswap.w.aq a2, a1, (a0)
+# CHECK-OBJ: amoswap.w.aq a2, a1, (a0)
+# CHECK-OBJ-NOALIAS: amoswap.w.aq a2, a1, (a0)
+amoswap.w.aq a2, a1, 0(a0)
+
+# CHECK-S: amoswap.w.rl a2, a1, (a0)
+# CHECK-S-NOALIAS: amoswap.w.rl a2, a1, (a0)
+# CHECK-OBJ: amoswap.w.rl a2, a1, (a0)
+# CHECK-OBJ-NOALIAS: amoswap.w.rl a2, a1, (a0)
+amoswap.w.rl a2, a1, 0(a0)
+
+# CHECK-S: amoswap.w.aqrl a2, a1, (a0)
+# CHECK-S-NOALIAS: amoswap.w.aqrl a2, a1, (a0)
+# CHECK-OBJ: amoswap.w.aqrl a2, a1, (a0)
+# CHECK-OBJ-NOALIAS: amoswap.w.aqrl a2, a1, (a0)
+amoswap.w.aqrl a2, a1, 0(a0)
+
+# CHECK-S: amoadd.w a2, a1, (a0)
+# CHECK-S-NOALIAS: amoadd.w a2, a1, (a0)
+# CHECK-OBJ: amoadd.w a2, a1, (a0)
+# CHECK-OBJ-NOALIAS: amoadd.w a2, a1, (a0)
+amoadd.w a2, a1, 0(a0)
+
+# CHECK-S: amoadd.w.aq a2, a1, (a0)
+# CHECK-S-NOALIAS: amoadd.w.aq a2, a1, (a0)
+# CHECK-OBJ: amoadd.w.aq a2, a1, (a0)
+# CHECK-OBJ-NOALIAS: amoadd.w.aq a2, a1, (a0)
+amoadd.w.aq a2, a1, 0(a0)
+
+# CHECK-S: amoadd.w.rl a2, a1, (a0)
+# CHECK-S-NOALIAS: amoadd.w.rl a2, a1, (a0)
+# CHECK-OBJ: amoadd.w.rl a2, a1, (a0)
+# CHECK-OBJ-NOALIAS: amoadd.w.rl a2, a1, (a0)
+amoadd.w.rl a2, a1, 0(a0)
+
+# CHECK-S: amoadd.w.aqrl a2, a1, (a0)
+# CHECK-S-NOALIAS: amoadd.w.aqrl a2, a1, (a0)
+# CHECK-OBJ: amoadd.w.aqrl a2, a1, (a0)
+# CHECK-OBJ-NOALIAS: amoadd.w.aqrl a2, a1, (a0)
+amoadd.w.aqrl a2, a1, 0(a0)
+
+# CHECK-S: amoxor.w a2, a1, (a0)
+# CHECK-S-NOALIAS: amoxor.w a2, a1, (a0)
+# CHECK-OBJ: amoxor.w a2, a1, (a0)
+# CHECK-OBJ-NOALIAS: amoxor.w a2, a1, (a0)
+amoxor.w a2, a1, 0(a0)
+
+# CHECK-S: amoxor.w.aq a2, a1, (a0)
+# CHECK-S-NOALIAS: amoxor.w.aq a2, a1, (a0)
+# CHECK-OBJ: amoxor.w.aq a2, a1, (a0)
+# CHECK-OBJ-NOALIAS: amoxor.w.aq a2, a1, (a0)
+amoxor.w.aq a2, a1, 0(a0)
+
+# CHECK-S: amoxor.w.rl a2, a1, (a0)
+# CHECK-S-NOALIAS: amoxor.w.rl a2, a1, (a0)
+# CHECK-OBJ: amoxor.w.rl a2, a1, (a0)
+# CHECK-OBJ-NOALIAS: amoxor.w.rl a2, a1, (a0)
+amoxor.w.rl a2, a1, 0(a0)
+
+# CHECK-S: amoxor.w.aqrl a2, a1, (a0)
+# CHECK-S-NOALIAS: amoxor.w.aqrl a2, a1, (a0)
+# CHECK-OBJ: amoxor.w.aqrl a2, a1, (a0)
+# CHECK-OBJ-NOALIAS: amoxor.w.aqrl a2, a1, (a0)
+amoxor.w.aqrl a2, a1, 0(a0)
+
+# CHECK-S: amoand.w a2, a1, (a0)
+# CHECK-S-NOALIAS: amoand.w a2, a1, (a0)
+# CHECK-OBJ: amoand.w a2, a1, (a0)
+# CHECK-OBJ-NOALIAS: amoand.w a2, a1, (a0)
+amoand.w a2, a1, 0(a0)
+
+# CHECK-S: amoand.w.aq a2, a1, (a0)
+# CHECK-S-NOALIAS: amoand.w.aq a2, a1, (a0)
+# CHECK-OBJ: amoand.w.aq a2, a1, (a0)
+# CHECK-OBJ-NOALIAS: amoand.w.aq a2, a1, (a0)
+amoand.w.aq a2, a1, 0(a0)
+
+# CHECK-S: amoand.w.rl a2, a1, (a0)
+# CHECK-S-NOALIAS: amoand.w.rl a2, a1, (a0)
+# CHECK-OBJ: amoand.w.rl a2, a1, (a0)
+# CHECK-OBJ-NOALIAS: amoand.w.rl a2, a1, (a0)
+amoand.w.rl a2, a1, 0(a0)
+
+# CHECK-S: amoand.w.aqrl a2, a1, (a0)
+# CHECK-S-NOALIAS: amoand.w.aqrl a2, a1, (a0)
+# CHECK-OBJ: amoand.w.aqrl a2, a1, (a0)
+# CHECK-OBJ-NOALIAS: amoand.w.aqrl a2, a1, (a0)
+amoand.w.aqrl a2, a1, 0(a0)
+
+# CHECK-S: amoor.w a2, a1, (a0)
+# CHECK-S-NOALIAS: amoor.w a2, a1, (a0)
+# CHECK-OBJ: amoor.w a2, a1, (a0)
+# CHECK-OBJ-NOALIAS: amoor.w a2, a1, (a0)
+amoor.w a2, a1, 0(a0)
+
+# CHECK-S: amoor.w.aq a2, a1, (a0)
+# CHECK-S-NOALIAS: amoor.w.aq a2, a1, (a0)
+# CHECK-OBJ: amoor.w.aq a2, a1, (a0)
+# CHECK-OBJ-NOALIAS: amoor.w.aq a2, a1, (a0)
+amoor.w.aq a2, a1, 0(a0)
+
+# CHECK-S: amoor.w.rl a2, a1, (a0)
+# CHECK-S-NOALIAS: amoor.w.rl a2, a1, (a0)
+# CHECK-OBJ: amoor.w.rl a2, a1, (a0)
+# CHECK-OBJ-NOALIAS: amoor.w.rl a2, a1, (a0)
+amoor.w.rl a2, a1, 0(a0)
+
+# CHECK-S: amoor.w.aqrl a2, a1, (a0)
+# CHECK-S-NOALIAS: amoor.w.aqrl a2, a1, (a0)
+# CHECK-OBJ: amoor.w.aqrl a2, a1, (a0)
+# CHECK-OBJ-NOALIAS: amoor.w.aqrl a2, a1, (a0)
+amoor.w.aqrl a2, a1, 0(a0)
+
+# CHECK-S: amomin.w a2, a1, (a0)
+# CHECK-S-NOALIAS: amomin.w a2, a1, (a0)
+# CHECK-OBJ: amomin.w a2, a1, (a0)
+# CHECK-OBJ-NOALIAS: amomin.w a2, a1, (a0)
+amomin.w a2, a1, 0(a0)
+
+# CHECK-S: amomin.w.aq a2, a1, (a0)
+# CHECK-S-NOALIAS: amomin.w.aq a2, a1, (a0)
+# CHECK-OBJ: amomin.w.aq a2, a1, (a0)
+# CHECK-OBJ-NOALIAS: amomin.w.aq a2, a1, (a0)
+amomin.w.aq a2, a1, 0(a0)
+
+# CHECK-S: amomin.w.rl a2, a1, (a0)
+# CHECK-S-NOALIAS: amomin.w.rl a2, a1, (a0)
+# CHECK-OBJ: amomin.w.rl a2, a1, (a0)
+# CHECK-OBJ-NOALIAS: amomin.w.rl a2, a1, (a0)
+amomin.w.rl a2, a1, 0(a0)
+
+# CHECK-S: amomin.w.aqrl a2, a1, (a0)
+# CHECK-S-NOALIAS: amomin.w.aqrl a2, a1, (a0)
+# CHECK-OBJ: amomin.w.aqrl a2, a1, (a0)
+# CHECK-OBJ-NOALIAS: amomin.w.aqrl a2, a1, (a0)
+amomin.w.aqrl a2, a1, 0(a0)
+
+# CHECK-S: amomax.w a2, a1, (a0)
+# CHECK-S-NOALIAS: amomax.w a2, a1, (a0)
+# CHECK-OBJ: amomax.w a2, a1, (a0)
+# CHECK-OBJ-NOALIAS: amomax.w a2, a1, (a0)
+amomax.w a2, a1, 0(a0)
+
+# CHECK-S: amomax.w.aq a2, a1, (a0)
+# CHECK-S-NOALIAS: amomax.w.aq a2, a1, (a0)
+# CHECK-OBJ: amomax.w.aq a2, a1, (a0)
+# CHECK-OBJ-NOALIAS: amomax.w.aq a2, a1, (a0)
+amomax.w.aq a2, a1, 0(a0)
+
+# CHECK-S: amomax.w.rl a2, a1, (a0)
+# CHECK-S-NOALIAS: amomax.w.rl a2, a1, (a0)
+# CHECK-OBJ: amomax.w.rl a2, a1, (a0)
+# CHECK-OBJ-NOALIAS: amomax.w.rl a2, a1, (a0)
+amomax.w.rl a2, a1, 0(a0)
+
+# CHECK-S: amomax.w.aqrl a2, a1, (a0)
+# CHECK-S-NOALIAS: amomax.w.aqrl a2, a1, (a0)
+# CHECK-OBJ: amomax.w.aqrl a2, a1, (a0)
+# CHECK-OBJ-NOALIAS: amomax.w.aqrl a2, a1, (a0)
+amomax.w.aqrl a2, a1, 0(a0)
+
+# CHECK-S: amominu.w a2, a1, (a0)
+# CHECK-S-NOALIAS: amominu.w a2, a1, (a0)
+# CHECK-OBJ: amominu.w a2, a1, (a0)
+# CHECK-OBJ-NOALIAS: amominu.w a2, a1, (a0)
+amominu.w a2, a1, 0(a0)
+
+# CHECK-S: amominu.w.aq a2, a1, (a0)
+# CHECK-S-NOALIAS: amominu.w.aq a2, a1, (a0)
+# CHECK-OBJ: amominu.w.aq a2, a1, (a0)
+# CHECK-OBJ-NOALIAS: amominu.w.aq a2, a1, (a0)
+amominu.w.aq a2, a1, 0(a0)
+
+# CHECK-S: amominu.w.rl a2, a1, (a0)
+# CHECK-S-NOALIAS: amominu.w.rl a2, a1, (a0)
+# CHECK-OBJ: amominu.w.rl a2, a1, (a0)
+# CHECK-OBJ-NOALIAS: amominu.w.rl a2, a1, (a0)
+amominu.w.rl a2, a1, 0(a0)
+
+# CHECK-S: amominu.w.aqrl a2, a1, (a0)
+# CHECK-S-NOALIAS: amominu.w.aqrl a2, a1, (a0)
+# CHECK-OBJ: amominu.w.aqrl a2, a1, (a0)
+# CHECK-OBJ-NOALIAS: amominu.w.aqrl a2, a1, (a0)
+amominu.w.aqrl a2, a1, 0(a0)
+
+# CHECK-S: amomaxu.w a2, a1, (a0)
+# CHECK-S-NOALIAS: amomaxu.w a2, a1, (a0)
+# CHECK-OBJ: amomaxu.w a2, a1, (a0)
+# CHECK-OBJ-NOALIAS: amomaxu.w a2, a1, (a0)
+amomaxu.w a2, a1, 0(a0)
+
+# CHECK-S: amomaxu.w.aq a2, a1, (a0)
+# CHECK-S-NOALIAS: amomaxu.w.aq a2, a1, (a0)
+# CHECK-OBJ: amomaxu.w.aq a2, a1, (a0)
+# CHECK-OBJ-NOALIAS: amomaxu.w.aq a2, a1, (a0)
+amomaxu.w.aq a2, a1, 0(a0)
+
+# CHECK-S: amomaxu.w.rl a2, a1, (a0)
+# CHECK-S-NOALIAS: amomaxu.w.rl a2, a1, (a0)
+# CHECK-OBJ: amomaxu.w.rl a2, a1, (a0)
+# CHECK-OBJ-NOALIAS: amomaxu.w.rl a2, a1, (a0)
+amomaxu.w.rl a2, a1, 0(a0)
+
+# CHECK-S: amomaxu.w.aqrl a2, a1, (a0)
+# CHECK-S-NOALIAS: amomaxu.w.aqrl a2, a1, (a0)
+# CHECK-OBJ: amomaxu.w.aqrl a2, a1, (a0)
+# CHECK-OBJ-NOALIAS: amomaxu.w.aqrl a2, a1, (a0)
+amomaxu.w.aqrl a2, a1, 0(a0)
OpenPOWER on IntegriCloud