Patchwork [i386,AVX512,31/n] Update float unspec namely storeu,rcp14,rsqrt14,scalef,getexp,fixupimm,rndscale,getmant.

login
register
mail settings
Submitter Kirill Yukhin
Date Aug. 29, 2014, 1:23 p.m.
Message ID <20140829132324.GC18938@msticlxl57.ims.intel.com>
Download mbox | patch
Permalink /patch/384228/
State New
Headers show

Comments

Kirill Yukhin - Aug. 29, 2014, 1:23 p.m.
Hello,
Patch in the bottom updates few UNSPEC insn patterns w/ new
mode iterator. Additionally names were slightly changed.

Bootstrapped.
AVX-512* tests on top of patch-set all pass
under simulator.

Is it ok for trunk?

gcc/
	* config/i386/i386.c
	(avx512f_getmantv2df_round): Rename to ...
	(avx512f_vgetmantv2df_round): this.
	(avx512f_getmantv4sf_round): Rename to ...
	(avx512f_vgetmantv4sf_round): this.
	(ix86_expand_args_builtin): Handle avx512vl_getmantv8sf_mask,
	avx512vl_getmantv4df_mask, avx512vl_getmantv4sf_mask,
	avx512vl_getmantv2df_mask.
	(ix86_expand_round_builtin): Handle avx512f_vgetmantv2df_round,
	avx512f_vgetmantv4sf_round.
	* config/i386/sse.md
	(define_insn "avx512f_storeu<ssemodesuffix>512_mask"): Delete.
	(define_insn "<avx512>_storeu<ssemodesuffix><avxsizesuffix>_mask"):
	New.
	(define_insn "<mask_codefor>rcp14<mode><mask_name>"): Use VF_AVX512VL.
	(define_insn "<mask_codefor>rsqrt14<mode><mask_name>"): Ditto.
	(define_insn "avx512f_scalef<mode><mask_name><round_name>"): Delete.
	(define_insn "<avx512>_scalef<mode><mask_name><round_name>"): New.
	(define_insn "avx512f_getexp<mode><mask_name><round_saeonly_name>"):
	Delete.
	(define_insn "<avx512>_getexp<mode><mask_name><round_saeonly_name>"):
	New.
	(define_expand
	"avx512f_fixupimm<mode>_maskz<round_saeonly_expand_name>"): Delete.
	(define_expand
	"<avx512>_fixupimm<mode>_maskz<round_saeonly_expand_name>"): New.
	(define_insn
	"avx512f_fixupimm<mode><sd_maskz_name><round_saeonly_name>"): Delete.
	(define_insn
	"<avx512>_fixupimm<mode><sd_maskz_name><round_saeonly_name>"): New.
	(define_insn "avx512f_fixupimm<mode>_mask<round_saeonly_name>"):
	Delete.
	(define_insn "<avx512>_fixupimm<mode>_mask<round_saeonly_name>"): New.
	(define_insn "avx512f_rndscale<mode><mask_name><round_saeonly_name>"):
	Delete.
	(define_insn
	"<avx512>_rndscale<mode><mask_name><round_saeonly_name>"): New.
	(define_insn "avx512f_getmant<mode><mask_name><round_saeonly_name>"):
	Delete.
	(define_insn "<avx512>_getmant<mode><mask_name><round_saeonly_name>"):
	New.
	(define_insn "avx512f_getmant<mode><round_saeonly_name>"): Rename to ...
	(define_insn "avx512f_vgetmant<mode><round_saeonly_name>"): this.

