summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilip Balister <balister@localhost.localdomain>2008-11-01 14:17:32 -0400
committerPhilip Balister <balister@localhost.localdomain>2008-11-01 14:17:32 -0400
commitb833a7f26a79a6708643b3c729d98d45a88e171c (patch)
tree7dd0cd649159f9022cb572ae76363c918e1fed30
parent7fd785dc8adf10b8dd79f085f9d8b619cb25b8e3 (diff)
gnuradio : Add patch that adds NEON support.
-rw-r--r--packages/gnuradio/gnuradio/gnuradio-neon.patch943
1 files changed, 943 insertions, 0 deletions
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 <math.h>
+ #include <errno.h>
+ #include <stdio.h>
++#include <string.h>
+
+ #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 <config.h>
++#endif
++#include <dotprod_fff_cortex_a8.h>
++
++/*!
++ * \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 <stddef.h>
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++/*!
++ * <pre>
++ *
++ * preconditions:
++ *
++ * n > 0 and a multiple of 4
++ * a 4-byte aligned
++ * b 16-byte aligned
++ *
++ * </pre>
++ */
++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 <foo>_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 <config.h>
++#endif
++#include <gr_fir_sysconfig_cortex_a8.h>
++#include <gr_cpu.h>
++
++#include <gr_fir_ccf.h>
++#include <gr_fir_ccf_generic.h>
++//#include <gr_fir_ccf_altivec.h>
++#include <gr_fir_fcc.h>
++#include <gr_fir_fcc_generic.h>
++//#include <gr_fir_fcc_altivec.h>
++#include <gr_fir_fff.h>
++#include <gr_fir_fff_generic.h>
++#include <gr_fir_fff_cortex_a8.h>
++#include <gr_fir_fsf.h>
++#include <gr_fir_fsf_generic.h>
++//#include <gr_fir_fsf_powerpc.h>
++#include <gr_fir_ccc.h>
++#include <gr_fir_ccc_generic.h>
++//#include <gr_fir_ccc_altivec.h>
++#include <gr_fir_scc.h>
++#include <gr_fir_scc_generic.h>
++//#include <gr_fir_scc_altivec.h>
++
++#include <iostream>
++using std::cerr;
++
++/*
++ * ----------------------------------------------------------------
++ * static functions that serve as constructors...
++ * ----------------------------------------------------------------
++ */
++
++#if 0
++static gr_fir_ccf *
++make_gr_fir_ccf_altivec(const std::vector<float> &taps)
++{
++ return new gr_fir_ccf_altivec(taps);
++}
++
++static gr_fir_fcc *
++make_gr_fir_fcc_altivec(const std::vector<gr_complex> &taps)
++{
++ return new gr_fir_fcc_altivec(taps);
++}
++
++static gr_fir_ccc *
++make_gr_fir_ccc_altivec (const std::vector<gr_complex> &taps)
++{
++ return new gr_fir_ccc_altivec (taps);
++}
++#endif
++
++static gr_fir_fff *
++make_gr_fir_fff_cortex_a8 (const std::vector<float> &taps)
++{
++ return new gr_fir_fff_cortex_a8 (taps);
++}
++
++#if 0
++static gr_fir_fsf *
++make_gr_fir_fsf_altivec (const std::vector<float> &taps)
++{
++ return new gr_fir_fsf_altivec (taps);
++}
++
++static gr_fir_scc *
++make_gr_fir_scc_altivec(const std::vector<gr_complex> &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<float> &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<gr_complex> &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<gr_complex> &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<float> &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<float> &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<gr_complex> &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<gr_fir_ccf_info> *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<gr_fir_fcc_info> *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<gr_fir_ccc_info> *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<gr_fir_fff_info> *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<gr_fir_fsf_info> *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<gr_fir_scc_info> *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 <gr_fir_fff_generic.h>
++
++/*!
++ * \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<float> &taps);
++ ~gr_fir_fff_cortex_a8();
++
++ virtual void set_taps (const std::vector<float> &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 <gr_cpu.h>
++
++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 <config.h>
++#endif
++#include <gr_fir_fff_cortex_a8.h>
++#include <stdlib.h>
++#include <string.h>
++#include <stdexcept>
++#include <assert.h>
++#include <gr_math.h>
++#include <dotprod_fff_cortex_a8.h>
++
++#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<float> &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<float> &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 <gr_fir_sysconfig_generic.h>
++
++class gr_fir_sysconfig_cortex_a8 : public gr_fir_sysconfig_generic {
++public:
++ virtual gr_fir_ccf *create_gr_fir_ccf (const std::vector<float> &taps);
++ virtual gr_fir_fcc *create_gr_fir_fcc (const std::vector<gr_complex> &taps);
++ virtual gr_fir_fff *create_gr_fir_fff (const std::vector<float> &taps);
++ virtual gr_fir_fsf *create_gr_fir_fsf (const std::vector<float> &taps);
++ virtual gr_fir_scc *create_gr_fir_scc (const std::vector<gr_complex> &taps);
++ virtual gr_fir_ccc *create_gr_fir_ccc (const std::vector<gr_complex> &taps);
++//virtual gr_fir_sss *create_gr_fir_sss (const std::vector<short> &taps);
++
++ virtual void get_gr_fir_ccf_info (std::vector<gr_fir_ccf_info> *info);
++ virtual void get_gr_fir_fcc_info (std::vector<gr_fir_fcc_info> *info);
++ virtual void get_gr_fir_fff_info (std::vector<gr_fir_fff_info> *info);
++ virtual void get_gr_fir_fsf_info (std::vector<gr_fir_fsf_info> *info);
++ virtual void get_gr_fir_scc_info (std::vector<gr_fir_scc_info> *info);
++ virtual void get_gr_fir_ccc_info (std::vector<gr_fir_ccc_info> *info);
++//virtual void get_gr_fir_sss_info (std::vector<gr_fir_sss_info> *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 <config.h>
++#endif
++#include <gr_fir_sysconfig_cortex_a8.h>
++
++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")
+ ])