config.gcc (supported_defaults): Add madd4.
authorMatthew Fortune <matthew.fortune@imgtec.com>
Fri, 20 Jan 2017 01:05:25 +0000 (01:05 +0000)
committerCatherine Moore <clm@gcc.gnu.org>
Fri, 20 Jan 2017 01:05:25 +0000 (20:05 -0500)
gcc/
2017-01-19  Matthew Fortune  <matthew.fortune@imgtec.com>
    Yunqiang Su  <yunqiang.su@imgtec.com>

* config.gcc (supported_defaults): Add madd4.
(with_madd4): Add validation.
(all_defaults): Add madd4.
* config/mips/mips.opt (mmadd4): New option.
* gcc/config/mips/mips.h (OPTION_DEFAULT_SPECS): Add a default for
mmadd4.
(TARGET_CPU_CPP_BUILTINS): Add builtin_define for
__mips_no_madd4.
(ISA_HAS_UNFUSED_MADD4): Gate with mips_madd4.
(ISA_HAS_FUSED_MADD4): Likewise.
* gcc/doc/invoke.texi (-mmadd4): Document the new option.
* gcc/doc/install.texi (--with-madd4): Document the new option.

gcc/testsuite/
2017-01-19  Matthew Fortune  <matthew.fortune@imgtec.com>

* gcc.target/mips/madd4-1.c: New file.
* gcc.target/mips/madd4-2.c: Likewise.
* gcc.target/mips/mips.exp (mips_option_groups): Add ghost option
HAS_MADD4.
(mips_option_groups): Add -m[no-]madd4.
(mips-dg-init): Detect default -mno-madd4.
(mips-dg-options): Handle HAS_MADD4 arch upgrade/downgrade.
* gcc.target/mips/mips-ps-type.c: Add -mmadd4 test option.
* gcc.target/mips/mips-ps-type-2.c: Likewise.
* gcc.target/mips/nmadd-1.c: Likewise.
* gcc.target/mips/nmadd-2.c: Likewise.
* gcc.target/mips/nmadd-3.c: Likewise.

Co-Authored-By: Yunqiang Su <yunqiang.su@imgtec.com>
From-SVN: r244676

15 files changed:
gcc/ChangeLog
gcc/config.gcc
gcc/config/mips/mips.h
gcc/config/mips/mips.opt
gcc/doc/install.texi
gcc/doc/invoke.texi
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/mips/madd4-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/mips/madd4-2.c [new file with mode: 0644]
gcc/testsuite/gcc.target/mips/mips-ps-type-2.c
gcc/testsuite/gcc.target/mips/mips-ps-type.c
gcc/testsuite/gcc.target/mips/mips.exp
gcc/testsuite/gcc.target/mips/nmadd-1.c
gcc/testsuite/gcc.target/mips/nmadd-2.c
gcc/testsuite/gcc.target/mips/nmadd-3.c

index fbc9c303ea030b23b10ad2d848fd475e0bef3fe0..c52f0247556264024f32247d7b2ee12773b0571f 100644 (file)
@@ -1,3 +1,19 @@
+2017-01-19  Matthew Fortune  <matthew.fortune@imgtec.com>
+           Yunqiang Su  <yunqiang.su@imgtec.com>
+
+       * config.gcc (supported_defaults): Add madd4.
+       (with_madd4): Add validation.
+       (all_defaults): Add madd4.
+       * config/mips/mips.opt (mmadd4): New option.
+       * gcc/config/mips/mips.h (OPTION_DEFAULT_SPECS): Add a default for
+       mmadd4.
+       (TARGET_CPU_CPP_BUILTINS): Add builtin_define for
+       __mips_no_madd4.
+       (ISA_HAS_UNFUSED_MADD4): Gate with mips_madd4.
+       (ISA_HAS_FUSED_MADD4): Likewise.
+       * gcc/doc/invoke.texi (-mmadd4): Document the new option.
+       * gcc/doc/install.texi (--with-madd4): Document the new option.
+
 2017-01-19  Jiong Wang  <jiong.wang@arm.com>
 
        * config/aarch64/aarch64-builtins.c (enum aarch64_builtins): New