--
Thanks, K
Uros Bizjak - Aug. 30, 2014, 8:14 a.m.
On Fri, Aug 29, 2014 at 3:23 PM, Kirill Yukhin <kirill.yukhin@gmail.com> wrote:
> Hello,
> Patch in the bottom updates few UNSPEC insn patterns w/ new
> mode iterator. Additionally names were slightly changed.
>
> Bootstrapped.
> AVX-512* tests on top of patch-set all pass
> under simulator.
>
> Is it ok for trunk?
>
> gcc/
>         * config/i386/i386.c
>         (avx512f_getmantv2df_round): Rename to ...
>         (avx512f_vgetmantv2df_round): this.
>         (avx512f_getmantv4sf_round): Rename to ...
>         (avx512f_vgetmantv4sf_round): this.
>         (ix86_expand_args_builtin): Handle avx512vl_getmantv8sf_mask,
>         avx512vl_getmantv4df_mask, avx512vl_getmantv4sf_mask,
>         avx512vl_getmantv2df_mask.
>         (ix86_expand_round_builtin): Handle avx512f_vgetmantv2df_round,
>         avx512f_vgetmantv4sf_round.
>         * config/i386/sse.md
>         (define_insn "avx512f_storeu<ssemodesuffix>512_mask"): Delete.
>         (define_insn "<avx512>_storeu<ssemodesuffix><avxsizesuffix>_mask"):
>         New.
>         (define_insn "<mask_codefor>rcp14<mode><mask_name>"): Use VF_AVX512VL.
>         (define_insn "<mask_codefor>rsqrt14<mode><mask_name>"): Ditto.
>         (define_insn "avx512f_scalef<mode><mask_name><round_name>"): Delete.
>         (define_insn "<avx512>_scalef<mode><mask_name><round_name>"): New.
>         (define_insn "avx512f_getexp<mode><mask_name><round_saeonly_name>"):
>         Delete.
>         (define_insn "<avx512>_getexp<mode><mask_name><round_saeonly_name>"):
>         New.
>         (define_expand
>         "avx512f_fixupimm<mode>_maskz<round_saeonly_expand_name>"): Delete.
>         (define_expand
>         "<avx512>_fixupimm<mode>_maskz<round_saeonly_expand_name>"): New.
>         (define_insn
>         "avx512f_fixupimm<mode><sd_maskz_name><round_saeonly_name>"): Delete.
>         (define_insn
>         "<avx512>_fixupimm<mode><sd_maskz_name><round_saeonly_name>"): New.
>         (define_insn "avx512f_fixupimm<mode>_mask<round_saeonly_name>"):
>         Delete.
>         (define_insn "<avx512>_fixupimm<mode>_mask<round_saeonly_name>"): New.
>         (define_insn "avx512f_rndscale<mode><mask_name><round_saeonly_name>"):
>         Delete.
>         (define_insn
>         "<avx512>_rndscale<mode><mask_name><round_saeonly_name>"): New.
>         (define_insn "avx512f_getmant<mode><mask_name><round_saeonly_name>"):
>         Delete.
>         (define_insn "<avx512>_getmant<mode><mask_name><round_saeonly_name>"):
>         New.
>         (define_insn "avx512f_getmant<mode><round_saeonly_name>"): Rename to ...
>         (define_insn "avx512f_vgetmant<mode><round_saeonly_name>"): this.

Please change ChangeLog entries to mention that these patterns are
*renamed*, not *deleted*. So, something like:

("new pattern"): Rename from "old pattern" and use VF_AVX512VL mode iterator.

Otherwise, nice patch that actually shows the power of mode iterators
and mode attributes!

OK with updated ChangeLog.

Thanks,
Uros.

Patch

diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index 61b33782..ff37ffe 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -30317,8 +30317,8 @@  static const struct builtin_description bdesc_round_args[] =
   { OPTION_MASK_ISA_AVX512F, CODE_FOR_avx512f_sgetexpv4sf_round, "__builtin_ia32_getexpss128_round", IX86_BUILTIN_GETEXPSS128, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF_INT },
   { OPTION_MASK_ISA_AVX512F, CODE_FOR_avx512f_getmantv8df_mask_round, "__builtin_ia32_getmantpd512_mask", IX86_BUILTIN_GETMANTPD512, UNKNOWN, (int) V8DF_FTYPE_V8DF_INT_V8DF_QI_INT },
   { OPTION_MASK_ISA_AVX512F, CODE_FOR_avx512f_getmantv16sf_mask_round, "__builtin_ia32_getmantps512_mask", IX86_BUILTIN_GETMANTPS512, UNKNOWN, (int) V16SF_FTYPE_V16SF_INT_V16SF_HI_INT },
-  { OPTION_MASK_ISA_AVX512F, CODE_FOR_avx512f_getmantv2df_round, "__builtin_ia32_getmantsd_round", IX86_BUILTIN_GETMANTSD128, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF_INT_INT },
-  { OPTION_MASK_ISA_AVX512F, CODE_FOR_avx512f_getmantv4sf_round, "__builtin_ia32_getmantss_round", IX86_BUILTIN_GETMANTSS128, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF_INT_INT },
+  { OPTION_MASK_ISA_AVX512F, CODE_FOR_avx512f_vgetmantv2df_round, "__builtin_ia32_getmantsd_round", IX86_BUILTIN_GETMANTSD128, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF_INT_INT },
+  { OPTION_MASK_ISA_AVX512F, CODE_FOR_avx512f_vgetmantv4sf_round, "__builtin_ia32_getmantss_round", IX86_BUILTIN_GETMANTSS128, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF_INT_INT },
   { OPTION_MASK_ISA_AVX512F, CODE_FOR_smaxv8df3_mask_round, "__builtin_ia32_maxpd512_mask", IX86_BUILTIN_MAXPD512, UNKNOWN, (int) V8DF_FTYPE_V8DF_V8DF_V8DF_QI_INT },
   { OPTION_MASK_ISA_AVX512F, CODE_FOR_smaxv16sf3_mask_round, "__builtin_ia32_maxps512_mask", IX86_BUILTIN_MAXPS512, UNKNOWN, (int) V16SF_FTYPE_V16SF_V16SF_V16SF_HI_INT },
   { OPTION_MASK_ISA_AVX512F, CODE_FOR_sse2_vmsmaxv2df3_round, "__builtin_ia32_maxsd_round", IX86_BUILTIN_MAXSD_ROUND, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF_INT },
