我正在尝试将一个64位值与一个64位值数组进行比较
R_UINT64 FP;R_UINT64 INPUT20000;
如果数组中的任何元素与FP的值匹配,则返回true。
我必须遍历这个数组并找到匹配的元素,我试图通过一次查看2个元素而不是1个元素来提高效率。
在Altivec中,向量的长度是128位,所以我将把FP的两个副本,两个元素放在向量中(我将它们都截断,每个向量元素两个8位)
到目前为止一切顺利,但现在我遇到了一个问题。我找不到一个VMX过程,它只查看向量的一半,看看是否有匹配,为了返回true,两个值都必须匹配,这不是我要找的。
所以我想知道有没有什么方法可以告诉编译器,我每次只查看向量的一半?
提前感谢!
发布于 2013-09-17 06:23:48
也许最好的方法是比较这两个元素,然后使用vec_mergeh/vec_mergel来测试结果的每一半,例如
size_t vec_search_u64(const uint64_t key, const uint64_t array[], const size_t len)
{
const vector signed int vkey = { key >> 32, key & 0xffffffff, key >> 32, key & 0xffffffff };
const vector bool int vk1 = { -1, -1, -1, -1 };
for (i = 0; i < len - 1; i += 2) // iterate two elements at a time
{
vector signed int v = vec_ld(0, (int *)&array[i]);
// load 2 elements
vector bool int vcmp = vec_cmpeq(v, vkey);
// compare 2 elements with key
if (vec_all_eq(vec_mergeh(vcmp, vcmp), vk1))
{ // if high element matches
return i; // return match found at element i
}
if (vec_all_eq(vec_mergel(vcmp, vcmp), vk1))
{ // if low element matches
return i + 1; // return match found at element i + 1
}
}
if (i < len) // if array size is odd
{
if (array[i] == key) // test last element
{
return i;
}
}
return (size_t)(-1); // match not found - return suitable value
}(注意:未经测试的代码-仅用于一般指导-可能需要强制转换和/或实际的错误修复!)
https://stackoverflow.com/questions/18837961
复制相似问题