1	.bundle_align_mode 5
2
3# We use these macros to test each pattern at every offset from
4# bundle alignment, i.e. [0,31].
5
6.macro offset_insn insn_name, offset
7	.p2align 5
8\insn_name\()_offset_\offset\():
9	.if \offset
10	.space \offset, 0xf4
11	.endif
12	\insn_name
13.endm
14
15.macro test_offsets insn_name
16	offset_insn \insn_name, 0
17	offset_insn \insn_name, 1
18	offset_insn \insn_name, 2
19	offset_insn \insn_name, 3
20	offset_insn \insn_name, 4
21	offset_insn \insn_name, 5
22	offset_insn \insn_name, 6
23	offset_insn \insn_name, 7
24	offset_insn \insn_name, 8
25	offset_insn \insn_name, 9
26	offset_insn \insn_name, 10
27	offset_insn \insn_name, 11
28	offset_insn \insn_name, 12
29	offset_insn \insn_name, 13
30	offset_insn \insn_name, 14
31	offset_insn \insn_name, 15
32	offset_insn \insn_name, 16
33	offset_insn \insn_name, 17
34	offset_insn \insn_name, 18
35	offset_insn \insn_name, 19
36	offset_insn \insn_name, 20
37	offset_insn \insn_name, 21
38	offset_insn \insn_name, 22
39	offset_insn \insn_name, 23
40	offset_insn \insn_name, 24
41	offset_insn \insn_name, 25
42	offset_insn \insn_name, 26
43	offset_insn \insn_name, 27
44	offset_insn \insn_name, 28
45	offset_insn \insn_name, 29
46	offset_insn \insn_name, 30
47	offset_insn \insn_name, 31
48.endm
49
50# These are vanilla (non-relaxed) instructions of each length.
51.macro test_1
52	clc
53.endm
54.macro test_2
55	add %eax,%eax
56.endm
57.macro test_3
58	and $3,%eax
59.endm
60.macro test_4
61	lock andl $3,(%rax)
62.endm
63.macro test_5
64	mov $0x11223344,%eax
65.endm
66.macro test_6
67	movl %eax,0x11223344(%rsi)
68.endm
69.macro test_7
70	movl $0x11223344,0x7f(%rsi)
71.endm
72.macro test_8
73	lock addl $0x11223344,0x10(%rsi)
74.endm
75.macro test_9
76	lock addl $0x11223344,%fs:0x10(%rsi)
77.endm
78.macro test_10
79	movl $0x11223344,0x7ff(%rsi)
80.endm
81.macro test_11
82	lock addl $0x11223344,0x7ff(%rsi)
83.endm
84.macro test_12
85	lock addl $0x11223344,%fs:0x7ff(%rsi)
86.endm
87.macro test_13
88	lock addl $0x11223344,%fs:0x7ff(%r11)
89.endm
90
91test_offsets test_1
92test_offsets test_2
93test_offsets test_3
94test_offsets test_4
95test_offsets test_5
96test_offsets test_6
97test_offsets test_7
98test_offsets test_8
99test_offsets test_9
100test_offsets test_10
101test_offsets test_11
102test_offsets test_12
103test_offsets test_13
104
105# The only relaxation cases are the jump instructions.
106# For each of the three flavors of jump (unconditional, conditional,
107# and conditional with prediction), we test a case that can be relaxed
108# to its shortest form, and one that must use the long form.
109.macro jmp_2
110	jmp jmp_2_\@
111	movl $0xdeadbeef,%eax
112jmp_2_\@\():
113	movl $0xb00b,%eax
114.endm
115.macro jmp_5
116	jmp jmp_5_\@
117	.rept 128
118	clc
119	.endr
120jmp_5_\@\():
121	movl $0xb00b,%eax
122.endm
123
124.macro cjmp_2
125	jz cjmp_2_\@
126	movl $0xdeadbeef,%eax
127cjmp_2_\@\():
128	movl $0xb00b,%eax
129.endm
130.macro cjmp_6
131	jz cjmp_6_\@
132	.rept 128
133	clc
134	.endr
135cjmp_6_\@\():
136	movl $0xb00b,%eax
137.endm
138
139.macro pjmp_3
140	jz,pt pjmp_3_\@
141	movl $0xdeadbeef,%eax
142pjmp_3_\@\():
143	movl $0xb00b,%eax
144.endm
145.macro pjmp_7
146	jz,pt pjmp_7_\@
147	.rept 128
148	clc
149	.endr
150pjmp_7_\@\():
151	movl $0xb00b,%eax
152.endm
153
154test_offsets jmp_2
155test_offsets cjmp_2
156test_offsets pjmp_3
157test_offsets jmp_5
158test_offsets cjmp_6
159test_offsets pjmp_7
160
161.p2align 5
162	hlt
163