index c0969a1aad009045b09ae36e4c9bb83232e5c8df..03b189497d86a4f217f87bbc46014fd08afd52e3 100644 (file)
@@ -3940,7 +3940,7 @@ case "${target}" in
                ;;
 
        mips*-*-*)
-               supported_defaults="abi arch arch_32 arch_64 float fpu nan fp_32 odd_spreg_32 tune tune_32 tune_64 divide llsc mips-plt synci lxc1-sxc1"
+               supported_defaults="abi arch arch_32 arch_64 float fpu nan fp_32 odd_spreg_32 tune tune_32 tune_64 divide llsc mips-plt synci lxc1-sxc1 madd4"
 
                case ${with_float} in
                "" | soft | hard)
@@ -4078,6 +4078,21 @@ case "${target}" in
                        exit 1
                        ;;
                esac
+
+               case ${with_madd4} in
+               yes)
+                       with_madd4=madd4
+                       ;;
+               no)
+                       with_madd4=no-madd4
+                       ;;
+               "")
+                       ;;
+               *)
+                       echo "Unknown madd4 type used in --with-madd4" 1>&2
+                       exit 1
+                       ;;
+               esac
                ;;
 
        nds32*-*-*)
@@ -4511,7 +4526,7 @@ case ${target} in
 esac
 
 t=
-all_defaults="abi cpu cpu_32 cpu_64 arch arch_32 arch_64 tune tune_32 tune_64 schedule float mode fpu nan fp_32 odd_spreg_32 divide llsc mips-plt synci tls lxc1-sxc1"
+all_defaults="abi cpu cpu_32 cpu_64 arch arch_32 arch_64 tune tune_32 tune_64 schedule float mode fpu nan fp_32 odd_spreg_32 divide llsc mips-plt synci tls lxc1-sxc1 madd4"
 for option in $all_defaults
 do
        eval "val=\$with_"`echo $option | sed s/-/_/g`
index 81032c9f94c471f79f16f88891bf384bc46527d0..23e1672b58627caf5dbe969340eb9e466b7c45f8 100644 (file)
@@ -639,6 +639,8 @@ struct mips_cpu_info {
        builtin_define ("__GCC_HAVE_BUILTIN_MIPS_CACHE");               \
       if (!ISA_HAS_LXC1_SXC1)                                          \
        builtin_define ("__mips_no_lxc1_sxc1");                         \
+      if (!ISA_HAS_UNFUSED_MADD4 && !ISA_HAS_FUSED_MADD4)              \
+       builtin_define ("__mips_no_madd4");                             \
     }                                                                  \
   while (0)
 
@@ -869,7 +871,8 @@ struct mips_cpu_info {
   {"llsc", "%{!mllsc:%{!mno-llsc:-m%(VALUE)}}" }, \
   {"mips-plt", "%{!mplt:%{!mno-plt:-m%(VALUE)}}" }, \
   {"synci", "%{!msynci:%{!mno-synci:-m%(VALUE)}}" },                   \
-  {"lxc1-sxc1", "%{!mlxc1-sxc1:%{!mno-lxc1-sxc1:-m%(VALUE)}}" } \
+  {"lxc1-sxc1", "%{!mlxc1-sxc1:%{!mno-lxc1-sxc1:-m%(VALUE)}}" }, \
+  {"madd4", "%{!mmadd4:%{!mno-madd4:-m%(VALUE)}}" } \
 
 /* A spec that infers the:
    -mnan=2008 setting from a -mips argument,
@@ -1066,11 +1069,14 @@ struct mips_cpu_info {
 
 /* ISA has 4 operand fused madd instructions of the form
    'd = [+-] (a * b [+-] c)'.  */
-#define ISA_HAS_FUSED_MADD4    (TARGET_MIPS8000 || TARGET_LOONGSON_3A)
+#define ISA_HAS_FUSED_MADD4    (mips_madd4                             \
+                                && (TARGET_MIPS8000                    \
+                                    || TARGET_LOONGSON_3A))
 
 /* ISA has 4 operand unfused madd instructions of the form
    'd = [+-] (a * b [+-] c)'.  */
