| 881 | #undef CX |
| 882 | |
| 883 | NOINLINE WARN_UNUSED_RESULT static int pass_all(cfftp_plan plan, cmplx c[], double fct, |
| 884 | const int sign) |
| 885 | { |
| 886 | if (plan->length==1) return 0; |
| 887 | size_t len=plan->length; |
| 888 | size_t l1=1, nf=plan->nfct; |
| 889 | cmplx *ch = RALLOC(cmplx, len); |
| 890 | if (!ch) return -1; |
| 891 | cmplx *p1=c, *p2=ch; |
| 892 | |
| 893 | for(size_t k1=0; k1<nf; k1++) |
| 894 | { |
| 895 | size_t ip=plan->fct[k1].fct; |
| 896 | size_t l2=ip*l1; |
| 897 | size_t ido = len/l2; |
| 898 | if (ip==4) |
| 899 | sign>0 ? pass4b (ido, l1, p1, p2, plan->fct[k1].tw) |
| 900 | : pass4f (ido, l1, p1, p2, plan->fct[k1].tw); |
| 901 | else if(ip==2) |
| 902 | sign>0 ? pass2b (ido, l1, p1, p2, plan->fct[k1].tw) |
| 903 | : pass2f (ido, l1, p1, p2, plan->fct[k1].tw); |
| 904 | else if(ip==3) |
| 905 | sign>0 ? pass3b (ido, l1, p1, p2, plan->fct[k1].tw) |
| 906 | : pass3f (ido, l1, p1, p2, plan->fct[k1].tw); |
| 907 | else if(ip==5) |
| 908 | sign>0 ? pass5b (ido, l1, p1, p2, plan->fct[k1].tw) |
| 909 | : pass5f (ido, l1, p1, p2, plan->fct[k1].tw); |
| 910 | else if(ip==7) pass7 (ido, l1, p1, p2, plan->fct[k1].tw, sign); |
| 911 | else if(ip==11) pass11(ido, l1, p1, p2, plan->fct[k1].tw, sign); |
| 912 | else |
| 913 | { |
| 914 | if (passg(ido, ip, l1, p1, p2, plan->fct[k1].tw, plan->fct[k1].tws, sign)) |
| 915 | { DEALLOC(ch); return -1; } |
| 916 | SWAP(p1,p2,cmplx *); |
| 917 | } |
| 918 | SWAP(p1,p2,cmplx *); |
| 919 | l1=l2; |
| 920 | } |
| 921 | if (p1!=c) |
| 922 | { |
| 923 | if (fct!=1.) |
| 924 | for (size_t i=0; i<len; ++i) |
| 925 | { |
| 926 | c[i].r = ch[i].r*fct; |
| 927 | c[i].i = ch[i].i*fct; |
| 928 | } |
| 929 | else |
| 930 | memcpy (c,p1,len*sizeof(cmplx)); |
| 931 | } |
| 932 | else |
| 933 | if (fct!=1.) |
| 934 | for (size_t i=0; i<len; ++i) |
| 935 | { |
| 936 | c[i].r *= fct; |
| 937 | c[i].i *= fct; |
| 938 | } |
| 939 | DEALLOC(ch); |
| 940 | return 0; |