@@ -34110,6 +34110,10 @@  ix86_expand_args_builtin (const struct builtin_description *d,
 	      case CODE_FOR_avx_vpermilv4df:
 	      case CODE_FOR_avx512f_getmantv8df_mask:
 	      case CODE_FOR_avx512f_getmantv16sf_mask:
+	      case CODE_FOR_avx512vl_getmantv8sf_mask:
+	      case CODE_FOR_avx512vl_getmantv4df_mask:
+	      case CODE_FOR_avx512vl_getmantv4sf_mask:
+	      case CODE_FOR_avx512vl_getmantv2df_mask:
 		error ("the last argument must be a 4-bit immediate");
 		return const0_rtx;
 
@@ -34516,8 +34520,8 @@  ix86_expand_round_builtin (const struct builtin_description *d,
 		{
 		case CODE_FOR_avx512f_getmantv8df_mask_round:
 		case CODE_FOR_avx512f_getmantv16sf_mask_round:
-		case CODE_FOR_avx512f_getmantv2df_round:
-		case CODE_FOR_avx512f_getmantv4sf_round:
+		case CODE_FOR_avx512f_vgetmantv2df_round:
+		case CODE_FOR_avx512f_vgetmantv4sf_round:
 		  error ("the immediate argument must be a 4-bit immediate");
 		  return const0_rtx;
 		case CODE_FOR_avx512f_cmpv8df3_mask_round:
diff --git a/gcc/config/i386/sse.md b/gcc/config/i386/sse.md
index b9aa581..d85f9a4 100644
--- a/gcc/config/i386/sse.md
+++ b/gcc/config/i386/sse.md
@@ -1170,11 +1170,11 @@ 
 	      ]
 	      (const_string "<MODE>")))])
 