-#define ISA_HAS_UNFUSED_MADD4  (ISA_HAS_FP4                            \
+#define ISA_HAS_UNFUSED_MADD4  (mips_madd4                             \
+                                && ISA_HAS_FP4                         \
                                 && !TARGET_MIPS8000                    \
                                 && !TARGET_LOONGSON_3A)
 
index 75ebafdba26949b1bad3f6e174ddf097709b96d2..7c4b607fa85009f12849faa13673d2b0f4b938b3 100644 (file)
@@ -392,6 +392,10 @@ mlxc1-sxc1
 Target Report Var(mips_lxc1_sxc1) Init(1)
 Use lwxc1/swxc1/ldxc1/sdxc1 instructions where applicable.
 
+mmadd4
+Target Report Var(mips_madd4) Init(1)
+Use 4-operand madd.s/madd.d and related instructions where applicable.
+
 mtune=
 Target RejectNegative Joined Var(mips_tune_option) ToLower Enum(mips_arch_opt_value)
 -mtune=PROCESSOR       Optimize the output for PROCESSOR.
index 712b82a1442a64e65311d752f7b07029293a99b7..cccf812fa736180c812b96806720527acba48bff 100644 (file)
@@ -1394,6 +1394,20 @@ in @code{lwxc1} type instructions.  This assumption holds true in a
 pure 32-bit environment and can hold true in a 64-bit environment if
 the address space is accurately set to be 32-bit for o32 and n32.
 
+@item --with-madd4
+On MIPS targets, make @option{-mmadd4} the default when no
+@option{-mno-madd4} option is passed.  This is the default.
+
+@item --without-madd4
+On MIPS targets, make @option{-mno-madd4} the default when no
+@option{-mmadd4} option is passed.  The @code{madd4} instruction
+family can be problematic when targeting a combination of cores that
+implement these instructions differently.  There are two known cores
+that implement these as fused operations instead of unfused (where
+unfused is normally expected).  Disabling these instructions is the
+only way to ensure compatible code is generated; this will incur
+a performance penalty.
+
 @item --with-mips-plt
 On MIPS targets, make use of copy relocations and PLTs.
 These features are extensions to the traditional
index 79a40f13d82c556161b0ffee7176a696b154600c..a7b494b76e243b9876d040d31504ba0444c4faca 100644 (file)
@@ -909,7 +909,7 @@ Objective-C and Objective-C++ Dialects}.
 -mcompact-branches=@var{policy} @gol
 -mfp-exceptions  -mno-fp-exceptions @gol
 -mvr4130-align  -mno-vr4130-align  -msynci  -mno-synci @gol
--mlxc1-sxc1 -mno-lxc1-sxc1 @gol
+-mlxc1-sxc1 -mno-lxc1-sxc1 -mmadd4 -mno-madd4 @gol
 -mrelax-pic-calls  -mno-relax-pic-calls  -mmcount-ra-address @gol
 -mframe-header-opt  -mno-frame-header-opt}
 
@@ -19950,6 +19950,12 @@ This optimization is off by default at all optimization levels.
 When applicable, enable (disable) the generation of @code{lwxc1},
 @code{swxc1}, @code{ldxc1}, @code{sdxc1} instructions.  Enabled by default.
 
+@item -mmadd4
+@itemx -mno-madd4
+@opindex mmadd4
+When applicable, enable (disable) the generation of 4-operand @code{madd.s},
+@code{madd.d} and related instructions.  Enabled by default.
+
 @end table
 
 @node MMIX Options
