From 9ac69f2d92d6efde2d31f08d400fc1ec9a0b2d39 Mon Sep 17 00:00:00 2001 From: Jan Beulich Date: Mon, 7 Aug 2023 11:45:20 +0200 Subject: x86: "ssemuladd" adjustments They're all VEX3- (also covering XOP) or EVEX-encoded. Express that in the default calculation of "prefix". FMA4 insns also all have a 1-byte immediate operand. Where the default calculation is not sufficient / applicable, add explicit "prefix" attributes. While there also add a "mode" attribute to fma___pair. gcc/ * config/i386/i386.md (isa): Move up. (length_immediate): Handle "fma4". (prefix): Handle "ssemuladd". * config/i386/sse.md (*fma_fmadd_): Add "prefix" attribute. (fma_fmadd_): Likewise. (_fmadd__mask): Likewise. (_fmadd__mask3): Likewise. (fma_fmsub_): Likewise. (_fmsub__mask): Likewise. (_fmsub__mask3): Likewise. (*fma_fnmadd_): Likewise. (fma_fnmadd_): Likewise. (_fnmadd__mask): Likewise. (_fnmadd__mask3): Likewise. (fma_fnmsub_): Likewise. (_fnmsub__mask): Likewise. (_fnmsub__mask3): Likewise. (fma_fmaddsub_): Likewise. (_fmaddsub__mask): Likewise. (_fmaddsub__mask3): Likewise. (fma_fmsubadd_): Likewise. (_fmsubadd__mask): Likewise. (_fmsubadd__mask3): Likewise. (*fmai_fmadd_): Likewise. (*fmai_fmsub_): Likewise. (*fmai_fnmadd_): Likewise. (*fmai_fnmsub_): Likewise. (avx512f_vmfmadd__mask): Likewise. (avx512f_vmfmadd__mask3): Likewise. (avx512f_vmfmadd__maskz_1): Likewise. (*avx512f_vmfmsub__mask): Likewise. (avx512f_vmfmsub__mask3): Likewise. (*avx512f_vmfmsub__maskz_1): Likewise. (avx512f_vmfnmadd__mask): Likewise. (avx512f_vmfnmadd__mask3): Likewise. (avx512f_vmfnmadd__maskz_1): Likewise. (*avx512f_vmfnmsub__mask): Likewise. (*avx512f_vmfnmsub__mask3): Likewise. (*avx512f_vmfnmsub__maskz_1): Likewise. (*fma4i_vmfmadd_): Likewise. (*fma4i_vmfmsub_): Likewise. (*fma4i_vmfnmadd_): Likewise. (*fma4i_vmfnmsub_): Likewise. (fma__): Likewise. (___mask): Likewise. (avx512fp16_fma_sh_v8hf): Likewise. (avx512fp16_sh_v8hf_mask): Likewise. (xop_p): Likewise. (xop_pdql): Likewise. (xop_pdqh): Likewise. (xop_pwd): Likewise. (xop_pwd): Likewise. (fma___pair): Likewise. Add "mode" attribute. --- gcc/config/i386/i386.md | 27 +++++++++++++++----------- gcc/config/i386/sse.md | 51 ++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 66 insertions(+), 12 deletions(-) diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index 2484323..9446ec3 100644 --- a/gcc/config/i386/i386.md +++ b/gcc/config/i386/i386.md @@ -531,12 +531,23 @@ (const_string "unknown")] (const_string "integer"))) +;; Used to control the "enabled" attribute on a per-instruction basis. +(define_attr "isa" "base,x64,nox64,x64_sse2,x64_sse4,x64_sse4_noavx, + x64_avx,x64_avx512bw,x64_avx512dq,aes, + sse_noavx,sse2,sse2_noavx,sse3,sse3_noavx,sse4,sse4_noavx, + avx,noavx,avx2,noavx2,bmi,bmi2,fma4,fma,avx512f,noavx512f, + avx512bw,noavx512bw,avx512dq,noavx512dq,fma_or_avx512vl, + avx512vl,noavx512vl,avxvnni,avx512vnnivl,avx512fp16,avxifma, + avx512ifmavl,avxneconvert,avx512bf16vl,vpclmulqdqvl" + (const_string "base")) + ;; The (bounding maximum) length of an instruction immediate. (define_attr "length_immediate" "" (cond [(eq_attr "type" "incdec,setcc,icmov,str,lea,other,multi,idiv,leave, bitmanip,imulx,msklog,mskmov") (const_int 0) - (eq_attr "type" "sse4arg") + (ior (eq_attr "type" "sse4arg") + (eq_attr "isa" "fma4")) (const_int 1) (eq_attr "unit" "i387,sse,mmx") (const_int 0) @@ -637,6 +648,10 @@ (const_string "vex") (eq_attr "mode" "XI,V16SF,V8DF") (const_string "evex") + (eq_attr "type" "ssemuladd") + (if_then_else (eq_attr "isa" "fma4") + (const_string "vex") + (const_string "maybe_evex")) (eq_attr "type" "sse4arg") (const_string "vex") ] @@ -842,16 +857,6 @@ ;; Define attribute to indicate unaligned ssemov insns (define_attr "movu" "0,1" (const_string "0")) -;; Used to control the "enabled" attribute on a per-instruction basis. -(define_attr "isa" "base,x64,nox64,x64_sse2,x64_sse4,x64_sse4_noavx, - x64_avx,x64_avx512bw,x64_avx512dq,aes, - sse_noavx,sse2,sse2_noavx,sse3,sse3_noavx,sse4,sse4_noavx, - avx,noavx,avx2,noavx2,bmi,bmi2,fma4,fma,avx512f,noavx512f, - avx512bw,noavx512bw,avx512dq,noavx512dq,fma_or_avx512vl, - avx512vl,noavx512vl,avxvnni,avx512vnnivl,avx512fp16,avxifma, - avx512ifmavl,avxneconvert,avx512bf16vl,vpclmulqdqvl" - (const_string "base")) - ;; Define instruction set of MMX instructions (define_attr "mmx_isa" "base,native,sse,sse_noavx,avx" (const_string "base")) diff --git a/gcc/config/i386/sse.md b/gcc/config/i386/sse.md index 8adea02..9513bd2 100644 --- a/gcc/config/i386/sse.md +++ b/gcc/config/i386/sse.md @@ -5422,6 +5422,7 @@ vfmadd213\t{%3, %2, %0|%0, %2, %3} vfmadd231\t{%2, %1, %0|%0, %1, %2}" [(set_attr "type" "ssemuladd") + (set_attr "prefix" "evex") (set_attr "mode" "")]) (define_expand "cond_fma" @@ -5461,6 +5462,7 @@ vfmadd132\t{%2, %3, %0%{%4%}|%0%{%4%}, %3, %2} vfmadd213\t{%3, %2, %0%{%4%}|%0%{%4%}, %2, %3}" [(set_attr "type" "ssemuladd") + (set_attr "prefix" "evex") (set_attr "mode" "")]) (define_insn "_fmadd__mask3" @@ -5475,6 +5477,7 @@ "TARGET_AVX512F" "vfmadd231\t{%2, %1, %0%{%4%}|%0%{%4%}, %1, %2}" [(set_attr "type" "ssemuladd") + (set_attr "prefix" "evex") (set_attr "mode" "")]) (define_insn "*fma_fmsub_" @@ -5522,6 +5525,7 @@ vfmsub213\t{%3, %2, %0|%0, %2, %3} vfmsub231\t{%2, %1, %0|%0, %1, %2}" [(set_attr "type" "ssemuladd") + (set_attr "prefix" "evex") (set_attr "mode" "")]) (define_expand "cond_fms" @@ -5563,6 +5567,7 @@ vfmsub132\t{%2, %3, %0%{%4%}|%0%{%4%}, %3, %2} vfmsub213\t{%3, %2, %0%{%4%}|%0%{%4%}, %2, %3}" [(set_attr "type" "ssemuladd") + (set_attr "prefix" "evex") (set_attr "mode" "")]) (define_insn "_fmsub__mask3" @@ -5578,6 +5583,7 @@ "TARGET_AVX512F && " "vfmsub231\t{%2, %1, %0%{%4%}|%0%{%4%}, %1, %2}" [(set_attr "type" "ssemuladd") + (set_attr "prefix" "evex") (set_attr "mode" "")]) (define_insn "*fma_fnmadd_" @@ -5625,6 +5631,7 @@ vfnmadd213\t{%3, %2, %0|%0, %2, %3} vfnmadd231\t{%2, %1, %0|%0, %1, %2}" [(set_attr "type" "ssemuladd") + (set_attr "prefix" "evex") (set_attr "mode" "")]) (define_expand "cond_fnma" @@ -5666,6 +5673,7 @@ vfnmadd132\t{%2, %3, %0%{%4%}|%0%{%4%}, %3, %2} vfnmadd213\t{%3, %2, %0%{%4%}|%0%{%4%}, %2, %3}" [(set_attr "type" "ssemuladd") + (set_attr "prefix" "evex") (set_attr "mode" "")]) (define_insn "_fnmadd__mask3" @@ -5681,6 +5689,7 @@ "TARGET_AVX512F && " "vfnmadd231\t{%2, %1, %0%{%4%}|%0%{%4%}, %1, %2}" [(set_attr "type" "ssemuladd") + (set_attr "prefix" "evex") (set_attr "mode" "")]) (define_insn "*fma_fnmsub_" @@ -5730,6 +5739,7 @@ vfnmsub213\t{%3, %2, %0|%0, %2, %3} vfnmsub231\t{%2, %1, %0|%0, %1, %2}" [(set_attr "type" "ssemuladd") + (set_attr "prefix" "evex") (set_attr "mode" "")]) (define_expand "cond_fnms" @@ -5773,6 +5783,7 @@ vfnmsub132\t{%2, %3, %0%{%4%}|%0%{%4%}, %3, %2} vfnmsub213\t{%3, %2, %0%{%4%}|%0%{%4%}, %2, %3}" [(set_attr "type" "ssemuladd") + (set_attr "prefix" "evex") (set_attr "mode" "")]) (define_insn "_fnmsub__mask3" @@ -5789,6 +5800,7 @@ "TARGET_AVX512F" "vfnmsub231\t{%2, %1, %0%{%4%}|%0%{%4%}, %1, %2}" [(set_attr "type" "ssemuladd") + (set_attr "prefix" "evex") (set_attr "mode" "")]) ;; FMA parallel floating point multiply addsub and subadd operations. @@ -5889,6 +5901,7 @@ vfmaddsub213\t{%3, %2, %0|%0, %2, %3} vfmaddsub231\t{%2, %1, %0|%0, %1, %2}" [(set_attr "type" "ssemuladd") + (set_attr "prefix" "evex") (set_attr "mode" "")]) (define_insn "_fmaddsub__mask" @@ -5906,6 +5919,7 @@ vfmaddsub132\t{%2, %3, %0%{%4%}|%0%{%4%}, %3, %2} vfmaddsub213\t{%3, %2, %0%{%4%}|%0%{%4%}, %2, %3}" [(set_attr "type" "ssemuladd") + (set_attr "prefix" "evex") (set_attr "mode" "")]) (define_insn "_fmaddsub__mask3" @@ -5921,6 +5935,7 @@ "TARGET_AVX512F" "vfmaddsub231\t{%2, %1, %0%{%4%}|%0%{%4%}, %1, %2}" [(set_attr "type" "ssemuladd") + (set_attr "prefix" "evex") (set_attr "mode" "")]) (define_insn "*fma_fmsubadd_" @@ -5956,6 +5971,7 @@ vfmsubadd213\t{%3, %2, %0|%0, %2, %3} vfmsubadd231\t{%2, %1, %0|%0, %1, %2}" [(set_attr "type" "ssemuladd") + (set_attr "prefix" "evex") (set_attr "mode" "")]) (define_insn "_fmsubadd__mask" @@ -5974,6 +5990,7 @@ vfmsubadd132\t{%2, %3, %0%{%4%}|%0%{%4%}, %3, %2} vfmsubadd213\t{%3, %2, %0%{%4%}|%0%{%4%}, %2, %3}" [(set_attr "type" "ssemuladd") + (set_attr "prefix" "evex") (set_attr "mode" "")]) (define_insn "_fmsubadd__mask3" @@ -5990,6 +6007,7 @@ "TARGET_AVX512F" "vfmsubadd231\t{%2, %1, %0%{%4%}|%0%{%4%}, %1, %2}" [(set_attr "type" "ssemuladd") + (set_attr "prefix" "evex") (set_attr "mode" "")]) ;; FMA3 floating point scalar intrinsics. These merge result with @@ -6057,6 +6075,7 @@ vfmadd132\t{%2, %3, %0|%0, %3, %2} vfmadd213\t{%3, %2, %0|%0, %2, %3}" [(set_attr "type" "ssemuladd") + (set_attr "prefix" "maybe_evex") (set_attr "mode" "")]) (define_insn "*fmai_fmsub_" @@ -6074,6 +6093,7 @@ vfmsub132\t{%2, %3, %0|%0, %3, %2} vfmsub213\t{%3, %2, %0|%0, %2, %3}" [(set_attr "type" "ssemuladd") + (set_attr "prefix" "maybe_evex") (set_attr "mode" "")]) (define_insn "*fmai_fnmadd_" @@ -6091,6 +6111,7 @@ vfnmadd132\t{%2, %3, %0|%0, %3, %2} vfnmadd213\t{%3, %2, %0|%0, %2, %3}" [(set_attr "type" "ssemuladd") + (set_attr "prefix" "maybe_evex") (set_attr "mode" "")]) (define_insn "*fmai_fnmsub_" @@ -6109,6 +6130,7 @@ vfnmsub132\t{%2, %3, %0|%0, %3, %2} vfnmsub213\t{%3, %2, %0|%0, %2, %3}" [(set_attr "type" "ssemuladd") + (set_attr "prefix" "maybe_evex") (set_attr "mode" "")]) (define_insn "avx512f_vmfmadd__mask" @@ -6128,6 +6150,7 @@ vfmadd132\t{%2, %3, %0%{%4%}|%0%{%4%}, %3, %2} vfmadd213\t{%3, %2, %0%{%4%}|%0%{%4%}, %2, %3}" [(set_attr "type" "ssemuladd") + (set_attr "prefix" "evex") (set_attr "mode" "")]) (define_insn "avx512f_vmfmadd__mask3" @@ -6145,6 +6168,7 @@ "TARGET_AVX512F" "vfmadd231\t{%2, %1, %0%{%4%}|%0%{%4%}, %3, %2}" [(set_attr "type" "ssemuladd") + (set_attr "prefix" "evex") (set_attr "mode" "")]) (define_expand "avx512f_vmfmadd__maskz" @@ -6178,6 +6202,7 @@ vfmadd132\t{%2, %3, %0%{%5%}%{z%}|%0%{%5%}%{z%}, %3, %2} vfmadd213\t{%3, %2, %0%{%5%}%{z%}|%0%{%5%}%{z%}, %2, %3}" [(set_attr "type" "ssemuladd") + (set_attr "prefix" "evex") (set_attr "mode" "")]) (define_insn "*avx512f_vmfmsub__mask" @@ -6198,6 +6223,7 @@ vfmsub132\t{%2, %3, %0%{%4%}|%0%{%4%}, %3, %2} vfmsub213\t{%3, %2, %0%{%4%}|%0%{%4%}, %2, %3}" [(set_attr "type" "ssemuladd") + (set_attr "prefix" "evex") (set_attr "mode" "")]) (define_insn "avx512f_vmfmsub__mask3" @@ -6216,6 +6242,7 @@ "TARGET_AVX512F" "vfmsub231\t{%2, %1, %0%{%4%}|%0%{%4%}, %3, %2}" [(set_attr "type" "ssemuladd") + (set_attr "prefix" "evex") (set_attr "mode" "")]) (define_insn "*avx512f_vmfmsub__maskz_1" @@ -6236,6 +6263,7 @@ vfmsub132\t{%2, %3, %0%{%5%}%{z%}|%0%{%5%}%{z%}, %3, %2} vfmsub213\t{%3, %2, %0%{%5%}%{z%}|%0%{%5%}%{z%}, %2, %3}" [(set_attr "type" "ssemuladd") + (set_attr "prefix" "evex") (set_attr "mode" "")]) (define_insn "avx512f_vmfnmadd__mask" @@ -6256,6 +6284,7 @@ vfnmadd132\t{%2, %3, %0%{%4%}|%0%{%4%}, %3, %2} vfnmadd213\t{%3, %2, %0%{%4%}|%0%{%4%}, %2, %3}" [(set_attr "type" "ssemuladd") + (set_attr "prefix" "evex") (set_attr "mode" "")]) (define_insn "avx512f_vmfnmadd__mask3" @@ -6274,6 +6303,7 @@ "TARGET_AVX512F" "vfnmadd231\t{%2, %1, %0%{%4%}|%0%{%4%}, %3, %2}" [(set_attr "type" "ssemuladd") + (set_attr "prefix" "evex") (set_attr "mode" "")]) (define_expand "avx512f_vmfnmadd__maskz" @@ -6308,6 +6338,7 @@ vfnmadd132\t{%2, %3, %0%{%5%}%{z%}|%0%{%5%}%{z%}, %3, %2} vfnmadd213\t{%3, %2, %0%{%5%}%{z%}|%0%{%5%}%{z%}, %2, %3}" [(set_attr "type" "ssemuladd") + (set_attr "prefix" "evex") (set_attr "mode" "")]) (define_insn "*avx512f_vmfnmsub__mask" @@ -6329,6 +6360,7 @@ vfnmsub132\t{%2, %3, %0%{%4%}|%0%{%4%}, %3, %2} vfnmsub213\t{%3, %2, %0%{%4%}|%0%{%4%}, %2, %3}" [(set_attr "type" "ssemuladd") + (set_attr "prefix" "evex") (set_attr "mode" "")]) (define_insn "*avx512f_vmfnmsub__mask3" @@ -6348,6 +6380,7 @@ "TARGET_AVX512F" "vfnmsub231\t{%2, %1, %0%{%4%}|%0%{%4%}, %3, %2}" [(set_attr "type" "ssemuladd") + (set_attr "prefix" "evex") (set_attr "mode" "")]) (define_insn "*avx512f_vmfnmsub__maskz_1" @@ -6369,6 +6402,7 @@ vfnmsub132\t{%2, %3, %0%{%5%}%{z%}|%0%{%5%}%{z%}, %3, %2} vfnmsub213\t{%3, %2, %0%{%5%}%{z%}|%0%{%5%}%{z%}, %2, %3}" [(set_attr "type" "ssemuladd") + (set_attr "prefix" "evex") (set_attr "mode" "")]) ;; FMA4 floating point scalar intrinsics. These write the @@ -6398,6 +6432,7 @@ "TARGET_FMA4" "vfmadd\t{%3, %2, %1, %0|%0, %1, %2, %3}" [(set_attr "type" "ssemuladd") + (set_attr "prefix" "vex") (set_attr "mode" "")]) (define_insn "*fma4i_vmfmsub_" @@ -6413,6 +6448,7 @@ "TARGET_FMA4" "vfmsub\t{%3, %2, %1, %0|%0, %1, %2, %3}" [(set_attr "type" "ssemuladd") + (set_attr "prefix" "vex") (set_attr "mode" "")]) (define_insn "*fma4i_vmfnmadd_" @@ -6428,6 +6464,7 @@ "TARGET_FMA4" "vfnmadd\t{%3, %2, %1, %0|%0, %1, %2, %3}" [(set_attr "type" "ssemuladd") + (set_attr "prefix" "vex") (set_attr "mode" "")]) (define_insn "*fma4i_vmfnmsub_" @@ -6444,6 +6481,7 @@ "TARGET_FMA4" "vfnmsub\t{%3, %2, %1, %0|%0, %1, %2, %3}" [(set_attr "type" "ssemuladd") + (set_attr "prefix" "vex") (set_attr "mode" "")]) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -6591,6 +6629,7 @@ "TARGET_AVX512FP16 && && " "v\t{%2, %1, %0|%0, %1, %2}" [(set_attr "type" "ssemuladd") + (set_attr "prefix" "evex") (set_attr "mode" "")]) (define_insn_and_split "fma__fadd_fmul" @@ -6654,7 +6693,9 @@ UNSPEC_COMPLEX_F_C_MA_PAIR))] "TARGET_AVX512FP16" "vph\t{%2, %1, %0|%0, %1, %2}" - [(set_attr "type" "ssemuladd")]) + [(set_attr "type" "ssemuladd") + (set_attr "prefix" "evex") + (set_attr "mode" "")]) (define_insn_and_split "fma__fmaddc_bcst" [(set (match_operand:VF_AVX512FP16VL 0 "register_operand") @@ -6726,6 +6767,7 @@ "TARGET_AVX512FP16 && " "v\t{%2, %1, %0%{%4%}|%0%{%4%}, %1, %2}" [(set_attr "type" "ssemuladd") + (set_attr "prefix" "evex") (set_attr "mode" "")]) (define_expand "cmul3" @@ -6913,6 +6955,7 @@ "TARGET_AVX512FP16" "vsh\t{%2, %1, %0|%0, %1, %2}" [(set_attr "type" "ssemuladd") + (set_attr "prefix" "evex") (set_attr "mode" "V8HF")]) (define_insn "avx512fp16_sh_v8hf_mask" @@ -6932,6 +6975,7 @@ "TARGET_AVX512FP16" "vsh\t{%2, %1, %0%{%4%}|%0%{%4%}, %1, %2}" [(set_attr "type" "ssemuladd") + (set_attr "prefix" "evex") (set_attr "mode" "V8HF")]) (define_insn "avx512fp16_sh_v8hf" @@ -24779,6 +24823,7 @@ "TARGET_XOP" "vp\t{%3, %2, %1, %0|%0, %1, %2, %3}" [(set_attr "type" "ssemuladd") + (set_attr "prefix" "vex") (set_attr "mode" "TI")]) (define_insn "xop_pdql" @@ -24797,6 +24842,7 @@ "TARGET_XOP" "vpdql\t{%3, %2, %1, %0|%0, %1, %2, %3}" [(set_attr "type" "ssemuladd") + (set_attr "prefix" "vex") (set_attr "mode" "TI")]) (define_insn "xop_pdqh" @@ -24815,6 +24861,7 @@ "TARGET_XOP" "vpdqh\t{%3, %2, %1, %0|%0, %1, %2, %3}" [(set_attr "type" "ssemuladd") + (set_attr "prefix" "vex") (set_attr "mode" "TI")]) ;; XOP parallel integer multiply/add instructions for the intrinisics @@ -24836,6 +24883,7 @@ "TARGET_XOP" "vpwd\t{%3, %2, %1, %0|%0, %1, %2, %3}" [(set_attr "type" "ssemuladd") + (set_attr "prefix" "vex") (set_attr "mode" "TI")]) (define_insn "xop_pwd" @@ -24868,6 +24916,7 @@ "TARGET_XOP" "vpwd\t{%3, %2, %1, %0|%0, %1, %2, %3}" [(set_attr "type" "ssemuladd") + (set_attr "prefix" "vex") (set_attr "mode" "TI")]) ;; XOP parallel XMM conditional moves -- cgit v1.1