# RUN: not llvm-mc -triple s390x-linux-gnu < %s 2> %t
# RUN: FileCheck < %t %s

# Test GR32 operands
#
#CHECK: error: invalid operand for instruction
#CHECK: lr	%f0,%r1
#CHECK: error: invalid operand for instruction
#CHECK: lr	%a0,%r1
#CHECK: error: invalid operand for instruction
#CHECK: lr	%c0,%r1
#CHECK: error: invalid operand for instruction
#CHECK: lr	%r0,%f1
#CHECK: error: invalid operand for instruction
#CHECK: lr	%r0,%a1
#CHECK: error: invalid operand for instruction
#CHECK: lr	%r0,%c1
#CHECK: error: invalid operand for instruction
#CHECK: lr	%r0,0
#CHECK: error: invalid operand for instruction
#CHECK: lr	%r0,0(%r1)

	lr	%f0,%r1
	lr	%a0,%r1
	lr	%c0,%r1
	lr	%r0,%f1
	lr	%r0,%a1
	lr	%r0,%c1
	lr	%r0,0
	lr	%r0,0(%r1)

# Test GR64 operands
#
#CHECK: error: invalid operand for instruction
#CHECK: lgr	%f0,%r1
#CHECK: error: invalid operand for instruction
#CHECK: lgr	%a0,%r1
#CHECK: error: invalid operand for instruction
#CHECK: lgr	%c0,%r1
#CHECK: error: invalid operand for instruction
#CHECK: lgr	%r0,%f1
#CHECK: error: invalid operand for instruction
#CHECK: lgr	%r0,%a1
#CHECK: error: invalid operand for instruction
#CHECK: lgr	%r0,%c1
#CHECK: error: invalid operand for instruction
#CHECK: lgr	%r0,0
#CHECK: error: invalid operand for instruction
#CHECK: lgr	%r0,0(%r1)

	lgr	%f0,%r1
	lgr	%a0,%r1
	lgr	%c0,%r1
	lgr	%r0,%f1
	lgr	%r0,%a1
	lgr	%r0,%c1
	lgr	%r0,0
	lgr	%r0,0(%r1)

# Test GR128 operands
#
#CHECK: error: invalid register pair
#CHECK: dlr	%r1,%r0
#CHECK: error: invalid register pair
#CHECK: dlr	%r3,%r0
#CHECK: error: invalid register pair
#CHECK: dlr	%r5,%r0
#CHECK: error: invalid register pair
#CHECK: dlr	%r7,%r0
#CHECK: error: invalid register pair
#CHECK: dlr	%r9,%r0
#CHECK: error: invalid register pair
#CHECK: dlr	%r11,%r0
#CHECK: error: invalid register pair
#CHECK: dlr	%r13,%r0
#CHECK: error: invalid register pair
#CHECK: dlr	%r15,%r0
#CHECK: error: invalid operand for instruction
#CHECK: dlr	%f0,%r1
#CHECK: error: invalid operand for instruction
#CHECK: dlr	%a0,%r1
#CHECK: error: invalid operand for instruction
#CHECK: dlr	%c0,%r1
#CHECK: error: invalid operand for instruction
#CHECK: dlr	%r0,%f1
#CHECK: error: invalid operand for instruction
#CHECK: dlr	%r0,%a1
#CHECK: error: invalid operand for instruction
#CHECK: dlr	%r0,%c1
#CHECK: error: invalid operand for instruction
#CHECK: dlr	%r0,0
#CHECK: error: invalid operand for instruction
#CHECK: dlr	%r0,0(%r1)

	dlr	%r1,%r0
	dlr	%r3,%r0
	dlr	%r5,%r0
	dlr	%r7,%r0
	dlr	%r9,%r0
	dlr	%r11,%r0
	dlr	%r13,%r0
	dlr	%r15,%r0
	dlr	%f0,%r1
	dlr	%a0,%r1
	dlr	%c0,%r1
	dlr	%r0,%f1
	dlr	%r0,%a1
	dlr	%r0,%c1
	dlr	%r0,0
	dlr	%r0,0(%r1)

# Test FP32 operands
#
#CHECK: error: invalid operand for instruction
#CHECK: ler	%r0,%f1
#CHECK: error: invalid operand for instruction
#CHECK: ler	%a0,%f1
#CHECK: error: invalid operand for instruction
#CHECK: ler	%c0,%f1
#CHECK: error: invalid operand for instruction
#CHECK: ler	%f0,%r1
#CHECK: error: invalid operand for instruction
#CHECK: ler	%f0,%a1
#CHECK: error: invalid operand for instruction
#CHECK: ler	%f0,%c1
#CHECK: error: invalid operand for instruction
#CHECK: ler	%f0,0
#CHECK: error: invalid operand for instruction
#CHECK: ler	%f0,0(%r1)

	ler	%r0,%f1
	ler	%a0,%f1
	ler	%c0,%f1
	ler	%f0,%r1
	ler	%f0,%a1
	ler	%f0,%c1
	ler	%f0,0
	ler	%f0,0(%r1)

# Test FP64 operands
#
#CHECK: error: invalid operand for instruction
#CHECK: ldr	%r0,%f1
#CHECK: error: invalid operand for instruction
#CHECK: ldr	%a0,%f1
#CHECK: error: invalid operand for instruction
#CHECK: ldr	%c0,%f1
#CHECK: error: invalid operand for instruction
#CHECK: ldr	%f0,%r1
#CHECK: error: invalid operand for instruction
#CHECK: ldr	%f0,%a1
#CHECK: error: invalid operand for instruction
#CHECK: ldr	%f0,%c1
#CHECK: error: invalid operand for instruction
#CHECK: ldr	%f0,0
#CHECK: error: invalid operand for instruction
#CHECK: ldr	%f0,0(%r1)

	ldr	%r0,%f1
	ldr	%a0,%f1
	ldr	%c0,%f1
	ldr	%f0,%r1
	ldr	%f0,%a1
	ldr	%f0,%c1
	ldr	%f0,0
	ldr	%f0,0(%r1)