index c868ea7f1e2be38dccc4b1efc9e8ad05f20de4b2..65c9ac816c5f1615490725f7468c3b7fcf412179 100644 (file)
@@ -1,3 +1,18 @@
+2017-01-19  Matthew Fortune  <matthew.fortune@imgtec.com>
+
+       * gcc.target/mips/madd4-1.c: New file.
+       * gcc.target/mips/madd4-2.c: Likewise.
+       * gcc.target/mips/mips.exp (mips_option_groups): Add ghost option
+       HAS_MADD4.
+       (mips_option_groups): Add -m[no-]madd4.
+       (mips-dg-init): Detect default -mno-madd4.
+       (mips-dg-options): Handle HAS_MADD4 arch upgrade/downgrade.
+       * gcc.target/mips/mips-ps-type.c: Add -mmadd4 test option.
+       * gcc.target/mips/mips-ps-type-2.c: Likewise.
+       * gcc.target/mips/nmadd-1.c: Likewise.
+       * gcc.target/mips/nmadd-2.c: Likewise.
+       * gcc.target/mips/nmadd-3.c: Likewise.
+
 2017-01-19  Jiong Wang  <jiong.wang@arm.com>
 
        * gcc.target/aarch64/return_address_sign_1.c: New testcase for no
diff --git a/gcc/testsuite/gcc.target/mips/madd4-1.c b/gcc/testsuite/gcc.target/mips/madd4-1.c
new file mode 100644 (file)
index 0000000..d0dee36
--- /dev/null
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+/* { dg-options "-ffast-math -mno-madd4 (HAS_MADD4) -mhard-float" } */
+/* { dg-skip-if "code quality test" { *-*-* } { "-O0" } { "" } } */
+/* { dg-final { scan-assembler-not "\tmadd.s\t" } } */
+
+#ifndef __mips_no_madd4
+#error missing definition of __mips_no_madd4
+#endif
+
+NOMIPS16 float
+madd4 (float f, float g, float h)
+{
+  return (f * g) + h;
+}
diff --git a/gcc/testsuite/gcc.target/mips/madd4-2.c b/gcc/testsuite/gcc.target/mips/madd4-2.c
new file mode 100644 (file)
index 0000000..eb83023
--- /dev/null
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+/* { dg-options "-ffast-math -mmadd4 (HAS_MADD4) -mhard-float" } */
+/* { dg-skip-if "code quality test" { *-*-* } { "-O0" } { "" } } */
+/* { dg-final { scan-assembler "\tmadd.s\t" } } */
+
+#ifdef __mips_no_madd4
+#error unexpected definition of __mips_no_madd4
+#endif
+
+NOMIPS16 float
+madd4 (float f, float g, float h)
+{
+  return (f * g) + h;
+}
index 6aba81507e7b587da1f110901b59281db3025acb..fecc35ba9e5481641e2f4d12e56ed4fda9f45da8 100644 (file)
@@ -1,7 +1,7 @@
 /* Test v2sf calculations.  The nmadd and nmsub patterns need
    -ffinite-math-only.  */
 /* { dg-do compile } */
-/* { dg-options "(HAS_MADDPS) -mgp32 -mpaired-single -ffinite-math-only forbid_cpu=octeon.*" } */
+/* { dg-options "(HAS_MADDPS) -mmadd4 -mgp32 -mpaired-single -ffinite-math-only forbid_cpu=octeon.*" } */
 /* { dg-skip-if "nmadd and nmsub need combine" { *-*-* } { "-O0" } { "" } } */
 /* { dg-final { scan-assembler "\tcvt.ps.s\t" } } */
 /* { dg-final { scan-assembler "\tmov.ps\t" } } */
index 454ffc349571ba5e6c9716c0647bb04d38d05f27..d74d4b527b9dff83eefa5c0d814f17e4ed7c4512 100644 (file)
@@ -1,7 +1,7 @@
 /* Test v2sf calculations.  The nmadd and nmsub patterns need
    -ffinite-math-only.  */
 /* { dg-do compile } */ 
-/* { dg-options "-mpaired-single -mgp64 -ffinite-math-only forbid_cpu=octeon.*" } */
+/* { dg-options "-mpaired-single -mmadd4 -mgp64 -ffinite-math-only forbid_cpu=octeon.*" } */
 /* { dg-skip-if "nmadd and nmsub need combine" { *-*-* } { "-O0" } { "" } } */
 /* { dg-final { scan-assembler "\tcvt.ps.s\t" } } */
 /* { dg-final { scan-assembler "\tmov.ps\t" } } */
