[PATCH, i386]: Committed: Fix PR target/33369 (target part): [4.3 Regression] suffix or operands invalid for `pslld'

Uros Bizjak ubizjak@gmail.com
Mon Sep 10 10:11:00 GMT 2007


This is in fact the problem, exposed by new SLP pass that doesn't
check target optabs if vec shift by vec constant is supported (this is
the same problem as was fixed for PR target/22480 for loop

Attached patch fixes target part of the failure by constraint
immediate operand with 'N' constraint.

Additionally, the mode of op1 operand is changed to SImode for two reasons:

1) code for a[i] << x, where x is integer is much better. For this
testcase from pr22480:

--cut here--
test_2 (int a)
  static unsigned int bm[16];
  int j;
  for (j = 0; j < 16; j++)
    bm[j] <<= a;
--cut here--

gcc generated

        subl    $28, %esp
        xorl    %eax, %eax
        movl    32(%esp), %edx
        .p2align 4,,7
        .p2align 3
        movl    %edx, (%esp)
        movdqa  bm.1472(%eax), %xmm0
        movl    $0, 4(%esp)
        movl    $0, 8(%esp)
        movl    $0, 12(%esp)
        movdqa  (%esp), %xmm1
        pslld   %xmm1, %xmm0
        movdqa  %xmm0, bm.1472(%eax)

but with attached patch, gcc generates:

        movl    $bm.1473, %eax
        movd    4(%esp), %xmm1
        .p2align 4,,7
        .p2align 3
        movdqa  (%eax), %xmm0
        pslld   %xmm1, %xmm0
        movdqa  %xmm0, (%eax)

2. gcc will always crash for (unsupported) vec shift by vec constant.
Currently, for attached testcase (ICEs because of SLP pass), SLP pass

  vect_var_.29_48 = vect_var_.28_46 << vect_cst_.30_47;

Which is just plain wrong for SSE. This is also the reason for new failure

FAIL: gcc.dg/vect/slp-36.c (internal compiler error)
FAIL: gcc.dg/vect/slp-36.c (test for excess errors)

Patch was bootstrapped and regression tested on i686-pc-linux-gnu.
Patch is commited to SVN.

2007-09-10  Uros Bizjak  <ubizjak@gmail.com>

	PR target/33369
	* gcc/config/i386/sse.md (ashr<mode>3): Change op2 mode to SImode.
	Use 'N' operand constraint for op2.
	(lshr<mode>3): Ditto.
	(ashl<mode>3): Ditto.
	(vec_shl_<mode>): Use const_0_to_255_mul_8_operand predicate for op2.
	(vec_shr_<mode>): Use const_0_to_255_mul_8_operand predicate for op2.

	* gcc/config/i386/i386.c (ix86_expand_builtin) [IX86_BUILTIN_PSLL?128,
	IX86_BUILTIN_PSRA*?128, IX86_BUILTIN_PSRL?128]: Convert op1 to SImode.

-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: pr33369.diff.txt
URL: <http://gcc.gnu.org/pipermail/gcc-patches/attachments/20070910/af981d66/attachment.txt>

More information about the Gcc-patches mailing list