# Test FP128 operands
#
#CHECK: error: invalid register pair
#CHECK: lxr	%f2,%f0
#CHECK: error: invalid register pair
#CHECK: lxr	%f0,%f3
#CHECK: error: invalid register pair
#CHECK: lxr	%f6,%f0
#CHECK: error: invalid register pair
#CHECK: lxr	%f0,%f7
#CHECK: error: invalid register pair
#CHECK: lxr	%f10,%f0
#CHECK: error: invalid register pair
#CHECK: lxr	%f0,%f11
#CHECK: error: invalid register pair
#CHECK: lxr	%f14,%f0
#CHECK: error: invalid register pair
#CHECK: lxr	%f0,%f15
#CHECK: error: invalid operand for instruction
#CHECK: lxr	%r0,%f1
#CHECK: error: invalid operand for instruction
#CHECK: lxr	%a0,%f1
#CHECK: error: invalid operand for instruction
#CHECK: lxr	%c0,%f1
#CHECK: error: invalid operand for instruction
#CHECK: lxr	%f0,%r1
#CHECK: error: invalid operand for instruction
#CHECK: lxr	%f0,%a1
#CHECK: error: invalid operand for instruction
#CHECK: lxr	%f0,%c1
#CHECK: error: invalid operand for instruction
#CHECK: lxr	%f0,0
#CHECK: error: invalid operand for instruction
#CHECK: lxr	%f0,0(%r1)

	lxr	%f2,%f0
	lxr	%f0,%f3
	lxr	%f6,%f0
	lxr	%f0,%f7
	lxr	%f10,%f0
	lxr	%f0,%f11
	lxr	%f14,%f0
	lxr	%f0,%f15
	lxr	%r0,%f1
	lxr	%a0,%f1
	lxr	%c0,%f1
	lxr	%f0,%r1
	lxr	%f0,%a1
	lxr	%f0,%c1
	lxr	%f0,0
	lxr	%f0,0(%r1)

# Test access register operands
#
#CHECK: error: invalid operand for instruction
#CHECK: ear	%r0,%r0
#CHECK: error: invalid operand for instruction
#CHECK: ear	%r0,%f0
#CHECK: error: invalid operand for instruction
#CHECK: ear	%r0,%c0
#CHECK: error: invalid operand for instruction
#CHECK: ear	%r0,0
#CHECK: error: invalid operand for instruction
#CHECK: ear	%r0,0(%r1)

	ear	%r0,%r0
	ear	%r0,%f0
	ear	%r0,%c0
	ear	%r0,0
	ear	%r0,0(%r1)

# Test control register operands
#
#CHECK: error: invalid operand for instruction
#CHECK: lctl	%c0,%r0,0
#CHECK: lctl	%c0,%f0,0
#CHECK: lctl	%c0,%a0,0
#CHECK: lctl	%c0,0,0
#CHECK: lctl	%c0,0(%r1),0

	lctl	%c0,%r0,0
	lctl	%c0,%f0,0
	lctl	%c0,%a0,0
	lctl	%c0,0,0
	lctl	%c0,0(%r1),0

	.cfi_startproc

# Test general register parsing, with no predetermined class in mind.
#
#CHECK: error: register expected
#CHECK: .cfi_offset r0,0
#CHECK: error: invalid register
#CHECK: .cfi_offset %,0
#CHECK: error: invalid register
#CHECK: .cfi_offset %r,0
#CHECK: error: invalid register
#CHECK: .cfi_offset %f,0
#CHECK: error: invalid register
#CHECK: .cfi_offset %a,0
#CHECK: error: invalid register
#CHECK: .cfi_offset %c,0
#CHECK: error: invalid register
#CHECK: .cfi_offset %0,0
#CHECK: error: invalid register
#CHECK: .cfi_offset %r16,0
#CHECK: error: invalid register
#CHECK: .cfi_offset %f16,0
#CHECK: error: invalid register
#CHECK: .cfi_offset %a16,0
#CHECK: error: invalid register
#CHECK: .cfi_offset %c16,0
#CHECK: error: invalid register
#CHECK: .cfi_offset %reef,0
#CHECK: error: invalid register
#CHECK: .cfi_offset %arid,0

	.cfi_offset r0,0
	.cfi_offset %,0
	.cfi_offset %r,0
	.cfi_offset %f,0
	.cfi_offset %a,0
	.cfi_offset %c,0
	.cfi_offset %0,0
	.cfi_offset %r16,0
	.cfi_offset %f16,0
	.cfi_offset %a16,0
	.cfi_offset %c16,0
	.cfi_offset %reef,0
	.cfi_offset %arid,0

	.cfi_endproc

#CHECK: error: %r0 used in an address
#CHECK: sll	%r2,8(%r0)
#CHECK: error: %r0 used in an address
#CHECK: br	%r0
#CHECK: error: %r0 used in an address
#CHECK: l	%r1,8(%r0)
#CHECK: error: %r0 used in an address
#CHECK: l	%r1,8(%r0,%r15)
#CHECK: error: %r0 used in an address
#CHECK: l	%r1,8(%r15,%r0)

	sll	%r2,8(%r0)
	br	%r0
	l	%r1,8(%r0)
	l	%r1,8(%r0,%r15)
	l	%r1,8(%r15,%r0)