mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 11:13:28 +01:00
4c3632fc8c
LLVM currently treats the first operand of MVCK as if it were a regular base+index+displacement address. However, it is in fact a base+displacement combined with a length register field. While the two might look syntactically similar, there are two semantic differences: - %r0 is a valid length register, even though it cannot be used as an index register. - In an expression with just a single register like 0(%rX), the register is treated as base with normal addresses, while it is treated as the length register (with an empty base) for MVCK. Fixed by adding a new operand parser class BDRAddr and reworking the assembler parser to distinguish between address + length register operands and regular addresses. llvm-svn: 285574
98 lines
2.5 KiB
ArmAsm
98 lines
2.5 KiB
ArmAsm
# RUN: not llvm-mc -triple s390x-linux-gnu < %s 2> %t
|
|
# RUN: FileCheck < %t %s
|
|
|
|
#CHECK: error: invalid instruction
|
|
#CHECK: foo 100, 200
|
|
#CHECK: error: unknown token in expression
|
|
#CHECK: foo 100(, 200
|
|
#CHECK: error: invalid instruction
|
|
#CHECK: foo 100(200), 300
|
|
#CHECK: error: register expected
|
|
#CHECK: foo 100(200,), 300
|
|
#CHECK: error: %r0 used in an address
|
|
#CHECK: foo 100(200,%r0), 300
|
|
#CHECK: error: invalid instruction
|
|
#CHECK: foo 100(200,%r1), 300
|
|
#CHECK: error: invalid address register
|
|
#CHECK: foo 100(%a0), 200
|
|
#CHECK: error: invalid instruction
|
|
#CHECK: foo 100(%r0), 200
|
|
#CHECK: error: %r0 used in an address
|
|
#CHECK: foo 100(%v1,%r0), 200
|
|
#CHECK: error: invalid instruction
|
|
#CHECK: foo 100(%v0,%r1), 200
|
|
#CHECK: error: invalid instruction
|
|
#CHECK: foo 100(%v31), 200
|
|
#CHECK: error: invalid address register
|
|
#CHECK: foo 100(%r1,%a0), 200
|
|
#CHECK: error: %r0 used in an address
|
|
#CHECK: foo 100(%r1,%r0), 200
|
|
#CHECK: error: unexpected token in address
|
|
#CHECK: foo 100(%r1,%r2, 200
|
|
#CHECK: error: invalid instruction
|
|
#CHECK: foo 100(%r1,%r2), 200
|
|
#CHECK: error: unexpected token in argument list
|
|
#CHECK: foo 100(%r1,%r2)(, 200
|
|
#CHECK: error: invalid instruction
|
|
#CHECK: foo %r0, 200
|
|
#CHECK: error: invalid instruction
|
|
#CHECK: foo %r15, 200
|
|
#CHECK: error: invalid register
|
|
#CHECK: foo %r16, 200
|
|
#CHECK: error: invalid instruction
|
|
#CHECK: foo %f0, 200
|
|
#CHECK: error: invalid instruction
|
|
#CHECK: foo %f15, 200
|
|
#CHECK: error: invalid register
|
|
#CHECK: foo %f16, 200
|
|
#CHECK: error: invalid instruction
|
|
#CHECK: foo %a0, 200
|
|
#CHECK: error: invalid instruction
|
|
#CHECK: foo %a15, 200
|
|
#CHECK: error: invalid register
|
|
#CHECK: foo %a16, 200
|
|
#CHECK: error: invalid instruction
|
|
#CHECK: foo %v0, 200
|
|
#CHECK: error: invalid instruction
|
|
#CHECK: foo %v31, 200
|
|
#CHECK: error: invalid register
|
|
#CHECK: foo %v32, 200
|
|
#CHECK: error: invalid register
|
|
#CHECK: foo %c, 200
|
|
#CHECK: error: invalid register
|
|
#CHECK: foo %, 200
|
|
#CHECK: error: unknown token in expression
|
|
#CHECK: foo {, 200
|
|
|
|
foo 100, 200
|
|
foo 100(, 200
|
|
foo 100(200), 300
|
|
foo 100(200,), 300
|
|
foo 100(200,%r0), 300
|
|
foo 100(200,%r1), 300
|
|
foo 100(%a0), 200
|
|
foo 100(%r0), 200
|
|
foo 100(%v1,%r0), 200
|
|
foo 100(%v0,%r1), 200
|
|
foo 100(%v31), 200
|
|
foo 100(%r1,%a0), 200
|
|
foo 100(%r1,%r0), 200
|
|
foo 100(%r1,%r2, 200
|
|
foo 100(%r1,%r2), 200
|
|
foo 100(%r1,%r2)(, 200
|
|
foo %r0, 200
|
|
foo %r15, 200
|
|
foo %r16, 200
|
|
foo %f0, 200
|
|
foo %f15, 200
|
|
foo %f16, 200
|
|
foo %a0, 200
|
|
foo %a15, 200
|
|
foo %a16, 200
|
|
foo %v0, 200
|
|
foo %v31, 200
|
|
foo %v32, 200
|
|
foo %c, 200
|
|
foo %, 200
|
|
foo {, 200
|