Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
R
riscv-gcc-1
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
lvzhengyang
riscv-gcc-1
Commits
3a94c984
Commit
3a94c984
authored
Aug 06, 2000
by
Kazu Hirata
Committed by
Jeff Law
Aug 06, 2000
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
* expr.c: Fix formatting.
From-SVN: r35523
parent
e50f5f3d
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
173 additions
and
174 deletions
+173
-174
gcc/ChangeLog
+4
-0
gcc/expr.c
+169
-174
No files found.
gcc/ChangeLog
View file @
3a94c984
2000-08-06 Kazu Hirata <kazu@hxi.com>
* expr.c: Fix formatting.
2000-08-06 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
2000-08-06 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
* rs6000.c (rs6000_maybe_dead): Prototype.
* rs6000.c (rs6000_maybe_dead): Prototype.
...
...
gcc/expr.c
View file @
3a94c984
...
@@ -19,7 +19,6 @@ along with GNU CC; see the file COPYING. If not, write to
...
@@ -19,7 +19,6 @@ along with GNU CC; see the file COPYING. If not, write to
the Free Software Foundation, 59 Temple Place - Suite 330,
the Free Software Foundation, 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
Boston, MA 02111-1307, USA. */
#include "config.h"
#include "config.h"
#include "system.h"
#include "system.h"
#include "machmode.h"
#include "machmode.h"
...
@@ -34,7 +33,7 @@ Boston, MA 02111-1307, USA. */
...
@@ -34,7 +33,7 @@ Boston, MA 02111-1307, USA. */
#include "insn-flags.h"
#include "insn-flags.h"
#include "insn-codes.h"
#include "insn-codes.h"
#include "insn-config.h"
#include "insn-config.h"
/* Include expr.h after insn-config.h so we get HAVE_conditional_move. */
/* Include expr.h after insn-config.h so we get HAVE_conditional_move.
*/
#include "expr.h"
#include "expr.h"
#include "recog.h"
#include "recog.h"
#include "reload.h"
#include "reload.h"
...
@@ -68,7 +67,7 @@ Boston, MA 02111-1307, USA. */
...
@@ -68,7 +67,7 @@ Boston, MA 02111-1307, USA. */
#ifdef PUSH_ROUNDING
#ifdef PUSH_ROUNDING
#if defined (STACK_GROWS_DOWNWARD) != defined (ARGS_GROW_DOWNWARD)
#if defined (STACK_GROWS_DOWNWARD) != defined (ARGS_GROW_DOWNWARD)
#define PUSH_ARGS_REVERSED
/* If it's last to first */
#define PUSH_ARGS_REVERSED
/* If it's last to first
.
*/
#endif
#endif
#endif
#endif
...
@@ -196,13 +195,13 @@ static char direct_store[NUM_MACHINE_MODES];
...
@@ -196,13 +195,13 @@ static char direct_store[NUM_MACHINE_MODES];
#if defined (HAVE_movstrqi) || defined (HAVE_movstrhi) || defined (HAVE_movstrsi) || defined (HAVE_movstrdi) || defined (HAVE_movstrti)
#if defined (HAVE_movstrqi) || defined (HAVE_movstrhi) || defined (HAVE_movstrsi) || defined (HAVE_movstrdi) || defined (HAVE_movstrti)
#define MOVE_RATIO 2
#define MOVE_RATIO 2
#else
#else
/* If we are optimizing for space (-Os), cut down the default move ratio */
/* If we are optimizing for space (-Os), cut down the default move ratio
.
*/
#define MOVE_RATIO (optimize_size ? 3 : 15)
#define MOVE_RATIO (optimize_size ? 3 : 15)
#endif
#endif
#endif
#endif
/* This macro is used to determine whether move_by_pieces should be called
/* This macro is used to determine whether move_by_pieces should be called
to perform a structure copy. */
to perform a structure copy.
*/
#ifndef MOVE_BY_PIECES_P
#ifndef MOVE_BY_PIECES_P
#define MOVE_BY_PIECES_P(SIZE, ALIGN) \
#define MOVE_BY_PIECES_P(SIZE, ALIGN) \
(move_by_pieces_ninsns (SIZE, ALIGN) < MOVE_RATIO)
(move_by_pieces_ninsns (SIZE, ALIGN) < MOVE_RATIO)
...
@@ -549,7 +548,7 @@ convert_move (to, from, unsignedp)
...
@@ -549,7 +548,7 @@ convert_move (to, from, unsignedp)
{
{
if
(
GET_MODE_BITSIZE
(
from_mode
)
!=
GET_MODE_BITSIZE
(
to_mode
))
if
(
GET_MODE_BITSIZE
(
from_mode
)
!=
GET_MODE_BITSIZE
(
to_mode
))
abort
();
abort
();
if
(
VECTOR_MODE_P
(
to_mode
))
if
(
VECTOR_MODE_P
(
to_mode
))
from
=
gen_rtx_SUBREG
(
to_mode
,
from
,
0
);
from
=
gen_rtx_SUBREG
(
to_mode
,
from
,
0
);
else
else
...
@@ -576,7 +575,7 @@ convert_move (to, from, unsignedp)
...
@@ -576,7 +575,7 @@ convert_move (to, from, unsignedp)
return
;
return
;
}
}
}
}
#ifdef HAVE_trunchfqf2
#ifdef HAVE_trunchfqf2
if
(
HAVE_trunchfqf2
&&
from_mode
==
HFmode
&&
to_mode
==
QFmode
)
if
(
HAVE_trunchfqf2
&&
from_mode
==
HFmode
&&
to_mode
==
QFmode
)
{
{
...
@@ -738,7 +737,7 @@ convert_move (to, from, unsignedp)
...
@@ -738,7 +737,7 @@ convert_move (to, from, unsignedp)
case
TFmode
:
case
TFmode
:
libcall
=
extendsftf2_libfunc
;
libcall
=
extendsftf2_libfunc
;
break
;
break
;
default
:
default
:
break
;
break
;
}
}
...
@@ -758,7 +757,7 @@ convert_move (to, from, unsignedp)
...
@@ -758,7 +757,7 @@ convert_move (to, from, unsignedp)
case
TFmode
:
case
TFmode
:
libcall
=
extenddftf2_libfunc
;
libcall
=
extenddftf2_libfunc
;
break
;
break
;
default
:
default
:
break
;
break
;
}
}
...
@@ -774,7 +773,7 @@ convert_move (to, from, unsignedp)
...
@@ -774,7 +773,7 @@ convert_move (to, from, unsignedp)
case
DFmode
:
case
DFmode
:
libcall
=
truncxfdf2_libfunc
;
libcall
=
truncxfdf2_libfunc
;
break
;
break
;
default
:
default
:
break
;
break
;
}
}
...
@@ -790,12 +789,12 @@ convert_move (to, from, unsignedp)
...
@@ -790,12 +789,12 @@ convert_move (to, from, unsignedp)
case
DFmode
:
case
DFmode
:
libcall
=
trunctfdf2_libfunc
;
libcall
=
trunctfdf2_libfunc
;
break
;
break
;
default
:
default
:
break
;
break
;
}
}
break
;
break
;
default
:
default
:
break
;
break
;
}
}
...
@@ -932,7 +931,7 @@ convert_move (to, from, unsignedp)
...
@@ -932,7 +931,7 @@ convert_move (to, from, unsignedp)
return
;
return
;
}
}
/* Handle pointer conversion
*/
/* SPEE 900220
*/
/* Handle pointer conversion
. */
/* SPEE 900220.
*/
if
(
to_mode
==
PQImode
)
if
(
to_mode
==
PQImode
)
{
{
if
(
from_mode
!=
QImode
)
if
(
from_mode
!=
QImode
)
...
@@ -1093,13 +1092,13 @@ convert_move (to, from, unsignedp)
...
@@ -1093,13 +1092,13 @@ convert_move (to, from, unsignedp)
}
}
/* No suitable intermediate mode.
/* No suitable intermediate mode.
Generate what we need with shifts. */
Generate what we need with shifts.
*/
shift_amount
=
build_int_2
(
GET_MODE_BITSIZE
(
to_mode
)
shift_amount
=
build_int_2
(
GET_MODE_BITSIZE
(
to_mode
)
-
GET_MODE_BITSIZE
(
from_mode
),
0
);
-
GET_MODE_BITSIZE
(
from_mode
),
0
);
from
=
gen_lowpart
(
to_mode
,
force_reg
(
from_mode
,
from
));
from
=
gen_lowpart
(
to_mode
,
force_reg
(
from_mode
,
from
));
tmp
=
expand_shift
(
LSHIFT_EXPR
,
to_mode
,
from
,
shift_amount
,
tmp
=
expand_shift
(
LSHIFT_EXPR
,
to_mode
,
from
,
shift_amount
,
to
,
unsignedp
);
to
,
unsignedp
);
tmp
=
expand_shift
(
RSHIFT_EXPR
,
to_mode
,
tmp
,
shift_amount
,
tmp
=
expand_shift
(
RSHIFT_EXPR
,
to_mode
,
tmp
,
shift_amount
,
to
,
unsignedp
);
to
,
unsignedp
);
if
(
tmp
!=
to
)
if
(
tmp
!=
to
)
emit_move_insn
(
to
,
tmp
);
emit_move_insn
(
to
,
tmp
);
...
@@ -1107,7 +1106,7 @@ convert_move (to, from, unsignedp)
...
@@ -1107,7 +1106,7 @@ convert_move (to, from, unsignedp)
}
}
}
}
/* Support special truncate insns for certain modes. */
/* Support special truncate insns for certain modes. */
if
(
from_mode
==
DImode
&&
to_mode
==
SImode
)
if
(
from_mode
==
DImode
&&
to_mode
==
SImode
)
{
{
...
@@ -1303,7 +1302,7 @@ convert_modes (mode, oldmode, x, unsignedp)
...
@@ -1303,7 +1302,7 @@ convert_modes (mode, oldmode, x, unsignedp)
if
(
GET_MODE
(
x
)
!=
VOIDmode
)
if
(
GET_MODE
(
x
)
!=
VOIDmode
)
oldmode
=
GET_MODE
(
x
);
oldmode
=
GET_MODE
(
x
);
if
(
mode
==
oldmode
)
if
(
mode
==
oldmode
)
return
x
;
return
x
;
...
@@ -1375,13 +1374,12 @@ convert_modes (mode, oldmode, x, unsignedp)
...
@@ -1375,13 +1374,12 @@ convert_modes (mode, oldmode, x, unsignedp)
return
temp
;
return
temp
;
}
}
/* This macro is used to determine what the largest unit size that
/* This macro is used to determine what the largest unit size that
move_by_pieces can use is. */
move_by_pieces can use is.
*/
/* MOVE_MAX_PIECES is the number of bytes at a time which we can
/* MOVE_MAX_PIECES is the number of bytes at a time which we can
move efficiently, as opposed to MOVE_MAX which is the maximum
move efficiently, as opposed to MOVE_MAX which is the maximum
number of bytes we can move with a single instruction. */
number of bytes we can move with a single instruction.
*/
#ifndef MOVE_MAX_PIECES
#ifndef MOVE_MAX_PIECES
#define MOVE_MAX_PIECES MOVE_MAX
#define MOVE_MAX_PIECES MOVE_MAX
...
@@ -1431,7 +1429,7 @@ move_by_pieces (to, from, len, align)
...
@@ -1431,7 +1429,7 @@ move_by_pieces (to, from, len, align)
if
(
!
(
data
.
autinc_from
&&
data
.
autinc_to
)
if
(
!
(
data
.
autinc_from
&&
data
.
autinc_to
)
&&
move_by_pieces_ninsns
(
len
,
align
)
>
2
)
&&
move_by_pieces_ninsns
(
len
,
align
)
>
2
)
{
{
/* Find the mode of the largest move... */
/* Find the mode of the largest move...
*/
for
(
tmode
=
GET_CLASS_NARROWEST_MODE
(
MODE_INT
);
for
(
tmode
=
GET_CLASS_NARROWEST_MODE
(
MODE_INT
);
tmode
!=
VOIDmode
;
tmode
=
GET_MODE_WIDER_MODE
(
tmode
))
tmode
!=
VOIDmode
;
tmode
=
GET_MODE_WIDER_MODE
(
tmode
))
if
(
GET_MODE_SIZE
(
tmode
)
<
max_size
)
if
(
GET_MODE_SIZE
(
tmode
)
<
max_size
)
...
@@ -1702,7 +1700,7 @@ emit_block_move (x, y, size, align)
...
@@ -1702,7 +1700,7 @@ emit_block_move (x, y, size, align)
To avoid this problem we go ahead and emit code to copy X, Y &
To avoid this problem we go ahead and emit code to copy X, Y &
SIZE into new pseudos. We can then place those new pseudos
SIZE into new pseudos. We can then place those new pseudos
into an RTL_EXPR and use them later, even after a call to
into an RTL_EXPR and use them later, even after a call to
emit_queue.
emit_queue.
Note this is not strictly needed for library calls since they
Note this is not strictly needed for library calls since they
do not call emit_queue before loading their arguments. However,
do not call emit_queue before loading their arguments. However,
...
@@ -1728,7 +1726,7 @@ emit_block_move (x, y, size, align)
...
@@ -1728,7 +1726,7 @@ emit_block_move (x, y, size, align)
examine the return value from memcpy.
examine the return value from memcpy.
For targets where libcalls and normal calls have different conventions
For targets where libcalls and normal calls have different conventions
for returning pointers, we could end up generating incorrect code.
for returning pointers, we could end up generating incorrect code.
So instead of using a libcall sequence we build up a suitable
So instead of using a libcall sequence we build up a suitable
CALL_EXPR and expand the call in the normal fashion. */
CALL_EXPR and expand the call in the normal fashion. */
...
@@ -1744,7 +1742,7 @@ emit_block_move (x, y, size, align)
...
@@ -1744,7 +1742,7 @@ emit_block_move (x, y, size, align)
fntype
=
build_pointer_type
(
void_type_node
);
fntype
=
build_pointer_type
(
void_type_node
);
fntype
=
build_function_type
(
fntype
,
NULL_TREE
);
fntype
=
build_function_type
(
fntype
,
NULL_TREE
);
fn
=
build_decl
(
FUNCTION_DECL
,
fn
,
fntype
);
fn
=
build_decl
(
FUNCTION_DECL
,
fn
,
fntype
);
ggc_add_tree_root
(
&
fn
,
1
);
ggc_add_tree_root
(
&
fn
,
1
);
DECL_EXTERNAL
(
fn
)
=
1
;
DECL_EXTERNAL
(
fn
)
=
1
;
TREE_PUBLIC
(
fn
)
=
1
;
TREE_PUBLIC
(
fn
)
=
1
;
DECL_ARTIFICIAL
(
fn
)
=
1
;
DECL_ARTIFICIAL
(
fn
)
=
1
;
...
@@ -1753,7 +1751,7 @@ emit_block_move (x, y, size, align)
...
@@ -1753,7 +1751,7 @@ emit_block_move (x, y, size, align)
pop_obstacks
();
pop_obstacks
();
}
}
/* We need to make an argument list for the function call.
/* We need to make an argument list for the function call.
memcpy has three arguments, the first two are void * addresses and
memcpy has three arguments, the first two are void * addresses and
the last is a size_t byte count for the copy. */
the last is a size_t byte count for the copy. */
...
@@ -1798,7 +1796,7 @@ move_block_to_reg (regno, x, nregs, mode)
...
@@ -1798,7 +1796,7 @@ move_block_to_reg (regno, x, nregs, mode)
{
{
int
i
;
int
i
;
#ifdef HAVE_load_multiple
#ifdef HAVE_load_multiple
rtx
pat
;
rtx
pat
;
rtx
last
;
rtx
last
;
#endif
#endif
...
@@ -1834,7 +1832,6 @@ move_block_to_reg (regno, x, nregs, mode)
...
@@ -1834,7 +1832,6 @@ move_block_to_reg (regno, x, nregs, mode)
The number of registers to be filled is NREGS. SIZE indicates the number
The number of registers to be filled is NREGS. SIZE indicates the number
of bytes in the object X. */
of bytes in the object X. */
void
void
move_block_from_reg
(
regno
,
x
,
nregs
,
size
)
move_block_from_reg
(
regno
,
x
,
nregs
,
size
)
int
regno
;
int
regno
;
...
@@ -1844,7 +1841,7 @@ move_block_from_reg (regno, x, nregs, size)
...
@@ -1844,7 +1841,7 @@ move_block_from_reg (regno, x, nregs, size)
{
{
int
i
;
int
i
;
#ifdef HAVE_store_multiple
#ifdef HAVE_store_multiple
rtx
pat
;
rtx
pat
;
rtx
last
;
rtx
last
;
#endif
#endif
enum
machine_mode
mode
;
enum
machine_mode
mode
;
...
@@ -1858,7 +1855,7 @@ move_block_from_reg (regno, x, nregs, size)
...
@@ -1858,7 +1855,7 @@ move_block_from_reg (regno, x, nregs, size)
gen_rtx_REG
(
mode
,
regno
));
gen_rtx_REG
(
mode
,
regno
));
return
;
return
;
}
}
/* Blocks smaller than a word on a BYTES_BIG_ENDIAN machine must be aligned
/* Blocks smaller than a word on a BYTES_BIG_ENDIAN machine must be aligned
to the left before storing to memory. Note that the previous test
to the left before storing to memory. Note that the previous test
doesn't handle all cases (e.g. SIZE == 3). */
doesn't handle all cases (e.g. SIZE == 3). */
...
@@ -1936,7 +1933,7 @@ emit_group_load (dst, orig_src, ssize, align)
...
@@ -1936,7 +1933,7 @@ emit_group_load (dst, orig_src, ssize, align)
else
else
start
=
1
;
start
=
1
;
tmps
=
(
rtx
*
)
alloca
(
sizeof
(
rtx
)
*
XVECLEN
(
dst
,
0
));
tmps
=
(
rtx
*
)
alloca
(
sizeof
(
rtx
)
*
XVECLEN
(
dst
,
0
));
/* If we won't be loading directly from memory, protect the real source
/* If we won't be loading directly from memory, protect the real source
from strange tricks we might play. */
from strange tricks we might play. */
...
@@ -2000,7 +1997,7 @@ emit_group_load (dst, orig_src, ssize, align)
...
@@ -2000,7 +1997,7 @@ emit_group_load (dst, orig_src, ssize, align)
tmps
[
i
],
0
,
OPTAB_WIDEN
);
tmps
[
i
],
0
,
OPTAB_WIDEN
);
}
}
emit_queue
();
emit_queue
();
/* Copy the extracted pieces into the proper (probable) hard regs. */
/* Copy the extracted pieces into the proper (probable) hard regs. */
for
(
i
=
start
;
i
<
XVECLEN
(
dst
,
0
);
i
++
)
for
(
i
=
start
;
i
<
XVECLEN
(
dst
,
0
);
i
++
)
...
@@ -2030,7 +2027,7 @@ emit_group_store (orig_dst, src, ssize, align)
...
@@ -2030,7 +2027,7 @@ emit_group_store (orig_dst, src, ssize, align)
else
else
start
=
1
;
start
=
1
;
tmps
=
(
rtx
*
)
alloca
(
sizeof
(
rtx
)
*
XVECLEN
(
src
,
0
));
tmps
=
(
rtx
*
)
alloca
(
sizeof
(
rtx
)
*
XVECLEN
(
src
,
0
));
/* Copy the (probable) hard regs into pseudos. */
/* Copy the (probable) hard regs into pseudos. */
for
(
i
=
start
;
i
<
XVECLEN
(
src
,
0
);
i
++
)
for
(
i
=
start
;
i
<
XVECLEN
(
src
,
0
);
i
++
)
...
@@ -2039,7 +2036,7 @@ emit_group_store (orig_dst, src, ssize, align)
...
@@ -2039,7 +2036,7 @@ emit_group_store (orig_dst, src, ssize, align)
tmps
[
i
]
=
gen_reg_rtx
(
GET_MODE
(
reg
));
tmps
[
i
]
=
gen_reg_rtx
(
GET_MODE
(
reg
));
emit_move_insn
(
tmps
[
i
],
reg
);
emit_move_insn
(
tmps
[
i
],
reg
);
}
}
emit_queue
();
emit_queue
();
/* If we won't be storing directly into memory, protect the real destination
/* If we won't be storing directly into memory, protect the real destination
from strange tricks we might play. */
from strange tricks we might play. */
...
@@ -2111,7 +2108,7 @@ emit_group_store (orig_dst, src, ssize, align)
...
@@ -2111,7 +2108,7 @@ emit_group_store (orig_dst, src, ssize, align)
mode
,
tmps
[
i
],
align
,
ssize
);
mode
,
tmps
[
i
],
align
,
ssize
);
}
}
emit_queue
();
emit_queue
();
/* Copy from the pseudo into the (probable) hard reg. */
/* Copy from the pseudo into the (probable) hard reg. */
if
(
GET_CODE
(
dst
)
==
REG
)
if
(
GET_CODE
(
dst
)
==
REG
)
...
@@ -2125,7 +2122,7 @@ emit_group_store (orig_dst, src, ssize, align)
...
@@ -2125,7 +2122,7 @@ emit_group_store (orig_dst, src, ssize, align)
The primary purpose of this routine is to handle functions
The primary purpose of this routine is to handle functions
that return BLKmode structures in registers. Some machines
that return BLKmode structures in registers. Some machines
(the PA for example) want to return all small structures
(the PA for example) want to return all small structures
in registers regardless of the structure's alignment. */
in registers regardless of the structure's alignment.
*/
rtx
rtx
copy_blkmode_from_reg
(
tgtblk
,
srcreg
,
type
)
copy_blkmode_from_reg
(
tgtblk
,
srcreg
,
type
)
...
@@ -2144,7 +2141,7 @@ copy_blkmode_from_reg (tgtblk, srcreg, type)
...
@@ -2144,7 +2141,7 @@ copy_blkmode_from_reg (tgtblk, srcreg, type)
MEM_SET_IN_STRUCT_P
(
tgtblk
,
AGGREGATE_TYPE_P
(
type
));
MEM_SET_IN_STRUCT_P
(
tgtblk
,
AGGREGATE_TYPE_P
(
type
));
preserve_temp_slots
(
tgtblk
);
preserve_temp_slots
(
tgtblk
);
}
}
/* This code assumes srcreg is at least a full word. If it isn't,
/* This code assumes srcreg is at least a full word. If it isn't,
copy it into a new pseudo which is a full word. */
copy it into a new pseudo which is a full word. */
if
(
GET_MODE
(
srcreg
)
!=
BLKmode
if
(
GET_MODE
(
srcreg
)
!=
BLKmode
...
@@ -2160,7 +2157,7 @@ copy_blkmode_from_reg (tgtblk, srcreg, type)
...
@@ -2160,7 +2157,7 @@ copy_blkmode_from_reg (tgtblk, srcreg, type)
=
(
BITS_PER_WORD
-
((
bytes
%
UNITS_PER_WORD
)
*
BITS_PER_UNIT
));
=
(
BITS_PER_WORD
-
((
bytes
%
UNITS_PER_WORD
)
*
BITS_PER_UNIT
));
/* Copy the structure BITSIZE bites at a time.
/* Copy the structure BITSIZE bites at a time.
We could probably emit more efficient code for machines which do not use
We could probably emit more efficient code for machines which do not use
strict alignment, but it doesn't seem worth the effort at the current
strict alignment, but it doesn't seem worth the effort at the current
time. */
time. */
...
@@ -2168,7 +2165,7 @@ copy_blkmode_from_reg (tgtblk, srcreg, type)
...
@@ -2168,7 +2165,7 @@ copy_blkmode_from_reg (tgtblk, srcreg, type)
bitpos
<
bytes
*
BITS_PER_UNIT
;
bitpos
<
bytes
*
BITS_PER_UNIT
;
bitpos
+=
bitsize
,
xbitpos
+=
bitsize
)
bitpos
+=
bitsize
,
xbitpos
+=
bitsize
)
{
{
/* We need a new source operand each time xbitpos is on a
/* We need a new source operand each time xbitpos is on a
word boundary and when xbitpos == big_endian_correction
word boundary and when xbitpos == big_endian_correction
(the first time through). */
(the first time through). */
if
(
xbitpos
%
BITS_PER_WORD
==
0
if
(
xbitpos
%
BITS_PER_WORD
==
0
...
@@ -2179,7 +2176,7 @@ copy_blkmode_from_reg (tgtblk, srcreg, type)
...
@@ -2179,7 +2176,7 @@ copy_blkmode_from_reg (tgtblk, srcreg, type)
a word boundary. */
a word boundary. */
if
(
bitpos
%
BITS_PER_WORD
==
0
)
if
(
bitpos
%
BITS_PER_WORD
==
0
)
dst
=
operand_subword
(
tgtblk
,
bitpos
/
BITS_PER_WORD
,
1
,
BLKmode
);
dst
=
operand_subword
(
tgtblk
,
bitpos
/
BITS_PER_WORD
,
1
,
BLKmode
);
/* Use xbitpos for the source extraction (right justified) and
/* Use xbitpos for the source extraction (right justified) and
xbitpos for the destination store (left justified). */
xbitpos for the destination store (left justified). */
store_bit_field
(
dst
,
bitsize
,
bitpos
%
BITS_PER_WORD
,
word_mode
,
store_bit_field
(
dst
,
bitsize
,
bitpos
%
BITS_PER_WORD
,
word_mode
,
...
@@ -2202,7 +2199,7 @@ use_reg (call_fusage, reg)
...
@@ -2202,7 +2199,7 @@ use_reg (call_fusage, reg)
{
{
if
(
GET_CODE
(
reg
)
!=
REG
if
(
GET_CODE
(
reg
)
!=
REG
||
REGNO
(
reg
)
>=
FIRST_PSEUDO_REGISTER
)
||
REGNO
(
reg
)
>=
FIRST_PSEUDO_REGISTER
)
abort
();
abort
();
*
call_fusage
*
call_fusage
=
gen_rtx_EXPR_LIST
(
VOIDmode
,
=
gen_rtx_EXPR_LIST
(
VOIDmode
,
...
@@ -2276,7 +2273,8 @@ clear_by_pieces (to, len, align)
...
@@ -2276,7 +2273,8 @@ clear_by_pieces (to, len, align)
data
.
explicit_inc_to
=
0
;
data
.
explicit_inc_to
=
0
;
data
.
reverse
data
.
reverse
=
(
GET_CODE
(
to_addr
)
==
PRE_DEC
||
GET_CODE
(
to_addr
)
==
POST_DEC
);
=
(
GET_CODE
(
to_addr
)
==
PRE_DEC
||
GET_CODE
(
to_addr
)
==
POST_DEC
);
if
(
data
.
reverse
)
data
.
offset
=
len
;
if
(
data
.
reverse
)
data
.
offset
=
len
;
data
.
len
=
len
;
data
.
len
=
len
;
/* If copying requires more than two move insns,
/* If copying requires more than two move insns,
...
@@ -2285,7 +2283,7 @@ clear_by_pieces (to, len, align)
...
@@ -2285,7 +2283,7 @@ clear_by_pieces (to, len, align)
if
(
!
data
.
autinc_to
if
(
!
data
.
autinc_to
&&
move_by_pieces_ninsns
(
len
,
align
)
>
2
)
&&
move_by_pieces_ninsns
(
len
,
align
)
>
2
)
{
{
/* Determine the main mode we'll be using */
/* Determine the main mode we'll be using
.
*/
for
(
tmode
=
GET_CLASS_NARROWEST_MODE
(
MODE_INT
);
for
(
tmode
=
GET_CLASS_NARROWEST_MODE
(
MODE_INT
);
tmode
!=
VOIDmode
;
tmode
=
GET_MODE_WIDER_MODE
(
tmode
))
tmode
!=
VOIDmode
;
tmode
=
GET_MODE_WIDER_MODE
(
tmode
))
if
(
GET_MODE_SIZE
(
tmode
)
<
max_size
)
if
(
GET_MODE_SIZE
(
tmode
)
<
max_size
)
...
@@ -2362,7 +2360,7 @@ clear_by_pieces_1 (genfun, mode, data)
...
@@ -2362,7 +2360,7 @@ clear_by_pieces_1 (genfun, mode, data)
to1
=
gen_rtx_MEM
(
mode
,
data
->
to_addr
);
to1
=
gen_rtx_MEM
(
mode
,
data
->
to_addr
);
MEM_COPY_ATTRIBUTES
(
to1
,
data
->
to
);
MEM_COPY_ATTRIBUTES
(
to1
,
data
->
to
);
}
}
else
else
to1
=
change_address
(
data
->
to
,
mode
,
to1
=
change_address
(
data
->
to
,
mode
,
plus_constant
(
data
->
to_addr
,
data
->
offset
));
plus_constant
(
data
->
to_addr
,
data
->
offset
));
...
@@ -2485,7 +2483,6 @@ clear_storage (object, size, align)
...
@@ -2485,7 +2483,6 @@ clear_storage (object, size, align)
size
=
copy_to_mode_reg
(
TYPE_MODE
(
integer_type_node
),
size
);
size
=
copy_to_mode_reg
(
TYPE_MODE
(
integer_type_node
),
size
);
#endif
#endif
#ifdef TARGET_MEM_FUNCTIONS
#ifdef TARGET_MEM_FUNCTIONS
/* It is incorrect to use the libcall calling conventions to call
/* It is incorrect to use the libcall calling conventions to call
memset in this context.
memset in this context.
...
@@ -2495,7 +2492,7 @@ clear_storage (object, size, align)
...
@@ -2495,7 +2492,7 @@ clear_storage (object, size, align)
For targets where libcalls and normal calls have different
For targets where libcalls and normal calls have different
conventions for returning pointers, we could end up generating
conventions for returning pointers, we could end up generating
incorrect code.
incorrect code.
So instead of using a libcall sequence we build up a suitable
So instead of using a libcall sequence we build up a suitable
CALL_EXPR and expand the call in the normal fashion. */
CALL_EXPR and expand the call in the normal fashion. */
...
@@ -2520,7 +2517,7 @@ clear_storage (object, size, align)
...
@@ -2520,7 +2517,7 @@ clear_storage (object, size, align)
pop_obstacks
();
pop_obstacks
();
}
}
/* We need to make an argument list for the function call.
/* We need to make an argument list for the function call.
memset has three arguments, the first is a void * addresses, the
memset has three arguments, the first is a void * addresses, the
second a integer with the initialization value, the last is a
second a integer with the initialization value, the last is a
...
@@ -2531,7 +2528,7 @@ clear_storage (object, size, align)
...
@@ -2531,7 +2528,7 @@ clear_storage (object, size, align)
object
));
object
));
TREE_CHAIN
(
arg_list
)
TREE_CHAIN
(
arg_list
)
=
build_tree_list
(
NULL_TREE
,
=
build_tree_list
(
NULL_TREE
,
make_tree
(
integer_type_node
,
const0_rtx
));
make_tree
(
integer_type_node
,
const0_rtx
));
TREE_CHAIN
(
TREE_CHAIN
(
arg_list
))
TREE_CHAIN
(
TREE_CHAIN
(
arg_list
))
=
build_tree_list
(
NULL_TREE
,
make_tree
(
sizetype
,
size
));
=
build_tree_list
(
NULL_TREE
,
make_tree
(
sizetype
,
size
));
TREE_CHAIN
(
TREE_CHAIN
(
TREE_CHAIN
(
arg_list
)))
=
NULL_TREE
;
TREE_CHAIN
(
TREE_CHAIN
(
TREE_CHAIN
(
arg_list
)))
=
NULL_TREE
;
...
@@ -2617,7 +2614,7 @@ emit_move_insn_1 (x, y)
...
@@ -2617,7 +2614,7 @@ emit_move_insn_1 (x, y)
unsigned
int
i
;
unsigned
int
i
;
if
(
mode
>=
MAX_MACHINE_MODE
)
if
(
mode
>=
MAX_MACHINE_MODE
)
abort
();
abort
();
if
(
mov_optab
->
handlers
[(
int
)
mode
].
insn_code
!=
CODE_FOR_nothing
)
if
(
mov_optab
->
handlers
[(
int
)
mode
].
insn_code
!=
CODE_FOR_nothing
)
return
return
...
@@ -2675,7 +2672,7 @@ emit_move_insn_1 (x, y)
...
@@ -2675,7 +2672,7 @@ emit_move_insn_1 (x, y)
memory and reload. FIXME, we should see about using extract and
memory and reload. FIXME, we should see about using extract and
insert on integer registers, but complex short and complex char
insert on integer registers, but complex short and complex char
variables should be rarely used. */
variables should be rarely used. */
if
(
GET_MODE_BITSIZE
(
mode
)
<
2
*
BITS_PER_WORD
if
(
GET_MODE_BITSIZE
(
mode
)
<
2
*
BITS_PER_WORD
&&
(
reload_in_progress
|
reload_completed
)
==
0
)
&&
(
reload_in_progress
|
reload_completed
)
==
0
)
{
{
int
packed_dest_p
=
(
REG_P
(
x
)
&&
REGNO
(
x
)
<
FIRST_PSEUDO_REGISTER
);
int
packed_dest_p
=
(
REG_P
(
x
)
&&
REGNO
(
x
)
<
FIRST_PSEUDO_REGISTER
);
...
@@ -2686,7 +2683,7 @@ emit_move_insn_1 (x, y)
...
@@ -2686,7 +2683,7 @@ emit_move_insn_1 (x, y)
enum
mode_class
reg_class
=
((
class
==
MODE_COMPLEX_FLOAT
)
enum
mode_class
reg_class
=
((
class
==
MODE_COMPLEX_FLOAT
)
?
MODE_FLOAT
:
MODE_INT
);
?
MODE_FLOAT
:
MODE_INT
);
enum
machine_mode
reg_mode
=
enum
machine_mode
reg_mode
=
mode_for_size
(
GET_MODE_BITSIZE
(
mode
),
reg_class
,
1
);
mode_for_size
(
GET_MODE_BITSIZE
(
mode
),
reg_class
,
1
);
if
(
reg_mode
!=
BLKmode
)
if
(
reg_mode
!=
BLKmode
)
...
@@ -2748,7 +2745,7 @@ emit_move_insn_1 (x, y)
...
@@ -2748,7 +2745,7 @@ emit_move_insn_1 (x, y)
rtx
last_insn
=
0
;
rtx
last_insn
=
0
;
rtx
seq
,
inner
;
rtx
seq
,
inner
;
int
need_clobber
;
int
need_clobber
;
#ifdef PUSH_ROUNDING
#ifdef PUSH_ROUNDING
/* If X is a push on the stack, do the push now and replace
/* If X is a push on the stack, do the push now and replace
...
@@ -2759,7 +2756,7 @@ emit_move_insn_1 (x, y)
...
@@ -2759,7 +2756,7 @@ emit_move_insn_1 (x, y)
x
=
change_address
(
x
,
VOIDmode
,
stack_pointer_rtx
);
x
=
change_address
(
x
,
VOIDmode
,
stack_pointer_rtx
);
}
}
#endif
#endif
/* If we are in reload, see if either operand is a MEM whose address
/* If we are in reload, see if either operand is a MEM whose address
is scheduled for replacement. */
is scheduled for replacement. */
if
(
reload_in_progress
&&
GET_CODE
(
x
)
==
MEM
if
(
reload_in_progress
&&
GET_CODE
(
x
)
==
MEM
...
@@ -2783,7 +2780,7 @@ emit_move_insn_1 (x, y)
...
@@ -2783,7 +2780,7 @@ emit_move_insn_1 (x, y)
need_clobber
=
0
;
need_clobber
=
0
;
for
(
i
=
0
;
for
(
i
=
0
;
i
<
(
GET_MODE_SIZE
(
mode
)
+
(
UNITS_PER_WORD
-
1
))
/
UNITS_PER_WORD
;
i
<
(
GET_MODE_SIZE
(
mode
)
+
(
UNITS_PER_WORD
-
1
))
/
UNITS_PER_WORD
;
i
++
)
i
++
)
{
{
rtx
xpart
=
operand_subword
(
x
,
i
,
1
,
mode
);
rtx
xpart
=
operand_subword
(
x
,
i
,
1
,
mode
);
...
@@ -2883,7 +2880,7 @@ push_block (size, extra, below)
...
@@ -2883,7 +2880,7 @@ push_block (size, extra, below)
{
{
if
(
GET_CODE
(
size
)
==
CONST_INT
)
if
(
GET_CODE
(
size
)
==
CONST_INT
)
temp
=
plus_constant
(
virtual_outgoing_args_rtx
,
temp
=
plus_constant
(
virtual_outgoing_args_rtx
,
-
INTVAL
(
size
)
-
(
below
?
0
:
extra
));
-
INTVAL
(
size
)
-
(
below
?
0
:
extra
));
else
if
(
extra
!=
0
&&
!
below
)
else
if
(
extra
!=
0
&&
!
below
)
temp
=
gen_rtx_PLUS
(
Pmode
,
virtual_outgoing_args_rtx
,
temp
=
gen_rtx_PLUS
(
Pmode
,
virtual_outgoing_args_rtx
,
negate_rtx
(
Pmode
,
plus_constant
(
size
,
extra
)));
negate_rtx
(
Pmode
,
plus_constant
(
size
,
extra
)));
...
@@ -2906,7 +2903,7 @@ gen_push_operand ()
...
@@ -2906,7 +2903,7 @@ gen_push_operand ()
static
rtx
static
rtx
get_push_address
(
size
)
get_push_address
(
size
)
int
size
;
int
size
;
{
{
register
rtx
temp
;
register
rtx
temp
;
...
@@ -2997,7 +2994,7 @@ emit_push_insn (x, mode, type, size, align, partial, reg, extra,
...
@@ -2997,7 +2994,7 @@ emit_push_insn (x, mode, type, size, align, partial, reg, extra,
int
used
=
partial
*
UNITS_PER_WORD
;
int
used
=
partial
*
UNITS_PER_WORD
;
int
offset
=
used
%
(
PARM_BOUNDARY
/
BITS_PER_UNIT
);
int
offset
=
used
%
(
PARM_BOUNDARY
/
BITS_PER_UNIT
);
int
skip
;
int
skip
;
if
(
size
==
0
)
if
(
size
==
0
)
abort
();
abort
();
...
@@ -3047,19 +3044,19 @@ emit_push_insn (x, mode, type, size, align, partial, reg, extra,
...
@@ -3047,19 +3044,19 @@ emit_push_insn (x, mode, type, size, align, partial, reg, extra,
if
(
current_function_check_memory_usage
&&
!
in_check_memory_usage
)
if
(
current_function_check_memory_usage
&&
!
in_check_memory_usage
)
{
{
rtx
temp
;
rtx
temp
;
in_check_memory_usage
=
1
;
in_check_memory_usage
=
1
;
temp
=
get_push_address
(
INTVAL
(
size
)
-
used
);
temp
=
get_push_address
(
INTVAL
(
size
)
-
used
);
if
(
GET_CODE
(
x
)
==
MEM
&&
type
&&
AGGREGATE_TYPE_P
(
type
))
if
(
GET_CODE
(
x
)
==
MEM
&&
type
&&
AGGREGATE_TYPE_P
(
type
))
emit_library_call
(
chkr_copy_bitmap_libfunc
,
1
,
VOIDmode
,
3
,
emit_library_call
(
chkr_copy_bitmap_libfunc
,
1
,
VOIDmode
,
3
,
temp
,
Pmode
,
temp
,
Pmode
,
XEXP
(
xinner
,
0
),
Pmode
,
XEXP
(
xinner
,
0
),
Pmode
,
GEN_INT
(
INTVAL
(
size
)
-
used
),
GEN_INT
(
INTVAL
(
size
)
-
used
),
TYPE_MODE
(
sizetype
));
TYPE_MODE
(
sizetype
));
else
else
emit_library_call
(
chkr_set_right_libfunc
,
1
,
VOIDmode
,
3
,
emit_library_call
(
chkr_set_right_libfunc
,
1
,
VOIDmode
,
3
,
temp
,
Pmode
,
temp
,
Pmode
,
GEN_INT
(
INTVAL
(
size
)
-
used
),
GEN_INT
(
INTVAL
(
size
)
-
used
),
TYPE_MODE
(
sizetype
),
TYPE_MODE
(
sizetype
),
GEN_INT
(
MEMORY_USE_RW
),
GEN_INT
(
MEMORY_USE_RW
),
TYPE_MODE
(
integer_type_node
));
TYPE_MODE
(
integer_type_node
));
...
@@ -3067,7 +3064,7 @@ emit_push_insn (x, mode, type, size, align, partial, reg, extra,
...
@@ -3067,7 +3064,7 @@ emit_push_insn (x, mode, type, size, align, partial, reg, extra,
}
}
}
}
else
else
#endif
/* PUSH_ROUNDING */
#endif
/* PUSH_ROUNDING
*/
{
{
rtx
target
;
rtx
target
;
...
@@ -3121,17 +3118,17 @@ emit_push_insn (x, mode, type, size, align, partial, reg, extra,
...
@@ -3121,17 +3118,17 @@ emit_push_insn (x, mode, type, size, align, partial, reg, extra,
in_check_memory_usage
=
0
;
in_check_memory_usage
=
0
;
}
}
target
=
gen_rtx_MEM
(
BLKmode
,
temp
);
target
=
gen_rtx_MEM
(
BLKmode
,
temp
);
if
(
type
!=
0
)
if
(
type
!=
0
)
{
{
set_mem_attributes
(
target
,
type
,
1
);
set_mem_attributes
(
target
,
type
,
1
);
/* Function incoming arguments may overlap with sibling call
/* Function incoming arguments may overlap with sibling call
outgoing arguments and we cannot allow reordering of reads
outgoing arguments and we cannot allow reordering of reads
from function arguments with stores to outgoing arguments
from function arguments with stores to outgoing arguments
of sibling calls. */
of sibling calls. */
MEM_ALIAS_SET
(
target
)
=
0
;
MEM_ALIAS_SET
(
target
)
=
0
;
}
}
/* TEMP is the address of the block. Copy the data there. */
/* TEMP is the address of the block. Copy the data there. */
if
(
GET_CODE
(
size
)
==
CONST_INT
if
(
GET_CODE
(
size
)
==
CONST_INT
...
@@ -3302,9 +3299,9 @@ emit_push_insn (x, mode, type, size, align, partial, reg, extra,
...
@@ -3302,9 +3299,9 @@ emit_push_insn (x, mode, type, size, align, partial, reg, extra,
if
(
GET_CODE
(
args_so_far
)
==
CONST_INT
)
if
(
GET_CODE
(
args_so_far
)
==
CONST_INT
)
addr
addr
=
memory_address
(
mode
,
=
memory_address
(
mode
,
plus_constant
(
args_addr
,
plus_constant
(
args_addr
,
INTVAL
(
args_so_far
)));
INTVAL
(
args_so_far
)));
else
else
addr
=
memory_address
(
mode
,
gen_rtx_PLUS
(
Pmode
,
args_addr
,
addr
=
memory_address
(
mode
,
gen_rtx_PLUS
(
Pmode
,
args_addr
,
args_so_far
));
args_so_far
));
target
=
addr
;
target
=
addr
;
...
@@ -3362,7 +3359,7 @@ emit_push_insn (x, mode, type, size, align, partial, reg, extra,
...
@@ -3362,7 +3359,7 @@ emit_push_insn (x, mode, type, size, align, partial, reg, extra,
if
(
extra
&&
args_addr
==
0
&&
where_pad
==
stack_direction
)
if
(
extra
&&
args_addr
==
0
&&
where_pad
==
stack_direction
)
anti_adjust_stack
(
GEN_INT
(
extra
));
anti_adjust_stack
(
GEN_INT
(
extra
));
if
(
alignment_pad
&&
args_addr
==
0
)
if
(
alignment_pad
&&
args_addr
==
0
)
anti_adjust_stack
(
alignment_pad
);
anti_adjust_stack
(
alignment_pad
);
}
}
...
@@ -3465,7 +3462,7 @@ expand_assignment (to, from, want_value, suggest_reg)
...
@@ -3465,7 +3462,7 @@ expand_assignment (to, from, want_value, suggest_reg)
&&
GET_MODE
(
to_rtx
)
==
BLKmode
&&
GET_MODE
(
to_rtx
)
==
BLKmode
&&
GET_MODE
(
XEXP
(
to_rtx
,
0
))
!=
VOIDmode
&&
GET_MODE
(
XEXP
(
to_rtx
,
0
))
!=
VOIDmode
&&
bitsize
&&
bitsize
&&
(
bitpos
%
bitsize
)
==
0
&&
(
bitpos
%
bitsize
)
==
0
&&
(
bitsize
%
GET_MODE_ALIGNMENT
(
mode1
))
==
0
&&
(
bitsize
%
GET_MODE_ALIGNMENT
(
mode1
))
==
0
&&
alignment
==
GET_MODE_ALIGNMENT
(
mode1
))
&&
alignment
==
GET_MODE_ALIGNMENT
(
mode1
))
{
{
...
@@ -3853,7 +3850,7 @@ store_expr (exp, target, want_value)
...
@@ -3853,7 +3850,7 @@ store_expr (exp, target, want_value)
SUBREG_PROMOTED_UNSIGNED_P
(
target
)),
SUBREG_PROMOTED_UNSIGNED_P
(
target
)),
exp
);
exp
);
}
}
temp
=
expand_expr
(
exp
,
NULL_RTX
,
VOIDmode
,
0
);
temp
=
expand_expr
(
exp
,
NULL_RTX
,
VOIDmode
,
0
);
/* If TEMP is a volatile MEM and we want a result value, make
/* If TEMP is a volatile MEM and we want a result value, make
...
@@ -3923,15 +3920,15 @@ store_expr (exp, target, want_value)
...
@@ -3923,15 +3920,15 @@ store_expr (exp, target, want_value)
{
{
in_check_memory_usage
=
1
;
in_check_memory_usage
=
1
;
if
(
GET_CODE
(
temp
)
==
MEM
)
if
(
GET_CODE
(
temp
)
==
MEM
)
emit_library_call
(
chkr_copy_bitmap_libfunc
,
1
,
VOIDmode
,
3
,
emit_library_call
(
chkr_copy_bitmap_libfunc
,
1
,
VOIDmode
,
3
,
XEXP
(
target
,
0
),
Pmode
,
XEXP
(
target
,
0
),
Pmode
,
XEXP
(
temp
,
0
),
Pmode
,
XEXP
(
temp
,
0
),
Pmode
,
expr_size
(
exp
),
TYPE_MODE
(
sizetype
));
expr_size
(
exp
),
TYPE_MODE
(
sizetype
));
else
else
emit_library_call
(
chkr_check_addr_libfunc
,
1
,
VOIDmode
,
3
,
emit_library_call
(
chkr_check_addr_libfunc
,
1
,
VOIDmode
,
3
,
XEXP
(
target
,
0
),
Pmode
,
XEXP
(
target
,
0
),
Pmode
,
expr_size
(
exp
),
TYPE_MODE
(
sizetype
),
expr_size
(
exp
),
TYPE_MODE
(
sizetype
),
GEN_INT
(
MEMORY_USE_WO
),
GEN_INT
(
MEMORY_USE_WO
),
TYPE_MODE
(
integer_type_node
));
TYPE_MODE
(
integer_type_node
));
in_check_memory_usage
=
0
;
in_check_memory_usage
=
0
;
}
}
...
@@ -4011,7 +4008,7 @@ store_expr (exp, target, want_value)
...
@@ -4011,7 +4008,7 @@ store_expr (exp, target, want_value)
if
(
GET_CODE
(
copy_size_rtx
)
==
CONST_INT
)
if
(
GET_CODE
(
copy_size_rtx
)
==
CONST_INT
)
{
{
addr
=
plus_constant
(
addr
,
TREE_STRING_LENGTH
(
exp
));
addr
=
plus_constant
(
addr
,
TREE_STRING_LENGTH
(
exp
));
size
=
plus_constant
(
size
,
-
TREE_STRING_LENGTH
(
exp
));
size
=
plus_constant
(
size
,
-
TREE_STRING_LENGTH
(
exp
));
align
=
MIN
(
align
,
(
BITS_PER_UNIT
align
=
MIN
(
align
,
(
BITS_PER_UNIT
*
(
INTVAL
(
copy_size_rtx
)
*
(
INTVAL
(
copy_size_rtx
)
&
-
INTVAL
(
copy_size_rtx
))));
&
-
INTVAL
(
copy_size_rtx
))));
...
@@ -4046,7 +4043,7 @@ store_expr (exp, target, want_value)
...
@@ -4046,7 +4043,7 @@ store_expr (exp, target, want_value)
emit_library_call
(
chkr_check_addr_libfunc
,
1
,
VOIDmode
,
3
,
emit_library_call
(
chkr_check_addr_libfunc
,
1
,
VOIDmode
,
3
,
addr
,
Pmode
,
addr
,
Pmode
,
size
,
TYPE_MODE
(
sizetype
),
size
,
TYPE_MODE
(
sizetype
),
GEN_INT
(
MEMORY_USE_WO
),
GEN_INT
(
MEMORY_USE_WO
),
TYPE_MODE
(
integer_type_node
));
TYPE_MODE
(
integer_type_node
));
in_check_memory_usage
=
0
;
in_check_memory_usage
=
0
;
clear_storage
(
dest
,
size
,
align
);
clear_storage
(
dest
,
size
,
align
);
...
@@ -4082,7 +4079,7 @@ store_expr (exp, target, want_value)
...
@@ -4082,7 +4079,7 @@ store_expr (exp, target, want_value)
&&
!
(
GET_CODE
(
target
)
==
REG
&&
!
(
GET_CODE
(
target
)
==
REG
&&
REGNO
(
target
)
<
FIRST_PSEUDO_REGISTER
))
&&
REGNO
(
target
)
<
FIRST_PSEUDO_REGISTER
))
return
copy_to_reg
(
target
);
return
copy_to_reg
(
target
);
else
else
return
target
;
return
target
;
}
}
...
@@ -4120,7 +4117,7 @@ is_zeros_p (exp)
...
@@ -4120,7 +4117,7 @@ is_zeros_p (exp)
return
0
;
return
0
;
return
1
;
return
1
;
default
:
default
:
return
0
;
return
0
;
}
}
...
@@ -4329,7 +4326,7 @@ store_constructor (exp, target, align, cleared, size)
...
@@ -4329,7 +4326,7 @@ store_constructor (exp, target, align, cleared, size)
}
}
else
else
bitpos
=
tree_low_cst
(
DECL_FIELD_BIT_OFFSET
(
field
),
0
);
bitpos
=
tree_low_cst
(
DECL_FIELD_BIT_OFFSET
(
field
),
0
);
if
(
offset
)
if
(
offset
)
{
{
rtx
offset_rtx
;
rtx
offset_rtx
;
...
@@ -4342,8 +4339,8 @@ store_constructor (exp, target, align, cleared, size)
...
@@ -4342,8 +4339,8 @@ store_constructor (exp, target, align, cleared, size)
if
(
GET_CODE
(
to_rtx
)
!=
MEM
)
if
(
GET_CODE
(
to_rtx
)
!=
MEM
)
abort
();
abort
();
if
(
GET_MODE
(
offset_rtx
)
!=
ptr_mode
)
if
(
GET_MODE
(
offset_rtx
)
!=
ptr_mode
)
{
{
#ifdef POINTERS_EXTEND_UNSIGNED
#ifdef POINTERS_EXTEND_UNSIGNED
offset_rtx
=
convert_memory_address
(
ptr_mode
,
offset_rtx
);
offset_rtx
=
convert_memory_address
(
ptr_mode
,
offset_rtx
);
#else
#else
...
@@ -4611,7 +4608,7 @@ store_constructor (exp, target, align, cleared, size)
...
@@ -4611,7 +4608,7 @@ store_constructor (exp, target, align, cleared, size)
}
}
}
}
/* Set constructor assignments */
/* Set constructor assignments
.
*/
else
if
(
TREE_CODE
(
type
)
==
SET_TYPE
)
else
if
(
TREE_CODE
(
type
)
==
SET_TYPE
)
{
{
tree
elt
=
CONSTRUCTOR_ELTS
(
exp
);
tree
elt
=
CONSTRUCTOR_ELTS
(
exp
);
...
@@ -4628,7 +4625,7 @@ store_constructor (exp, target, align, cleared, size)
...
@@ -4628,7 +4625,7 @@ store_constructor (exp, target, align, cleared, size)
Also, if a large set has just a single range, it may also be
Also, if a large set has just a single range, it may also be
better to first clear all the first clear the set (using
better to first clear all the first clear the set (using
bzero/memset), and set the bits we want. */
bzero/memset), and set the bits we want. */
/* Check for all zeros. */
/* Check for all zeros. */
if
(
elt
==
NULL_TREE
&&
size
>
0
)
if
(
elt
==
NULL_TREE
&&
size
>
0
)
{
{
...
@@ -4647,7 +4644,7 @@ store_constructor (exp, target, align, cleared, size)
...
@@ -4647,7 +4644,7 @@ store_constructor (exp, target, align, cleared, size)
/* For "small" sets, or "medium-sized" (up to 32 bytes) sets that
/* For "small" sets, or "medium-sized" (up to 32 bytes) sets that
are "complicated" (more than one range), initialize (the
are "complicated" (more than one range), initialize (the
constant parts) by copying from a constant. */
constant parts) by copying from a constant. */
if
(
GET_MODE
(
target
)
!=
BLKmode
||
nbits
<=
2
*
BITS_PER_WORD
if
(
GET_MODE
(
target
)
!=
BLKmode
||
nbits
<=
2
*
BITS_PER_WORD
||
(
nbytes
<=
32
&&
TREE_CHAIN
(
elt
)
!=
NULL_TREE
))
||
(
nbytes
<=
32
&&
TREE_CHAIN
(
elt
)
!=
NULL_TREE
))
{
{
...
@@ -4686,7 +4683,7 @@ store_constructor (exp, target, align, cleared, size)
...
@@ -4686,7 +4683,7 @@ store_constructor (exp, target, align, cleared, size)
to_rtx
=
plus_constant
(
XEXP
(
target
,
0
),
offset
);
to_rtx
=
plus_constant
(
XEXP
(
target
,
0
),
offset
);
to_rtx
=
change_address
(
target
,
mode
,
to_rtx
);
to_rtx
=
change_address
(
target
,
mode
,
to_rtx
);
}
}
else
if
(
offset
==
0
)
else
if
(
offset
==
0
)
to_rtx
=
target
;
to_rtx
=
target
;
else
else
abort
();
abort
();
...
@@ -4712,12 +4709,12 @@ store_constructor (exp, target, align, cleared, size)
...
@@ -4712,12 +4709,12 @@ store_constructor (exp, target, align, cleared, size)
-
tree_low_cst
(
TREE_PURPOSE
(
elt
),
0
)
+
1
-
tree_low_cst
(
TREE_PURPOSE
(
elt
),
0
)
+
1
!=
(
HOST_WIDE_INT
)
nbits
))))
!=
(
HOST_WIDE_INT
)
nbits
))))
clear_storage
(
target
,
expr_size
(
exp
),
TYPE_ALIGN
(
type
));
clear_storage
(
target
,
expr_size
(
exp
),
TYPE_ALIGN
(
type
));
for
(;
elt
!=
NULL_TREE
;
elt
=
TREE_CHAIN
(
elt
))
for
(;
elt
!=
NULL_TREE
;
elt
=
TREE_CHAIN
(
elt
))
{
{
/*
start of range of element or NULL
*/
/*
Start of range of element or NULL.
*/
tree
startbit
=
TREE_PURPOSE
(
elt
);
tree
startbit
=
TREE_PURPOSE
(
elt
);
/*
end of range of element, or element value
*/
/*
End of range of element, or element value.
*/
tree
endbit
=
TREE_VALUE
(
elt
);
tree
endbit
=
TREE_VALUE
(
elt
);
#ifdef TARGET_MEM_FUNCTIONS
#ifdef TARGET_MEM_FUNCTIONS
HOST_WIDE_INT
startb
,
endb
;
HOST_WIDE_INT
startb
,
endb
;
...
@@ -4727,7 +4724,7 @@ store_constructor (exp, target, align, cleared, size)
...
@@ -4727,7 +4724,7 @@ store_constructor (exp, target, align, cleared, size)
bitlength_rtx
=
expand_expr
(
bitlength
,
bitlength_rtx
=
expand_expr
(
bitlength
,
NULL_RTX
,
MEM
,
EXPAND_CONST_ADDRESS
);
NULL_RTX
,
MEM
,
EXPAND_CONST_ADDRESS
);
/*
handle non-range tuple element like [ expr ]
*/
/*
Handle non-range tuple element like [ expr ].
*/
if
(
startbit
==
NULL_TREE
)
if
(
startbit
==
NULL_TREE
)
{
{
startbit
=
save_expr
(
endbit
);
startbit
=
save_expr
(
endbit
);
...
@@ -4741,9 +4738,9 @@ store_constructor (exp, target, align, cleared, size)
...
@@ -4741,9 +4738,9 @@ store_constructor (exp, target, align, cleared, size)
startbit
=
size_binop
(
MINUS_EXPR
,
startbit
,
domain_min
);
startbit
=
size_binop
(
MINUS_EXPR
,
startbit
,
domain_min
);
endbit
=
size_binop
(
MINUS_EXPR
,
endbit
,
domain_min
);
endbit
=
size_binop
(
MINUS_EXPR
,
endbit
,
domain_min
);
}
}
startbit_rtx
=
expand_expr
(
startbit
,
NULL_RTX
,
MEM
,
startbit_rtx
=
expand_expr
(
startbit
,
NULL_RTX
,
MEM
,
EXPAND_CONST_ADDRESS
);
EXPAND_CONST_ADDRESS
);
endbit_rtx
=
expand_expr
(
endbit
,
NULL_RTX
,
MEM
,
endbit_rtx
=
expand_expr
(
endbit
,
NULL_RTX
,
MEM
,
EXPAND_CONST_ADDRESS
);
EXPAND_CONST_ADDRESS
);
if
(
REG_P
(
target
))
if
(
REG_P
(
target
))
...
@@ -4807,7 +4804,7 @@ store_constructor (exp, target, align, cleared, size)
...
@@ -4807,7 +4804,7 @@ store_constructor (exp, target, align, cleared, size)
In this case, UNSIGNEDP must be nonzero if the value is an unsigned type.
In this case, UNSIGNEDP must be nonzero if the value is an unsigned type.
ALIGN is the alignment that TARGET is known to have.
ALIGN is the alignment that TARGET is known to have.
TOTAL_SIZE is the size in bytes of the structure, or -1 if varying.
TOTAL_SIZE is the size in bytes of the structure, or -1 if varying.
ALIAS_SET is the alias set for the destination. This value will
ALIAS_SET is the alias set for the destination. This value will
(in general) be different from that for TARGET, since TARGET is a
(in general) be different from that for TARGET, since TARGET is a
...
@@ -5080,7 +5077,7 @@ get_inner_reference (exp, pbitsize, pbitpos, poffset, pmode,
...
@@ -5080,7 +5077,7 @@ get_inner_reference (exp, pbitsize, pbitpos, poffset, pmode,
else
else
*
pbitsize
=
GET_MODE_BITSIZE
(
mode
);
*
pbitsize
=
GET_MODE_BITSIZE
(
mode
);
}
}
if
(
size_tree
!=
0
)
if
(
size_tree
!=
0
)
{
{
if
(
!
host_integerp
(
size_tree
,
1
))
if
(
!
host_integerp
(
size_tree
,
1
))
...
@@ -5300,7 +5297,7 @@ force_operand (value, target)
...
@@ -5300,7 +5297,7 @@ force_operand (value, target)
force_operand
(
XEXP
(
XEXP
(
value
,
0
),
1
),
0
),
force_operand
(
XEXP
(
XEXP
(
value
,
0
),
1
),
0
),
target
,
0
,
OPTAB_LIB_WIDEN
);
target
,
0
,
OPTAB_LIB_WIDEN
);
}
}
tmp
=
force_operand
(
XEXP
(
value
,
0
),
subtarget
);
tmp
=
force_operand
(
XEXP
(
value
,
0
),
subtarget
);
return
expand_binop
(
GET_MODE
(
value
),
binoptab
,
tmp
,
return
expand_binop
(
GET_MODE
(
value
),
binoptab
,
tmp
,
force_operand
(
op2
,
NULL_RTX
),
force_operand
(
op2
,
NULL_RTX
),
...
@@ -5540,7 +5537,7 @@ safe_from_p (x, exp, top_p)
...
@@ -5540,7 +5537,7 @@ safe_from_p (x, exp, top_p)
where it is so we can turn it back in the top-level safe_from_p()
where it is so we can turn it back in the top-level safe_from_p()
when we're done. */
when we're done. */
/* For now, don't bother re-sizing the array. */
/* For now, don't bother re-sizing the array.
*/
if
(
save_expr_count
>=
save_expr_size
)
if
(
save_expr_count
>=
save_expr_size
)
return
0
;
return
0
;
save_expr_rewritten
[
save_expr_count
++
]
=
exp
;
save_expr_rewritten
[
save_expr_count
++
]
=
exp
;
...
@@ -5567,7 +5564,7 @@ safe_from_p (x, exp, top_p)
...
@@ -5567,7 +5564,7 @@ safe_from_p (x, exp, top_p)
case
METHOD_CALL_EXPR
:
case
METHOD_CALL_EXPR
:
/* This takes a rtx argument, but shouldn't appear here. */
/* This takes a rtx argument, but shouldn't appear here. */
abort
();
abort
();
default
:
default
:
break
;
break
;
}
}
...
@@ -5643,7 +5640,7 @@ var_rtx (exp)
...
@@ -5643,7 +5640,7 @@ var_rtx (exp)
#ifdef MAX_INTEGER_COMPUTATION_MODE
#ifdef MAX_INTEGER_COMPUTATION_MODE
void
void
check_max_integer_computation_mode
(
exp
)
check_max_integer_computation_mode
(
exp
)
tree
exp
;
tree
exp
;
{
{
enum
tree_code
code
;
enum
tree_code
code
;
enum
machine_mode
mode
;
enum
machine_mode
mode
;
...
@@ -5677,7 +5674,7 @@ check_max_integer_computation_mode (exp)
...
@@ -5677,7 +5674,7 @@ check_max_integer_computation_mode (exp)
&&
mode
>
MAX_INTEGER_COMPUTATION_MODE
)
&&
mode
>
MAX_INTEGER_COMPUTATION_MODE
)
fatal
(
"unsupported wide integer operation"
);
fatal
(
"unsupported wide integer operation"
);
}
}
/* Check operands of a binary/comparison op. */
/* Check operands of a binary/comparison op. */
if
(
TREE_CODE_CLASS
(
code
)
==
'2'
||
TREE_CODE_CLASS
(
code
)
==
'<'
)
if
(
TREE_CODE_CLASS
(
code
)
==
'2'
||
TREE_CODE_CLASS
(
code
)
==
'<'
)
{
{
...
@@ -5693,7 +5690,6 @@ check_max_integer_computation_mode (exp)
...
@@ -5693,7 +5690,6 @@ check_max_integer_computation_mode (exp)
}
}
}
}
#endif
#endif
/* Utility function used by expand_expr to see if TYPE, a RECORD_TYPE,
/* Utility function used by expand_expr to see if TYPE, a RECORD_TYPE,
has any readonly fields. If any of the fields have types that
has any readonly fields. If any of the fields have types that
...
@@ -5706,7 +5702,7 @@ readonly_fields_p (type)
...
@@ -5706,7 +5702,7 @@ readonly_fields_p (type)
tree
field
;
tree
field
;
for
(
field
=
TYPE_FIELDS
(
type
);
field
!=
0
;
field
=
TREE_CHAIN
(
field
))
for
(
field
=
TYPE_FIELDS
(
type
);
field
!=
0
;
field
=
TREE_CHAIN
(
field
))
if
(
TREE_CODE
(
field
)
==
FIELD_DECL
if
(
TREE_CODE
(
field
)
==
FIELD_DECL
&&
(
TREE_READONLY
(
field
)
&&
(
TREE_READONLY
(
field
)
||
(
TREE_CODE
(
TREE_TYPE
(
field
))
==
RECORD_TYPE
||
(
TREE_CODE
(
TREE_TYPE
(
field
))
==
RECORD_TYPE
&&
readonly_fields_p
(
TREE_TYPE
(
field
)))))
&&
readonly_fields_p
(
TREE_TYPE
(
field
)))))
...
@@ -5769,7 +5765,7 @@ expand_expr (exp, target, tmode, modifier)
...
@@ -5769,7 +5765,7 @@ expand_expr (exp, target, tmode, modifier)
/* Used by check-memory-usage to make modifier read only. */
/* Used by check-memory-usage to make modifier read only. */
enum
expand_modifier
ro_modifier
;
enum
expand_modifier
ro_modifier
;
/* Handle ERROR_MARK before anybody tries to access its type. */
/* Handle ERROR_MARK before anybody tries to access its type.
*/
if
(
TREE_CODE
(
exp
)
==
ERROR_MARK
)
if
(
TREE_CODE
(
exp
)
==
ERROR_MARK
)
{
{
op0
=
CONST0_RTX
(
tmode
);
op0
=
CONST0_RTX
(
tmode
);
...
@@ -5824,7 +5820,7 @@ expand_expr (exp, target, tmode, modifier)
...
@@ -5824,7 +5820,7 @@ expand_expr (exp, target, tmode, modifier)
return
expand_expr
(
TREE_OPERAND
(
exp
,
0
),
const0_rtx
,
return
expand_expr
(
TREE_OPERAND
(
exp
,
0
),
const0_rtx
,
VOIDmode
,
ro_modifier
);
VOIDmode
,
ro_modifier
);
else
if
(
TREE_CODE_CLASS
(
code
)
==
'2'
||
TREE_CODE_CLASS
(
code
)
==
'<'
else
if
(
TREE_CODE_CLASS
(
code
)
==
'2'
||
TREE_CODE_CLASS
(
code
)
==
'<'
||
code
==
ARRAY_REF
)
||
code
==
ARRAY_REF
)
{
{
expand_expr
(
TREE_OPERAND
(
exp
,
0
),
const0_rtx
,
VOIDmode
,
ro_modifier
);
expand_expr
(
TREE_OPERAND
(
exp
,
0
),
const0_rtx
,
VOIDmode
,
ro_modifier
);
expand_expr
(
TREE_OPERAND
(
exp
,
1
),
const0_rtx
,
VOIDmode
,
ro_modifier
);
expand_expr
(
TREE_OPERAND
(
exp
,
1
),
const0_rtx
,
VOIDmode
,
ro_modifier
);
...
@@ -5843,7 +5839,7 @@ expand_expr (exp, target, tmode, modifier)
...
@@ -5843,7 +5839,7 @@ expand_expr (exp, target, tmode, modifier)
expand_expr
(
TREE_OPERAND
(
exp
,
2
),
const0_rtx
,
VOIDmode
,
ro_modifier
);
expand_expr
(
TREE_OPERAND
(
exp
,
2
),
const0_rtx
,
VOIDmode
,
ro_modifier
);
return
const0_rtx
;
return
const0_rtx
;
}
}
;
;
target
=
0
;
target
=
0
;
}
}
...
@@ -6026,7 +6022,7 @@ expand_expr (exp, target, tmode, modifier)
...
@@ -6026,7 +6022,7 @@ expand_expr (exp, target, tmode, modifier)
abort
();
abort
();
addr
=
XEXP
(
DECL_RTL
(
exp
),
0
);
addr
=
XEXP
(
DECL_RTL
(
exp
),
0
);
if
(
GET_CODE
(
addr
)
==
MEM
)
if
(
GET_CODE
(
addr
)
==
MEM
)
addr
=
change_address
(
addr
,
Pmode
,
addr
=
change_address
(
addr
,
Pmode
,
fix_lexical_addr
(
XEXP
(
addr
,
0
),
exp
));
fix_lexical_addr
(
XEXP
(
addr
,
0
),
exp
));
else
else
addr
=
fix_lexical_addr
(
addr
,
exp
);
addr
=
fix_lexical_addr
(
addr
,
exp
);
...
@@ -6095,12 +6091,12 @@ expand_expr (exp, target, tmode, modifier)
...
@@ -6095,12 +6091,12 @@ expand_expr (exp, target, tmode, modifier)
case
CONST_DECL
:
case
CONST_DECL
:
return
expand_expr
(
DECL_INITIAL
(
exp
),
target
,
VOIDmode
,
return
expand_expr
(
DECL_INITIAL
(
exp
),
target
,
VOIDmode
,
EXPAND_MEMORY_USE_BAD
);
EXPAND_MEMORY_USE_BAD
);
case
REAL_CST
:
case
REAL_CST
:
/* If optimized, generate immediate CONST_DOUBLE
/* If optimized, generate immediate CONST_DOUBLE
which will be turned into memory by reload if necessary.
which will be turned into memory by reload if necessary.
We used to force a register so that loop.c could see it. But
We used to force a register so that loop.c could see it. But
this does not allow gen_* patterns to perform optimizations with
this does not allow gen_* patterns to perform optimizations with
the constants. It also produces two insns in cases like "x = 1.0;".
the constants. It also produces two insns in cases like "x = 1.0;".
...
@@ -6138,7 +6134,7 @@ expand_expr (exp, target, tmode, modifier)
...
@@ -6138,7 +6134,7 @@ expand_expr (exp, target, tmode, modifier)
lineno
=
EXPR_WFL_LINENO
(
exp
);
lineno
=
EXPR_WFL_LINENO
(
exp
);
if
(
EXPR_WFL_EMIT_LINE_NOTE
(
exp
))
if
(
EXPR_WFL_EMIT_LINE_NOTE
(
exp
))
emit_line_note
(
input_filename
,
lineno
);
emit_line_note
(
input_filename
,
lineno
);
/* Possibly avoid switching back and force here */
/* Possibly avoid switching back and force here
.
*/
to_return
=
expand_expr
(
EXPR_WFL_NODE
(
exp
),
target
,
tmode
,
modifier
);
to_return
=
expand_expr
(
EXPR_WFL_NODE
(
exp
),
target
,
tmode
,
modifier
);
input_filename
=
saved_input_filename
;
input_filename
=
saved_input_filename
;
lineno
=
saved_lineno
;
lineno
=
saved_lineno
;
...
@@ -6254,7 +6250,7 @@ expand_expr (exp, target, tmode, modifier)
...
@@ -6254,7 +6250,7 @@ expand_expr (exp, target, tmode, modifier)
tree
elt
;
tree
elt
;
/* Find the outermost reference that is of the type we want.
/* Find the outermost reference that is of the type we want.
If none, see if any object has a type that is a pointer to
If none, see if any object has a type that is a pointer to
the type we want. */
the type we want. */
for
(
elt
=
TREE_PURPOSE
(
placeholder_expr
);
for
(
elt
=
TREE_PURPOSE
(
placeholder_expr
);
elt
!=
0
&&
object
==
0
;
elt
!=
0
&&
object
==
0
;
...
@@ -6416,7 +6412,7 @@ expand_expr (exp, target, tmode, modifier)
...
@@ -6416,7 +6412,7 @@ expand_expr (exp, target, tmode, modifier)
&&
!
(
target
!=
0
&&
safe_from_p
(
target
,
exp
,
1
)))
&&
!
(
target
!=
0
&&
safe_from_p
(
target
,
exp
,
1
)))
||
TREE_ADDRESSABLE
(
exp
)
||
TREE_ADDRESSABLE
(
exp
)
||
(
host_integerp
(
TYPE_SIZE_UNIT
(
type
),
1
)
||
(
host_integerp
(
TYPE_SIZE_UNIT
(
type
),
1
)
&&
(
!
MOVE_BY_PIECES_P
&&
(
!
MOVE_BY_PIECES_P
(
tree_low_cst
(
TYPE_SIZE_UNIT
(
type
),
1
),
(
tree_low_cst
(
TYPE_SIZE_UNIT
(
type
),
1
),
TYPE_ALIGN
(
type
)))
TYPE_ALIGN
(
type
)))
&&
!
mostly_zeros_p
(
exp
))))
&&
!
mostly_zeros_p
(
exp
))))
...
@@ -6466,8 +6462,8 @@ expand_expr (exp, target, tmode, modifier)
...
@@ -6466,8 +6462,8 @@ expand_expr (exp, target, tmode, modifier)
{
{
tree
exp1
=
TREE_OPERAND
(
exp
,
0
);
tree
exp1
=
TREE_OPERAND
(
exp
,
0
);
tree
index
;
tree
index
;
tree
string
=
string_constant
(
exp1
,
&
index
);
tree
string
=
string_constant
(
exp1
,
&
index
);
/* Try to optimize reads from const strings. */
/* Try to optimize reads from const strings. */
if
(
string
if
(
string
&&
TREE_CODE
(
string
)
==
STRING_CST
&&
TREE_CODE
(
string
)
==
STRING_CST
...
@@ -6563,7 +6559,7 @@ expand_expr (exp, target, tmode, modifier)
...
@@ -6563,7 +6559,7 @@ expand_expr (exp, target, tmode, modifier)
if
(
TREE_CODE
(
array
)
==
CONSTRUCTOR
&&
!
TREE_SIDE_EFFECTS
(
array
)
if
(
TREE_CODE
(
array
)
==
CONSTRUCTOR
&&
!
TREE_SIDE_EFFECTS
(
array
)
&&
TREE_CODE
(
index
)
==
INTEGER_CST
&&
TREE_CODE
(
index
)
==
INTEGER_CST
&&
0
>
compare_tree_int
(
index
,
&&
0
>
compare_tree_int
(
index
,
list_length
(
CONSTRUCTOR_ELTS
list_length
(
CONSTRUCTOR_ELTS
(
TREE_OPERAND
(
exp
,
0
)))))
(
TREE_OPERAND
(
exp
,
0
)))))
{
{
...
@@ -6578,7 +6574,7 @@ expand_expr (exp, target, tmode, modifier)
...
@@ -6578,7 +6574,7 @@ expand_expr (exp, target, tmode, modifier)
return
expand_expr
(
fold
(
TREE_VALUE
(
elem
)),
target
,
return
expand_expr
(
fold
(
TREE_VALUE
(
elem
)),
target
,
tmode
,
ro_modifier
);
tmode
,
ro_modifier
);
}
}
else
if
(
optimize
>=
1
else
if
(
optimize
>=
1
&&
TREE_READONLY
(
array
)
&&
!
TREE_SIDE_EFFECTS
(
array
)
&&
TREE_READONLY
(
array
)
&&
!
TREE_SIDE_EFFECTS
(
array
)
&&
TREE_CODE
(
array
)
==
VAR_DECL
&&
DECL_INITIAL
(
array
)
&&
TREE_CODE
(
array
)
==
VAR_DECL
&&
DECL_INITIAL
(
array
)
...
@@ -6611,8 +6607,7 @@ expand_expr (exp, target, tmode, modifier)
...
@@ -6611,8 +6607,7 @@ expand_expr (exp, target, tmode, modifier)
}
}
}
}
}
}
/* Fall through. */
/* ... fall through ... */
case
COMPONENT_REF
:
case
COMPONENT_REF
:
case
BIT_FIELD_REF
:
case
BIT_FIELD_REF
:
...
@@ -6642,7 +6637,7 @@ expand_expr (exp, target, tmode, modifier)
...
@@ -6642,7 +6637,7 @@ expand_expr (exp, target, tmode, modifier)
&&
(
GET_MODE_BITSIZE
(
DECL_MODE
(
TREE_PURPOSE
(
elt
)))
&&
(
GET_MODE_BITSIZE
(
DECL_MODE
(
TREE_PURPOSE
(
elt
)))
<=
HOST_BITS_PER_WIDE_INT
))))
<=
HOST_BITS_PER_WIDE_INT
))))
{
{
op0
=
expand_expr
(
TREE_VALUE
(
elt
),
target
,
tmode
,
modifier
);
op0
=
expand_expr
(
TREE_VALUE
(
elt
),
target
,
tmode
,
modifier
);
if
(
DECL_BIT_FIELD
(
TREE_PURPOSE
(
elt
)))
if
(
DECL_BIT_FIELD
(
TREE_PURPOSE
(
elt
)))
{
{
HOST_WIDE_INT
bitsize
HOST_WIDE_INT
bitsize
...
@@ -6691,7 +6686,7 @@ expand_expr (exp, target, tmode, modifier)
...
@@ -6691,7 +6686,7 @@ expand_expr (exp, target, tmode, modifier)
/* If TEM's type is a union of variable size, pass TARGET to the inner
/* If TEM's type is a union of variable size, pass TARGET to the inner
computation, since it will need a temporary and TARGET is known
computation, since it will need a temporary and TARGET is known
to have to do. This occurs in unchecked conversion in Ada. */
to have to do. This occurs in unchecked conversion in Ada. */
op0
=
expand_expr
(
tem
,
op0
=
expand_expr
(
tem
,
(
TREE_CODE
(
TREE_TYPE
(
tem
))
==
UNION_TYPE
(
TREE_CODE
(
TREE_TYPE
(
tem
))
==
UNION_TYPE
&&
(
TREE_CODE
(
TYPE_SIZE
(
TREE_TYPE
(
tem
)))
&&
(
TREE_CODE
(
TYPE_SIZE
(
TREE_TYPE
(
tem
)))
...
@@ -6750,7 +6745,7 @@ expand_expr (exp, target, tmode, modifier)
...
@@ -6750,7 +6745,7 @@ expand_expr (exp, target, tmode, modifier)
&&
GET_MODE
(
op0
)
==
BLKmode
&&
GET_MODE
(
op0
)
==
BLKmode
&&
GET_MODE
(
XEXP
(
op0
,
0
))
!=
VOIDmode
&&
GET_MODE
(
XEXP
(
op0
,
0
))
!=
VOIDmode
&&
bitsize
!=
0
&&
bitsize
!=
0
&&
(
bitpos
%
bitsize
)
==
0
&&
(
bitpos
%
bitsize
)
==
0
&&
(
bitsize
%
GET_MODE_ALIGNMENT
(
mode1
))
==
0
&&
(
bitsize
%
GET_MODE_ALIGNMENT
(
mode1
))
==
0
&&
alignment
==
GET_MODE_ALIGNMENT
(
mode1
))
&&
alignment
==
GET_MODE_ALIGNMENT
(
mode1
))
{
{
...
@@ -6767,7 +6762,6 @@ expand_expr (exp, target, tmode, modifier)
...
@@ -6767,7 +6762,6 @@ expand_expr (exp, target, tmode, modifier)
bitpos
=
0
;
bitpos
=
0
;
}
}
op0
=
change_address
(
op0
,
VOIDmode
,
op0
=
change_address
(
op0
,
VOIDmode
,
gen_rtx_PLUS
(
ptr_mode
,
XEXP
(
op0
,
0
),
gen_rtx_PLUS
(
ptr_mode
,
XEXP
(
op0
,
0
),
force_reg
(
ptr_mode
,
force_reg
(
ptr_mode
,
...
@@ -6784,7 +6778,7 @@ expand_expr (exp, target, tmode, modifier)
...
@@ -6784,7 +6778,7 @@ expand_expr (exp, target, tmode, modifier)
/* Check the access. */
/* Check the access. */
if
(
cfun
!=
0
&&
current_function_check_memory_usage
if
(
cfun
!=
0
&&
current_function_check_memory_usage
&&
GET_CODE
(
op0
)
==
MEM
)
&&
GET_CODE
(
op0
)
==
MEM
)
{
{
enum
memory_use_mode
memory_usage
;
enum
memory_use_mode
memory_usage
;
memory_usage
=
get_memory_usage_from_modifier
(
modifier
);
memory_usage
=
get_memory_usage_from_modifier
(
modifier
);
...
@@ -6803,7 +6797,7 @@ expand_expr (exp, target, tmode, modifier)
...
@@ -6803,7 +6797,7 @@ expand_expr (exp, target, tmode, modifier)
to
,
Pmode
,
to
,
Pmode
,
GEN_INT
(
size
/
BITS_PER_UNIT
),
GEN_INT
(
size
/
BITS_PER_UNIT
),
TYPE_MODE
(
sizetype
),
TYPE_MODE
(
sizetype
),
GEN_INT
(
memory_usage
),
GEN_INT
(
memory_usage
),
TYPE_MODE
(
integer_type_node
));
TYPE_MODE
(
integer_type_node
));
in_check_memory_usage
=
0
;
in_check_memory_usage
=
0
;
}
}
...
@@ -6873,7 +6867,7 @@ expand_expr (exp, target, tmode, modifier)
...
@@ -6873,7 +6867,7 @@ expand_expr (exp, target, tmode, modifier)
GEN_INT
((
bitsize
+
BITS_PER_UNIT
-
1
)
GEN_INT
((
bitsize
+
BITS_PER_UNIT
-
1
)
/
BITS_PER_UNIT
),
/
BITS_PER_UNIT
),
BITS_PER_UNIT
);
BITS_PER_UNIT
);
return
target
;
return
target
;
}
}
...
@@ -7017,7 +7011,7 @@ expand_expr (exp, target, tmode, modifier)
...
@@ -7017,7 +7011,7 @@ expand_expr (exp, target, tmode, modifier)
of the set. */
of the set. */
if
(
GET_CODE
(
lo_r
)
==
CONST_INT
)
if
(
GET_CODE
(
lo_r
)
==
CONST_INT
)
rlow
=
GEN_INT
(
INTVAL
(
lo_r
)
rlow
=
GEN_INT
(
INTVAL
(
lo_r
)
&
~
((
HOST_WIDE_INT
)
1
<<
BITS_PER_UNIT
));
&
~
((
HOST_WIDE_INT
)
1
<<
BITS_PER_UNIT
));
else
else
rlow
=
expand_binop
(
index_mode
,
and_optab
,
lo_r
,
rlow
=
expand_binop
(
index_mode
,
and_optab
,
lo_r
,
GEN_INT
(
~
((
HOST_WIDE_INT
)
1
<<
BITS_PER_UNIT
)),
GEN_INT
(
~
((
HOST_WIDE_INT
)
1
<<
BITS_PER_UNIT
)),
...
@@ -7036,7 +7030,7 @@ expand_expr (exp, target, tmode, modifier)
...
@@ -7036,7 +7030,7 @@ expand_expr (exp, target, tmode, modifier)
setaddr
,
NULL_RTX
,
iunsignedp
,
setaddr
,
NULL_RTX
,
iunsignedp
,
OPTAB_LIB_WIDEN
));
OPTAB_LIB_WIDEN
));
/* Extract the bit we want to examine */
/* Extract the bit we want to examine
.
*/
bit
=
expand_shift
(
RSHIFT_EXPR
,
byte_mode
,
bit
=
expand_shift
(
RSHIFT_EXPR
,
byte_mode
,
gen_rtx_MEM
(
byte_mode
,
addr
),
gen_rtx_MEM
(
byte_mode
,
addr
),
make_tree
(
TREE_TYPE
(
index
),
rem
),
make_tree
(
TREE_TYPE
(
index
),
rem
),
...
@@ -7327,7 +7321,7 @@ expand_expr (exp, target, tmode, modifier)
...
@@ -7327,7 +7321,7 @@ expand_expr (exp, target, tmode, modifier)
op0
=
eliminate_constant_term
(
op0
,
&
constant_term
);
op0
=
eliminate_constant_term
(
op0
,
&
constant_term
);
/* CONSTANT_TERM and XEXP (op1, 1) are known to be constant, so
/* CONSTANT_TERM and XEXP (op1, 1) are known to be constant, so
their sum should be a constant. Form it into OP1, since the
their sum should be a constant. Form it into OP1, since the
result we want will then be OP0 + OP1. */
result we want will then be OP0 + OP1. */
temp
=
simplify_binary_operation
(
PLUS
,
mode
,
constant_term
,
temp
=
simplify_binary_operation
(
PLUS
,
mode
,
constant_term
,
...
@@ -7612,7 +7606,7 @@ expand_expr (exp, target, tmode, modifier)
...
@@ -7612,7 +7606,7 @@ expand_expr (exp, target, tmode, modifier)
/* At this point, a MEM target is no longer useful; we will get better
/* At this point, a MEM target is no longer useful; we will get better
code without it. */
code without it. */
if
(
GET_CODE
(
target
)
==
MEM
)
if
(
GET_CODE
(
target
)
==
MEM
)
target
=
gen_reg_rtx
(
mode
);
target
=
gen_reg_rtx
(
mode
);
...
@@ -7867,7 +7861,7 @@ expand_expr (exp, target, tmode, modifier)
...
@@ -7867,7 +7861,7 @@ expand_expr (exp, target, tmode, modifier)
/* If we are not to produce a result, we have no target. Otherwise,
/* If we are not to produce a result, we have no target. Otherwise,
if a target was specified use it; it will not be used as an
if a target was specified use it; it will not be used as an
intermediate target unless it is safe. If no target, use a
intermediate target unless it is safe. If no target, use a
temporary. */
temporary. */
if
(
ignore
)
if
(
ignore
)
...
@@ -7945,7 +7939,7 @@ expand_expr (exp, target, tmode, modifier)
...
@@ -7945,7 +7939,7 @@ expand_expr (exp, target, tmode, modifier)
TREE_OPERAND
(
exp
,
0
)
TREE_OPERAND
(
exp
,
0
)
=
invert_truthvalue
(
TREE_OPERAND
(
exp
,
0
));
=
invert_truthvalue
(
TREE_OPERAND
(
exp
,
0
));
}
}
do_pending_stack_adjust
();
do_pending_stack_adjust
();
NO_DEFER_POP
;
NO_DEFER_POP
;
op0
=
gen_label_rtx
();
op0
=
gen_label_rtx
();
...
@@ -8002,7 +7996,8 @@ expand_expr (exp, target, tmode, modifier)
...
@@ -8002,7 +7996,8 @@ expand_expr (exp, target, tmode, modifier)
||
TREE_CODE
(
TREE_OPERAND
(
exp
,
1
))
==
SAVE_EXPR
)
||
TREE_CODE
(
TREE_OPERAND
(
exp
,
1
))
==
SAVE_EXPR
)
&&
safe_from_p
(
temp
,
TREE_OPERAND
(
exp
,
2
),
1
))
&&
safe_from_p
(
temp
,
TREE_OPERAND
(
exp
,
2
),
1
))
{
{
if
(
GET_CODE
(
temp
)
==
REG
&&
REGNO
(
temp
)
<
FIRST_PSEUDO_REGISTER
)
if
(
GET_CODE
(
temp
)
==
REG
&&
REGNO
(
temp
)
<
FIRST_PSEUDO_REGISTER
)
temp
=
gen_reg_rtx
(
mode
);
temp
=
gen_reg_rtx
(
mode
);
store_expr
(
TREE_OPERAND
(
exp
,
1
),
temp
,
0
);
store_expr
(
TREE_OPERAND
(
exp
,
1
),
temp
,
0
);
jumpif
(
TREE_OPERAND
(
exp
,
0
),
op0
);
jumpif
(
TREE_OPERAND
(
exp
,
0
),
op0
);
...
@@ -8020,7 +8015,8 @@ expand_expr (exp, target, tmode, modifier)
...
@@ -8020,7 +8015,8 @@ expand_expr (exp, target, tmode, modifier)
||
TREE_CODE
(
TREE_OPERAND
(
exp
,
2
))
==
SAVE_EXPR
)
||
TREE_CODE
(
TREE_OPERAND
(
exp
,
2
))
==
SAVE_EXPR
)
&&
safe_from_p
(
temp
,
TREE_OPERAND
(
exp
,
1
),
1
))
&&
safe_from_p
(
temp
,
TREE_OPERAND
(
exp
,
1
),
1
))
{
{
if
(
GET_CODE
(
temp
)
==
REG
&&
REGNO
(
temp
)
<
FIRST_PSEUDO_REGISTER
)
if
(
GET_CODE
(
temp
)
==
REG
&&
REGNO
(
temp
)
<
FIRST_PSEUDO_REGISTER
)
temp
=
gen_reg_rtx
(
mode
);
temp
=
gen_reg_rtx
(
mode
);
store_expr
(
TREE_OPERAND
(
exp
,
2
),
temp
,
0
);
store_expr
(
TREE_OPERAND
(
exp
,
2
),
temp
,
0
);
jumpifnot
(
TREE_OPERAND
(
exp
,
0
),
op0
);
jumpifnot
(
TREE_OPERAND
(
exp
,
0
),
op0
);
...
@@ -8035,11 +8031,11 @@ expand_expr (exp, target, tmode, modifier)
...
@@ -8035,11 +8031,11 @@ expand_expr (exp, target, tmode, modifier)
jumpifnot
(
TREE_OPERAND
(
exp
,
0
),
op0
);
jumpifnot
(
TREE_OPERAND
(
exp
,
0
),
op0
);
start_cleanup_deferral
();
start_cleanup_deferral
();
/* One branch of the cond can be void, if it never returns. For
/* One branch of the cond can be void, if it never returns. For
example A ? throw : E */
example A ? throw : E */
if
(
temp
!=
0
if
(
temp
!=
0
&&
TREE_TYPE
(
TREE_OPERAND
(
exp
,
1
))
!=
void_type_node
)
&&
TREE_TYPE
(
TREE_OPERAND
(
exp
,
1
))
!=
void_type_node
)
store_expr
(
TREE_OPERAND
(
exp
,
1
),
temp
,
0
);
store_expr
(
TREE_OPERAND
(
exp
,
1
),
temp
,
0
);
else
else
expand_expr
(
TREE_OPERAND
(
exp
,
1
),
expand_expr
(
TREE_OPERAND
(
exp
,
1
),
...
@@ -8051,7 +8047,7 @@ expand_expr (exp, target, tmode, modifier)
...
@@ -8051,7 +8047,7 @@ expand_expr (exp, target, tmode, modifier)
emit_label
(
op0
);
emit_label
(
op0
);
start_cleanup_deferral
();
start_cleanup_deferral
();
if
(
temp
!=
0
if
(
temp
!=
0
&&
TREE_TYPE
(
TREE_OPERAND
(
exp
,
2
))
!=
void_type_node
)
&&
TREE_TYPE
(
TREE_OPERAND
(
exp
,
2
))
!=
void_type_node
)
store_expr
(
TREE_OPERAND
(
exp
,
2
),
temp
,
0
);
store_expr
(
TREE_OPERAND
(
exp
,
2
),
temp
,
0
);
else
else
expand_expr
(
TREE_OPERAND
(
exp
,
2
),
expand_expr
(
TREE_OPERAND
(
exp
,
2
),
...
@@ -8090,7 +8086,7 @@ expand_expr (exp, target, tmode, modifier)
...
@@ -8090,7 +8086,7 @@ expand_expr (exp, target, tmode, modifier)
/* Set this here so that if we get a target that refers to a
/* Set this here so that if we get a target that refers to a
register variable that's already been used, put_reg_into_stack
register variable that's already been used, put_reg_into_stack
knows that it should fix up those uses. */
knows that it should fix up those uses. */
TREE_USED
(
slot
)
=
1
;
TREE_USED
(
slot
)
=
1
;
if
(
target
==
0
)
if
(
target
==
0
)
...
@@ -8138,12 +8134,12 @@ expand_expr (exp, target, tmode, modifier)
...
@@ -8138,12 +8134,12 @@ expand_expr (exp, target, tmode, modifier)
not target that we were passed in, as our target
not target that we were passed in, as our target
parameter is only a hint. */
parameter is only a hint. */
if
(
DECL_RTL
(
slot
)
!=
0
)
if
(
DECL_RTL
(
slot
)
!=
0
)
{
{
target
=
DECL_RTL
(
slot
);
target
=
DECL_RTL
(
slot
);
/* If we have already expanded the slot, so don't do
/* If we have already expanded the slot, so don't do
it again. (mrs) */
it again. (mrs) */
if
(
TREE_OPERAND
(
exp
,
1
)
==
NULL_TREE
)
if
(
TREE_OPERAND
(
exp
,
1
)
==
NULL_TREE
)
return
target
;
return
target
;
}
}
else
else
{
{
...
@@ -8165,7 +8161,7 @@ expand_expr (exp, target, tmode, modifier)
...
@@ -8165,7 +8161,7 @@ expand_expr (exp, target, tmode, modifier)
store_expr
(
exp1
,
target
,
0
);
store_expr
(
exp1
,
target
,
0
);
expand_decl_cleanup
(
NULL_TREE
,
cleanups
);
expand_decl_cleanup
(
NULL_TREE
,
cleanups
);
return
target
;
return
target
;
}
}
...
@@ -8338,7 +8334,7 @@ expand_expr (exp, target, tmode, modifier)
...
@@ -8338,7 +8334,7 @@ expand_expr (exp, target, tmode, modifier)
if
(
GET_CODE
(
op0
)
!=
MEM
)
if
(
GET_CODE
(
op0
)
!=
MEM
)
abort
();
abort
();
if
(
modifier
==
EXPAND_SUM
||
modifier
==
EXPAND_INITIALIZER
)
if
(
modifier
==
EXPAND_SUM
||
modifier
==
EXPAND_INITIALIZER
)
{
{
temp
=
XEXP
(
op0
,
0
);
temp
=
XEXP
(
op0
,
0
);
...
@@ -8413,7 +8409,7 @@ expand_expr (exp, target, tmode, modifier)
...
@@ -8413,7 +8409,7 @@ expand_expr (exp, target, tmode, modifier)
case
REALPART_EXPR
:
case
REALPART_EXPR
:
op0
=
expand_expr
(
TREE_OPERAND
(
exp
,
0
),
0
,
VOIDmode
,
0
);
op0
=
expand_expr
(
TREE_OPERAND
(
exp
,
0
),
0
,
VOIDmode
,
0
);
return
gen_realpart
(
mode
,
op0
);
return
gen_realpart
(
mode
,
op0
);
case
IMAGPART_EXPR
:
case
IMAGPART_EXPR
:
op0
=
expand_expr
(
TREE_OPERAND
(
exp
,
0
),
0
,
VOIDmode
,
0
);
op0
=
expand_expr
(
TREE_OPERAND
(
exp
,
0
),
0
,
VOIDmode
,
0
);
return
gen_imagpart
(
mode
,
op0
);
return
gen_imagpart
(
mode
,
op0
);
...
@@ -8423,12 +8419,12 @@ expand_expr (exp, target, tmode, modifier)
...
@@ -8423,12 +8419,12 @@ expand_expr (exp, target, tmode, modifier)
enum
machine_mode
partmode
=
TYPE_MODE
(
TREE_TYPE
(
TREE_TYPE
(
exp
)));
enum
machine_mode
partmode
=
TYPE_MODE
(
TREE_TYPE
(
TREE_TYPE
(
exp
)));
rtx
imag_t
;
rtx
imag_t
;
rtx
insns
;
rtx
insns
;
op0
=
expand_expr
(
TREE_OPERAND
(
exp
,
0
),
0
,
VOIDmode
,
0
);
op0
=
expand_expr
(
TREE_OPERAND
(
exp
,
0
),
0
,
VOIDmode
,
0
);
if
(
!
target
)
if
(
!
target
)
target
=
gen_reg_rtx
(
mode
);
target
=
gen_reg_rtx
(
mode
);
start_sequence
();
start_sequence
();
/* Store the realpart and the negated imagpart to target. */
/* Store the realpart and the negated imagpart to target. */
...
@@ -8437,14 +8433,14 @@ expand_expr (exp, target, tmode, modifier)
...
@@ -8437,14 +8433,14 @@ expand_expr (exp, target, tmode, modifier)
imag_t
=
gen_imagpart
(
partmode
,
target
);
imag_t
=
gen_imagpart
(
partmode
,
target
);
temp
=
expand_unop
(
partmode
,
neg_optab
,
temp
=
expand_unop
(
partmode
,
neg_optab
,
gen_imagpart
(
partmode
,
op0
),
imag_t
,
0
);
gen_imagpart
(
partmode
,
op0
),
imag_t
,
0
);
if
(
temp
!=
imag_t
)
if
(
temp
!=
imag_t
)
emit_move_insn
(
imag_t
,
temp
);
emit_move_insn
(
imag_t
,
temp
);
insns
=
get_insns
();
insns
=
get_insns
();
end_sequence
();
end_sequence
();
/* Conjugate should appear as a single unit
/* Conjugate should appear as a single unit
If TARGET is a CONCAT, we got insns like RD = RS, ID = - IS,
If TARGET is a CONCAT, we got insns like RD = RS, ID = - IS,
each with a separate pseudo as destination.
each with a separate pseudo as destination.
It's not correct for flow to treat them as a unit. */
It's not correct for flow to treat them as a unit. */
...
@@ -8499,12 +8495,13 @@ expand_expr (exp, target, tmode, modifier)
...
@@ -8499,12 +8495,13 @@ expand_expr (exp, target, tmode, modifier)
return
op0
;
return
op0
;
}
}
case
GOTO_SUBROUTINE_EXPR
:
case
GOTO_SUBROUTINE_EXPR
:
{
{
rtx
subr
=
(
rtx
)
TREE_OPERAND
(
exp
,
0
);
rtx
subr
=
(
rtx
)
TREE_OPERAND
(
exp
,
0
);
rtx
return_link
=
*
(
rtx
*
)
&
TREE_OPERAND
(
exp
,
1
);
rtx
return_link
=
*
(
rtx
*
)
&
TREE_OPERAND
(
exp
,
1
);
rtx
return_address
=
gen_label_rtx
();
rtx
return_address
=
gen_label_rtx
();
emit_move_insn
(
return_link
,
gen_rtx_LABEL_REF
(
Pmode
,
return_address
));
emit_move_insn
(
return_link
,
gen_rtx_LABEL_REF
(
Pmode
,
return_address
));
emit_jump
(
subr
);
emit_jump
(
subr
);
emit_label
(
return_address
);
emit_label
(
return_address
);
return
const0_rtx
;
return
const0_rtx
;
...
@@ -8613,7 +8610,7 @@ expand_expr_unaligned (exp, palign)
...
@@ -8613,7 +8610,7 @@ expand_expr_unaligned (exp, palign)
that was declared const. */
that was declared const. */
if
(
TREE_CODE
(
array
)
==
CONSTRUCTOR
&&
!
TREE_SIDE_EFFECTS
(
array
)
if
(
TREE_CODE
(
array
)
==
CONSTRUCTOR
&&
!
TREE_SIDE_EFFECTS
(
array
)
&&
0
>
compare_tree_int
(
index
,
&&
0
>
compare_tree_int
(
index
,
list_length
(
CONSTRUCTOR_ELTS
list_length
(
CONSTRUCTOR_ELTS
(
TREE_OPERAND
(
exp
,
0
)))))
(
TREE_OPERAND
(
exp
,
0
)))))
{
{
...
@@ -8627,7 +8624,7 @@ expand_expr_unaligned (exp, palign)
...
@@ -8627,7 +8624,7 @@ expand_expr_unaligned (exp, palign)
if
(
elem
)
if
(
elem
)
return
expand_expr_unaligned
(
fold
(
TREE_VALUE
(
elem
)),
palign
);
return
expand_expr_unaligned
(
fold
(
TREE_VALUE
(
elem
)),
palign
);
}
}
else
if
(
optimize
>=
1
else
if
(
optimize
>=
1
&&
TREE_READONLY
(
array
)
&&
!
TREE_SIDE_EFFECTS
(
array
)
&&
TREE_READONLY
(
array
)
&&
!
TREE_SIDE_EFFECTS
(
array
)
&&
TREE_CODE
(
array
)
==
VAR_DECL
&&
DECL_INITIAL
(
array
)
&&
TREE_CODE
(
array
)
==
VAR_DECL
&&
DECL_INITIAL
(
array
)
...
@@ -8653,8 +8650,7 @@ expand_expr_unaligned (exp, palign)
...
@@ -8653,8 +8650,7 @@ expand_expr_unaligned (exp, palign)
}
}
}
}
}
}
/* Fall through. */
/* ... fall through ... */
case
COMPONENT_REF
:
case
COMPONENT_REF
:
case
BIT_FIELD_REF
:
case
BIT_FIELD_REF
:
...
@@ -8753,7 +8749,7 @@ expand_expr_unaligned (exp, palign)
...
@@ -8753,7 +8749,7 @@ expand_expr_unaligned (exp, palign)
/* Check the access. */
/* Check the access. */
if
(
current_function_check_memory_usage
&&
GET_CODE
(
op0
)
==
MEM
)
if
(
current_function_check_memory_usage
&&
GET_CODE
(
op0
)
==
MEM
)
{
{
rtx
to
;
rtx
to
;
int
size
;
int
size
;
...
@@ -8766,7 +8762,7 @@ expand_expr_unaligned (exp, palign)
...
@@ -8766,7 +8762,7 @@ expand_expr_unaligned (exp, palign)
emit_library_call
(
chkr_check_addr_libfunc
,
1
,
VOIDmode
,
3
,
emit_library_call
(
chkr_check_addr_libfunc
,
1
,
VOIDmode
,
3
,
to
,
ptr_mode
,
GEN_INT
(
size
/
BITS_PER_UNIT
),
to
,
ptr_mode
,
GEN_INT
(
size
/
BITS_PER_UNIT
),
TYPE_MODE
(
sizetype
),
TYPE_MODE
(
sizetype
),
GEN_INT
(
MEMORY_USE_RO
),
GEN_INT
(
MEMORY_USE_RO
),
TYPE_MODE
(
integer_type_node
));
TYPE_MODE
(
integer_type_node
));
in_check_memory_usage
=
0
;
in_check_memory_usage
=
0
;
}
}
...
@@ -8820,7 +8816,6 @@ expand_expr_unaligned (exp, palign)
...
@@ -8820,7 +8816,6 @@ expand_expr_unaligned (exp, palign)
-
bitsize
),
-
bitsize
),
op0
,
1
);
op0
,
1
);
emit_move_insn
(
new
,
op0
);
emit_move_insn
(
new
,
op0
);
op0
=
copy_rtx
(
new
);
op0
=
copy_rtx
(
new
);
PUT_MODE
(
op0
,
BLKmode
);
PUT_MODE
(
op0
,
BLKmode
);
...
@@ -8829,8 +8824,8 @@ expand_expr_unaligned (exp, palign)
...
@@ -8829,8 +8824,8 @@ expand_expr_unaligned (exp, palign)
else
else
/* Get a reference to just this component. */
/* Get a reference to just this component. */
op0
=
change_address
(
op0
,
mode1
,
op0
=
change_address
(
op0
,
mode1
,
plus_constant
(
XEXP
(
op0
,
0
),
plus_constant
(
XEXP
(
op0
,
0
),
(
bitpos
/
BITS_PER_UNIT
)));
(
bitpos
/
BITS_PER_UNIT
)));
MEM_ALIAS_SET
(
op0
)
=
get_alias_set
(
exp
);
MEM_ALIAS_SET
(
op0
)
=
get_alias_set
(
exp
);
...
@@ -8986,7 +8981,7 @@ expand_increment (exp, post, ignore)
...
@@ -8986,7 +8981,7 @@ expand_increment (exp, post, ignore)
if
(
this_optab
==
sub_optab
if
(
this_optab
==
sub_optab
&&
GET_CODE
(
op1
)
==
CONST_INT
)
&&
GET_CODE
(
op1
)
==
CONST_INT
)
{
{
op1
=
GEN_INT
(
-
INTVAL
(
op1
));
op1
=
GEN_INT
(
-
INTVAL
(
op1
));
this_optab
=
add_optab
;
this_optab
=
add_optab
;
}
}
...
@@ -9094,7 +9089,7 @@ expand_increment (exp, post, ignore)
...
@@ -9094,7 +9089,7 @@ expand_increment (exp, post, ignore)
/* Increment however we can. */
/* Increment however we can. */
op1
=
expand_binop
(
mode
,
this_optab
,
value
,
op1
,
op1
=
expand_binop
(
mode
,
this_optab
,
value
,
op1
,
current_function_check_memory_usage
?
NULL_RTX
:
op0
,
current_function_check_memory_usage
?
NULL_RTX
:
op0
,
TREE_UNSIGNED
(
TREE_TYPE
(
exp
)),
OPTAB_LIB_WIDEN
);
TREE_UNSIGNED
(
TREE_TYPE
(
exp
)),
OPTAB_LIB_WIDEN
);
/* Make sure the value is stored into OP0. */
/* Make sure the value is stored into OP0. */
if
(
op1
!=
op0
)
if
(
op1
!=
op0
)
...
@@ -9163,7 +9158,7 @@ preexpand_calls (exp)
...
@@ -9163,7 +9158,7 @@ preexpand_calls (exp)
case
SAVE_EXPR
:
case
SAVE_EXPR
:
if
(
SAVE_EXPR_RTL
(
exp
)
!=
0
)
if
(
SAVE_EXPR_RTL
(
exp
)
!=
0
)
return
;
return
;
default
:
default
:
break
;
break
;
}
}
...
@@ -9602,7 +9597,7 @@ do_jump (exp, if_false_label, if_true_label)
...
@@ -9602,7 +9597,7 @@ do_jump (exp, if_false_label, if_true_label)
cmp
=
UNORDERED
,
rcmp
=
ORDERED
;
cmp
=
UNORDERED
,
rcmp
=
ORDERED
;
else
else
cmp
=
ORDERED
,
rcmp
=
UNORDERED
;
cmp
=
ORDERED
,
rcmp
=
UNORDERED
;
mode
=
TYPE_MODE
(
TREE_TYPE
(
TREE_OPERAND
(
exp
,
0
)));
mode
=
TYPE_MODE
(
TREE_TYPE
(
TREE_OPERAND
(
exp
,
0
)));
do_rev
=
0
;
do_rev
=
0
;
if
(
!
can_compare_p
(
cmp
,
mode
,
ccp_jump
)
if
(
!
can_compare_p
(
cmp
,
mode
,
ccp_jump
)
...
@@ -9655,7 +9650,7 @@ do_jump (exp, if_false_label, if_true_label)
...
@@ -9655,7 +9650,7 @@ do_jump (exp, if_false_label, if_true_label)
tree
op1
=
save_expr
(
TREE_OPERAND
(
exp
,
1
));
tree
op1
=
save_expr
(
TREE_OPERAND
(
exp
,
1
));
tree
cmp0
,
cmp1
;
tree
cmp0
,
cmp1
;
/* If the target doesn't support combined unordered
/* If the target doesn't support combined unordered
compares, decompose into UNORDERED + comparison. */
compares, decompose into UNORDERED + comparison. */
cmp0
=
fold
(
build
(
UNORDERED_EXPR
,
TREE_TYPE
(
exp
),
op0
,
op1
));
cmp0
=
fold
(
build
(
UNORDERED_EXPR
,
TREE_TYPE
(
exp
),
op0
,
op1
));
cmp1
=
fold
(
build
(
tcode2
,
TREE_TYPE
(
exp
),
op0
,
op1
));
cmp1
=
fold
(
build
(
tcode2
,
TREE_TYPE
(
exp
),
op0
,
op1
));
...
@@ -9934,7 +9929,7 @@ compare_from_rtx (op0, op1, code, unsignedp, mode, size, align)
...
@@ -9934,7 +9929,7 @@ compare_from_rtx (op0, op1, code, unsignedp, mode, size, align)
unsignedp = 1;
unsignedp = 1;
}
}
#endif
#endif
emit_cmp_insn
(
op0
,
op1
,
code
,
size
,
mode
,
unsignedp
,
align
);
emit_cmp_insn
(
op0
,
op1
,
code
,
size
,
mode
,
unsignedp
,
align
);
return
gen_rtx_fmt_ee
(
code
,
VOIDmode
,
cc0_rtx
,
const0_rtx
);
return
gen_rtx_fmt_ee
(
code
,
VOIDmode
,
cc0_rtx
,
const0_rtx
);
...
@@ -10350,7 +10345,7 @@ do_store_flag (exp, target, mode, only_cheap)
...
@@ -10350,7 +10345,7 @@ do_store_flag (exp, target, mode, only_cheap)
else
else
return
0
;
return
0
;
}
}
preexpand_calls
(
exp
);
preexpand_calls
(
exp
);
if
(
!
get_subtarget
(
target
)
if
(
!
get_subtarget
(
target
)
||
GET_MODE
(
subtarget
)
!=
operand_mode
||
GET_MODE
(
subtarget
)
!=
operand_mode
...
@@ -10479,4 +10474,4 @@ do_tablejump (index, mode, range, table_label, default_label)
...
@@ -10479,4 +10474,4 @@ do_tablejump (index, mode, range, table_label, default_label)
emit_barrier
();
emit_barrier
();
}
}
#endif
/* HAVE_tablejump */
#endif
/* HAVE_tablejump
*/
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment