On Mon, Oct 27, 2014 at 3:23 PM, Steve Ellcey <sell...@imgtec.com> wrote: > > 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.
That sounds like a bug in google earth's allocator if we follow either C or C++ standards when it comes to malloc/operator new. Both have to be align enough for the type which is at least that size that is being allocated. So it needs to be 8byte aligned if allocating a 8 byte object. Thanks, Andrew > > Tested on mips-mti-linux-gnu. > > OK to checkin? > > Steve Ellcey > sell...@imgtec.com > > > > 2014-10-27 Steve Ellcey <sell...@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