libcvd-members
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Libcvd-members] libcvd/cvd_src utility.cc


From: Ethan Eade
Subject: [Libcvd-members] libcvd/cvd_src utility.cc
Date: Tue, 16 May 2006 14:36:34 +0000

CVSROOT:        /cvsroot/libcvd
Module name:    libcvd
Branch:         
Changes by:     Ethan Eade <address@hidden>     06/05/16 14:36:34

Modified files:
        cvd_src        : utility.cc 

Log message:
        Fixed bug when using utility functions with small counts.

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/libcvd/libcvd/cvd_src/utility.cc.diff?tr1=1.2&tr2=1.3&r1=text&r2=text

Patches:
Index: libcvd/cvd_src/utility.cc
diff -u libcvd/cvd_src/utility.cc:1.2 libcvd/cvd_src/utility.cc:1.3
--- libcvd/cvd_src/utility.cc:1.2       Tue May 16 13:15:22 2006
+++ libcvd/cvd_src/utility.cc   Tue May 16 14:36:34 2006
@@ -23,7 +23,11 @@
     using CVD::steps_to_align;
     template <class F, class T1, class T2, int A, int M> inline void 
maybe_aligned_differences(const T1* a, const T1* b, T2* c, unsigned int count)
     {
-       if (!is_aligned<A>(a)) {      
+       if (count < M*2) {
+           F::unaligned_differences(a,b,c,count);
+           return;
+       }
+       if (!is_aligned<A>(a)) {            
            unsigned int steps = steps_to_align<A>(a);
            F::unaligned_differences(a,b,c,steps);
            count -= steps;
@@ -31,18 +35,23 @@
            b += steps;
            c += steps;
        }
-       if (!is_aligned<A>(c)) {
+       if (!is_aligned<A>(c) || count < M) {
            F::unaligned_differences(a,b,c,count);
            return;
        }       
        unsigned int block = (count/M)*M;
        F::aligned_differences(a,b,c,block);
-       if (count > block)
+       if (count > block) {
            F::unaligned_differences(a+block,b+block,c+block,count-block);
+       }
     }    
     
     template <class F, class T1, class T2, int A, int M> inline void 
maybe_aligned_add_mul_add(const T1* a, const T1* b, const T1& c, T2* out, 
unsigned int count)
     {
+       if (count < M*2) {
+           F::unaligned_add_mul_add(a,b,c,out,count);
+           return;
+       }
        if (!is_aligned<A>(a)) {      
            unsigned int steps = steps_to_align<A>(a);
            F::unaligned_add_mul_add(a,b,c,out,steps);
@@ -50,6 +59,10 @@
            a += steps;
            b += steps;
            out += steps;
+           if (count < M) {
+               F::unaligned_add_mul_add(a,b,c,out,count);
+               return;
+           }
        }
        unsigned int block = (count/M)*M;
        F::aligned_add_mul_add(a,b,c,out,block);
@@ -59,12 +72,20 @@
 
     template <class F, class T1, class T2, int A, int M> inline void 
maybe_aligned_assign_mul(const T1* a, const T1& c, T2* out, unsigned int count)
     {
+       if (count < M*2) {
+           F::unaligned_assign_mul(a,c,out,count);
+           return;
+       }
        if (!is_aligned<A>(a)) {      
            unsigned int steps = steps_to_align<A>(a);
            F::unaligned_assign_mul(a,c,out,steps);
            count -= steps;
            a += steps;
            out += steps;
+           if (count < M) {
+               F::unaligned_assign_mul(a,c,out,count);
+               return;
+           }
        }
        unsigned int block = (count/M)*M;
        F::aligned_assign_mul(a,c,out,block);
@@ -74,6 +95,9 @@
 
     template <class F, class R, class T1, int A, int M> inline R 
maybe_aligned_inner_product(const T1* a, const T1* b, unsigned int count)
     {
+       if (count < M*2) {
+           return F::unaligned_inner_product(a,b,count);
+       }
        R sum = 0;
        if (!is_aligned<A>(a)) {      
            unsigned int steps = steps_to_align<A>(a);
@@ -81,6 +105,9 @@
            count -= steps;
            a += steps;
            b += steps;
+           if (count < M) {
+               return sum + F::unaligned_inner_product(a,b,count);
+           }
        }
        unsigned int block = (count/M)*M;
        sum += F::aligned_inner_product(a,b,block);
@@ -91,6 +118,9 @@
 
     template <class F, class R, class T1, int A, int M> inline R 
maybe_aligned_ssd(const T1* a, const T1* b, unsigned int count)
     {
+       if (count < M*2) {
+           return F::unaligned_ssd(a,b,count);
+       }
        R sum = 0;
        if (!is_aligned<A>(a)) {      
            unsigned int steps = steps_to_align<A>(a);
@@ -98,6 +128,9 @@
            count -= steps;
            a += steps;
            b += steps;
+           if (count < M) {
+               return sum + F::unaligned_ssd(a,b,count);
+           }
        }
        unsigned int block = (count/M)*M;
        sum += F::aligned_ssd(a,b,block);




reply via email to

[Prev in Thread] Current Thread [Next in Thread]