#ifndef CAMM_UTIL_H
#define CAMM_UTIL_H /*+ To stop multiple inclusions. +*/
typedef struct {
float r,i;
} Complex;
typedef struct {
double r,i;
} Dcomplex;
#undef str
#define str(a_) xstr(a_)
#undef xstr
#define xstr(a_) #a_
#undef val
#define val(a_) xval(a_)
#undef xval
#define xval(a_) a_
#ifndef Mjoin
#define Mjoin(a,b) mjoin(a,b)
#ifdef mjoin
#undef mjoin
#endif
#define mjoin(a,b) a ## b
#endif
#undef VOLATILE
#define VOLATILE __volatile__
#undef ASM
#define ASM __asm__ VOLATILE
#ifdef BETA0
#undef BL
#define BL b0
#endif
#ifdef BETA1
#undef BL
#define BL b1
#endif
#ifdef BETAX
#undef BL
#define BL bX
#endif
#ifdef BETAXI0
#undef BL
#define BL bXi0
#endif
#ifdef NO_TRANSPOSE
#ifdef GER
#ifdef Conj_
#undef FEXT
#define FEXT Gc
#else
#undef FEXT
#define FEXT Gu
#endif
#else
#ifdef Conj_
#undef FEXT
#define FEXT Nc
#else
#undef FEXT
#define FEXT N
#endif
#endif
#else
#ifdef Conj_
#undef FEXT
#define FEXT C
#else
#undef FEXT
#define FEXT T
#endif
#endif
#undef BLC
#define BLC Mjoin(FEXT,BL)
#ifdef __GNUC__
#undef NO_INLINE
#define NO_INLINE double sq(double x) {return x*x;}
#else
#undef NO_INLINE
#define NO_INLINE
#endif
#undef lab
#define lab(a_) "\n" str(MY_FUNCTION) "_" str(N) "_" str(a_) ":\n\t"
#undef jmp
#define jmp(a_) "jmp " str(MY_FUNCTION) "_" str(N) "_" str(a_) "\n\t"
#undef je
#define je(a_) "je " str(MY_FUNCTION) "_" str(N) "_" str(a_) "\n\t"
#undef jge
#define jge(a_) "jge " str(MY_FUNCTION) "_" str(N) "_" str(a_) "\n\t"
#undef jle
#define jle(a_) "jle " str(MY_FUNCTION) "_" str(N) "_" str(a_) "\n\t"
#undef jl
#define jl(a_) "jl " str(MY_FUNCTION) "_" str(N) "_" str(a_) "\n\t"
#undef jne
#define jne(a_) "jne " str(MY_FUNCTION) "_" str(N) "_" str(a_) "\n\t"
#undef align
#define align ".align 16\n\t"
#undef test
#define test(a_,b_) "testl $" str(a_) ",%%e" str(b_) "\n\t"
#undef and
#define and(a_,b_) "andl $" str(a_) ",%%e" str(b_) "\n\t"
#undef sub
#define sub(a_,b_) "subl $" str(a_) ",%%e" str(b_) "\n\t"
#undef SS
#define SS(a_,b_) a_ + b_
#undef MM
#define MM(a_,b_) a_ * b_
#undef E4
#define E4(a_) (( a_ >> 2 ) << 2 )
#undef TYPE
#undef SCALAR
#undef PREC
#undef CSHUF
#undef LSHUF
#undef HSHUF
#undef ISHUF
#undef RSHUF
#undef SINGLE
#undef REAL
#undef DIV
#ifdef SCPLX
#define TYPE Complex
#define SCALAR Complex *
#define PREC c
#define CSHUF 177
#define LSHUF 160
#define HSHUF 245
#define ISHUF 13*17
#define RSHUF 8*17
#define SINGLE
#define DIV 2
/* #ifdef Conj_ */
/* static const TYPE signd[2]={{-1.0,1.0},{-1.0,1.0}}; */
/* #else */
static const TYPE signd[2]={{1.0,-1.0},{1.0,-1.0}};
/* #endif */
#endif
#ifdef SREAL
#define TYPE float
#define SCALAR float
#define PREC s
#define SINGLE
#define REAL
#define DIV 1
#endif
#ifdef DREAL
#define TYPE double
#define SCALAR double
#define PREC d
#define REAL
#define DIV 2
#endif
#ifdef DCPLX
#define TYPE Dcomplex
#define SCALAR Dcomplex *
#define PREC z
#define CSHUF 1
#define LSHUF 0
#define HSHUF 3
#define ISHUF 3
#define RSHUF 0
#define DIV 4
/* #ifdef Conj_ */
/* static const TYPE signd[1]={{-1.0,1.0}}; */
/* #else */
static const TYPE signd[1]={{1.0,-1.0}};
/* #endif */
#endif
#undef M11
#define M11 0
#undef M12
#define M12 1
#undef M13
#define M13 2
#undef M14
#define M14 3
#undef M15
#define M15 4
#undef M16
#define M16 5
#undef M17
#define M17 6
#undef M18
#define M18 7
#undef M23
#define M23 1
#undef M24
#define M24 2
#undef M25
#define M25 3
#undef M26
#define M26 4
#undef M27
#define M27 5
#undef M28
#define M28 6
#undef M33
#define M33 0
#undef M34
#define M34 1
#undef M35
#define M35 2
#undef M36
#define M36 3
#undef M37
#define M37 4
#undef M38
#define M38 5
#undef P10
#define P10 1
#undef P11
#define P11 2
#undef P12
#define P12 3
#undef P13
#define P13 4
#undef P14
#define P14 5
#undef P15
#define P15 6
#undef P16
#define P16 7
#undef XM
#define XM(a_,b_) M ## b_ ## a_
#undef M
#define M(a_,b_) XM(a_,b_)
#undef XP
#define XP(a_,b_) P ## b_ ## a_
#undef P
#define P(a_,b_) XP(a_,b_)
#undef mex
#define mex(a_) str(%%e ## a_)
#undef msx
#define msx(a_) "%%st(" str(a_) ")"
#undef cmp
#define cmp(a_,b_) "cmp " mex(a_) "," mex(b_) "\n\t"
#undef icmpr
#define icmpr(a_,b_) "cmp " mex(a_) ",(" mex(b_) ")\n\t"
#undef f
#define f(a_,b_,c_) "prefetch" str(a_) " " str(b_) "(%%e" #c_ ")\n\t"
#undef pfx
#define pfx(a_,b_,c_,d_,e_) "prefetch" str(a_) " " str(b_) "(%%e" #c_ ",%%e" #d_ "," str(e_) ")\n\t"
#undef a
#define a(a_,b_) "addl $" str(a_) "," mex(b_) "\n\t"
#undef m
#define m(a_,b_) "imul $" str(a_) "," mex(b_) "\n\t"
#undef pop
#define pop(a_) "popl %%e" str(a_) "\n\t"
#undef push
#define push(a_) "pushl %%e" str(a_) "\n\t"
#undef d
#define d(a_,b_) "idiv $" str(a_) "," mex(b_) "\n\t"
#undef shl
#define shl(a_,b_) "shl $" str(a_) "," mex(b_) "\n\t"
#undef shr
#define shr(a_,b_) "shr $" str(a_) "," mex(b_) "\n\t"
#undef mm
#define mm(a_,b_) "mov $" str(a_) "," mex(b_) "\n\t"
#undef ra
#define ra(a_,b_) "addl %%e" str(a_) "," mex(b_) "\n\t"
#undef rs
#define rs(a_,b_) "subl %%e" str(a_) "," mex(b_) "\n\t"
#undef fl
#define fl(a_,b_) "fldl " str(a_) "(" mex(b_) ")\n\t"
#undef fp
#define fp(a_,b_) "fstpl " str(a_) "(" mex(b_) ")\n\t"
#undef fd
#define fd(a_) "fld " msx(a_) "\n\t"
#undef fap
#define fap(a_,b_) "faddp " msx(a_) "," msx(b_) "\n\t"
/* #define fsp(a_) fx(a_) "fsubp %%st," msx(a_) "\n\t" */
#undef fsp
#define fsp(a_) "fsubrp %%st," msx(a_) "\n\t"
#undef fmp
#define fmp(a_,b_) "fmulp " msx(a_) "," msx(b_) "\n\t"
#undef fa
#define fa(a_,b_) "fadd " msx(a_) "," msx(b_) "\n\t"
#undef fm
#define fm(a_,b_) "fmul " msx(a_) "," msx(b_) "\n\t"
#undef faa
#define faa(a_,b_) "faddl " str(a_) "(" mex(b_) ")\n\t"
#undef fma
#define fma(a_,b_) "fmull " str(a_) "(" mex(b_) ")\n\t"
#undef fz
#define fz "fldz\n\t"
#undef fx
#define fx(a_) "fxch " msx(a_) "\n\t"
#undef fx1
#define fx1 "fxch\n\t"
#undef fc
#define fc(a_) "fstp " msx(a_) "\n\t"
#ifndef ATHLON
#if defined(DREAL) || defined(DCPLX)
#undef SSESUF
#define SSESUF "d "
#undef RS4
#define RS4 16
#undef RS
#define RS 4
#else
#undef SSESUF
#define SSESUF "s "
#undef RS4
#define RS4 16
#undef RS
#define RS 4
#endif
#undef mxx
#define mxx(a_) str(%%xmm ## a_)
#undef prp
#define prp(a_,b_) "rcpp" SSESUF mxx(a_) "," mxx(b_) "\n\t"
#undef prps
#define prps(a_,b_) "rcps" SSESUF mxx(a_) "," mxx(b_) "\n\t"
#undef pann
#define pann(a_,b_) "andnp" SSESUF mxx(a_) "," mxx(b_) "\n\t"
#undef psqs
#define psqs(a_,b_) "sqrts" SSESUF mxx(a_) "," mxx(b_) "\n\t"
#undef por
#define por(a_,b_) "orp" SSESUF mxx(a_) "," mxx(b_) "\n\t"
#undef pan
#define pan(a_,b_) "andp" SSESUF mxx(a_) "," mxx(b_) "\n\t"
#undef pcm
#define pcm(a_,b_,c_) "cmpp" SSESUF " $" str(a_) "," mxx(b_) "," mxx(c_) "\n\t"
#undef pcms
#define pcms(a_,b_,c_) "cmps" SSESUF " $" str(a_) "," mxx(b_) "," mxx(c_) "\n\t"
#undef pax
#define pax(a_,b_) "maxp" SSESUF mxx(a_) "," mxx(b_) "\n\t"
#undef paxs
#define paxs(a_,b_) "maxs" SSESUF mxx(a_) "," mxx(b_) "\n\t"
#undef pd
#define pd(a_,b_) "divp" SSESUF mxx(a_) "," mxx(b_) "\n\t"
#undef pdsr
#define pdsr(a_,b_) "divs" SSESUF mxx(a_) "," mxx(b_) "\n\t"
#undef pxx
#define pxx(a_,b_) "xorp" SSESUF mxx(a_) "," mxx(b_) "\n\t"
#undef px
#define px(a_) "xorp" SSESUF mxx(a_) "," mxx(a_) "\n\t"
#undef pm
#define pm(a_,b_) "mulp" SSESUF mxx(a_) "," mxx(b_) "\n\t"
#undef pa
#define pa(a_,b_) "addp" SSESUF mxx(a_) "," mxx(b_) "\n\t"
#undef pmm
#define pmm(a_,b_,c_) "mulp" SSESUF str(a_) "(" mex(b_) ")," mxx(c_) "\n\t"
#undef pam
#define pam(a_,b_,c_) "addp" SSESUF str(a_) "(" mex(b_) ")," mxx(c_) "\n\t"
#undef pl
#define pl(a_,b_,c_) "movup" SSESUF str(a_) "(" mex(b_) ")," mxx(c_) "\n\t"
#undef pla
#define pla(a_,b_,c_) "movap" SSESUF str(a_) "(" mex(b_) ")," mxx(c_) "\n\t"
#undef pu
#define pu(a_,b_,c_) "movup" SSESUF mxx(a_) "," str(b_) "(" mex(c_) ")\n\t"
#undef punt
#define punt(a_,b_,c_) "movntp" SSESUF mxx(a_) "," str(b_) "(" mex(c_) ")\n\t"
#undef pua
#define pua(a_,b_,c_) "movap" SSESUF mxx(a_) "," str(b_) "(" mex(c_) ")\n\t"
#undef pud
#define pud(a_,b_,c_) "movlp" SSESUF mxx(a_) "," str(b_) "(" mex(c_) ")\n\t"
#undef pudr
#define pudr(a_,b_) "movlp" SSESUF mxx(a_) "," mxx(b_) "\n\t"
#undef pc
#define pc(a_,b_) "movap" SSESUF mxx(a_) "," mxx(b_) "\n\t"
#undef ps
#define ps(a_,b_,c_) "shufp" SSESUF " $" str(a_) "," mxx(b_) "," mxx(c_) "\n\t"
#undef phl
#define phl(a_,b_) "movhlp" SSESUF mxx(a_) "," mxx(b_) "\n\t"
#undef pus
#define pus(a_,b_,c_) "movs" SSESUF mxx(a_) "," str(b_) "(" mex(c_) ")\n\t"
#undef pls
#define pls(a_,b_,c_) "movs" SSESUF str(a_) "(" mex(b_) ")," mxx(c_) "\n\t"
#undef pld
#define pld(a_,b_,c_) "movlp" SSESUF str(a_) "(" mex(b_) ")," mxx(c_) "\n\t"
#undef plh
#define plh(a_,b_) "movlhp" SSESUF mxx(a_) "," mxx(b_) "\n\t"
#undef pas
#define pas(a_,b_,c_) "adds" SSESUF str(a_) "(" mex(b_) ")," mxx(c_) "\n\t"
#undef pms
#define pms(a_,b_,c_) "muls" SSESUF str(a_) "(" mex(b_) ")," mxx(c_) "\n\t"
#undef pcs
#define pcs(a_,b_) "movs" SSESUF mxx(a_) "," mxx(b_) "\n\t"
#undef pasr
#define pasr(a_,b_) "adds" SSESUF mxx(a_) "," mxx(b_) "\n\t"
#undef pmsr
#define pmsr(a_,b_) "muls" SSESUF mxx(a_) "," mxx(b_) "\n\t"
#undef pul
#define pul(a_,b_) "unpcklp" SSESUF mxx(a_) "," mxx(b_) "\n\t"
#undef puh
#define puh(a_,b_) "unpckhp" SSESUF mxx(a_) "," mxx(b_) "\n\t"
#undef plsx
#define plsx(a_,b_,c_,d_,e_) \
"movs" SSESUF str(a_) "(" mex(b_) "," mex(c_) "," #d_ ")," mxx(e_) "\n\t"
#undef plx
#define plx(a_,b_,c_,d_,e_) \
"movup" SSESUF str(a_) "(" mex(b_) "," mex(c_) "," #d_ ")," mxx(e_) "\n\t"
#undef plax
#define plax(a_,b_,c_,d_,e_) \
"movap" SSESUF str(a_) "(" mex(b_) "," mex(c_) "," #d_ ")," mxx(e_) "\n\t"
#undef pasx
#define pasx(a_,b_,c_,d_,e_) \
"adds" SSESUF str(a_) "(" mex(b_) "," mex(c_) "," #d_ ")," mxx(e_) "\n\t"
#undef pusx
#define pusx(a_,b_,c_,d_,e_) \
"movs" SSESUF mxx(a_) "," str(b_) "(" mex(c_) "," mex(d_) "," #e_ ")\n\t"
#undef pux
#define pux(a_,b_,c_,d_,e_) \
"movup" SSESUF mxx(a_) "," str(b_) "(" mex(c_) "," mex(d_) "," #e_ ")\n\t"
#undef puax
#define puax(a_,b_,c_,d_,e_) \
"movap" SSESUF mxx(a_) "," str(b_) "(" mex(c_) "," mex(d_) "," #e_ ")\n\t"
#undef pudx
#define pudx(a_,b_,c_,d_,e_) \
"movlp" SSESUF mxx(a_) "," str(b_) "(" mex(c_) "," mex(d_) "," #e_ ")\n\t"
#undef pldx
#define pldx(a_,b_,c_,d_,e_) \
"movlp" SSESUF str(a_) "(" mex(b_) "," mex(c_) "," #d_ ")," mxx(e_) "\n\t"
#else
#undef RS4
#define RS4 8
#undef RS
#define RS 2
#undef mxx
#define mxx(a_) str(%%mm ## a_)
#undef pul
#define pul(a_,b_) "punpckldq " mxx(a_) "," mxx(b_) "\n\t"
#undef puh
#define puh(a_,b_) "punpckhdq " mxx(a_) "," mxx(b_) "\n\t"
#undef px
#define px(a_) "pxor " mxx(a_) "," mxx(a_) "\n\t"
#undef pm
#define pm(a_,b_) "pfmul " mxx(a_) "," mxx(b_) "\n\t"
#undef pa
#define pa(a_,b_) "pfadd " mxx(a_) "," mxx(b_) "\n\t"
#undef pac
#define pac(a_,b_) "pfacc " mxx(a_) "," mxx(b_) "\n\t"
#undef pmm
#define pmm(a_,b_,c_) "pfmul " str(a_) "(" mex(b_) ")," mxx(c_) "\n\t"
#undef pam
#define pam(a_,b_,c_) "pfadd " str(a_) "(" mex(b_) ")," mxx(c_) "\n\t"
#undef pl
#define pl(a_,b_,c_) "movq " str(a_) "(" mex(b_) ")," mxx(c_) "\n\t"
#undef pla
#define pla(a_,b_,c_) "movq " str(a_) "(" mex(b_) ")," mxx(c_) "\n\t"
#undef pu
#define pu(a_,b_,c_) "movq " mxx(a_) "," str(b_) "(" mex(c_) ")\n\t"
#undef pc
#define pc(a_,b_) "movq " mxx(a_) "," mxx(b_) "\n\t"
#undef ps
#define ps(a_,b_,c_) "pswapd " mxx(b_) "," mxx(c_) "\n\t"
#undef phl
#define phl(a_,b_) "punpckhdq " mxx(a_) "," mxx(b_) "\n\t"
#undef plh
#define plh(a_,b_) "punpckldq " mxx(a_) "," mxx(b_) "\n\t"
#undef pus
#define pus(a_,b_,c_) "movd " mxx(a_) "," str(b_) "(" mex(c_) ")\n\t"
#undef pls
#define pls(a_,b_,c_) "movd " str(a_) "(" mex(b_) ")," mxx(c_) "\n\t"
#undef plsx
#define plsx(a_,b_,c_,d_,e_) \
"movd " str(a_) "(" mex(b_) "," mex(c_) "," #d_ ")," mxx(e_) "\n\t"
#undef plx
#define plx(a_,b_,c_,d_,e_) \
"movq " str(a_) "(" mex(b_) "," mex(c_) "," #d_ ")," mxx(e_) "\n\t"
#undef pasx
#define pasx(a_,b_,c_,d_,e_) \
"addss " str(a_) "(" mex(b_) "," mex(c_) "," #d_ ")," mxx(e_) "\n\t"
#undef pusx
#define pusx(a_,b_,c_,d_,e_) \
"movd " mxx(a_) "," str(b_) "(" mex(c_) "," mex(d_) "," #e_ ")\n\t"
#undef pux
#define pux(a_,b_,c_,d_,e_) \
"movq " mxx(a_) "," str(b_) "(" mex(c_) "," mex(d_) "," #e_ ")\n\t"
#endif
#endif /* CAMM_UTIL_H */