From b4bd32c169b461afd39a37318141f1c14af5e662 Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Wed, 5 Aug 2015 13:09:43 +0000 Subject: [PATCH] gcc * config/rl78/rl78.c (rl78_force_nonfar_3): Remove optimization to allow identical far pointers to remain. tests * gcc.target/rl78: New directory. * gcc.target/rl78/rl78.exp: New file: Test driver. * gcc.target/rl78/test_addm3.c: New file: Test adds. From-SVN: r226624 --- gcc/ChangeLog | 5 + gcc/config/rl78/rl78.c | 7 -- gcc/testsuite/ChangeLog | 6 ++ gcc/testsuite/gcc.target/rl78/rl78.exp | 43 ++++++++ gcc/testsuite/gcc.target/rl78/test_addm3.c | 99 +++++++++++++++++++ .../gcc.target/rx/rx-abi-function-tests.c | 22 +++++ 6 files changed, 175 insertions(+), 7 deletions(-) create mode 100644 gcc/testsuite/gcc.target/rl78/rl78.exp create mode 100644 gcc/testsuite/gcc.target/rl78/test_addm3.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 349bbcb8f38..77690973db3 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2015-08-05 Nick Clifton + + * config/rl78/rl78.c (rl78_force_nonfar_3): Remove optimization + to allow identical far pointers to remain. + 2015-08-05 Richard Biener PR middle-end/67120 diff --git a/gcc/config/rl78/rl78.c b/gcc/config/rl78/rl78.c index 70695302560..e74d6c38a31 100644 --- a/gcc/config/rl78/rl78.c +++ b/gcc/config/rl78/rl78.c @@ -608,13 +608,6 @@ rl78_force_nonfar_3 (rtx *operands, rtx (*gen)(rtx,rtx,rtx)) int did = 0; rtx temp_reg = NULL; - /* As an exception, we allow two far operands if they're identical - and the third operand is not a MEM. This allows global variables - to be incremented, for example. */ - if (rtx_equal_p (operands[0], operands[1]) - && ! MEM_P (operands[2])) - return 0; - /* FIXME: Likewise. */ if (rl78_far_p (operands[1])) { diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 61d98486c1e..62a4080d46b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2015-08-05 Nick Clifton + + * gcc.target/rl78: New directory. + * gcc.target/rl78/rl78.exp: New file: Test driver. + * gcc.target/rl78/test_addm3.c: New file: Test adds. + 2015-08-05 Richard Biener PR middle-end/67120 diff --git a/gcc/testsuite/gcc.target/rl78/rl78.exp b/gcc/testsuite/gcc.target/rl78/rl78.exp new file mode 100644 index 00000000000..f32740212c2 --- /dev/null +++ b/gcc/testsuite/gcc.target/rl78/rl78.exp @@ -0,0 +1,43 @@ +# Copyright (C) 2015 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +# GCC testsuite that uses the `dg.exp' driver. + +# Exit immediately if this isn't the right target. +if { ![istarget rl78-*-*] } then { + return +} + +# Load support procs. +load_lib gcc-dg.exp + +# If a testcase doesn't have special options, use these. +global DEFAULT_CFLAGS +if ![info exists DEFAULT_CFLAGS] then { + set DEFAULT_CFLAGS "" +} + +# Initialize `dg'. +dg-init + +# Find all tests +set tests [lsort [find $srcdir/$subdir *.\[cS\]]] + +# Main loop. +gcc-dg-runtest $tests "" $DEFAULT_CFLAGS + +# All done. +dg-finish diff --git a/gcc/testsuite/gcc.target/rl78/test_addm3.c b/gcc/testsuite/gcc.target/rl78/test_addm3.c new file mode 100644 index 00000000000..1beeb1b0ac8 --- /dev/null +++ b/gcc/testsuite/gcc.target/rl78/test_addm3.c @@ -0,0 +1,99 @@ +/* Remove `-ansi' from options to enable the use of __far and long long. */ +/* { dg-options "" } */ + +#define ADD(TYPE, name) \ + TYPE \ + add##name(TYPE a, TYPE b) \ + { \ + return a + b; \ + } \ + +#define ADDIMM(TYPE, name) \ + TYPE \ + addimm##name(TYPE a) \ + { \ + return a + 50; \ + } \ + +#define ADDFAR(TYPE, name) \ + TYPE __far gf##name; \ + void \ + addfar##name(TYPE __far *pa, TYPE b) \ + { \ + gf##name += b; \ + *pa += 50; \ + } \ + + +ADD (char, qi3) +ADD (int, hi3) +ADD (long, si3) +ADD (long long, di3) +ADD (float, sf3) +ADD (double, df3) + +ADDIMM (char, qi3) +ADDIMM (int, hi3) +ADDIMM (long, si3) +ADDIMM (long long, di3) +ADDIMM (float, sf3) +ADDIMM (double, df3) + +ADDFAR (char, qi3) +ADDFAR (int, hi3) +ADDFAR (long, si3) +ADDFAR (long long, di3) +ADDFAR (float, sf3) +ADDFAR (double, df3) + +char aqi1, aqi2; +int ahi1, ahi2; +long asi1, asi2; +long long adi1, adi2; +float af1, af2; +double ad1, ad2; + +void +testglobal (void) +{ + aqi1 += aqi2; + ahi1 += ahi2; + asi1 += asi2; + adi1 += adi2; + af1 += af2; + ad1 += ad2; +} + +void +testglobal2 (void) +{ + aqi1 += 10; + ahi1 += 11; + asi1 += 12; + adi1 += 13; + af1 += 2.0; + ad1 += 4.0; +} + +void +testptr (char *aqi1, int *ahi1, long *asi1, long long *adi1, float *af1, double *ad1, + char *aqi2, int *ahi2, long *asi2, long long *adi2, float *af2, double *ad2) +{ + *aqi1 += *aqi2; + *ahi1 += *ahi2; + *asi1 += *asi2; + *adi1 += *adi2; + *af1 += *af2; + *ad1 += *ad2; +} + +void +testptr2 (char *aqi1, int *ahi1, long *asi1, long long *adi1, float *af1, double *ad1) +{ + *aqi1 += 5; + *ahi1 += 10; + *asi1 += 11; + *adi1 += 12; + *af1 += 4.5; + *ad1 += 5.5; +} diff --git a/gcc/testsuite/gcc.target/rx/rx-abi-function-tests.c b/gcc/testsuite/gcc.target/rx/rx-abi-function-tests.c index e07ff71a007..81a43c8d166 100644 --- a/gcc/testsuite/gcc.target/rx/rx-abi-function-tests.c +++ b/gcc/testsuite/gcc.target/rx/rx-abi-function-tests.c @@ -15,7 +15,29 @@ extern float _COM_ADDf (float, float); extern float _COM_SUBf (float, float); extern float _COM_MULf (float, float); extern float _COM_DIVf (float, float); + +#ifdef __RX_64BIT_DOUBLES__ +extern int _COM_CMPLTf (double, double); +extern int _COM_CMPGTf (double, double); +extern int _COM_CMPLEf (double, double); +extern int _COM_CMPGEf (double, double); +extern int _COM_CMPEQf (double, double); +extern int _COM_CMPNEf (double, double); +#else extern int _COM_CMPLTf (float, float); +extern int _COM_CMPGTf (float, float); +extern int _COM_CMPLEf (float, float); +extern int _COM_CMPGEf (float, float); +extern int _COM_CMPEQf (float, float); +extern int _COM_CMPNEf (float, float); +#endif + +extern int _COM_CMPLTd (double, double); +extern int _COM_CMPGTd (double, double); +extern int _COM_CMPLEd (double, double); +extern int _COM_CMPGEd (double, double); +extern int _COM_CMPEQd (double, double); +extern int _COM_CMPNEd (double, double); extern long long _COM_MUL64 (long long, long long); extern signed long long _COM_DIV64s (long long, long long); -- 2.30.2