diff options
author | Sam Elliott <selliott@lowrisc.org> | 2019-08-01 12:42:31 +0000 |
---|---|---|
committer | Sam Elliott <selliott@lowrisc.org> | 2019-08-01 12:42:31 +0000 |
commit | f596f45070a0db27c431b0585248f61a40acbb1c (patch) | |
tree | cd28e6655fd3d1b7d3a8817209372bfddbcc64e3 /llvm/test/MC/RISCV/rv64a-invalid.s | |
parent | 208ebc9e8b661d11ac6790184f17d5a1b5c368e5 (diff) | |
download | bcm5719-llvm-f596f45070a0db27c431b0585248f61a40acbb1c.tar.gz bcm5719-llvm-f596f45070a0db27c431b0585248f61a40acbb1c.zip |
[RISCV] Add Custom Parser for Atomic Memory Operands
Summary:
GCC Accepts both (reg) and 0(reg) for atomic instruction memory
operands. These instructions do not allow for an offset in their
encoding, so in the latter case, the 0 is silently dropped.
Due to how we have structured the RISCVAsmParser, the easiest way to add
support for parsing this offset is to add a custom AsmOperand and
parser. This parser drops all the parens, and just keeps the register.
This commit also adds a custom printer for these operands, which matches
the GCC canonical printer, printing both `(a0)` and `0(a0)` as `(a0)`.
Reviewers: asb, lewis-revill
Reviewed By: asb
Subscribers: s.egerton, hiraditya, rbar, johnrusso, simoncook, apazos, sabuasal, niosHD, kito-cheng, shiva0217, jrtc27, MaskRay, zzheng, edward-jones, rogfer01, MartinMosbeck, brucehoult, the_o, rkruppe, jfb, PkmX, jocewei, psnobl, benna, Jim, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D65205
llvm-svn: 367553
Diffstat (limited to 'llvm/test/MC/RISCV/rv64a-invalid.s')
-rw-r--r-- | llvm/test/MC/RISCV/rv64a-invalid.s | 7 |
1 files changed, 4 insertions, 3 deletions
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 |