// RUN: not llvm-mc -triple x86_64-unknown-unknown --show-encoding %s 2> %t.err | FileCheck --check-prefix=64 %s
// RUN: FileCheck --check-prefix=ERR64 < %t.err %s
// RUN: not llvm-mc -triple i386-unknown-unknown --show-encoding %s 2> %t.err | FileCheck --check-prefix=32 %s
// RUN: FileCheck --check-prefix=ERR32 < %t.err %s
// RUN: not llvm-mc -triple i386-unknown-unknown-code16 --show-encoding %s 2> %t.err | FileCheck --check-prefix=16 %s
// RUN: FileCheck --check-prefix=ERR16 < %t.err %s
lodsb
// 64: lodsb (%rsi), %al // 32: lodsb (%esi), %al // 16: lodsb (%si), %al
lodsb (%rsi), %al
// 64: lodsb (%rsi), %al // ERR32: 64-bit
// ERR16: 64-bit
lodsb (%esi), %al
// 64: lodsb (%esi), %al // 32: lodsb (%esi), %al // 16: lodsb (%esi), %al
lodsb (%si), %al
// ERR64: invalid 16-bit base register
// 32: lodsb (%si), %al // 16: lodsb (%si), %al
lodsl %gs:(%esi)
// 64: lodsl %gs:(%esi), %eax // 32: lodsl %gs:(%esi), %eax // 16: lodsl %gs:(%esi), %eax
lodsl (%edi), %eax
// ERR64: invalid operand
// ERR32: invalid operand
// ERR16: invalid operand
lodsl 44(%edi), %eax
// ERR64: invalid operand
// ERR32: invalid operand
// ERR16: invalid operand
lods (%esi), %ax
// 64: lodsw (%esi), %ax // 32: lodsw (%esi), %ax // 16: lodsw (%esi), %ax
stosw
// 64: stosw %ax, %es:(%rdi) // 32: stosw %ax, %es:(%edi) // 16: stosw %ax, %es:(%di)
stos %eax, (%edi)
// 64: stosl %eax, %es:(%edi) // 32: stosl %eax, %es:(%edi) // 16: stosl %eax, %es:(%edi)
stosb %al, %fs:(%edi)
// ERR64: invalid operand for instruction
// ERR32: invalid operand for instruction
// ERR16: invalid operand for instruction
stosb %al, %es:(%edi)
// 64: stosb %al, %es:(%edi) // 32: stosb %al, %es:(%edi) // 16: stosb %al, %es:(%edi)
stosq
// 64: stosq %rax, %es:(%rdi) // ERR32: 64-bit
// ERR16: 64-bit
stos %rax, (%edi)
// 64: stosq %rax, %es:(%edi) // ERR32: only available in 64-bit mode
// ERR16: only available in 64-bit mode
scas %es:(%edi), %al
// 64: scasb %es:(%edi), %al // 32: scasb %es:(%edi), %al // 16: scasb %es:(%edi), %al
scasq %es:(%edi)
// 64: scasq %es:(%edi), %rax // ERR32: 64-bit
// ERR16: 64-bit
scasl %es:(%edi), %al
// ERR64: invalid operand
// ERR32: invalid operand
// ERR16: invalid operand
scas %es:(%di), %ax
// ERR64: invalid 16-bit base register
// 16: scasw %es:(%di), %ax // 32: scasw %es:(%di), %ax
cmpsb
// 64: cmpsb %es:(%rdi), (%rsi) // 32: cmpsb %es:(%edi), (%esi) // 16: cmpsb %es:(%di), (%si)
cmpsw (%edi), (%esi)
// 64: cmpsw %es:(%edi), (%esi) // 32: cmpsw %es:(%edi), (%esi) // 16: cmpsw %es:(%edi), (%esi)
cmpsb (%di), (%esi)
// ERR64: invalid 16-bit base register
// ERR32: mismatching source and destination
// ERR16: mismatching source and destination
cmpsl %es:(%edi), %ss:(%esi)
// 64: cmpsl %es:(%edi), %ss:(%esi) // 32: cmpsl %es:(%edi), %ss:(%esi) // 16: cmpsl %es:(%edi), %ss:(%esi)
cmpsq (%rdi), (%rsi)
// 64: cmpsq %es:(%rdi), (%rsi) // ERR32: 64-bit
// ERR16: 64-bit
movsb (%esi), (%edi)
// 64: movsb (%esi), %es:(%edi) // 32: movsb (%esi), %es:(%edi) // 16: movsb (%esi), %es:(%edi)
movsl %gs:(%esi), (%edi)
// 64: movsl %gs:(%esi), %es:(%edi) // 32: movsl %gs:(%esi), %es:(%edi) // 16: movsl %gs:(%esi), %es:(%edi)
outsb
// 64: outsb (%rsi), %dx // 32: outsb (%esi), %dx // 16: outsb (%si), %dx
outsw %fs:(%esi), %dx
// 64: outsw %fs:(%esi), %dx // 32: outsw %fs:(%esi), %dx // 16: outsw %fs:(%esi), %dx
insw %dx, (%edi)
// 64: insw %dx, %es:(%edi) // 32: insw %dx, %es:(%edi) // 16: insw %dx, %es:(%edi)
insw %dx, (%bx)
// ERR64: invalid 16-bit base register
// 32: insw %dx, %es:(%di) // 16: insw %dx, %es:(%di)
insw %dx, (%ebx)
// 64: insw %dx, %es:(%edi) // 32: insw %dx, %es:(%edi) // 16: insw %dx, %es:(%edi)
insw %dx, (%rbx)
// 64: insw %dx, %es:(%rdi) // ERR32: 64-bit
// ERR16: 64-bit