|
@@ -18,6 +18,12 @@
|
|
|
.endm
|
|
|
#endif
|
|
|
|
|
|
+/*
|
|
|
+ * Issue one struct alt_instr descriptor entry (need to put it into
|
|
|
+ * the section .altinstructions, see below). This entry contains
|
|
|
+ * enough information for the alternatives patching code to patch an
|
|
|
+ * instruction. See apply_alternatives().
|
|
|
+ */
|
|
|
.macro altinstruction_entry orig alt feature orig_len alt_len pad_len
|
|
|
.long \orig - .
|
|
|
.long \alt - .
|
|
@@ -27,6 +33,12 @@
|
|
|
.byte \pad_len
|
|
|
.endm
|
|
|
|
|
|
+/*
|
|
|
+ * Define an alternative between two instructions. If @feature is
|
|
|
+ * present, early code in apply_alternatives() replaces @oldinstr with
|
|
|
+ * @newinstr. ".skip" directive takes care of proper instruction padding
|
|
|
+ * in case @newinstr is longer than @oldinstr.
|
|
|
+ */
|
|
|
.macro ALTERNATIVE oldinstr, newinstr, feature
|
|
|
140:
|
|
|
\oldinstr
|
|
@@ -55,6 +67,12 @@
|
|
|
*/
|
|
|
#define alt_max_short(a, b) ((a) ^ (((a) ^ (b)) & -(-((a) < (b)))))
|
|
|
|
|
|
+
|
|
|
+/*
|
|
|
+ * Same as ALTERNATIVE macro above but for two alternatives. If CPU
|
|
|
+ * has @feature1, it replaces @oldinstr with @newinstr1. If CPU has
|
|
|
+ * @feature2, it replaces @oldinstr with @feature2.
|
|
|
+ */
|
|
|
.macro ALTERNATIVE_2 oldinstr, newinstr1, feature1, newinstr2, feature2
|
|
|
140:
|
|
|
\oldinstr
|