|
|
|
@ -912,42 +912,42 @@ INIT_XMM |
|
|
|
|
|
|
|
|
|
%macro PERMUTE 2-* ; takes a list of pairs to swap |
|
|
|
|
%rep %0/2 |
|
|
|
|
%xdefine tmp%2 m%2 |
|
|
|
|
%xdefine ntmp%2 nm%2 |
|
|
|
|
%xdefine %%tmp%2 m%2 |
|
|
|
|
%rotate 2 |
|
|
|
|
%endrep |
|
|
|
|
%rep %0/2 |
|
|
|
|
%xdefine m%1 tmp%2 |
|
|
|
|
%xdefine nm%1 ntmp%2 |
|
|
|
|
%undef tmp%2 |
|
|
|
|
%undef ntmp%2 |
|
|
|
|
%xdefine m%1 %%tmp%2 |
|
|
|
|
CAT_XDEFINE n, m%1, %1 |
|
|
|
|
%rotate 2 |
|
|
|
|
%endrep |
|
|
|
|
%endmacro |
|
|
|
|
|
|
|
|
|
%macro SWAP 2-* ; swaps a single chain (sometimes more concise than pairs) |
|
|
|
|
%rep %0-1 |
|
|
|
|
%ifdef m%1 |
|
|
|
|
%xdefine tmp m%1 |
|
|
|
|
%xdefine m%1 m%2 |
|
|
|
|
%xdefine m%2 tmp |
|
|
|
|
CAT_XDEFINE n, m%1, %1 |
|
|
|
|
CAT_XDEFINE n, m%2, %2 |
|
|
|
|
%else |
|
|
|
|
; If we were called as "SWAP m0,m1" rather than "SWAP 0,1" infer the original numbers here. |
|
|
|
|
; Be careful using this mode in nested macros though, as in some cases there may be |
|
|
|
|
; other copies of m# that have already been dereferenced and don't get updated correctly. |
|
|
|
|
%xdefine %%n1 n %+ %1 |
|
|
|
|
%xdefine %%n2 n %+ %2 |
|
|
|
|
%xdefine tmp m %+ %%n1 |
|
|
|
|
CAT_XDEFINE m, %%n1, m %+ %%n2 |
|
|
|
|
CAT_XDEFINE m, %%n2, tmp |
|
|
|
|
CAT_XDEFINE n, m %+ %%n1, %%n1 |
|
|
|
|
CAT_XDEFINE n, m %+ %%n2, %%n2 |
|
|
|
|
%macro SWAP 2+ ; swaps a single chain (sometimes more concise than pairs) |
|
|
|
|
%ifnum %1 ; SWAP 0, 1, ... |
|
|
|
|
SWAP_INTERNAL_NUM %1, %2 |
|
|
|
|
%else ; SWAP m0, m1, ... |
|
|
|
|
SWAP_INTERNAL_NAME %1, %2 |
|
|
|
|
%endif |
|
|
|
|
%undef tmp |
|
|
|
|
%endmacro |
|
|
|
|
|
|
|
|
|
%macro SWAP_INTERNAL_NUM 2-* |
|
|
|
|
%rep %0-1 |
|
|
|
|
%xdefine %%tmp m%1 |
|
|
|
|
%xdefine m%1 m%2 |
|
|
|
|
%xdefine m%2 %%tmp |
|
|
|
|
CAT_XDEFINE n, m%1, %1 |
|
|
|
|
CAT_XDEFINE n, m%2, %2 |
|
|
|
|
%rotate 1 |
|
|
|
|
%endrep |
|
|
|
|
%endrep |
|
|
|
|
%endmacro |
|
|
|
|
|
|
|
|
|
%macro SWAP_INTERNAL_NAME 2-* |
|
|
|
|
%xdefine %%args n %+ %1 |
|
|
|
|
%rep %0-1 |
|
|
|
|
%xdefine %%args %%args, n %+ %2 |
|
|
|
|
%rotate 1 |
|
|
|
|
%endrep |
|
|
|
|
SWAP_INTERNAL_NUM %%args |
|
|
|
|
%endmacro |
|
|
|
|
|
|
|
|
|
; If SAVE_MM_PERMUTATION is placed at the end of a function, then any later |
|
|
|
|