.bundle_align_mode 5 # We use these macros to test each pattern at every offset from # bundle alignment, i.e. [0,31]. .macro offset_insn insn_name, offset .p2align 5 \insn_name\()_offset_\offset\(): .if \offset .space \offset, 0xf4 .endif \insn_name .endm .macro test_offsets insn_name offset_insn \insn_name, 0 offset_insn \insn_name, 1 offset_insn \insn_name, 2 offset_insn \insn_name, 3 offset_insn \insn_name, 4 offset_insn \insn_name, 5 offset_insn \insn_name, 6 offset_insn \insn_name, 7 offset_insn \insn_name, 8 offset_insn \insn_name, 9 offset_insn \insn_name, 10 offset_insn \insn_name, 11 offset_insn \insn_name, 12 offset_insn \insn_name, 13 offset_insn \insn_name, 14 offset_insn \insn_name, 15 offset_insn \insn_name, 16 offset_insn \insn_name, 17 offset_insn \insn_name, 18 offset_insn \insn_name, 19 offset_insn \insn_name, 20 offset_insn \insn_name, 21 offset_insn \insn_name, 22 offset_insn \insn_name, 23 offset_insn \insn_name, 24 offset_insn \insn_name, 25 offset_insn \insn_name, 26 offset_insn \insn_name, 27 offset_insn \insn_name, 28 offset_insn \insn_name, 29 offset_insn \insn_name, 30 offset_insn \insn_name, 31 .endm # These are vanilla (non-relaxed) instructions of each length. .macro test_1 clc .endm .macro test_2 add %eax,%eax .endm .macro test_3 and $3,%eax .endm .macro test_4 lock and $3,(%rax) .endm .macro test_5 mov $0x11223344,%eax .endm .macro test_6 movl %eax,0x11223344(%rsi) .endm .macro test_7 movl $0x11223344,0x7f(%rsi) .endm .macro test_8 lock addl $0x11223344,0x10(%rsi) .endm .macro test_9 lock addl $0x11223344,%fs:0x10(%rsi) .endm .macro test_10 movl $0x11223344,0x7ff(%rsi) .endm .macro test_11 lock addl $0x11223344,0x7ff(%rsi) .endm .macro test_12 lock addl $0x11223344,%fs:0x7ff(%rsi) .endm .macro test_13 lock addl $0x11223344,%fs:0x7ff(%r11) .endm test_offsets test_1 test_offsets test_2 test_offsets test_3 test_offsets test_4 test_offsets test_5 test_offsets test_6 test_offsets test_7 test_offsets test_8 test_offsets test_9 test_offsets test_10 test_offsets test_11 test_offsets test_12 test_offsets test_13 # The only relaxation cases are the jump instructions. # For each of the three flavors of jump (unconditional, conditional, # and conditional with prediction), we test a case that can be relaxed # to its shortest form, and one that must use the long form. .macro jmp_2 jmp jmp_2_\@ movl $0xdeadbeef,%eax jmp_2_\@\(): movl $0xb00b,%eax .endm .macro jmp_5 jmp jmp_5_\@ .rept 128 clc .endr jmp_5_\@\(): movl $0xb00b,%eax .endm .macro cjmp_2 jz cjmp_2_\@ movl $0xdeadbeef,%eax cjmp_2_\@\(): movl $0xb00b,%eax .endm .macro cjmp_6 jz cjmp_6_\@ .rept 128 clc .endr cjmp_6_\@\(): movl $0xb00b,%eax .endm .macro pjmp_3 jz,pt pjmp_3_\@ movl $0xdeadbeef,%eax pjmp_3_\@\(): movl $0xb00b,%eax .endm .macro pjmp_7 jz,pt pjmp_7_\@ .rept 128 clc .endr pjmp_7_\@\(): movl $0xb00b,%eax .endm test_offsets jmp_2 test_offsets cjmp_2 test_offsets pjmp_3 test_offsets jmp_5 test_offsets cjmp_6 test_offsets pjmp_7 .p2align 5 hlt