@@ -94,13 +94,12 @@ static inline int alternatives_text_reserved(void *start, void *end)
94
94
#define alt_total_slen alt_end_marker"b-661b"
95
95
#define alt_rlen (num ) e_replacement(num)"f-"b_replacement(num)"f"
96
96
97
- #define __OLDINSTR (oldinstr , num ) \
97
+ #define OLDINSTR (oldinstr , num ) \
98
+ "# ALT: oldnstr\n" \
98
99
"661:\n\t" oldinstr "\n662:\n" \
100
+ "# ALT: padding\n" \
99
101
".skip -(((" alt_rlen(num) ")-(" alt_slen ")) > 0) * " \
100
- "((" alt_rlen(num) ")-(" alt_slen ")),0x90\n"
101
-
102
- #define OLDINSTR (oldinstr , num ) \
103
- __OLDINSTR(oldinstr, num) \
102
+ "((" alt_rlen(num) ")-(" alt_slen ")),0x90\n" \
104
103
alt_end_marker ":\n"
105
104
106
105
/*
@@ -116,11 +115,23 @@ static inline int alternatives_text_reserved(void *start, void *end)
116
115
* additionally longer than the first replacement alternative.
117
116
*/
118
117
#define OLDINSTR_2 (oldinstr , num1 , num2 ) \
118
+ "# ALT: oldinstr2\n" \
119
119
"661:\n\t" oldinstr "\n662:\n" \
120
+ "# ALT: padding2\n" \
120
121
".skip -((" alt_max_short(alt_rlen(num1), alt_rlen(num2)) " - (" alt_slen ")) > 0) * " \
121
122
"(" alt_max_short(alt_rlen(num1), alt_rlen(num2)) " - (" alt_slen ")), 0x90\n" \
122
123
alt_end_marker ":\n"
123
124
125
+ #define OLDINSTR_3 (oldinsn , n1 , n2 , n3 ) \
126
+ "# ALT: oldinstr3\n" \
127
+ "661:\n\t" oldinsn "\n662:\n" \
128
+ "# ALT: padding3\n" \
129
+ ".skip -((" alt_max_short(alt_max_short(alt_rlen(n1), alt_rlen(n2)), alt_rlen(n3)) \
130
+ " - (" alt_slen ")) > 0) * " \
131
+ "(" alt_max_short(alt_max_short(alt_rlen(n1), alt_rlen(n2)), alt_rlen(n3)) \
132
+ " - (" alt_slen ")), 0x90\n" \
133
+ alt_end_marker ":\n"
134
+
124
135
#define ALTINSTR_ENTRY (feature , num ) \
125
136
" .long 661b - .\n" /* label */ \
126
137
" .long " b_replacement (num )"f - .\n" /* new instruction */ \
@@ -129,8 +140,9 @@ static inline int alternatives_text_reserved(void *start, void *end)
129
140
" .byte " alt_rlen (num ) "\n" /* replacement len */ \
130
141
" .byte " alt_pad_len "\n" /* pad len */
131
142
132
- #define ALTINSTR_REPLACEMENT (newinstr , feature , num ) /* replacement */ \
133
- b_replacement(num)":\n\t" newinstr "\n" e_replacement(num) ":\n\t"
143
+ #define ALTINSTR_REPLACEMENT (newinstr , feature , num ) /* replacement */ \
144
+ "# ALT: replacement " #num "\n" \
145
+ b_replacement(num)":\n\t" newinstr "\n" e_replacement(num) ":\n"
134
146
135
147
/* alternative assembly primitive: */
136
148
#define ALTERNATIVE (oldinstr , newinstr , feature ) \
@@ -153,6 +165,19 @@ static inline int alternatives_text_reserved(void *start, void *end)
153
165
ALTINSTR_REPLACEMENT(newinstr2, feature2, 2) \
154
166
".popsection\n"
155
167
168
+ #define ALTERNATIVE_3 (oldinsn , newinsn1 , feat1 , newinsn2 , feat2 , newinsn3 , feat3 ) \
169
+ OLDINSTR_3(oldinsn, 1, 2, 3) \
170
+ ".pushsection .altinstructions,\"a\"\n" \
171
+ ALTINSTR_ENTRY(feat1, 1) \
172
+ ALTINSTR_ENTRY(feat2, 2) \
173
+ ALTINSTR_ENTRY(feat3, 3) \
174
+ ".popsection\n" \
175
+ ".pushsection .altinstr_replacement, \"ax\"\n" \
176
+ ALTINSTR_REPLACEMENT(newinsn1, feat1, 1) \
177
+ ALTINSTR_REPLACEMENT(newinsn2, feat2, 2) \
178
+ ALTINSTR_REPLACEMENT(newinsn3, feat3, 3) \
179
+ ".popsection\n"
180
+
156
181
/*
157
182
* Alternative instructions for different CPU types or capabilities.
158
183
*
0 commit comments