-(define_insn "avx512f_storeu<ssemodesuffix>512_mask"
-  [(set (match_operand:VF_512 0 "memory_operand" "=m")
-	(vec_merge:VF_512
-	  (unspec:VF_512
-	    [(match_operand:VF_512 1 "register_operand" "v")]
+(define_insn "<avx512>_storeu<ssemodesuffix><avxsizesuffix>_mask"
+  [(set (match_operand:VF_AVX512VL 0 "memory_operand" "=m")
+	(vec_merge:VF_AVX512VL
+	  (unspec:VF_AVX512VL
+	    [(match_operand:VF_AVX512VL 1 "register_operand" "v")]
 	    UNSPEC_STOREU)
 	  (match_dup 0)
 	  (match_operand:<avx512fmaskmode> 2 "register_operand" "Yk")))]
@@ -1183,6 +1183,8 @@ 
   switch (get_attr_mode (insn))
     {
     case MODE_V16SF:
+    case MODE_V8SF:
+    case MODE_V4SF:
       return "vmovups\t{%1, %0%{%2%}|%0%{%2%}, %1}";
     default:
       return "vmovu<ssemodesuffix>\t{%1, %0%{%2%}|%0%{%2%}, %1}";
@@ -1702,9 +1704,9 @@ 
    (set_attr "mode" "SF")])
 
 (define_insn "<mask_codefor>rcp14<mode><mask_name>"
-  [(set (match_operand:VF_512 0 "register_operand" "=v")
-	(unspec:VF_512
-	  [(match_operand:VF_512 1 "nonimmediate_operand" "vm")]
+  [(set (match_operand:VF_AVX512VL 0 "register_operand" "=v")
+	(unspec:VF_AVX512VL
+	  [(match_operand:VF_AVX512VL 1 "nonimmediate_operand" "vm")]
 	  UNSPEC_RCP14))]
   "TARGET_AVX512F"
   "vrcp14<ssemodesuffix>\t{%1, %0<mask_operand2>|%0<mask_operand2>, %1}"
@@ -1797,9 +1799,9 @@ 
    (set_attr "mode" "<MODE>")])
 
 (define_insn "<mask_codefor>rsqrt14<mode><mask_name>"
-  [(set (match_operand:VF_512 0 "register_operand" "=v")
-	(unspec:VF_512
-	  [(match_operand:VF_512 1 "nonimmediate_operand" "vm")]
+  [(set (match_operand:VF_AVX512VL 0 "register_operand" "=v")
+	(unspec:VF_AVX512VL
+	  [(match_operand:VF_AVX512VL 1 "nonimmediate_operand" "vm")]
 	  UNSPEC_RSQRT14))]
   "TARGET_AVX512F"
   "vrsqrt14<ssemodesuffix>\t{%1, %0<mask_operand2>|%0<mask_operand2>, %1}"
@@ -7110,11 +7112,11 @@ 
   [(set_attr "prefix" "evex")
    (set_attr "mode"  "<ssescalarmode>")])
 
-(define_insn "avx512f_scalef<mode><mask_name><round_name>"
-  [(set (match_operand:VF_512 0 "register_operand" "=v")
-	(unspec:VF_512
-	  [(match_operand:VF_512 1 "register_operand" "v")
-	   (match_operand:VF_512 2 "<round_nimm_predicate>" "<round_constraint>")]
+(define_insn "<avx512>_scalef<mode><mask_name><round_name>"
+  [(set (match_operand:VF_AVX512VL 0 "register_operand" "=v")
+	(unspec:VF_AVX512VL
+	  [(match_operand:VF_AVX512VL 1 "register_operand" "v")
+	   (match_operand:VF_AVX512VL 2 "nonimmediate_operand" "<round_constraint>")]
 	  UNSPEC_SCALEF))]
   "TARGET_AVX512F"
   "vscalef<ssemodesuffix>\t{<round_mask_op3>%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2<round_mask_op3>}"
@@ -7167,9 +7169,9 @@ 
    (set_attr "prefix" "evex")
    (set_attr "mode" "<sseinsnmode>")])
 
-(define_insn "avx512f_getexp<mode><mask_name><round_saeonly_name>"
-  [(set (match_operand:VF_512 0 "register_operand" "=v")
-        (unspec:VF_512 [(match_operand:VF_512 1 "<round_saeonly_nimm_predicate>" "<round_saeonly_constraint>")]
+(define_insn "<avx512>_getexp<mode><mask_name><round_saeonly_name>"
+  [(set (match_operand:VF_AVX512VL 0 "register_operand" "=v")
+        (unspec:VF_AVX512VL [(match_operand:VF_AVX512VL 1 "<round_saeonly_nimm_predicate>" "<round_saeonly_constraint>")]
                         UNSPEC_GETEXP))]
    "TARGET_AVX512F"
    "vgetexp<ssemodesuffix>\t{<round_saeonly_mask_op2>%1, %0<mask_operand2>|%0<mask_operand2>, %1<round_saeonly_mask_op2>}";
@@ -7233,28 +7235,28 @@ 
 })
 
 
-(define_expand "avx512f_fixupimm<mode>_maskz<round_saeonly_expand_name>"
-  [(match_operand:VF_512 0 "register_operand")
-   (match_operand:VF_512 1 "register_operand")
-   (match_operand:VF_512 2 "register_operand")
+(define_expand "<avx512>_fixupimm<mode>_maskz<round_saeonly_expand_name>"
+  [(match_operand:VF_AVX512VL 0 "register_operand")
+   (match_operand:VF_AVX512VL 1 "register_operand")
+   (match_operand:VF_AVX512VL 2 "register_operand")
    (match_operand:<sseintvecmode> 3 "<round_saeonly_expand_nimm_predicate>")
    (match_operand:SI 4 "const_0_to_255_operand")
    (match_operand:<avx512fmaskmode> 5 "register_operand")]
   "TARGET_AVX512F"
 {
-  emit_insn (gen_avx512f_fixupimm<mode>_maskz_1<round_saeonly_expand_name> (
+  emit_insn (gen_<avx512>_fixupimm<mode>_maskz_1<round_saeonly_expand_name> (
 	operands[0], operands[1], operands[2], operands[3],
 	operands[4], CONST0_RTX (<MODE>mode), operands[5]
 	<round_saeonly_expand_operand6>));
   DONE;
 })
 
-(define_insn "avx512f_fixupimm<mode><sd_maskz_name><round_saeonly_name>"
-  [(set (match_operand:VF_512 0 "register_operand" "=v")
-        (unspec:VF_512
-          [(match_operand:VF_512 1 "register_operand" "0")
-	   (match_operand:VF_512 2 "register_operand" "v")
-           (match_operand:<sseintvecmode> 3 "<round_saeonly_nimm_predicate>" "<round_saeonly_constraint>")
+(define_insn "<avx512>_fixupimm<mode><sd_maskz_name><round_saeonly_name>"
+  [(set (match_operand:VF_AVX512VL 0 "register_operand" "=v")
+        (unspec:VF_AVX512VL
+          [(match_operand:VF_AVX512VL 1 "register_operand" "0")
+	   (match_operand:VF_AVX512VL 2 "register_operand" "v")
+           (match_operand:<sseintvecmode> 3 "nonimmediate_operand" "<round_saeonly_constraint>")
            (match_operand:SI 4 "const_0_to_255_operand")]
            UNSPEC_FIXUPIMM))]
   "TARGET_AVX512F"
@@ -7262,13 +7264,13 @@ 
   [(set_attr "prefix" "evex")
    (set_attr "mode" "<MODE>")])
 
-(define_insn "avx512f_fixupimm<mode>_mask<round_saeonly_name>"
-  [(set (match_operand:VF_512 0 "register_operand" "=v")
-	(vec_merge:VF_512
-          (unspec:VF_512
-            [(match_operand:VF_512 1 "register_operand" "0")
-	     (match_operand:VF_512 2 "register_operand" "v")
-             (match_operand:<sseintvecmode> 3 "<round_saeonly_nimm_predicate>" "<round_saeonly_constraint>")
+(define_insn "<avx512>_fixupimm<mode>_mask<round_saeonly_name>"
+  [(set (match_operand:VF_AVX512VL 0 "register_operand" "=v")
+	(vec_merge:VF_AVX512VL
+          (unspec:VF_AVX512VL
+            [(match_operand:VF_AVX512VL 1 "register_operand" "0")
+	     (match_operand:VF_AVX512VL 2 "register_operand" "v")
+             (match_operand:<sseintvecmode> 3 "nonimmediate_operand" "<round_saeonly_constraint>")
              (match_operand:SI 4 "const_0_to_255_operand")]
              UNSPEC_FIXUPIMM)
 	  (match_dup 1)
@@ -7329,10 +7331,10 @@ 
   [(set_attr "prefix" "evex")
    (set_attr "mode" "<ssescalarmode>")])
 
-(define_insn "avx512f_rndscale<mode><mask_name><round_saeonly_name>"
-  [(set (match_operand:VF_512 0 "register_operand" "=v")
-	(unspec:VF_512
-	  [(match_operand:VF_512 1 "<round_saeonly_nimm_predicate>" "<round_saeonly_constraint>")
+(define_insn "<avx512>_rndscale<mode><mask_name><round_saeonly_name>"
+  [(set (match_operand:VF_AVX512VL 0 "register_operand" "=v")
+	(unspec:VF_AVX512VL
+	  [(match_operand:VF_AVX512VL 1 "nonimmediate_operand" "<round_saeonly_constraint>")
 	   (match_operand:SI 2 "const_0_to_255_operand")]
 	  UNSPEC_ROUND))]
   "TARGET_AVX512F"
@@ -16758,10 +16760,10 @@ 
    (set_attr "memory" "none,load")
    (set_attr "mode" "<sseinsnmode>")])
 
-(define_insn "avx512f_getmant<mode><mask_name><round_saeonly_name>"
-  [(set (match_operand:VF_512 0 "register_operand" "=v")
-	(unspec:VF_512
-	  [(match_operand:VF_512 1 "<round_saeonly_nimm_predicate>" "<round_saeonly_constraint>")
+(define_insn "<avx512>_getmant<mode><mask_name><round_saeonly_name>"
+  [(set (match_operand:VF_AVX512VL 0 "register_operand" "=v")
+	(unspec:VF_AVX512VL
+	  [(match_operand:VF_AVX512VL 1 "nonimmediate_operand" "<round_saeonly_constraint>")
 	   (match_operand:SI 2 "const_0_to_15_operand")]
 	  UNSPEC_GETMANT))]
   "TARGET_AVX512F"
@@ -16769,7 +16771,7 @@ 
   [(set_attr "prefix" "evex")
    (set_attr "mode" "<MODE>")])
 
-(define_insn "avx512f_getmant<mode><round_saeonly_name>"
+(define_insn "avx512f_vgetmant<mode><round_saeonly_name>"
   [(set (match_operand:VF_128 0 "register_operand" "=v")
 	(vec_merge:VF_128
 	  (unspec:VF_128