This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[Patch] Add MIPS flag to avoid use of ldc1/sdc1/ldxc1/sdxc1
- From: "Steve Ellcey " <sellcey at imgtec dot com>
- To: <clm at codesourcery dot com>, <matthew dot fortune at imgtec dot com>, <gcc-patches at gcc dot gnu dot org>
- Date: Mon, 27 Oct 2014 15:23:45 -0700
- Subject: [Patch] Add MIPS flag to avoid use of ldc1/sdc1/ldxc1/sdxc1
- Authentication-results: sourceware.org; auth=none
There are some MIPS patches that have been applied to the Google Android GCC
tree but not been submitted to FSF GCC. I would like to get those patches
checked in if possible. The first one is to add a new MIPS flag to turn
off the use of ldc1/sdc1/ldxc1/sdxc1. Google Earth has a custom allocator
that does not guarantee 8 byte alignment of the allocated memory, therefore
using these instructions (that require 8 byte alignment) could cause runtime
failures. By default, these instructions will continue to be used, the
flag is there to allow their use to be turned off if desired.
Tested on mips-mti-linux-gnu.
OK to checkin?
Steve Ellcey
sellcey@imgtec.com
2014-10-27 Steve Ellcey <sellcey@imgtec.com>
* config/mips/mips.h (ISA_HAS_LDC1_SDC1): Check TARGET_LDC1_SDC1.
* config/mips/mips.md (*<ANYF:loadx>_<P:mode): Ditto.
* config/mips/mips.md (*<ANYF:storex>_<P:mode): Ditto.
* config/mips/mips.opt (mldc1-sdc1): New.
diff --git a/gcc/config/mips/mips.h b/gcc/config/mips/mips.h
index c7b998b..b9caff7 100644
--- a/gcc/config/mips/mips.h
+++ b/gcc/config/mips/mips.h
@@ -892,7 +892,8 @@ struct mips_cpu_info {
/* ISA has LDC1 and SDC1. */
#define ISA_HAS_LDC1_SDC1 (!ISA_MIPS1 \
&& !TARGET_MIPS5900 \
- && !TARGET_MIPS16)
+ && !TARGET_MIPS16 \
+ && TARGET_LDC1_SDC1)
/* ISA has the mips4 FP condition code instructions: FP-compare to CC,
branch on CC, and move (both FP and non-FP) on CC. */
diff --git a/gcc/config/mips/mips.md b/gcc/config/mips/mips.md
index d47bb78..77f3356 100644
--- a/gcc/config/mips/mips.md
+++ b/gcc/config/mips/mips.md
@@ -4573,7 +4573,7 @@
[(set (match_operand:ANYF 0 "register_operand" "=f")
(mem:ANYF (plus:P (match_operand:P 1 "register_operand" "d")
(match_operand:P 2 "register_operand" "d"))))]
- "ISA_HAS_LXC1_SXC1"
+ "ISA_HAS_LXC1_SXC1 && (<MODE>mode == SFmode || TARGET_LDC1_SDC1)"
"<ANYF:loadx>\t%0,%1(%2)"
[(set_attr "type" "fpidxload")
(set_attr "mode" "<ANYF:UNITMODE>")])
@@ -4582,7 +4582,7 @@
[(set (mem:ANYF (plus:P (match_operand:P 1 "register_operand" "d")
(match_operand:P 2 "register_operand" "d")))
(match_operand:ANYF 0 "register_operand" "f"))]
- "ISA_HAS_LXC1_SXC1"
+ "ISA_HAS_LXC1_SXC1 && (<MODE>mode == SFmode || TARGET_LDC1_SDC1)"
"<ANYF:storex>\t%0,%1(%2)"
[(set_attr "type" "fpidxstore")
(set_attr "mode" "<ANYF:UNITMODE>")])
diff --git a/gcc/config/mips/mips.opt b/gcc/config/mips/mips.opt
index dca4f80..7b75fc9 100644
--- a/gcc/config/mips/mips.opt
+++ b/gcc/config/mips/mips.opt
@@ -267,6 +267,10 @@ mips3d
Target Report RejectNegative Var(TARGET_MIPS3D)
Use MIPS-3D instructions
+mldc1-sdc1
+Target Report Var(TARGET_LDC1_SDC1) Init(1)
+Use ldc1/ldxc1 and sdc1/sdxc1 instruction
+
mllsc
Target Report Mask(LLSC)
Use ll, sc and sync instructions