00001 #ifndef CVD_INTERNAL_INC_FAST_CORNER_UTILITIES_H
00002 #define CVD_INTERNAL_INC_FAST_CORNER_UTILITIES_H
00003
00004 #include <emmintrin.h>
00005
00006 namespace CVD
00007 {
00008
00009 struct Less
00010 {
00011 template <class T1, class T2> static bool eval(const T1 a, const T2 b)
00012 {
00013 return a < b;
00014 }
00015 static int prep_t(int pixel_val, int barrier)
00016 {
00017 return pixel_val - barrier;
00018 }
00019 };
00020 struct Greater
00021 {
00022 template <class T1, class T2> static bool eval(const T1 a, const T2 b)
00023 {
00024 return a > b;
00025 }
00026 static int prep_t(int pixel_val, int barrier)
00027 {
00028 return pixel_val + barrier;
00029 }
00030 };
00031
00032 #define CHECK_BARRIER(lo, hi, other, flags) \
00033 { \
00034 __m128i diff = _mm_subs_epu8(lo, other); \
00035 __m128i diff2 = _mm_subs_epu8(other, hi); \
00036 __m128i z = _mm_setzero_si128(); \
00037 diff = _mm_cmpeq_epi8(diff, z); \
00038 diff2 = _mm_cmpeq_epi8(diff2, z); \
00039 flags = ~(_mm_movemask_epi8(diff) | (_mm_movemask_epi8(diff2) << 16)); \
00040 }
00041
00042 template <bool Aligned> inline __m128i load_si128(const void* addr) { return _mm_loadu_si128((const __m128i*)addr); }
00043 template <> inline __m128i load_si128<true>(const void* addr) { return _mm_load_si128((const __m128i*)addr); }
00044
00045 }
00046 #endif