#ifndef CAMM_SCALE_H #define CAMM_SCALE_H /*+ To stop multiple inclusions. +*/ #include "camm_util.h" #undef spf #define spf(a_,b_) f(t0,a_,b_) #ifdef SCPLX #ifdef BETAX #undef SSREG #define SSREG 2 #undef lbx #define lbx pls(4,ax,1) ps(0,1,1) pm(SSREG,1) #undef cxx #define cxx pm(1,3) ps(177,3,3) pa(3,2) #undef pcx #define pcx pc(2,3) #else #undef lbx #define lbx #undef cxx #define cxx #undef pcx #define pcx #endif #undef lb #define lb pls(0,ax,0) ps(0,0,0) lbx #undef c #define c(a_) pl(a_ ## 0,si,2) pcx pm(0,2) cxx pu(2,a_ ## 0,si) #undef cp #define cp(a_,b_) pl(a_ ## 0,si,2) pcx pm(0,2) spf(b_,si) cxx pu(2,a_ ## 0,si) #undef c1_2 #define c1_2(a_) px(2) pld(a_ ## 0,si,2) pcx pm(0,2) cxx pud(2,a_ ## 0,si) #undef ub #define ub #endif #ifdef SREAL #undef lb #define lb pls(0,ax,0) ps(0,0,0) #undef c #define c(a_) pl(a_ ## 0,si,2) pm(0,2) pu(2,a_ ## 0,si) #undef cp #define cp(a_,b_) pl(a_ ## 0,si,2) spf(b_,si) pm(0,2) pu(2,a_ ## 0,si) #undef c1_2 #define c1_2(a_) px(2) pld(a_ ## 0,si,2) pm(0,2) pud(2,a_ ## 0,si) #undef c1_4 #define c1_4(a_) pls(a_ ## 0,si,2) pm(0,2) pus(2,a_ ## 0,si) #undef ub #define ub #endif #ifdef DREAL #undef lb #define lb fl(0,ax) #undef c #define c(a_) fl(a_ ## 0,si) fm(1,0) fl(a_ ## 8,si) fm(2,0) fx1 \ fp(a_ ## 0,si) fp(a_ ## 8,si) #undef cp #define cp(a_,b_) fl(a_ ## 0,si) fm(1,0) fl(a_ ## 8,si) spf(b_,si) fm(2,0) fx1 \ fp(a_ ## 0,si) fp(a_ ## 8,si) #undef c1_2 #define c1_2(a_) fl(a_ ## 0,si) fm(1,0) fp(a_ ## 0,si) #undef ub #define ub fc(0) #endif #ifdef DCPLX #undef lb #define lb fl(0,ax) fl(8,ax) #undef c #define c(a_) fl(a_ ## 0,si) fl(a_ ## 8,si) fd(3) fm(2,0) fd(3) \ fm(2,0) fx(3) fm(4,0) fx(2) fm(5,0) fap(0,2) fx(2) fsp(2) fx1 \ fp(a_ ## 0,si) fp(a_ ## 8,si) #undef cp #define cp(a_,b_) fl(a_ ## 0,si) fl(a_ ## 8,si) fd(3) fm(2,0) fd(3) \ fm(2,0) fx(3) spf(b_,si) fm(4,0) fx(2) fm(5,0) fap(0,2) fx(2) \ fsp(2) fx1 fp(a_ ## 0,si) fp(a_ ## 8,si) #undef ub #define ub fc(0) fc(0) #endif #undef sbl1 #define sbl1 c1_4(0x0) #undef sbl2 #define sbl2 c1_2(0x0) #undef sbl4 #define sbl4 cp(0x0,0x40) #undef sbl8 #define sbl8 sbl4 c(0x1) #undef sbl16 #define sbl16 sbl8 cp(0x2,0x60) c(0x3) #undef sinc16 #define sinc16 a(0x40,si) #undef sinc8 #define sinc8 a(0x20,si) #undef sinc4 #define sinc4 a(0x10,si) #undef sinc2 #define sinc2 a(0x8,si) #undef sinc1 #define sinc1 a(0x4,si) #undef SCALE #define SCALE Mjoin(Mjoin(PREC,Mjoin(scale,BLC)),FEXT) #undef MY_FUNCTION #define MY_FUNCTION SCALE static void MY_FUNCTION(const TYPE *b,TYPE *c,int len) { const TYPE *ce=c+len; #if defined(BETAX) && defined(SCPLX) const TYPE z1[2]={{1.0,-1.0},{1.0,-1.0}},*z=z1; #endif NO_INLINE #ifndef SREAL len+=len; #endif #ifdef DCPLX len+=len; #endif ASM( "pushl %%ebx\n\t" a(4,sp) "movl %0,%%esi\n\t" spf(0x00,si) spf(0x20,si) "movl %1,%%eax\n\t" "movl %2,%%edi\n\t" #if defined(BETAX) && defined(SCPLX) "movl %3,%%ebx\n\t" pl(0,bx,SSREG) #endif lb lab(loop) test(-16,di) je(8) sub(16,di) align sbl16 sinc16 jmp(loop) align lab(8) test(8,di) je(4) sbl8 sinc8 lab(4) test(4,di) je(2) sbl4 sinc4 lab(2) #ifndef DCPLX test(2,di) je(1) sbl2 sinc2 lab(1) #ifdef SREAL test(1,di) je(stop) sbl1 sinc1 lab(stop) #endif #endif ub a(-4,sp) "popl %%ebx\n\t" ::"m" (c),"m" (b), "m" (len) #if defined(BETAX) && defined(SCPLX) ,"m" (z) #endif : "si","ax","di"); } #endif /* CAMM_SCALE_H */