smartalign: 16-bit generic alignment macros
[nasm.git] / macros / smartalign.mac
blob6ff294ae4e4841b65e59abbaf9223015fd9e37fe
2 ; Smart alignment macros
4 USE: smartalign
6 %imacro alignmode 1-2.nolist
7   %define __ALIGN_JMP_THRESHOLD__ 17
8   %ifidni %1,nop
9     %define __ALIGN_16BIT_1B__ 0x90
10     %define __ALIGN_16BIT_2B__ 0x90,0x90
11     %define __ALIGN_16BIT_3B__ 0x90,0x90,0x90
12     %define __ALIGN_16BIT_4B__ 0x90,0x90,0x90,0x90
13     %define __ALIGN_16BIT_5B__ 0x90,0x90,0x90,0x90,0x90
14     %define __ALIGN_16BIT_6B__ 0x90,0x90,0x90,0x90,0x90,0x90
15     %define __ALIGN_16BIT_7B__ 0x90,0x90,0x90,0x90,0x90,0x90,0x90
16     %define __ALIGN_16BIT_8B__ 0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90
18     %define __ALIGN_32BIT_1B__ 0x90
19     %define __ALIGN_32BIT_2B__ 0x90,0x90
20     %define __ALIGN_32BIT_3B__ 0x90,0x90,0x90
21     %define __ALIGN_32BIT_4B__ 0x90,0x90,0x90,0x90
22     %define __ALIGN_32BIT_5B__ 0x90,0x90,0x90,0x90,0x90
23     %define __ALIGN_32BIT_6B__ 0x90,0x90,0x90,0x90,0x90,0x90
24     %define __ALIGN_32BIT_7B__ 0x90,0x90,0x90,0x90,0x90,0x90,0x90
25     %define __ALIGN_32BIT_8B__ 0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90
27     %define __ALIGN_64BIT_1B__ 0x90
28     %define __ALIGN_64BIT_2B__ 0x90,0x90
29     %define __ALIGN_64BIT_3B__ 0x90,0x90,0x90
30     %define __ALIGN_64BIT_4B__ 0x90,0x90,0x90,0x90
31     %define __ALIGN_64BIT_5B__ 0x90,0x90,0x90,0x90,0x90
32     %define __ALIGN_64BIT_6B__ 0x90,0x90,0x90,0x90,0x90,0x90
33     %define __ALIGN_64BIT_7B__ 0x90,0x90,0x90,0x90,0x90,0x90,0x90
34     %define __ALIGN_64BIT_8B__ 0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90
35   %elifidni %1,generic
36     %define __ALIGN_16BIT_1B__ 0x90
37     %define __ALIGN_16BIT_2B__ 0x89,0xf6
38     %define __ALIGN_16BIT_3B__ 0x8d,0x74,0x00
39     %define __ALIGN_16BIT_4B__ 0x8d,0xb4,0x00,0x00
40     %define __ALIGN_16BIT_5B__ 0x90,0x8d,0xb4,0x00,0x00
41     %define __ALIGN_16BIT_6B__ 0x89,0xf6,0x8d,0xbd,0x00,0x00
42     %define __ALIGN_16BIT_7B__ 0x8d,0x74,0x00,0x8d,0xbd,0x00,0x00
43     %define __ALIGN_16BIT_8B__ 0x8d,0xb4,0x00,0x00,0x8d,0xbd,0x00,0x00
45     %define __ALIGN_32BIT_1B__ 0x90
46     %define __ALIGN_32BIT_2B__ 0x89,0xf6
47     %define __ALIGN_32BIT_3B__ 0x8d,0x76,0x00
48     %define __ALIGN_32BIT_4B__ 0x8d,0x74,0x26,0x00
49     %define __ALIGN_32BIT_5B__ 0x90,0x8d,0x74,0x26,0x00
50     %define __ALIGN_32BIT_6B__ 0x8d,0xb6,0x00,0x00,0x00,0x00
51     %define __ALIGN_32BIT_7B__ 0x8d,0xb4,0x26,0x00,0x00,0x00,0x00
52     %undef  __ALIGN_32BIT_8B__
54     %define __ALIGN_64BIT_1B__ 0x90
55     %define __ALIGN_64BIT_2B__ 0x66,0x90
56     %define __ALIGN_64BIT_3B__ 0x66,0x66,0x90
57     %define __ALIGN_64BIT_4B__ 0x66,0x66,0x66,0x90
58     %define __ALIGN_64BIT_5B__ 0x66,0x66,0x90,0x66,0x90
59     %define __ALIGN_64BIT_6B__ 0x66,0x66,0x90,0x66,0x66,0x90
60     %define __ALIGN_64BIT_7B__ 0x66,0x66,0x66,0x90,0x66,0x66,0x90
61     %define __ALIGN_64BIT_8B__ 0x66,0x66,0x66,0x90,0x66,0x66,0x66,0x90
62   %elifidni %1,k8
63     %define __ALIGN_16BIT_1B__ 0x90
64     %define __ALIGN_16BIT_2B__ 0x66,0x90
65     %define __ALIGN_16BIT_3B__ 0x66,0x66,0x90
66     %define __ALIGN_16BIT_4B__ 0x66,0x66,0x66,0x90
67     %define __ALIGN_16BIT_5B__ 0x66,0x66,0x90,0x66,0x90
68     %define __ALIGN_16BIT_6B__ 0x66,0x66,0x90,0x66,0x66,0x90
69     %define __ALIGN_16BIT_7B__ 0x66,0x66,0x66,0x90,0x66,0x66,0x90
70     %define __ALIGN_16BIT_8B__ 0x66,0x66,0x66,0x90,0x66,0x66,0x66,0x90
72     %define __ALIGN_32BIT_1B__ 0x90
73     %define __ALIGN_32BIT_2B__ 0x66,0x90
74     %define __ALIGN_32BIT_3B__ 0x66,0x66,0x90
75     %define __ALIGN_32BIT_4B__ 0x66,0x66,0x66,0x90
76     %define __ALIGN_32BIT_5B__ 0x66,0x66,0x90,0x66,0x90
77     %define __ALIGN_32BIT_6B__ 0x66,0x66,0x90,0x66,0x66,0x90
78     %define __ALIGN_32BIT_7B__ 0x66,0x66,0x66,0x90,0x66,0x66,0x90
79     %define __ALIGN_32BIT_8B__ 0x66,0x66,0x66,0x90,0x66,0x66,0x66,0x90
81     %define __ALIGN_64BIT_1B__ 0x90
82     %define __ALIGN_64BIT_2B__ 0x66,0x90
83     %define __ALIGN_64BIT_3B__ 0x66,0x66,0x90
84     %define __ALIGN_64BIT_4B__ 0x66,0x66,0x66,0x90
85     %define __ALIGN_64BIT_5B__ 0x66,0x66,0x90,0x66,0x90
86     %define __ALIGN_64BIT_6B__ 0x66,0x66,0x90,0x66,0x66,0x90
87     %define __ALIGN_64BIT_7B__ 0x66,0x66,0x66,0x90,0x66,0x66,0x90
88     %define __ALIGN_64BIT_8B__ 0x66,0x66,0x66,0x90,0x66,0x66,0x66,0x90
89   %elifidni %1,k7
90     %define __ALIGN_16BIT_1B__ 0x90
91     %define __ALIGN_16BIT_2B__ 0x66,0x90
92     %define __ALIGN_16BIT_3B__ 0x66,0x66,0x90
93     %define __ALIGN_16BIT_4B__ 0x66,0x66,0x66,0x90
94     %define __ALIGN_16BIT_5B__ 0x66,0x66,0x90,0x66,0x90
95     %define __ALIGN_16BIT_6B__ 0x66,0x66,0x90,0x66,0x66,0x90
96     %define __ALIGN_16BIT_7B__ 0x66,0x66,0x66,0x90,0x66,0x66,0x90
97     %define __ALIGN_16BIT_8B__ 0x66,0x66,0x66,0x90,0x66,0x66,0x66,0x90
99     %define __ALIGN_32BIT_1B__ 0x90
100     %define __ALIGN_32BIT_2B__ 0x8b,0xc0
101     %define __ALIGN_32BIT_3B__ 0x8d,0x04,0x20
102     %define __ALIGN_32BIT_4B__ 0x8d,0x44,0x20,0x00
103     %define __ALIGN_32BIT_5B__ 0x8d,0x44,0x20,0x00,0x90
104     %define __ALIGN_32BIT_6B__ 0x8d,0x80,0x00,0x00,0x00,0x00
105     %define __ALIGN_32BIT_7B__ 0x8d,0x04,0x05,0x00,0x00,0x00,0x00
106     %undef  __ALIGN_32BIT_8B__
108     %define __ALIGN_64BIT_1B__ 0x90
109     %define __ALIGN_64BIT_2B__ 0x66,0x90
110     %define __ALIGN_64BIT_3B__ 0x66,0x66,0x90
111     %define __ALIGN_64BIT_4B__ 0x66,0x66,0x66,0x90
112     %define __ALIGN_64BIT_5B__ 0x66,0x66,0x90,0x66,0x90
113     %define __ALIGN_64BIT_6B__ 0x66,0x66,0x90,0x66,0x66,0x90
114     %define __ALIGN_64BIT_7B__ 0x66,0x66,0x66,0x90,0x66,0x66,0x90
115     %define __ALIGN_64BIT_8B__ 0x66,0x66,0x66,0x90,0x66,0x66,0x66,0x90
116   %elifidni %1,p6
117     %define __ALIGN_16BIT_1B__ 0x90
118     %define __ALIGN_16BIT_2B__ 0x66,0x90
119     %define __ALIGN_16BIT_3B__ 0x0f,0x1f,0x00
120     %define __ALIGN_16BIT_4B__ 0x0f,0x1f,0x40,0x00
121     %define __ALIGN_16BIT_5B__ 0x90,0x0f,0x1f,0x40,0x00
122     %define __ALIGN_16BIT_6B__ 0x0f,0x1f,0x00,0x0f,0x1f,0x00
123     %define __ALIGN_16BIT_7B__ 0x0f,0x1f,0x00,0x0f,0x1f,0x40,0x00
124     %define __ALIGN_16BIT_8B__ 0x0f,0x1f,0x40,0x00,0x0f,0x1f,0x40,0x00
126     %define __ALIGN_32BIT_1B__ 0x90
127     %define __ALIGN_32BIT_2B__ 0x66,0x90
128     %define __ALIGN_32BIT_3B__ 0x0f,0x1f,0x00
129     %define __ALIGN_32BIT_4B__ 0x0f,0x1f,0x40,0x00
130     %define __ALIGN_32BIT_5B__ 0x0f,0x1f,0x44,0x00,0x00
131     %define __ALIGN_32BIT_6B__ 0x66,0x0f,0x1f,0x44,0x00,0x00
132     %define __ALIGN_32BIT_7B__ 0x0f,0x1f,0x80,0x00,0x00,0x00,0x00
133     %define __ALIGN_32BIT_8B__ 0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00
135     %define __ALIGN_64BIT_1B__ 0x90
136     %define __ALIGN_64BIT_2B__ 0x66,0x90
137     %define __ALIGN_64BIT_3B__ 0x0f,0x1f,0x00
138     %define __ALIGN_64BIT_4B__ 0x0f,0x1f,0x40,0x00
139     %define __ALIGN_64BIT_5B__ 0x0f,0x1f,0x44,0x00,0x00
140     %define __ALIGN_64BIT_6B__ 0x66,0x0f,0x1f,0x44,0x00,0x00
141     %define __ALIGN_64BIT_7B__ 0x0f,0x1f,0x80,0x00,0x00,0x00,0x00
142     %define __ALIGN_64BIT_8B__ 0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00
143   %else
144     %error unknown alignment mode: %1
145   %endif
146   %ifnempty %2
147     %xdefine __ALIGN_JMP_THRESHOLD__ %2
148   %endif
149   %xdefine __ALIGNMODE__ %1,__ALIGN_JMP_THRESHOLD__
150 %endmacro
152 %unimacro align 1-2+.nolist
153 %imacro align 1-2+.nolist
154   %ifnempty %2
155     times ($$-$) % (%1) %2
156   %else
157     %push
158     %assign %$pad ($$-$) % %1
159     %if %$pad >= __ALIGN_JMP_THRESHOLD__
160       jmp %%end
161       ; We can't re-use %$pad here as $ will have changed!
162       times ($$-$) % %1 db 90h
163 %%end:
164     %else
165       %if __BITS__ == 16
166         %ifdef __ALIGN_16BIT_8B__
167           %rep %$pad / 8
168             db __ALIGN_16BIT_8B__
169           %endrep
170           %assign %$pad %$pad % 8
171         %else
172           %rep %$pad / 7
173             db __ALIGN_16BIT_7B__
174           %endrep
175           %assign %$pad %$pad % 7
176         %endif
177         %if %$pad == 1
178           db __ALIGN_16BIT_1B__
179         %elif %$pad == 2
180           db __ALIGN_16BIT_2B__
181         %elif %$pad == 3
182           db __ALIGN_16BIT_3B__
183         %elif %$pad == 4
184           db __ALIGN_16BIT_4B__
185         %elif %$pad == 5
186           db __ALIGN_16BIT_5B__
187         %elif %$pad == 6
188           db __ALIGN_16BIT_6B__
189         %elif %$pad == 7
190           db __ALIGN_16BIT_7B__
191         %endif
192       %elif __BITS__ == 32
193         %ifdef __ALIGN_32BIT_8B__
194           %rep %$pad / 8
195             db __ALIGN_32BIT_8B__
196           %endrep
197           %assign %$pad %$pad % 8
198         %else
199           %rep %$pad / 7
200             db __ALIGN_32BIT_7B__
201           %endrep
202           %assign %$pad %$pad % 7
203         %endif
204         %if %$pad == 1
205           db __ALIGN_32BIT_1B__
206         %elif %$pad == 2
207           db __ALIGN_32BIT_2B__
208         %elif %$pad == 3
209           db __ALIGN_32BIT_3B__
210         %elif %$pad == 4
211           db __ALIGN_32BIT_4B__
212         %elif %$pad == 5
213           db __ALIGN_32BIT_5B__
214         %elif %$pad == 6
215           db __ALIGN_32BIT_6B__
216         %elif %$pad == 7
217           db __ALIGN_32BIT_7B__
218         %endif
219       %elif __BITS__ == 64
220         %ifdef __ALIGN_64BIT_8B__
221           %rep %$pad / 8
222             db __ALIGN_64BIT_8B__
223           %endrep
224           %assign %$pad %$pad % 8
225         %else
226           %rep %$pad / 7
227             db __ALIGN_64BIT_7B__
228           %endrep
229           %assign %$pad %$pad % 7
230         %endif
231         %if %$pad == 1
232           db __ALIGN_64BIT_1B__
233         %elif %$pad == 2
234           db __ALIGN_64BIT_2B__
235         %elif %$pad == 3
236           db __ALIGN_64BIT_3B__
237         %elif %$pad == 4
238           db __ALIGN_64BIT_4B__
239         %elif %$pad == 5
240           db __ALIGN_64BIT_5B__
241         %elif %$pad == 6
242           db __ALIGN_64BIT_6B__
243         %elif %$pad == 7
244           db __ALIGN_64BIT_7B__
245         %endif
246       %else
247         %error "Invalid __BITS__ value"
248       %endif
249     %endif
250     %pop
251   %endif
252 %endmacro
254         alignmode generic