Files
clang-p2996/llvm/test/MC/PowerPC/ppc64-errors.s
Nemanja Ivanovic d6c0ef7887 [PowerPC] Handle base load with reservation mnemonic
The Power ISA defined l[bhwdq]arx as both base and
extended mnemonics. The base mnemonic takes the EH
bit as an operand and the extended mnemonic omits
it, making it implicitly zero. The existing
implementation only handles the base mnemonic when
EH is 1 and internally produces a different
instruction. There are historical reasons for this.
This patch simply removes the limitation introduced
by this implementation that disallows the base
mnemonic with EH = 0 in the ASM parser.

This resolves an issue that prevented some files
in the Linux kernel from being built with
-fintegrated-as.

Also fix a crash if the value is not an integer immediate.
2021-12-03 09:13:02 -06:00

146 lines
3.6 KiB
ArmAsm

# RUN: not llvm-mc -triple powerpc64-unknown-unknown < %s 2> %t
# RUN: FileCheck < %t %s
# RUN: not llvm-mc -triple powerpc64le-unknown-unknown < %s 2> %t
# RUN: FileCheck < %t %s
# Register operands
# CHECK: error: invalid operand for instruction
# CHECK-NEXT: add 32, 32, 32
add 32, 32, 32
# CHECK: error: invalid register name
# CHECK-NEXT: add %r32, %r32, %r32
add %r32, %r32, %r32
# TLS register operands
# CHECK: error: invalid operand for instruction
# CHECK-NEXT: add 3, symbol@tls, 4
add 3, symbol@tls, 4
# CHECK: error: invalid operand for instruction
# CHECK-NEXT: subf 3, 4, symbol@tls
subf 3, 4, symbol@tls
# Unsigned 1-bit immediate operands
# CHECK: error: invalid operand for instruction
# CHECK-NEXT: mtmsr 1, 2
mtmsr 1, 2
# CHECK: error: invalid operand for instruction
# CHECK-NEXT: mtmsrd 1, 2
mtmsrd 1, 2
# CHECK: error: invalid operand for instruction
# CHECK-NEXT: mtfsf 1, 2, 2, 1
mtfsf 1, 2, 2, 1
# CHECK: error: invalid operand for instruction
# CHECK-NEXT: mtfsf. 1, 2, 2, 1
mtfsf. 1, 2, 2, 1
# Unsigned 2-bit immediate operands
# CHECK: error: invalid operand for instruction
# CHECK-NEXT: darn 1, 4
darn 1, 4
# CHECK: error: invalid operand for instruction
# CHECK-NEXT: wait 4
wait 4
# CHECK: error: invalid operand for instruction
# CHECK-NEXT: sync 4
sync 4
# Unsigned 3-bit immediate operands
# CHECK: error: invalid operand for instruction
# CHECK-NEXT: dcbf 0, 1, 8
dcbf 0, 1, 8
# Signed 16-bit immediate operands
# CHECK: error: invalid operand for instruction
# CHECK-NEXT: addi 1, 0, -32769
addi 1, 0, -32769
# CHECK: error: invalid operand for instruction
# CHECK-NEXT: addi 1, 0, 32768
addi 1, 0, 32768
# Unsigned 16-bit immediate operands
# CHECK: error: invalid operand for instruction
# CHECK-NEXT: ori 1, 2, -1
ori 1, 2, -1
# CHECK: error: invalid operand for instruction
# CHECK-NEXT: ori 1, 2, 65536
ori 1, 2, 65536
# Signed 16-bit immediate operands (extended range for addis)
# CHECK: error: invalid operand for instruction
addis 1, 0, -65537
# CHECK: error: invalid operand for instruction
addis 1, 0, 65536
# D-Form memory operands
# CHECK: error: invalid register number
# CHECK-NEXT: lwz 1, 0(32)
lwz 1, 0(32)
# CHECK: error: invalid register name
# CHECK-NEXT: lwz 1, 0(%r32)
lwz 1, 0(%r32)
# CHECK: error: invalid operand for instruction
# CHECK-NEXT: lwz 1, -32769(2)
lwz 1, -32769(2)
# CHECK: error: invalid operand for instruction
# CHECK-NEXT: lwz 1, 32768(2)
lwz 1, 32768(2)
# CHECK: error: invalid register number
# CHECK-NEXT: ld 1, 0(32)
ld 1, 0(32)
# CHECK: error: invalid register name
# CHECK-NEXT: ld 1, 0(%r32)
ld 1, 0(%r32)
# CHECK: error: invalid operand for instruction
# CHECK-NEXT: ld 1, 1(2)
ld 1, 1(2)
# CHECK: error: invalid operand for instruction
# CHECK-NEXT: ld 1, 2(2)
ld 1, 2(2)
# CHECK: error: invalid operand for instruction
# CHECK-NEXT: ld 1, 3(2)
ld 1, 3(2)
# CHECK: error: invalid operand for instruction
# CHECK-NEXT: ld 1, -32772(2)
ld 1, -32772(2)
# CHECK: error: invalid operand for instruction
# CHECK-NEXT: ld 1, 32768(2)
ld 1, 32768(2)
# CHECK: error: invalid modifier 'got' (no symbols present)
addi 4, 3, 123@got
# CHECK-NEXT: addi 4, 3, 123@got
# CHECK: error: invalid operand for instruction
# CHECK-NEXT: lwarx 1, 2, 3, a
lwarx 1, 2, 3, a