This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug target/35294] iwmmxt intrinsics, internal compiler error


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=35294

--- Comment #10 from serowk at yandex dot ru 2010-12-16 11:19:50 UTC ---
It seems that this bug affects the whole iwmmxt shift intrinsics
group(_mm_slli_pi16, _mm_slli_pi32, _mm_slli_si64, _mm_srai_pi16,
_mm_srai_pi32, _mm_srai_si64, _mm_srli_pi16, _mm_srli_pi32, _mm_srli_si64,
_mm_rori_pi16, _mm_rori_pi32, _mm_rori_si64). I tested it.

These functions have the same prototype:
static __inline __m64 func_name (__m64 __m, int __count)

But it is very strange that abort did not work in gcc 3.4.5(This version looks
like is not affected by this bug and it contains abort instead gcc_assert).

My suggestion:

static rtx
arm_expand_binop_builtin_iwmmx_shift (enum insn_code icode,
              tree exp, rtx target)
{
  rtx pat;
  tree arg0 = CALL_EXPR_ARG (exp, 0);
  tree arg1 = CALL_EXPR_ARG (exp, 1);
  rtx op0 = expand_normal (arg0);
  rtx op1 = expand_normal (arg1);
  enum machine_mode tmode = insn_data[icode].operand[0].mode;
  enum machine_mode mode0 = insn_data[icode].operand[1].mode;
  enum machine_mode mode1 = insn_data[icode].operand[2].mode;

  gcc_assert (VECTOR_MODE_P (mode0))
  op0 = safe_vector_operand (op0, mode0);

  gcc_assert (!VECTOR_MODE_P (mode1))

  if (! target
      || GET_MODE (target) != tmode
      || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
    target = gen_reg_rtx (tmode);

  if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
    op0 = copy_to_mode_reg (mode0, op0);
  if (! (*insn_data[icode].operand[2].predicate) (op1, mode1))
    op1 = copy_to_mode_reg (mode1, op1);

  pat = GEN_FCN (icode) (target, op0, op1);
  if (! pat)
    return 0;
  emit_insn (pat);
  return target;
}

And in
arm_expand_builtin
...
  switch (fcode)
    {
...
    case ARM_BUILTIN_WSLLHI:
    case ARM_BUILTIN_WSLLWI:
    case ARM_BUILTIN_WSLLDI:

    case ARM_BUILTIN_WSRAHI:
    case ARM_BUILTIN_WSRAWI:
    case ARM_BUILTIN_WSRADI:

    case ARM_BUILTIN_WSRLHI:
    case ARM_BUILTIN_WSRLWI:
    case ARM_BUILTIN_WSRLDI:

    case ARM_BUILTIN_WRORHI:
    case ARM_BUILTIN_WRORWI:
    case ARM_BUILTIN_WRORDI:
        arm_expand_binop_builtin_iwmmx_shift(fcode, exp, target);
...


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]