index 5296a15f616fedb839ff12289692bc4e6d653c28..78fbba077d880b372f7452186adc754fe9ca831d 100644 (file)
@@ -256,6 +256,7 @@ set mips_option_groups {
     ldc "HAS_LDC"
     movn "HAS_MOVN"
     madd "HAS_MADD"
+    madd4_ghost "HAS_MADD4"
     maddps "HAS_MADDPS"
     lsa "(|!)HAS_LSA"
     lxc1 "HAS_LXC1"
@@ -284,6 +285,7 @@ foreach option {
     local-sdata
     long-calls
     lxc1-sxc1
+    madd4
     paired-single
     plt
     shared
@@ -863,6 +865,12 @@ proc mips-dg-init {} {
            "-mlxc1-sxc1"
            #endif
 
+           #ifdef __mips_no_madd4
+           "-mno-madd4"
+           #else
+           "-mmadd4"
+           #endif
+
            #ifdef __mips_synci
            "-msynci",
            #else
@@ -1182,6 +1190,7 @@ proc mips-dg-options { args } {
        #
        } elseif { $isa < 4
                   && ([mips_have_test_option_p options "HAS_LXC1"]
+                      || [mips_have_test_option_p options "HAS_MADD4"]
                       || [mips_have_test_option_p options "HAS_MOVN"]) } {
            mips_make_test_option options "-mips4"
         # We need MIPS III or higher for:
@@ -1224,8 +1233,9 @@ proc mips-dg-options { args } {
                       || [mips_have_test_option_p options "-mfix-r10000"]
                       || [mips_have_test_option_p options "NOT_HAS_DMUL"]
                       || [mips_have_test_option_p options "HAS_LXC1"]
-                      || [mips_have_test_option_p options "HAS_MOVN"]
                       || [mips_have_test_option_p options "HAS_MADD"]
+                      || [mips_have_test_option_p options "HAS_MADD4"]
+                      || [mips_have_test_option_p options "HAS_MOVN"]
                       || [mips_have_test_option_p options "-mpaired-single"]
                       || [mips_have_test_option_p options "-mnan=legacy"]
                       || [mips_have_test_option_p options "-mabs=legacy"]
index 00be144d16a6777dc31758b8489cbaed78645a43..746fbbbf778e58f98324489e4f51f300f08fcfcc 100644 (file)
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-ffast-math isa=4 -mhard-float" } */
+/* { dg-options "-ffast-math -mmadd4 isa=4 -mhard-float" } */
 /* { dg-skip-if "code quality test" { *-*-* } { "-O0" } { "" } } */
 /* { dg-final { scan-assembler "\tnmadd.s\t" } } */
 /* { dg-final { scan-assembler "\tnmadd.d\t" } } */
index a271f33b697314e0677f1e55eb0a68d5d9aa6e82..4c8dd65d57d3daff11feae21fa9b72ec0694a066 100644 (file)
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-fno-fast-math -ffinite-math-only isa=4 -mhard-float" } */
+/* { dg-options "-fno-fast-math -ffinite-math-only -mmadd4 isa=4 -mhard-float" } */
 /* { dg-skip-if "code quality test" { *-*-* } { "-O0" } { "" } } */
 /* { dg-final { scan-assembler "\tnmadd.s\t" } } */
 /* { dg-final { scan-assembler "\tnmadd.d\t" } } */
index 85de518a73dff4a3c9ea61d43a65b94f78bc5ef5..b55de96c7a0b0b65bf00674744ee5f83316dfaaa 100644 (file)
@@ -1,7 +1,7 @@
 /* The same code as nmadd-2.c, but compiled with -fno-finite-math-only.
    We can't use nmadd and nmsub in that case.  */
 /* { dg-do compile } */
-/* { dg-options "-fno-fast-math -fno-finite-math-only isa=4 -mhard-float" } */
+/* { dg-options "-fno-fast-math -fno-finite-math-only -mmadd4 isa=4 -mhard-float" } */
 /* { dg-final { scan-assembler-not "\tnmadd" } } */
 /* { dg-final { scan-assembler-not "\tnmsub" } } */