1 // RUN: llvm-mc -triple x86_64-unknown-unknown -show-encoding %s > %t 2> %t.err
2 // RUN: FileCheck < %t %s
3 // RUN: FileCheck --check-prefix=CHECK-STDERR < %t.err %s
8 // CHECK: addl $0, %eax
10 // CHECK: addb $255, %al
12 // CHECK: orq %rax, %rdx
14 // CHECK: shlq $3, %rax
18 // CHECK: subb %al, %al
21 // CHECK: addl $24, %eax
24 // CHECK: movl %eax, 10(%ebp)
26 // CHECK: movl %eax, 10(%ebp,%ebx)
27 movl %eax, 10(%ebp, %ebx)
28 // CHECK: movl %eax, 10(%ebp,%ebx,4)
29 movl %eax, 10(%ebp, %ebx, 4)
30 // CHECK: movl %eax, 10(,%ebx,4)
31 movl %eax, 10(, %ebx, 4)
33 // CHECK: movl 0, %eax
35 // CHECK: movl $0, %eax
41 // FIXME: Check that this matches SUB32ri8
42 // CHECK: subl $1, %eax
45 // FIXME: Check that this matches SUB32ri8
46 // CHECK: subl $-1, %eax
49 // FIXME: Check that this matches SUB32ri
50 // CHECK: subl $256, %eax
53 // FIXME: Check that this matches XOR64ri8
54 // CHECK: xorq $1, %rax
57 // FIXME: Check that this matches XOR64ri32
58 // CHECK: xorq $256, %rax
61 // FIXME: Check that this matches SUB8rr
62 // CHECK: subb %al, %bl
65 // FIXME: Check that this matches SUB16rr
66 // CHECK: subw %ax, %bx
69 // FIXME: Check that this matches SUB32rr
70 // CHECK: subl %eax, %ebx
73 // FIXME: Check that this matches the correct instruction.
77 // FIXME: Check that this matches the correct instruction.
78 // CHECK: shldl %cl, %eax, %ebx
81 // CHECK: shll $2, %eax
84 // CHECK: shll $2, %eax
101 smovb // CHECK: movsb
102 smovw // CHECK: movsw
103 smovl // CHECK: movsl
104 smovq // CHECK: movsq
119 // NOTE: repz and repe have the same opcode as rep
124 // NOTE: repnz has the same opcode as repne
129 // NOTE: repe and repz have the same opcode as rep
139 // CHECK: cmpxchgb %al, (%ebx)
140 lock;cmpxchgb %al, 0(%ebx)
143 // CHECK: movb (%eax), %al
147 // CHECK: movb (%eax), %al
151 // CHECK: movb (%eax), %al
155 // CHECK: movb (%eax), %al
159 // CHECK: movb (%eax), %al
163 // CHECK: movb (%eax), %al
166 // CHECK: fadd %st(0)
167 // CHECK: fadd %st(1)
168 // CHECK: fadd %st(7)
174 // CHECK: leal 0, %eax
177 // rdar://7986634 - Insensitivity on opcodes.
182 // Allow scale factor without index register.
183 // CHECK: movaps %xmm3, (%esi)
184 // CHECK-STDERR: warning: scale factor without index register is ignored
185 movaps %xmm3, (%esi, 2)
187 // CHECK: imull $12, %eax, %eax
190 // CHECK: imull %ecx, %eax
195 // CHECK: outb %al, $161
197 // CHECK: outw %ax, $128
199 // CHECK: inb $161, %al
211 // CHECK: cmovnew %bx, %ax
213 // CHECK: cmovneq %rbx, %rax
218 // CHECK: inb $127, %al
219 // CHECK: inw %dx, %ax
220 // CHECK: outb %al, $127
221 // CHECK: outw %ax, %dx
222 // CHECK: inl %dx, %eax
231 // CHECK: outb %al, %dx
232 // CHECK: outw %ax, %dx
233 // CHECK: outl %eax, %dx
242 // CHECK: fxch %st(1)
243 // CHECK: fucom %st(1)
244 // CHECK: fucomp %st(1)
245 // CHECK: faddp %st(1)
246 // CHECK: faddp %st(0)
247 // CHECK: fsubp %st(1)
248 // CHECK: fsubrp %st(1)
249 // CHECK: fmulp %st(1)
250 // CHECK: fdivp %st(1)
251 // CHECK: fdivrp %st(1)
264 // CHECK: fcomi %st(1)
265 // CHECK: fcomi %st(2)
266 // CHECK: fucomi %st(1)
267 // CHECK: fucomi %st(2)
268 // CHECK: fucomi %st(2)
287 // CHECK: rclb $1, %bl
288 // CHECK: rcll $1, 3735928559(%ebx,%ecx,8)
289 // CHECK: rcrl $1, %ecx
290 // CHECK: rcrl $1, 305419896
293 rcll 0xdeadbeef(%ebx,%ecx,8)
298 // CHECK: shldw $1, %bx, %bx
299 // CHECK: shldw $1, %bx, %bx
300 // CHECK: shrdw $1, %bx, %bx
301 // CHECK: shrdw $1, %bx, %bx
309 // CHECK: encoding: [0x0f,0x00,0xc1]
311 // CHECK: encoding: [0x66,0x0f,0x00,0xc1]
316 // CHECK: lcalll *3135175374
317 // CHECK: ljmpl *3135175374
323 // CHECK: enter $31438, $0
324 // CHECK: encoding: [0xc8,0xce,0x7a,0x00]
325 // CHECK: enter $31438, $1
326 // CHECK: encoding: [0xc8,0xce,0x7a,0x01]
327 // CHECK: enter $31438, $127
328 // CHECK: encoding: [0xc8,0xce,0x7a,0x7f]
335 // CHECK: movw %cs, %ax
339 fcmovb %st(1), %st(0) // CHECK: fcmovb %st(1), %st(0)
340 fcmove %st(1), %st(0) // CHECK: fcmove %st(1), %st(0)
341 fcmovbe %st(1), %st(0) // CHECK: fcmovbe %st(1), %st(0)
342 fcmovu %st(1), %st(0) // CHECK: fcmovu %st(1), %st(0)
344 fcmovnb %st(1), %st(0) // CHECK: fcmovnb %st(1), %st(0)
345 fcmovne %st(1), %st(0) // CHECK: fcmovne %st(1), %st(0)
346 fcmovnbe %st(1), %st(0) // CHECK: fcmovnbe %st(1), %st(0)
347 fcmovnu %st(1), %st(0) // CHECK: fcmovnu %st(1), %st(0)
349 fcmovnae %st(1), %st(0) // CHECK: fcmovb %st(1), %st(0)
350 fcmovna %st(1), %st(0) // CHECK: fcmovbe %st(1), %st(0)
352 fcmovae %st(1), %st(0) // CHECK: fcmovnb %st(1), %st(0)
353 fcmova %st(1), %st(0) // CHECK: fcmovnbe %st(1), %st(0)
356 .byte 88 + 1 & 15 // CHECK: .byte 9
360 // CHECK: movq %rdx, %cr0
361 // CHECK: encoding: [0x0f,0x22,0xc2]
363 // CHECK: movq %rdx, %cr4
364 // CHECK: encoding: [0x0f,0x22,0xe2]
366 // CHECK: movq %rdx, %cr8
367 // CHECK: encoding: [0x44,0x0f,0x22,0xc2]
369 // CHECK: movq %rdx, %cr15
370 // CHECK: encoding: [0x44,0x0f,0x22,0xfa]
372 // rdar://8456371 - Handle commutable instructions written backward.
373 // CHECK: faddp %st(1)
374 // CHECK: fmulp %st(2)
378 // rdar://8468087 - Encode these accurately, they are not synonyms.
379 // CHECK: fmul %st(0), %st(1)
380 // CHECK: encoding: [0xdc,0xc9]
381 // CHECK: fmul %st(1)
382 // CHECK: encoding: [0xd8,0xc9]
386 // CHECK: fadd %st(0), %st(1)
387 // CHECK: encoding: [0xdc,0xc1]
388 // CHECK: fadd %st(1)
389 // CHECK: encoding: [0xd8,0xc1]
395 // CHECK: xorb %al, %al
396 // CHECK: encoding: [0x30,0xc0]
397 // CHECK: xorw %di, %di
398 // CHECK: encoding: [0x66,0x31,0xff]
399 // CHECK: xorl %esi, %esi
400 // CHECK: encoding: [0x31,0xf6]
401 // CHECK: xorq %rsi, %rsi
402 // CHECK: encoding: [0x48,0x31,0xf6]
419 // rdar://8456378 and PR7557 - fstsw
425 // CHECK: fnstsw (%rax)
430 // CHECK: fnstcw (%rsp)
435 // CHECK: fnstcw (%rsp)
444 // CHECK: fnsave 32493
447 // rdar://8456382 - cvtsd2si support.
449 // CHECK: cvtsd2siq %xmm1, %rax
450 // CHECK: encoding: [0xf2,0x48,0x0f,0x2d,0xc1]
452 // CHECK: cvtsd2sil %xmm1, %eax
453 // CHECK: encoding: [0xf2,0x0f,0x2d,0xc1]
455 cvtsd2siq %xmm0, %rax // CHECK: cvtsd2siq %xmm0, %rax
456 cvtsd2sil %xmm0, %eax // CHECK: cvtsd2sil %xmm0, %eax
457 cvtsd2si %xmm0, %rax // CHECK: cvtsd2siq %xmm0, %rax
460 cvttpd2dq %xmm1, %xmm0 // CHECK: cvttpd2dq %xmm1, %xmm0
461 cvttpd2dq (%rax), %xmm0 // CHECK: cvttpd2dq (%rax), %xmm0
463 cvttps2dq %xmm1, %xmm0 // CHECK: cvttps2dq %xmm1, %xmm0
464 cvttps2dq (%rax), %xmm0 // CHECK: cvttps2dq (%rax), %xmm0
466 // rdar://8456376 - llvm-mc rejects 'roundss'
467 roundss $0xE, %xmm0, %xmm0 // CHECK: encoding: [0x66,0x0f,0x3a,0x0a,0xc0,0x0e]
468 roundps $0xE, %xmm0, %xmm0 // CHECK: encoding: [0x66,0x0f,0x3a,0x08,0xc0,0x0e]
469 roundsd $0xE, %xmm0, %xmm0 // CHECK: encoding: [0x66,0x0f,0x3a,0x0b,0xc0,0x0e]
470 roundpd $0xE, %xmm0, %xmm0 // CHECK: encoding: [0x66,0x0f,0x3a,0x09,0xc0,0x0e]
473 // rdar://8482675 - 32-bit mem operand support in 64-bit mode (0x67 prefix)
475 // CHECK: leal 8(%eax), %esi
476 // CHECK: encoding: [0x67,0x8d,0x70,0x08]
478 // CHECK: leaq 8(%eax), %rsi
479 // CHECK: encoding: [0x67,0x48,0x8d,0x70,0x08]
481 // CHECK: leaq 8(%rax), %rsi
482 // CHECK: encoding: [0x48,0x8d,0x70,0x08]
485 cvttpd2dq 0xdeadbeef(%ebx,%ecx,8),%xmm5
486 // CHECK: cvttpd2dq 3735928559(%ebx,%ecx,8), %xmm5
487 // CHECK: encoding: [0x67,0x66,0x0f,0xe6,0xac,0xcb,0xef,0xbe,0xad,0xde]
489 // rdar://8490728 - llvm-mc rejects 'movmskpd'
491 // CHECK: movmskpd %xmm6, %rax
492 // CHECK: encoding: [0x66,0x48,0x0f,0x50,0xc6]
494 // CHECK: movmskpd %xmm6, %eax
495 // CHECK: encoding: [0x66,0x0f,0x50,0xc6]
497 // rdar://8491845 - Gas supports commuted forms of non-commutable instructions.
498 fdivrp %st(0), %st(1) // CHECK: encoding: [0xde,0xf9]
499 fdivrp %st(1), %st(0) // CHECK: encoding: [0xde,0xf9]
501 fsubrp %ST(0), %ST(1) // CHECK: encoding: [0xde,0xe9]
502 fsubrp %ST(1), %ST(0) // CHECK: encoding: [0xde,0xe9]
506 // CHECK: movl foo(%rip), %eax
507 // CHECK: encoding: [0x8b,0x05,A,A,A,A]
508 // CHECK: fixup A - offset: 2, value: foo-4, kind: reloc_riprel_4byte
511 // CHECK: movb $12, foo(%rip)
512 // CHECK: encoding: [0xc6,0x05,A,A,A,A,0x0c]
513 // CHECK: fixup A - offset: 2, value: foo-5, kind: reloc_riprel_4byte
516 // CHECK: movw $12, foo(%rip)
517 // CHECK: encoding: [0x66,0xc7,0x05,A,A,A,A,0x0c,0x00]
518 // CHECK: fixup A - offset: 3, value: foo-6, kind: reloc_riprel_4byte
521 // CHECK: movl $12, foo(%rip)
522 // CHECK: encoding: [0xc7,0x05,A,A,A,A,0x0c,0x00,0x00,0x00]
523 // CHECK: fixup A - offset: 2, value: foo-8, kind: reloc_riprel_4byte
526 // CHECK: movq $12, foo(%rip)
527 // CHECK: encoding: [0x48,0xc7,0x05,A,A,A,A,0x0c,0x00,0x00,0x00]
528 // CHECK: fixup A - offset: 3, value: foo-8, kind: reloc_riprel_4byte
530 // CHECK: addq $-424, %rax
531 // CHECK: encoding: [0x48,0x05,0x58,0xfe,0xff,0xff]
535 // CHECK: movq _foo@GOTPCREL(%rip), %rax
536 // CHECK: encoding: [0x48,0x8b,0x05,A,A,A,A]
537 // CHECK: fixup A - offset: 3, value: _foo@GOTPCREL-4, kind: reloc_riprel_4byte_movq_load
538 movq _foo@GOTPCREL(%rip), %rax
540 // CHECK: movq _foo@GOTPCREL(%rip), %r14
541 // CHECK: encoding: [0x4c,0x8b,0x35,A,A,A,A]
542 // CHECK: fixup A - offset: 3, value: _foo@GOTPCREL-4, kind: reloc_riprel_4byte_movq_load
543 movq _foo@GOTPCREL(%rip), %r14
546 // CHECK: movq (%r13,%rax,8), %r13
547 // CHECK: encoding: [0x4d,0x8b,0x6c,0xc5,0x00]
548 movq 0x00(%r13,%rax,8),%r13
550 // CHECK: testq %rax, %rbx
551 // CHECK: encoding: [0x48,0x85,0xd8]
554 // CHECK: cmpq %rbx, %r14
555 // CHECK: encoding: [0x49,0x39,0xde]
562 // CHECK: encoding: [0x48,0xa5]
566 // CHECK: encoding: [0xa5]
570 // CHECK: encoding: [0x48,0xab]
573 // CHECK: encoding: [0xab]
576 // Not moffset forms of moves, they are x86-32 only! rdar://7947184
577 movb 0, %al // CHECK: movb 0, %al # encoding: [0x8a,0x04,0x25,0x00,0x00,0x00,0x00]
578 movw 0, %ax // CHECK: movw 0, %ax # encoding: [0x66,0x8b,0x04,0x25,0x00,0x00,0x00,0x00]
579 movl 0, %eax // CHECK: movl 0, %eax # encoding: [0x8b,0x04,0x25,0x00,0x00,0x00,0x00]
581 // CHECK: pushfq # encoding: [0x9c]
583 // CHECK: pushfq # encoding: [0x9c]
585 // CHECK: popfq # encoding: [0x9d]
587 // CHECK: popfq # encoding: [0x9d]
590 // CHECK: movabsq $-281474976710654, %rax
591 // CHECK: encoding: [0x48,0xb8,0x02,0x00,0x00,0x00,0x00,0x00,0xff,0xff]
592 movabsq $0xFFFF000000000002, %rax
594 // CHECK: movabsq $-281474976710654, %rax
595 // CHECK: encoding: [0x48,0xb8,0x02,0x00,0x00,0x00,0x00,0x00,0xff,0xff]
596 movq $0xFFFF000000000002, %rax
598 // CHECK: movq $-65536, %rax
599 // CHECK: encoding: [0x48,0xc7,0xc0,0x00,0x00,0xff,0xff]
600 movq $0xFFFFFFFFFFFF0000, %rax
602 // CHECK: movq $-256, %rax
603 // CHECK: encoding: [0x48,0xc7,0xc0,0x00,0xff,0xff,0xff]
604 movq $0xFFFFFFFFFFFFFF00, %rax
606 // CHECK: movq $10, %rax
607 // CHECK: encoding: [0x48,0xc7,0xc0,0x0a,0x00,0x00,0x00]
613 // CHECK: encoding: [0xc3]
617 // CHECK: encoding: [0x0f,0x94,0xc0]
621 // CHECK: encoding: [0x0f,0x95,0xc0]
625 // CHECK: encoding: [0x74,A]
629 // CHECK: encoding: [0x75,A]
634 // CHECK: btq $1, %rdx
635 // CHECK: encoding: [0x48,0x0f,0xba,0xe2,0x01]
638 // CHECK: movzbl %al, %esi
639 // CHECK: encoding: [0x0f,0xb6,0xf0]
642 // CHECK: movzbq %al, %rsi
643 // CHECK: encoding: [0x48,0x0f,0xb6,0xf0]
646 // CHECK: movsbw %al, %ax
647 // CHECK: encoding: [0x66,0x0f,0xbe,0xc0]
650 // CHECK: movsbl %al, %eax
651 // CHECK: encoding: [0x0f,0xbe,0xc0]
654 // CHECK: movswl %ax, %eax
655 // CHECK: encoding: [0x0f,0xbf,0xc0]
658 // CHECK: movsbq %bl, %rax
659 // CHECK: encoding: [0x48,0x0f,0xbe,0xc3]
662 // CHECK: movswq %cx, %rax
663 // CHECK: encoding: [0x48,0x0f,0xbf,0xc1]
666 // CHECK: movslq %edi, %rax
667 // CHECK: encoding: [0x48,0x63,0xc7]
670 // CHECK: movzbw %al, %ax
671 // CHECK: encoding: [0x66,0x0f,0xb6,0xc0]
674 // CHECK: movzbl %al, %eax
675 // CHECK: encoding: [0x0f,0xb6,0xc0]
678 // CHECK: movzwl %ax, %eax
679 // CHECK: encoding: [0x0f,0xb7,0xc0]
682 // CHECK: movzbq %bl, %rax
683 // CHECK: encoding: [0x48,0x0f,0xb6,0xc3]
686 // CHECK: movzwq %cx, %rax
687 // CHECK: encoding: [0x48,0x0f,0xb7,0xc1]
690 // CHECK: movsbw (%rax), %ax
691 // CHECK: encoding: [0x66,0x0f,0xbe,0x00]
694 // CHECK: movzbw (%rax), %ax
695 // CHECK: encoding: [0x66,0x0f,0xb6,0x00]
700 // CHECK: [0x65,0x8b,0x04,0x25,0x7c,0x00,0x00,0x00]
703 // CHECK: jmpq *8(%rax)
704 // CHECK: encoding: [0xff,0x60,0x08]
707 // CHECK: btq $61, -216(%rbp)
708 // CHECK: encoding: [0x48,0x0f,0xba,0xa5,0x28,0xff,0xff,0xff,0x3d]
716 // CHECK: encoding: [0x67,0xe3,A]
719 // CHECK: encoding: [0xe3,A]
723 // CHECK: xchgl %ecx, 368(%rax)
724 xchgl %ecx, 368(%rax)
725 // CHECK: xchgl %ecx, 368(%rax)
728 xchg 0xdeadbeef(%rbx,%rcx,8),%bl
729 // CHECK: xchgb %bl, 3735928559(%rbx,%rcx,8)
736 // CHECK: incl 1(%rsp)
741 // CHECK: encoding: [0xf3]
743 // CHECK: encoding: [0xa5]
749 // CHECK: encoding: [0xcf]
752 // CHECK: encoding: [0x66,0xcf]
755 // CHECK: encoding: [0xcf]
758 // CHECK: encoding: [0x48,0xcf]
761 // CHECK: retw $31438
762 // CHECK: encoding: [0x66,0xc2,0xce,0x7a]
765 // CHECK: lretw $31438
766 // CHECK: encoding: [0x66,0xca,0xce,0x7a]
772 // CHECK: encoding: [0x0f,0x07]
775 // CHECK: encoding: [0x0f,0x07]
778 // CHECK: encoding: [0x48,0x0f,0x07]
783 // CHECK: encoding: [0x0f,0xa0]
786 // CHECK: encoding: [0x0f,0xa8]
790 // CHECK: encoding: [0x66,0x0f,0xa0]
793 // CHECK: encoding: [0x66,0x0f,0xa8]
798 // CHECK: encoding: [0x0f,0xa1]
801 // CHECK: encoding: [0x0f,0xa9]
805 // CHECK: encoding: [0x66,0x0f,0xa1]
808 // CHECK: encoding: [0x66,0x0f,0xa9]
813 // CHECK: fildll -8(%rsp)
814 // CHECK: encoding: [0xdf,0x6c,0x24,0xf8]
815 // CHECK: fildll -8(%rsp)
816 // CHECK: encoding: [0xdf,0x6c,0x24,0xf8]
821 // CHECK: leaq -40(%rbp), %r15
826 // rdar://8013734 - Alias dr6=db6
829 // CHECK: movq %dr6, %rax
830 // CHECK: movq %dr6, %rax
833 // INC/DEC encodings.
834 incb %al // CHECK: incb %al # encoding: [0xfe,0xc0]
835 incw %ax // CHECK: incw %ax # encoding: [0x66,0xff,0xc0]
836 incl %eax // CHECK: incl %eax # encoding: [0xff,0xc0]
837 decb %al // CHECK: decb %al # encoding: [0xfe,0xc8]
838 decw %ax // CHECK: decw %ax # encoding: [0x66,0xff,0xc8]
839 decl %eax // CHECK: decl %eax # encoding: [0xff,0xc8]
842 // CHECK: lgdt 4(%rax)
843 // CHECK: encoding: [0x0f,0x01,0x50,0x04]
846 // CHECK: lgdt 4(%rax)
847 // CHECK: encoding: [0x0f,0x01,0x50,0x04]
850 // CHECK: lidt 4(%rax)
851 // CHECK: encoding: [0x0f,0x01,0x58,0x04]
854 // CHECK: lidt 4(%rax)
855 // CHECK: encoding: [0x0f,0x01,0x58,0x04]
858 // CHECK: sgdt 4(%rax)
859 // CHECK: encoding: [0x0f,0x01,0x40,0x04]
862 // CHECK: sgdt 4(%rax)
863 // CHECK: encoding: [0x0f,0x01,0x40,0x04]
866 // CHECK: sidt 4(%rax)
867 // CHECK: encoding: [0x0f,0x01,0x48,0x04]
870 // CHECK: sidt 4(%rax)
871 // CHECK: encoding: [0x0f,0x01,0x48,0x04]