On Thu, Jun 26, 2014 at 07:43:55AM +0200, Marc Glisse wrote:
> >+      if (compute_type == TREE_TYPE (type)
> >+          && !VECTOR_INTEGER_TYPE_P (TREE_TYPE (rhs2)))
> >+        {
> >+          optab oplv, opl, oprv, opr, opo;
> >+          oplv = optab_for_tree_code (LSHIFT_EXPR, type, optab_vector);
> >+          oprv = optab_for_tree_code (RSHIFT_EXPR, type, optab_vector);
> >+          opo = optab_for_tree_code (BIT_IOR_EXPR, type, optab_default);
> >+          opl = optab_for_tree_code (LSHIFT_EXPR, type, optab_scalar);
> >+          opr = optab_for_tree_code (RSHIFT_EXPR, type, optab_scalar);
> 
> How well are we separating lshiftrt from ashiftrt? Are ROTATE_EXPR always on
> an unsigned type so it is fine? Or do we expand one in terms of the other if
> it isn't available so it doesn't matter?

You're right, for RSHIFT_EXPR I should use
        oprv = vlshr_optab;
        opr = lshr_optab;
because expmed.c always uses lshiftrt.
> 
> >+          if (optab_handler (oplv, TYPE_MODE (type)) != CODE_FOR_nothing
> >+              && optab_handler (opl, TYPE_MODE (type)) == CODE_FOR_nothing
> >+              && optab_handler (oprv, TYPE_MODE (type)) != CODE_FOR_nothing
> >+              && optab_handler (opr, TYPE_MODE (type)) == CODE_FOR_nothing)
> >+            {
> >+              opl = oplv;
> >+              opr = oprv;
> >+            }
> 
> Maybe arrange the conditions in order (oplv!= && oprv!= && (opl== ||
> opr==)), or separate the replacement of opl and of opv into 2 separate ifs?

The reason I wrote them in this order was so that it fits on the lines ;)
Guess two separate ifs would be fine.

> Somehow, it feels like those checks should be somewhere in get_compute_type
> so we test both scalar and vector versions for each size, or we could call
> get_compute_type for both and pick the best.

It would be easier to just call get_compute_type in each case and pick the
wider, but the preexisting case didn't bother, so I haven't bothered either.
Passing two optabs optionally to get_compute_type would be IMHO too ugly.
> 
> >+          compute_type = get_compute_type (LSHIFT_EXPR, opl, type);
> >+          if (compute_type == TREE_TYPE (type)
> >+              || compute_type != get_compute_type (RSHIFT_EXPR, opr, type)
> >+              || compute_type != get_compute_type (BIT_IOR_EXPR, opo, type))
> >+            compute_type = TREE_TYPE (type);
> 
> Since we have determined compute_type from ashift (let's assume that's the
> one least likely to exist), I would just check that optab is ok with using
> this mode for the other 2 ops. Here, if we have shifts in 128 bits and ior
> in both 128 and 256 bits, we will fail (I thought that might be the case in
> AVX, but apparently not). Plus it is faster ;-)

Makes sense.

> Does rotate hit PR 56873? (I noticed the -mno-xop and no -mxop test)

There are exec testcases, -mxop AFAIK has rotates, so I think it is not
worth testing.  And there is a single asm match compile testcase, where
the -mno-xop ensures that when somebody -mxop in RUNTESTFLAGS or CPU
defaults to -mxop we don't get a matching failure, because in that case it
would emit a vector rotate insn.

        Jakub

Reply via email to