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); ...