added vmul() and vsignum()

This commit is contained in:
Ahmet Inan 2020-07-12 22:44:46 +02:00
commit 48303e7f58
4 changed files with 263 additions and 0 deletions

108
simd.hh
View file

@ -1226,6 +1226,114 @@ static inline SIMD<uint16_t, WIDTH> vqsub(SIMD<uint16_t, WIDTH> a, SIMD<uint16_t
return tmp;
}
template <int WIDTH>
static inline SIMD<float, WIDTH> vmul(SIMD<float, WIDTH> a, SIMD<float, WIDTH> b)
{
SIMD<float, WIDTH> tmp;
for (int i = 0; i < WIDTH; ++i)
tmp.v[i] = a.v[i] * b.v[i];
return tmp;
}
template <int WIDTH>
static inline SIMD<double, WIDTH> vmul(SIMD<double, WIDTH> a, SIMD<double, WIDTH> b)
{
SIMD<double, WIDTH> tmp;
for (int i = 0; i < WIDTH; ++i)
tmp.v[i] = a.v[i] * b.v[i];
return tmp;
}
template <int WIDTH>
static inline SIMD<int8_t, WIDTH> vmul(SIMD<int8_t, WIDTH> a, SIMD<int8_t, WIDTH> b)
{
SIMD<int8_t, WIDTH> tmp;
for (int i = 0; i < WIDTH; ++i)
tmp.v[i] = a.v[i] * b.v[i];
return tmp;
}
template <int WIDTH>
static inline SIMD<int16_t, WIDTH> vmul(SIMD<int16_t, WIDTH> a, SIMD<int16_t, WIDTH> b)
{
SIMD<int16_t, WIDTH> tmp;
for (int i = 0; i < WIDTH; ++i)
tmp.v[i] = a.v[i] * b.v[i];
return tmp;
}
template <int WIDTH>
static inline SIMD<int32_t, WIDTH> vmul(SIMD<int32_t, WIDTH> a, SIMD<int32_t, WIDTH> b)
{
SIMD<int32_t, WIDTH> tmp;
for (int i = 0; i < WIDTH; ++i)
tmp.v[i] = a.v[i] * b.v[i];
return tmp;
}
template <int WIDTH>
static inline SIMD<int64_t, WIDTH> vmul(SIMD<int64_t, WIDTH> a, SIMD<int64_t, WIDTH> b)
{
SIMD<int64_t, WIDTH> tmp;
for (int i = 0; i < WIDTH; ++i)
tmp.v[i] = a.v[i] * b.v[i];
return tmp;
}
template <int WIDTH>
static inline SIMD<float, WIDTH> vsignum(SIMD<float, WIDTH> a)
{
SIMD<float, WIDTH> tmp;
for (int i = 0; i < WIDTH; ++i)
tmp.v[i] = (a.v[i] > 0.f) - (a.v[i] < 0.f);
return tmp;
}
template <int WIDTH>
static inline SIMD<double, WIDTH> vsignum(SIMD<double, WIDTH> a)
{
SIMD<double, WIDTH> tmp;
for (int i = 0; i < WIDTH; ++i)
tmp.v[i] = (a.v[i] > 0.) - (a.v[i] < 0.);
return tmp;
}
template <int WIDTH>
static inline SIMD<int8_t, WIDTH> vsignum(SIMD<int8_t, WIDTH> a)
{
SIMD<int8_t, WIDTH> tmp;
for (int i = 0; i < WIDTH; ++i)
tmp.v[i] = (a.v[i] > 0) - (a.v[i] < 0);
return tmp;
}
template <int WIDTH>
static inline SIMD<int16_t, WIDTH> vsignum(SIMD<int16_t, WIDTH> a)
{
SIMD<int16_t, WIDTH> tmp;
for (int i = 0; i < WIDTH; ++i)
tmp.v[i] = (a.v[i] > 0) - (a.v[i] < 0);
return tmp;
}
template <int WIDTH>
static inline SIMD<int32_t, WIDTH> vsignum(SIMD<int32_t, WIDTH> a)
{
SIMD<int32_t, WIDTH> tmp;
for (int i = 0; i < WIDTH; ++i)
tmp.v[i] = (a.v[i] > 0) - (a.v[i] < 0);
return tmp;
}
template <int WIDTH>
static inline SIMD<int64_t, WIDTH> vsignum(SIMD<int64_t, WIDTH> a)
{
SIMD<int64_t, WIDTH> tmp;
for (int i = 0; i < WIDTH; ++i)
tmp.v[i] = (a.v[i] > 0) - (a.v[i] < 0);
return tmp;
}
template <int WIDTH>
static inline SIMD<float, WIDTH> vsign(SIMD<float, WIDTH> a, SIMD<float, WIDTH> b)
{