https://gcc.gnu.org/bugzilla/show_bug.cgi?id=121634

--- Comment #2 from Xi Ruoyao <xry111 at gcc dot gnu.org> ---
typedef short v8i16 __attribute__((vector_size(16)));
typedef long __m128i __attribute__((__vector_size__(16)));
__m128i __lsx_vmaddwod_w_h__1, WidenMulPairwiseAdd___trans_tmp_2;
template <typename, int> using CappedTag = int;
struct Vec128 {
  __m128i raw;
};
Vec128 Zero(int);
template <class D> using VFromD = decltype(Zero(D()));
VFromD<int> WidenMulPairwiseAdd(Vec128 a, Vec128 b) {
  WidenMulPairwiseAdd___trans_tmp_2 = (__m128i)__builtin_lsx_vmaddwod_w_h(
      (__attribute__((
          __vector_size__(4 * sizeof(int)))) int)__lsx_vmaddwod_w_h__1,
      (v8i16)a.raw, (v8i16)b.raw);
  return {WidenMulPairwiseAdd___trans_tmp_2};
}
template <class D> using Vec = decltype(Zero(D()));
struct TestWidenMulPairwiseAdd {
  void operator()(short, int dn) {
    Vec<decltype(dn)> bf0 = WidenMulPairwiseAdd(bf0, bf0);
  }
};
template <int kMul> struct ForeachCappedR {
  static void Do(int, int) {
    CappedTag<short, kMul> d;
    TestWidenMulPairwiseAdd()(short(), d);
  }
};
template <int kPow2 = 1> struct ForShrinkableVectors {
  template <typename T> void operator()(T) {
    int kMaxCapped;
    ForeachCappedR<kPow2>::Do(kPow2, kMaxCapped);
  }
};
void TestAllWidenMulPairwiseAdd() { ForShrinkableVectors()(short()); }

Reply via email to