Hi!

AVX2 prefers v*i128 instructions for vector integer
modes, while AVX only supports v*f128.
In one of my recent patches I've changed vextract* so that
it emits v*i128 instead of v*f128 for AVX2 on integer modes,
but I wonder what is the prefered way to change the rest
of the insn.

E.g. we have:
(define_insn "avx_vbroadcastf128_<mode>"
  [(set (match_operand:V_256 0 "register_operand" "=x,x,x")
        (vec_concat:V_256
          (match_operand:<ssehalfvecmode> 1 "nonimmediate_operand" "m,0,?x")
          (match_dup 1)))]
  "TARGET_AVX"
  "@
   vbroadcastf128\t{%1, %0|%0, %1}
   vinsertf128\t{$1, %1, %0, %0|%0, %0, %1, 1}
   vperm2f128\t{$0, %t1, %t1, %0|%0, %t1, %t1, 0}"
  [(set_attr "type" "ssemov,sselog1,sselog1")
   (set_attr "prefix_extra" "1")
   (set_attr "length_immediate" "0,1,1")
   (set_attr "prefix" "vex")
   (set_attr "mode" "V4SF,V8SF,V8SF")])

One option is change the mode iterator, so that it
iterates on all 256-bit vectors for !TARGET_AVX2, and only
for V8SF and V4DF for TARGET_AVX2, then for each such an insn also
add similar insn that iterates on the 256-bit integer vectors,
is guarded by TARGET_AVX2 and uses *i128 and OI mode attribute instead of
V8SF or V4DF.

Or, e.g. we could have operand modifier that would print "i128"
resp. "i" for TARGET_AVX2 and integer vector modes, and would print
"f128" resp. "f" otherwise.  Still, something would need to be done
about the mode attribute.

Or something else?

        Jakub

Reply via email to