char转short疑问
meiqua大大你好, ` for(; j <= template_positions -mipp::N<int16_t>()2; j+=mipp::N<int16_t>()){ mipp::Reg<uint8_t> src8_v((uint8_t)lm_ptr + j);
// uchar to short, once for N bytes
mipp::Reg<int16_t> src16_v(mipp::interleavelo(src8_v, zero_v).r);
mipp::Reg<int16_t> dst_v((int16_t*)dst_ptr + j);
mipp::Reg<int16_t> res_v = src16_v + dst_v;
res_v.store((int16_t*)dst_ptr + j);
}`
中对于
mipp::interleavelo(src8_v, zero_v).r有些疑问,我查阅了相关的定义
模板函数中
template <typename T> inline Reg<T> interleavelo (const Reg<T> v1, const Reg<T> v2) { return v1.interleavelo(v2); }
而mipp中interleavelo直接return *this,那此直接返回v1吗?v2有何意义呢?
而对象v1的r是直接在初始化列表里面初始化的,所以不明白这char转short的过程,望指点迷津。
我最近想把代码中的指令集优化部分替换成OpenCV4 的Universal intrinsics,但卡在interleavelo这里了,请问这个interleavelo操作是如下的操作吗
// v1 = [a0, b0], v2 = [a1, b1] // res = [a0, a1]
// v1 = [a0, b0, c0, d0], v2 = [a1, b1, c1, d1] // res = [a0, a1, b0, b1]
如果是,那interleave后的结果应该还是和输入的v1,v2是相同的数据类型uint8,然后转int16是直接强制转换?
对,就是这个意思,char < 127的时候就等于转short。MIPP直接return *this在哪?
1、for (; j <= template_positions - mipp::N<int16_t>() * 2; j += mipp::N<int16_t>())
{
mipp::Reg<uint8_t> src8_v((uint8_t*)lm_ptr + j);
mipp::Reg<int16_t> src16_v(mipp::interleavelo(src8_v, zero_v).r);
mipp::Reg<int16_t> dst_v((int16_t*)dst_ptr + j);
mipp::Reg<int16_t> res_v = src16_v + dst_v;
res_v.store((int16_t*)dst_ptr + j);
}
那这部分在代码中具体是实现什么功能?
2、int template_positions = span_y * W + span_x + 1;是什么意思