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
This commit is contained in:
Nick Clifton 2015-08-05 13:09:43 +00:00 committed by Nick Clifton
parent aad88aede9
commit b4bd32c169
6 changed files with 175 additions and 7 deletions

View File

@ -1,3 +1,8 @@
2015-08-05 Nick Clifton <nickc@redhat.com>
* config/rl78/rl78.c (rl78_force_nonfar_3): Remove optimization
to allow identical far pointers to remain.
2015-08-05 Richard Biener <rguenther@suse.de>
PR middle-end/67120

View File

@ -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]))
{

View File

@ -1,3 +1,9 @@
2015-08-05 Nick Clifton <nickc@redhat.com>
* 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 <rguenther@suse.de>
PR middle-end/67120

View File

@ -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

View File

@ -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;
}

View File

@ -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);