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