Hi! Another case (separate patch because I thought I should add an avx512f alternative here, but later on found out it is already handled by having the vrndscale* patterns defined before these ones and having the same RTL for them (except allowing 0 to 255 instead of just 0 to 15).
Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? 2016-05-24 Jakub Jelinek <ja...@redhat.com> * config/i386/sse.md (<sse4_1>_round<ssemodesuffix><avxsizesuffix>): Limit 1st alternative to noavx isa, split 2nd alternative into one noavx and one avx alternative, use *x and Bm in the former and x and m in the latter. --- gcc/config/i386/sse.md.jj 2016-05-24 10:55:52.000000000 +0200 +++ gcc/config/i386/sse.md 2016-05-24 14:50:14.566277449 +0200 @@ -14986,22 +14996,19 @@ (define_insn "<sse4_1>_ptest<mode>" (set_attr "mode" "<sseinsnmode>")]) (define_insn "<sse4_1>_round<ssemodesuffix><avxsizesuffix>" - [(set (match_operand:VF_128_256 0 "register_operand" "=Yr,*x") + [(set (match_operand:VF_128_256 0 "register_operand" "=Yr,*x,x") (unspec:VF_128_256 - [(match_operand:VF_128_256 1 "vector_operand" "YrBm,*xBm") - (match_operand:SI 2 "const_0_to_15_operand" "n,n")] + [(match_operand:VF_128_256 1 "vector_operand" "YrBm,*xBm,xm") + (match_operand:SI 2 "const_0_to_15_operand" "n,n,n")] UNSPEC_ROUND))] "TARGET_ROUND" "%vround<ssemodesuffix>\t{%2, %1, %0|%0, %1, %2}" - [(set_attr "type" "ssecvt") - (set (attr "prefix_data16") - (if_then_else - (match_test "TARGET_AVX") - (const_string "*") - (const_string "1"))) + [(set_attr "isa" "noavx,noavx,avx") + (set_attr "type" "ssecvt") + (set_attr "prefix_data16" "1,1,*") (set_attr "prefix_extra" "1") (set_attr "length_immediate" "1") - (set_attr "prefix" "maybe_vex") + (set_attr "prefix" "orig,orig,vex") (set_attr "mode" "<MODE>")]) (define_expand "<sse4_1>_round<ssemodesuffix>_sfix<avxsizesuffix>" Jakub