Hym*_*mir 4 c++ arm operator-overloading simd c++14
我想为uint32x4_t在arm_neon.h.
struct uint32x4_t {
uint32_t val[4];
};
Run Code Online (Sandbox Code Playgroud)
这应该通过调用 SIMD 函数来完成,该函数期望值移位和常量立即数:
uint32x4_t simdShift(uint32x4_t, constant_immediate);
Run Code Online (Sandbox Code Playgroud)
移位.h
#ifndef SHIFT_H
#define SHIFT_H
namespace A {
namespace B {
/*uint32x4_t simdLoad(uint32_t*) {
...
}*/
template<int N>
uint32x4_t shiftRight(uint32x4_t vec) {
return vshrq_n_u32(vec,N);
}
}
}
uint32x4_t operator>>(uint32x4_t const & vec, const int v) {
return A::B::shiftRight<v>(vec);
}
#endif
Run Code Online (Sandbox Code Playgroud)
主程序
#include "shift.h"
int main() {
uint32_t* data = new uint32_t[4];
data[0] = 1;
data[1] = 2;
data[2] = 3;
data[3] = 4;
uint32x4_t reg;// = simdLoad(data);
reg = reg>>3;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
此代码产生错误:
'uint32x4_t operator>>(const uint32x4_t&, int)' 必须有一个类或枚举类型的参数 uint32x4_t operator>>(uint32x4_t const & vec, const int v) {
是否有解决方法可以重载operator>>“本机”类型,例如uint32x4_t?
编辑:我调整了建议的解决方法,但错误仍然相同:(
ErmIg 答案的增量改进:
template<int N>
constexpr std::integral_constant<int, N> i_{};
template<int N>
uint32x4_t operator >>(uint32x4_t value, std::integral_constant<int, N>) noexcept {
return _mm_slli_si128(value, N);
}
int main() {
std::uint32_t data[4] = {1, 2, 3, 4};
uint32x4_t reg;// = simdLoad(&data);
reg = reg >> i_<3>;
}
Run Code Online (Sandbox Code Playgroud)
Nb 我已经放入operator>>了全局命名空间;如果你想把它放在一个不同的命名空间中,你需要在使用它之前将操作符引入作用域。