This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug target/35294] iwmmxt intrinsics, internal compiler error
- From: "serowk at yandex dot ru" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Thu, 16 Dec 2010 11:20:16 +0000
- Subject: [Bug target/35294] iwmmxt intrinsics, internal compiler error
- Auto-submitted: auto-generated
- References: <bug-35294-4@http.gcc.gnu.org/bugzilla/>
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);
...