From b833a7f26a79a6708643b3c729d98d45a88e171c Mon Sep 17 00:00:00 2001 From: Philip Balister Date: Sat, 1 Nov 2008 14:17:32 -0400 Subject: gnuradio : Add patch that adds NEON support. --- packages/gnuradio/gnuradio/gnuradio-neon.patch | 943 +++++++++++++++++++++++++ 1 file changed, 943 insertions(+) create mode 100644 packages/gnuradio/gnuradio/gnuradio-neon.patch (limited to 'packages/gnuradio') diff --git a/packages/gnuradio/gnuradio/gnuradio-neon.patch b/packages/gnuradio/gnuradio/gnuradio-neon.patch new file mode 100644 index 0000000000..3affda547f --- /dev/null +++ b/packages/gnuradio/gnuradio/gnuradio-neon.patch @@ -0,0 +1,943 @@ +Index: gnuradio-core/src/lib/runtime/gr_dispatcher.cc +=================================================================== +--- gnuradio-core/src/lib/runtime/gr_dispatcher.cc (revision 9831) ++++ gnuradio-core/src/lib/runtime/gr_dispatcher.cc (working copy) +@@ -28,6 +28,7 @@ + #include + #include + #include ++#include + + #ifdef HAVE_SELECT + # ifdef HAVE_SYS_SELECT_H +Index: gnuradio-core/src/lib/filter/dotprod_fff_cortex_a8.c +=================================================================== +--- gnuradio-core/src/lib/filter/dotprod_fff_cortex_a8.c (revision 0) ++++ gnuradio-core/src/lib/filter/dotprod_fff_cortex_a8.c (revision 0) +@@ -0,0 +1,85 @@ ++/* -*- c++ -*- */ ++/* ++ * Copyright 2008 Free Software Foundation, Inc. ++ * ++ * This file is part of GNU Radio ++ * ++ * GNU Radio is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 3, or (at your option) ++ * any later version. ++ * ++ * GNU Radio is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License along ++ * with this program; if not, write to the Free Software Foundation, Inc., ++ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. ++ */ ++ ++#ifdef HAVE_CONFIG_H ++#include ++#endif ++#include ++ ++/*! ++ * \param x any value ++ * \param pow2 must be a power of 2 ++ * \returns \p x rounded down to a multiple of \p pow2. ++ */ ++static inline size_t ++gr_p2_round_down(size_t x, size_t pow2) ++{ ++ return x & -pow2; ++} ++ ++ ++#if 0 ++ ++float ++dotprod_fff_cortex_a8(const float *a, const float *b, size_t n) ++{ ++ float sum = 0; ++ size_t i; ++ for (i = 0; i < n; i++){ ++ sum += a[i] * b[i]; ++ } ++ return sum; ++} ++ ++#else ++ ++/* ++ * preconditions: ++ * ++ * n > 0 and a multiple of 4 ++ * a 4-byte aligned ++ * b 16-byte aligned ++ */ ++float ++dotprod_fff_cortex_a8(const float *a, const float *b, size_t n) ++{ ++ float s = 0; ++ ++ asm ("vmov.f32 q8, #0.0 \n\t" ++ "vmov.f32 q9, #0.0 \n\t" ++ "1: \n\t" ++ "subs %3, %3, #8 \n\t" ++ "vld1.32 {d0,d1,d2,d3}, [%1]! \n\t" ++ "vld1.32 {d4,d5,d6,d7}, [%2]! \n\t" ++ "vmla.f32 q8, q0, q2 \n\t" ++ "vmla.f32 q9, q1, q3 \n\t" ++ "bgt 1b \n\t" ++ "vadd.f32 q8, q8, q9 \n\t" ++ "vpadd.f32 d0, d16, d17 \n\t" ++ "vadd.f32 %0, s0, s1 \n\t" ++ : "=w"(s), "+r"(a), "+r"(b), "+r"(n) ++ :: "q0", "q1", "q2", "q3", "q8", "q9"); ++ ++ return s; ++ ++} ++ ++#endif +Index: gnuradio-core/src/lib/filter/dotprod_fff_cortex_a8.h +=================================================================== +--- gnuradio-core/src/lib/filter/dotprod_fff_cortex_a8.h (revision 0) ++++ gnuradio-core/src/lib/filter/dotprod_fff_cortex_a8.h (revision 0) +@@ -0,0 +1,49 @@ ++/* -*- c++ -*- */ ++/* ++ * Copyright 2008 Free Software Foundation, Inc. ++ * ++ * This file is part of GNU Radio ++ * ++ * GNU Radio is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 3, or (at your option) ++ * any later version. ++ * ++ * GNU Radio is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License along ++ * with this program; if not, write to the Free Software Foundation, Inc., ++ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. ++ */ ++#ifndef INCLUDED_DOTPROD_FFF_CORTEX_A8_H ++#define INCLUDED_DOTPROD_FFF_CORTEX_A8_H ++ ++#include ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++/*! ++ *
++ *
++ *  preconditions:
++ *
++ *    n > 0 and a multiple of 4
++ *    a   4-byte aligned
++ *    b  16-byte aligned
++ *
++ * 
++ */ ++float ++dotprod_fff_cortex_a8(const float *a, const float *b, size_t n); ++ ++#ifdef __cplusplus ++} ++#endif ++ ++ ++#endif /* INCLUDED_DOTPROD_FFF_CORTEX_A8_H */ +Index: gnuradio-core/src/lib/filter/Makefile.am +=================================================================== +--- gnuradio-core/src/lib/filter/Makefile.am (revision 9831) ++++ gnuradio-core/src/lib/filter/Makefile.am (working copy) +@@ -177,7 +177,16 @@ + powerpc_qa_CODE = \ + qa_dotprod_powerpc.cc + ++cortex_a8_CODE = \ ++ sysconfig_cortex_a8.cc \ ++ gr_fir_sysconfig_cortex_a8.cc \ ++ gr_cpu_cortex_a8.cc \ ++ gr_fir_fff_cortex_a8.cc \ ++ dotprod_fff_cortex_a8.c + ++cortex_a8_qa_CODE = \ ++ qa_dotprod_cortex_a8.cc ++ + # + # include each _CODE entry here... + # +@@ -189,7 +198,9 @@ + $(x86_64_SUBCODE) \ + $(x86_qa_CODE) \ + $(powerpc_CODE) \ +- $(powerpc_qa_CODE) ++ $(powerpc_qa_CODE) \ ++ $(cortex_a8_CODE) \ ++ $(cortex_a8_qa_CODE) + + + EXTRA_DIST = \ +@@ -254,7 +265,12 @@ + libfilter_qa_la_SOURCES = $(libfilter_qa_la_common_SOURCES) $(powerpc_qa_CODE) + endif + ++if MD_CPU_cortex_a8 ++libfilter_la_SOURCES = $(libfilter_la_common_SOURCES) $(cortex_a8_CODE) ++libfilter_qa_la_SOURCES = $(libfilter_qa_la_common_SOURCES) $(cortex_a8_qa_CODE) ++endif + ++ + grinclude_HEADERS = \ + $(GENERATED_H) \ + complex_dotprod_generic.h \ +@@ -296,6 +312,7 @@ + noinst_HEADERS = \ + assembly.h \ + dotprod_fff_altivec.h \ ++ dotprod_fff_cortex_a8.h \ + gr_fir_scc_simd.h \ + gr_fir_scc_x86.h \ + gr_fir_fcc_simd.h \ +@@ -305,6 +322,7 @@ + gr_fir_ccc_simd.h \ + gr_fir_ccc_x86.h \ + gr_fir_fff_altivec.h \ ++ gr_fir_fff_cortex_a8.h \ + gr_fir_fff_simd.h \ + gr_fir_fff_x86.h \ + gr_fir_fsf_simd.h \ +Index: gnuradio-core/src/lib/filter/gr_fir_sysconfig_cortex_a8.cc +=================================================================== +--- gnuradio-core/src/lib/filter/gr_fir_sysconfig_cortex_a8.cc (revision 0) ++++ gnuradio-core/src/lib/filter/gr_fir_sysconfig_cortex_a8.cc (revision 0) +@@ -0,0 +1,340 @@ ++/* -*- c++ -*- */ ++/* ++ * Copyright 2002,2008 Free Software Foundation, Inc. ++ * ++ * This file is part of GNU Radio ++ * ++ * GNU Radio is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 3, or (at your option) ++ * any later version. ++ * ++ * GNU Radio is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with GNU Radio; see the file COPYING. If not, write to ++ * the Free Software Foundation, Inc., 51 Franklin Street, ++ * Boston, MA 02110-1301, USA. ++ */ ++#ifdef HAVE_CONFIG_H ++#include ++#endif ++#include ++#include ++ ++#include ++#include ++//#include ++#include ++#include ++//#include ++#include ++#include ++#include ++#include ++#include ++//#include ++#include ++#include ++//#include ++#include ++#include ++//#include ++ ++#include ++using std::cerr; ++ ++/* ++ * ---------------------------------------------------------------- ++ * static functions that serve as constructors... ++ * ---------------------------------------------------------------- ++ */ ++ ++#if 0 ++static gr_fir_ccf * ++make_gr_fir_ccf_altivec(const std::vector &taps) ++{ ++ return new gr_fir_ccf_altivec(taps); ++} ++ ++static gr_fir_fcc * ++make_gr_fir_fcc_altivec(const std::vector &taps) ++{ ++ return new gr_fir_fcc_altivec(taps); ++} ++ ++static gr_fir_ccc * ++make_gr_fir_ccc_altivec (const std::vector &taps) ++{ ++ return new gr_fir_ccc_altivec (taps); ++} ++#endif ++ ++static gr_fir_fff * ++make_gr_fir_fff_cortex_a8 (const std::vector &taps) ++{ ++ return new gr_fir_fff_cortex_a8 (taps); ++} ++ ++#if 0 ++static gr_fir_fsf * ++make_gr_fir_fsf_altivec (const std::vector &taps) ++{ ++ return new gr_fir_fsf_altivec (taps); ++} ++ ++static gr_fir_scc * ++make_gr_fir_scc_altivec(const std::vector &taps) ++{ ++ return new gr_fir_scc_altivec(taps); ++} ++#endif ++ ++/* ++ * ---------------------------------------------------------------- ++ * Return instances of the fastest powerpc versions of these classes. ++ * ++ * check CPUID, if has altivec, return altivec version, ++ * else return generic version. ++ * ---------------------------------------------------------------- ++ */ ++ ++gr_fir_ccf * ++gr_fir_sysconfig_cortex_a8::create_gr_fir_ccf (const std::vector &taps) ++{ ++ static bool first = true; ++ ++#if 0 ++ if (gr_cpu::has_altivec ()){ ++ if (first){ ++ cerr << ">>> gr_fir_ccf: using altivec\n"; ++ first = false; ++ } ++ return make_gr_fir_ccf_altivec (taps); ++ } ++#endif ++ ++ if (0 && first){ ++ cerr << ">>> gr_fir_ccf: handing off to parent class\n"; ++ first = false; ++ } ++ return gr_fir_sysconfig_generic::create_gr_fir_ccf (taps); ++} ++ ++gr_fir_fcc * ++gr_fir_sysconfig_cortex_a8::create_gr_fir_fcc (const std::vector &taps) ++{ ++ static bool first = true; ++ ++#if 0 ++ if (gr_cpu::has_altivec ()){ ++ if (first){ ++ cerr << ">>> gr_fir_fcc: using altivec\n"; ++ first = false; ++ } ++ return make_gr_fir_fcc_altivec (taps); ++ } ++#endif ++ ++ if (0 && first){ ++ cerr << ">>> gr_fir_fcc: handing off to parent class\n"; ++ first = false; ++ } ++ return gr_fir_sysconfig_generic::create_gr_fir_fcc (taps); ++} ++ ++gr_fir_ccc * ++gr_fir_sysconfig_cortex_a8::create_gr_fir_ccc (const std::vector &taps) ++{ ++ static bool first = true; ++ ++#if 0 ++ if (gr_cpu::has_altivec ()){ ++ if (first){ ++ cerr << ">>> gr_fir_ccc: using altivec\n"; ++ first = false; ++ } ++ return make_gr_fir_ccc_altivec (taps); ++ } ++#endif ++ ++ if (0 && first){ ++ cerr << ">>> gr_fir_ccc: handing off to parent class\n"; ++ first = false; ++ } ++ return gr_fir_sysconfig_generic::create_gr_fir_ccc (taps); ++} ++ ++gr_fir_fff * ++gr_fir_sysconfig_cortex_a8::create_gr_fir_fff (const std::vector &taps) ++{ ++ static bool first = true; ++ ++ if (gr_cpu::has_cortex_a8 ()){ ++ if (first){ ++ cerr << ">>> gr_fir_fff: using cortex_a8\n"; ++ first = false; ++ } ++ return make_gr_fir_fff_cortex_a8 (taps); ++ } ++ ++ if (0 && first){ ++ cerr << ">>> gr_fir_fff: handing off to parent class\n"; ++ first = false; ++ } ++ return gr_fir_sysconfig_generic::create_gr_fir_fff (taps); ++} ++ ++gr_fir_fsf * ++gr_fir_sysconfig_cortex_a8::create_gr_fir_fsf (const std::vector &taps) ++{ ++ static bool first = true; ++ ++#if 0 ++ if (gr_cpu::has_altivec ()){ ++ if (first){ ++ cerr << ">>> gr_fir_fsf: using altivec\n"; ++ first = false; ++ } ++ return make_gr_fir_fsf_altivec (taps); ++ } ++#endif ++ ++ if (0 && first){ ++ cerr << ">>> gr_fir_fsf: handing off to parent class\n"; ++ first = false; ++ } ++ return gr_fir_sysconfig_generic::create_gr_fir_fsf (taps); ++} ++ ++ ++gr_fir_scc * ++gr_fir_sysconfig_cortex_a8::create_gr_fir_scc (const std::vector &taps) ++{ ++ static bool first = true; ++ ++#if 0 ++ if (gr_cpu::has_altivec ()){ ++ if (first){ ++ cerr << ">>> gr_fir_scc: using altivec\n"; ++ first = false; ++ } ++ return make_gr_fir_scc_altivec (taps); ++ } ++#endif ++ ++ if (0 && first){ ++ cerr << ">>> gr_fir_scc: handing off to parent class\n"; ++ first = false; ++ } ++ return gr_fir_sysconfig_generic::create_gr_fir_scc (taps); ++} ++ ++/* ++ * ---------------------------------------------------------------- ++ * Return info about available implementations ++ * ---------------------------------------------------------------- ++ */ ++ ++void ++gr_fir_sysconfig_cortex_a8::get_gr_fir_ccf_info (std::vector *info) ++{ ++ // invoke parent.. ++ gr_fir_sysconfig_generic::get_gr_fir_ccf_info (info); ++ ++#if 0 ++ // add our stuff... ++ gr_fir_ccf_info t; ++ if (gr_cpu::has_altivec ()){ ++ t.name = "altivec"; ++ t.create = make_gr_fir_ccf_altivec; ++ (*info).push_back (t); ++ } ++#endif ++} ++ ++void ++gr_fir_sysconfig_cortex_a8::get_gr_fir_fcc_info (std::vector *info) ++{ ++ // invoke parent.. ++ gr_fir_sysconfig_generic::get_gr_fir_fcc_info (info); ++ ++#if 0 ++ // add our stuff... ++ gr_fir_fcc_info t; ++ if (gr_cpu::has_altivec ()){ ++ t.name = "altivec"; ++ t.create = make_gr_fir_fcc_altivec; ++ (*info).push_back (t); ++ } ++#endif ++} ++ ++void ++gr_fir_sysconfig_cortex_a8::get_gr_fir_ccc_info (std::vector *info) ++{ ++ // invoke parent.. ++ gr_fir_sysconfig_generic::get_gr_fir_ccc_info (info); ++ ++#if 0 ++ // add our stuff... ++ gr_fir_ccc_info t; ++ if (gr_cpu::has_altivec ()){ ++ t.name = "altivec"; ++ t.create = make_gr_fir_ccc_altivec; ++ (*info).push_back (t); ++ } ++#endif ++} ++ ++void ++gr_fir_sysconfig_cortex_a8::get_gr_fir_fff_info (std::vector *info) ++{ ++ // invoke parent.. ++ gr_fir_sysconfig_generic::get_gr_fir_fff_info (info); ++ ++ // add our stuff... ++ gr_fir_fff_info t; ++ if (gr_cpu::has_cortex_a8 ()){ ++ t.name = "cortex_a8"; ++ t.create = make_gr_fir_fff_cortex_a8; ++ (*info).push_back (t); ++ } ++} ++ ++void ++gr_fir_sysconfig_cortex_a8::get_gr_fir_fsf_info (std::vector *info) ++{ ++ // invoke parent.. ++ gr_fir_sysconfig_generic::get_gr_fir_fsf_info (info); ++ ++#if 0 ++ // add our stuff... ++ gr_fir_fsf_info t; ++ if (gr_cpu::has_altivec ()){ ++ t.name = "altivec"; ++ t.create = make_gr_fir_fsf_altivec; ++ (*info).push_back (t); ++ } ++#endif ++} ++ ++void ++gr_fir_sysconfig_cortex_a8::get_gr_fir_scc_info (std::vector *info) ++{ ++ // invoke parent.. ++ gr_fir_sysconfig_generic::get_gr_fir_scc_info (info); ++ ++#if 0 ++ // add our stuff... ++ gr_fir_scc_info t; ++ if (gr_cpu::has_altivec ()){ ++ t.name = "altivec"; ++ t.create = make_gr_fir_scc_altivec; ++ (*info).push_back (t); ++ } ++#endif ++} +Index: gnuradio-core/src/lib/filter/gr_cpu.h +=================================================================== +--- gnuradio-core/src/lib/filter/gr_cpu.h (revision 9831) ++++ gnuradio-core/src/lib/filter/gr_cpu.h (working copy) +@@ -34,6 +34,7 @@ + static bool has_3dnow (); + static bool has_3dnowext (); + static bool has_altivec (); ++ static bool has_cortex_a8 (); + }; + + #endif /* _GR_CPU_H_ */ +Index: gnuradio-core/src/lib/filter/gr_fir_fff_cortex_a8.h +=================================================================== +--- gnuradio-core/src/lib/filter/gr_fir_fff_cortex_a8.h (revision 0) ++++ gnuradio-core/src/lib/filter/gr_fir_fff_cortex_a8.h (revision 0) +@@ -0,0 +1,45 @@ ++/* -*- c++ -*- */ ++/* ++ * Copyright 2008 Free Software Foundation, Inc. ++ * ++ * This file is part of GNU Radio ++ * ++ * GNU Radio is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 3, or (at your option) ++ * any later version. ++ * ++ * GNU Radio is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License along ++ * with this program; if not, write to the Free Software Foundation, Inc., ++ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. ++ */ ++#ifndef INCLUDED_GR_FIR_FFF_CORTEX_A8_H ++#define INCLUDED_GR_FIR_FFF_CORTEX_A8_H ++ ++#include ++ ++/*! ++ * \brief altivec version of gr_fir_fff ++ */ ++class gr_fir_fff_cortex_a8 : public gr_fir_fff_generic ++{ ++protected: ++ ++ size_t d_naligned_taps; // number of taps (multiple of 4) ++ float *d_aligned_taps; // 16-byte aligned, and zero padded to multiple of 4 ++ ++public: ++ gr_fir_fff_cortex_a8(); ++ gr_fir_fff_cortex_a8(const std::vector &taps); ++ ~gr_fir_fff_cortex_a8(); ++ ++ virtual void set_taps (const std::vector &taps); ++ virtual float filter (const float input[]); ++}; ++ ++#endif /* INCLUDED_GR_FIR_FFF_CORTEX_A*_H */ +Index: gnuradio-core/src/lib/filter/gr_cpu_x86.cc +=================================================================== +--- gnuradio-core/src/lib/filter/gr_cpu_x86.cc (revision 9831) ++++ gnuradio-core/src/lib/filter/gr_cpu_x86.cc (working copy) +@@ -111,3 +111,10 @@ + { + return false; + } ++ ++bool ++gr_cpu::has_cortex_a8 () ++{ ++ return false; ++} ++ +Index: gnuradio-core/src/lib/filter/gr_cpu_cortex_a8.cc +=================================================================== +--- gnuradio-core/src/lib/filter/gr_cpu_cortex_a8.cc (revision 0) ++++ gnuradio-core/src/lib/filter/gr_cpu_cortex_a8.cc (revision 0) +@@ -0,0 +1,59 @@ ++/* -*- c++ -*- */ ++/* ++ * Copyright 2002, 2008 Free Software Foundation, Inc. ++ * ++ * This file is part of GNU Radio ++ * ++ * GNU Radio is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 3, or (at your option) ++ * any later version. ++ * ++ * GNU Radio is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with GNU Radio; see the file COPYING. If not, write to ++ * the Free Software Foundation, Inc., 51 Franklin Street, ++ * Boston, MA 02110-1301, USA. ++ */ ++ ++#include ++ ++bool ++gr_cpu::has_mmx () ++{ ++ return false; ++} ++ ++bool ++gr_cpu::has_sse () ++{ ++ return false; ++} ++ ++bool ++gr_cpu::has_sse2 () ++{ ++ return false; ++} ++ ++bool ++gr_cpu::has_3dnow () ++{ ++ return false; ++} ++ ++bool ++gr_cpu::has_3dnowext () ++{ ++ return false; ++} ++ ++bool ++gr_cpu::has_cortex_a8 () ++{ ++ return true; ++} +Index: gnuradio-core/src/lib/filter/gr_fir_fff_cortex_a8.cc +=================================================================== +--- gnuradio-core/src/lib/filter/gr_fir_fff_cortex_a8.cc (revision 0) ++++ gnuradio-core/src/lib/filter/gr_fir_fff_cortex_a8.cc (revision 0) +@@ -0,0 +1,85 @@ ++/* -*- c++ -*- */ ++/* ++ * Copyright 2008 Free Software Foundation, Inc. ++ * ++ * This file is part of GNU Radio ++ * ++ * GNU Radio is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 3, or (at your option) ++ * any later version. ++ * ++ * GNU Radio is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License along ++ * with this program; if not, write to the Free Software Foundation, Inc., ++ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. ++ */ ++ ++#ifdef HAVE_CONFIG_H ++#include ++#endif ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#define FLOATS_PER_VEC 8 ++ ++gr_fir_fff_cortex_a8::gr_fir_fff_cortex_a8() ++ : gr_fir_fff_generic(), ++ d_naligned_taps(0), d_aligned_taps(0) ++{ ++} ++ ++gr_fir_fff_cortex_a8::gr_fir_fff_cortex_a8 (const std::vector &new_taps) ++ : gr_fir_fff_generic(new_taps), ++ d_naligned_taps(0), d_aligned_taps(0) ++{ ++ set_taps(new_taps); ++} ++ ++gr_fir_fff_cortex_a8::~gr_fir_fff_cortex_a8() ++{ ++ if (d_aligned_taps){ ++ free(d_aligned_taps); ++ d_aligned_taps = 0; ++ } ++} ++ ++void ++gr_fir_fff_cortex_a8::set_taps(const std::vector &inew_taps) ++{ ++ gr_fir_fff_generic::set_taps(inew_taps); // call superclass ++ d_naligned_taps = gr_p2_round_up(ntaps(), FLOATS_PER_VEC); ++ ++ if (d_aligned_taps){ ++ free(d_aligned_taps); ++ d_aligned_taps = 0; ++ } ++ void *p; ++ int r = posix_memalign(&p, sizeof(float), d_naligned_taps * sizeof(d_aligned_taps[0])); ++ if (r != 0){ ++ throw std::bad_alloc(); ++ } ++ d_aligned_taps = (float *) p; ++ memcpy(d_aligned_taps, &d_taps[0], ntaps() * sizeof(d_aligned_taps[0])); ++ for (size_t i = ntaps(); i < d_naligned_taps; i++) ++ d_aligned_taps[i] = 0.0; ++} ++ ++ ++float ++gr_fir_fff_cortex_a8::filter (const float input[]) ++{ ++ if (d_naligned_taps == 0) ++ return 0.0; ++ ++ return dotprod_fff_cortex_a8(input, d_aligned_taps, d_naligned_taps); ++} +Index: gnuradio-core/src/lib/filter/qa_dotprod_cortex_a8.cc +=================================================================== +--- gnuradio-core/src/lib/filter/qa_dotprod_cortex_a8.cc (revision 0) ++++ gnuradio-core/src/lib/filter/qa_dotprod_cortex_a8.cc (revision 0) +@@ -0,0 +1,32 @@ ++/* -*- c++ -*- */ ++/* ++ * Copyright 2003 Free Software Foundation, Inc. ++ * ++ * This file is part of GNU Radio ++ * ++ * GNU Radio is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 3, or (at your option) ++ * any later version. ++ * ++ * GNU Radio is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with GNU Radio; see the file COPYING. If not, write to ++ * the Free Software Foundation, Inc., 51 Franklin Street, ++ * Boston, MA 02110-1301, USA. ++ */ ++#include "qa_dotprod.h" ++ ++CppUnit::TestSuite * ++qa_dotprod_suite () ++{ ++ CppUnit::TestSuite *s = new CppUnit::TestSuite ("dotprod"); ++ ++ // empty test suite ++ ++ return s; ++} +Index: gnuradio-core/src/lib/filter/gr_fir_sysconfig_cortex_a8.h +=================================================================== +--- gnuradio-core/src/lib/filter/gr_fir_sysconfig_cortex_a8.h (revision 0) ++++ gnuradio-core/src/lib/filter/gr_fir_sysconfig_cortex_a8.h (revision 0) +@@ -0,0 +1,46 @@ ++/* -*- c++ -*- */ ++/* ++ * Copyright 2002,2008 Free Software Foundation, Inc. ++ * ++ * This file is part of GNU Radio ++ * ++ * GNU Radio is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 3, or (at your option) ++ * any later version. ++ * ++ * GNU Radio is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with GNU Radio; see the file COPYING. If not, write to ++ * the Free Software Foundation, Inc., 51 Franklin Street, ++ * Boston, MA 02110-1301, USA. ++ */ ++#ifndef INCLUDED_GR_FIR_SYSCONFIG_CORTEX_A8_H ++#define INCLUDED_GR_FIR_SYSCONFIG_CORTEX_A8_H ++ ++#include ++ ++class gr_fir_sysconfig_cortex_a8 : public gr_fir_sysconfig_generic { ++public: ++ virtual gr_fir_ccf *create_gr_fir_ccf (const std::vector &taps); ++ virtual gr_fir_fcc *create_gr_fir_fcc (const std::vector &taps); ++ virtual gr_fir_fff *create_gr_fir_fff (const std::vector &taps); ++ virtual gr_fir_fsf *create_gr_fir_fsf (const std::vector &taps); ++ virtual gr_fir_scc *create_gr_fir_scc (const std::vector &taps); ++ virtual gr_fir_ccc *create_gr_fir_ccc (const std::vector &taps); ++//virtual gr_fir_sss *create_gr_fir_sss (const std::vector &taps); ++ ++ virtual void get_gr_fir_ccf_info (std::vector *info); ++ virtual void get_gr_fir_fcc_info (std::vector *info); ++ virtual void get_gr_fir_fff_info (std::vector *info); ++ virtual void get_gr_fir_fsf_info (std::vector *info); ++ virtual void get_gr_fir_scc_info (std::vector *info); ++ virtual void get_gr_fir_ccc_info (std::vector *info); ++//virtual void get_gr_fir_sss_info (std::vector *info); ++}; ++ ++#endif +Index: gnuradio-core/src/lib/filter/sysconfig_cortex_a8.cc +=================================================================== +--- gnuradio-core/src/lib/filter/sysconfig_cortex_a8.cc (revision 0) ++++ gnuradio-core/src/lib/filter/sysconfig_cortex_a8.cc (revision 0) +@@ -0,0 +1,38 @@ ++/* -*- c++ -*- */ ++/* ++ * Copyright 2002,2008 Free Software Foundation, Inc. ++ * ++ * This file is part of GNU Radio ++ * ++ * GNU Radio is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 3, or (at your option) ++ * any later version. ++ * ++ * GNU Radio is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with GNU Radio; see the file COPYING. If not, write to ++ * the Free Software Foundation, Inc., 51 Franklin Street, ++ * Boston, MA 02110-1301, USA. ++ */ ++ ++#ifdef HAVE_CONFIG_H ++#include ++#endif ++#include ++ ++gr_fir_sysconfig * ++gr_fir_sysconfig_singleton () ++{ ++ static gr_fir_sysconfig *singleton = 0; ++ ++ if (singleton) ++ return singleton; ++ ++ singleton = new gr_fir_sysconfig_cortex_a8 (); ++ return singleton; ++} +Index: config/gr_set_md_cpu.m4 +=================================================================== +--- config/gr_set_md_cpu.m4 (revision 9831) ++++ config/gr_set_md_cpu.m4 (working copy) +@@ -35,6 +35,7 @@ + case "$cf_with_md_cpu" in + x86 | i[[3-7]]86) MD_CPU=x86 MD_SUBCPU=x86 ;; + x86_64) MD_CPU=x86 MD_SUBCPU=x86_64 ;; ++ arm) MD_CPU=cortex_a8 ;; + powerpc*) MD_CPU=powerpc ;; + *) MD_CPU=generic ;; + esac +@@ -59,5 +60,6 @@ + AM_CONDITIONAL(MD_CPU_x86, test "$MD_CPU" = "x86") + AM_CONDITIONAL(MD_SUBCPU_x86_64, test "$MD_SUBCPU" = "x86_64") + AM_CONDITIONAL(MD_CPU_powerpc, test "$MD_CPU" = "powerpc") ++ AM_CONDITIONAL(MD_CPU_cortex_a8, test "$MD_CPU" = "cortex_a8") + AM_CONDITIONAL(MD_CPU_generic, test "$MD_CPU" = "generic") + ]) -- cgit v1.2.3