Turn TRULY_NOOP_TRUNCATION into a hook

I'm not sure the documentation is correct that outprec is always less
than inprec, and each non-default implementation tested for the case
in which it wasn't, but the patch leaves it as-is.

The SH port had a couple of TRULY_NOOP_TRUNCATION tests that were left
over from the old shmedia port.

2017-09-13  Richard Sandiford  <richard.sandiford@linaro.org>
	    Alan Hayard  <alan.hayward@arm.com>
	    David Sherwood  <david.sherwood@arm.com>

gcc/
	* target.def (truly_noop_truncation): New hook.
	(mode_rep_extended): Refer to TARGET_TRULY_NOOP_TRUNCATION rather
	than TRULY_NOOP_TRUNCATION.
	* hooks.h (hook_bool_uint_uint_true): Declare.
	* hooks.c (hook_bool_uint_uint_true): New function.
	* doc/tm.texi.in (TRULY_NOOP_TRUNCATION): Replace with...
	(TARGET_TRULY_NOOP_TRUNCATION): ...this.
	* doc/tm.texi: Regenerate.
	* combine.c (make_extraction): Refer to TARGET_TRULY_NOOP_TRUNCATION
	rather than TRULY_NOOP_TRUNCATION in comments.
	(simplify_comparison): Likewise.
	(record_truncated_value): Likewise.
	* expmed.c (extract_bit_field_1): Likewise.
	(extract_split_bit_field): Likewise.
	* convert.c (convert_to_integer_1): Use targetm.truly_noop_truncation
	instead of TRULY_NOOP_TRUNCATION.
	* function.c (assign_parm_setup_block): Likewise.
	* machmode.h (TRULY_NOOP_TRUNCATION_MODES_P): Likewise.
	* rtlhooks.c: Include target.h.
	* config/aarch64/aarch64.h (TRULY_NOOP_TRUNCATION): Delete.
	* config/alpha/alpha.h (TRULY_NOOP_TRUNCATION): Delete.
	* config/arc/arc.h (TRULY_NOOP_TRUNCATION): Delete.
	* config/arm/arm.h (TRULY_NOOP_TRUNCATION): Delete.
	* config/avr/avr.h (TRULY_NOOP_TRUNCATION): Delete.
	* config/bfin/bfin.h (TRULY_NOOP_TRUNCATION): Delete.
	* config/c6x/c6x.h (TRULY_NOOP_TRUNCATION): Delete.
	* config/cr16/cr16.h (TRULY_NOOP_TRUNCATION): Delete.
	* config/cris/cris.h (TRULY_NOOP_TRUNCATION): Delete.
	* config/epiphany/epiphany.h (TRULY_NOOP_TRUNCATION): Delete.
	* config/fr30/fr30.h (TRULY_NOOP_TRUNCATION): Delete.
	* config/frv/frv.h (TRULY_NOOP_TRUNCATION): Delete.
	* config/ft32/ft32.h (TRULY_NOOP_TRUNCATION): Delete.
	* config/h8300/h8300.h (TRULY_NOOP_TRUNCATION): Delete.
	* config/i386/i386.h (TRULY_NOOP_TRUNCATION): Delete.
	* config/ia64/ia64.h (TRULY_NOOP_TRUNCATION): Delete.
	* config/iq2000/iq2000.h (TRULY_NOOP_TRUNCATION): Delete.
	* config/lm32/lm32.h (TRULY_NOOP_TRUNCATION): Delete.
	* config/m32c/m32c.h (TRULY_NOOP_TRUNCATION): Delete.
	* config/m32r/m32r.h (TRULY_NOOP_TRUNCATION): Delete.
	* config/m68k/m68k.h (TRULY_NOOP_TRUNCATION): Delete.
	* config/mcore/mcore.h (TRULY_NOOP_TRUNCATION): Delete.
	* config/microblaze/microblaze.h (TRULY_NOOP_TRUNCATION): Delete.
	* config/mips/mips.h (TRULY_NOOP_TRUNCATION): Delete.
	* config/mips/mips.c (mips_truly_noop_truncation): New function.
	(TARGET_TRULY_NOOP_TRUNCATION): Redefine.
	* config/mips/mips.md: Refer to TARGET_TRULY_NOOP_TRUNCATION
	rather than TRULY_NOOP_TRUNCATION in comments.
	* config/mmix/mmix.h (TRULY_NOOP_TRUNCATION): Delete.
	* config/mn10300/mn10300.h (TRULY_NOOP_TRUNCATION): Delete.
	* config/moxie/moxie.h (TRULY_NOOP_TRUNCATION): Delete.
	* config/msp430/msp430.h (TRULY_NOOP_TRUNCATION): Delete.
	* config/nds32/nds32.h (TRULY_NOOP_TRUNCATION): Delete.
	* config/nios2/nios2.h (TRULY_NOOP_TRUNCATION): Delete.
	* config/nvptx/nvptx.h (TRULY_NOOP_TRUNCATION): Delete.
	* config/pa/pa.h (TRULY_NOOP_TRUNCATION): Delete.
	* config/pdp11/pdp11.h (TRULY_NOOP_TRUNCATION): Delete.
	* config/powerpcspe/powerpcspe.h (TRULY_NOOP_TRUNCATION): Delete.
	* config/riscv/riscv.h (TRULY_NOOP_TRUNCATION): Delete.
	* config/riscv/riscv.md: Refer to TARGET_TRULY_NOOP_TRUNCATION
	rather than TRULY_NOOP_TRUNCATION in comments.
	* config/rl78/rl78.h (TRULY_NOOP_TRUNCATION): Delete.
	* config/rs6000/rs6000.h (TRULY_NOOP_TRUNCATION): Delete.
	* config/rx/rx.h (TRULY_NOOP_TRUNCATION): Delete.
	* config/s390/s390.h (TRULY_NOOP_TRUNCATION): Delete.
	* config/sh/sh.h (MAYBE_BASE_REGISTER_RTX_P): Remove
	TRULY_NOOP_TRUNCATION condition.
	(MAYBE_INDEX_REGISTER_RTX_P): Likewise.
	(TRULY_NOOP_TRUNCATION): Delete.
	* config/sparc/sparc.h (TRULY_NOOP_TRUNCATION): Delete.
	* config/spu/spu.h (TRULY_NOOP_TRUNCATION): Delete.
	* config/spu/spu.c (spu_truly_noop_truncation): New function.
	(TARGET_TRULY_NOOP_TRUNCATION): Redefine.
	* config/stormy16/stormy16.h (TRULY_NOOP_TRUNCATION): Delete.
	* config/tilegx/tilegx.h (TRULY_NOOP_TRUNCATION): Delete.
	* config/tilegx/tilegx.c (tilegx_truly_noop_truncation): New fuction.
	(TARGET_TRULY_NOOP_TRUNCATION): Redefine.
	* config/tilegx/tilegx.md: Refer to TARGET_TRULY_NOOP_TRUNCATION
	rather than TRULY_NOOP_TRUNCATION in comments.
	* config/tilepro/tilepro.h (TRULY_NOOP_TRUNCATION): Delete.
	* config/v850/v850.h (TRULY_NOOP_TRUNCATION): Delete.
	* config/vax/vax.h (TRULY_NOOP_TRUNCATION): Delete.
	* config/visium/visium.h (TRULY_NOOP_TRUNCATION): Delete.
	* config/xtensa/xtensa.h (TRULY_NOOP_TRUNCATION): Delete.
	* system.h (TRULY_NOOP_TRUNCATION): Poison.

Co-Authored-By: Alan Hayward <alan.hayward@arm.com>
Co-Authored-By: David Sherwood <david.sherwood@arm.com>

From-SVN: r252818
This commit is contained in:
Richard Sandiford 2017-09-15 13:47:41 +00:00 committed by Richard Sandiford
parent a75c63e02a
commit bb149ca2e9
68 changed files with 180 additions and 236 deletions

View file

@ -1,3 +1,92 @@
2017-09-15 Richard Sandiford <richard.sandiford@linaro.org>
Alan Hayard <alan.hayward@arm.com>
David Sherwood <david.sherwood@arm.com>
* target.def (truly_noop_truncation): New hook.
(mode_rep_extended): Refer to TARGET_TRULY_NOOP_TRUNCATION rather
than TRULY_NOOP_TRUNCATION.
* hooks.h (hook_bool_uint_uint_true): Declare.
* hooks.c (hook_bool_uint_uint_true): New function.
* doc/tm.texi.in (TRULY_NOOP_TRUNCATION): Replace with...
(TARGET_TRULY_NOOP_TRUNCATION): ...this.
* doc/tm.texi: Regenerate.
* combine.c (make_extraction): Refer to TARGET_TRULY_NOOP_TRUNCATION
rather than TRULY_NOOP_TRUNCATION in comments.
(simplify_comparison): Likewise.
(record_truncated_value): Likewise.
* expmed.c (extract_bit_field_1): Likewise.
(extract_split_bit_field): Likewise.
* convert.c (convert_to_integer_1): Use targetm.truly_noop_truncation
instead of TRULY_NOOP_TRUNCATION.
* function.c (assign_parm_setup_block): Likewise.
* machmode.h (TRULY_NOOP_TRUNCATION_MODES_P): Likewise.
* rtlhooks.c: Include target.h.
* config/aarch64/aarch64.h (TRULY_NOOP_TRUNCATION): Delete.
* config/alpha/alpha.h (TRULY_NOOP_TRUNCATION): Delete.
* config/arc/arc.h (TRULY_NOOP_TRUNCATION): Delete.
* config/arm/arm.h (TRULY_NOOP_TRUNCATION): Delete.
* config/avr/avr.h (TRULY_NOOP_TRUNCATION): Delete.
* config/bfin/bfin.h (TRULY_NOOP_TRUNCATION): Delete.
* config/c6x/c6x.h (TRULY_NOOP_TRUNCATION): Delete.
* config/cr16/cr16.h (TRULY_NOOP_TRUNCATION): Delete.
* config/cris/cris.h (TRULY_NOOP_TRUNCATION): Delete.
* config/epiphany/epiphany.h (TRULY_NOOP_TRUNCATION): Delete.
* config/fr30/fr30.h (TRULY_NOOP_TRUNCATION): Delete.
* config/frv/frv.h (TRULY_NOOP_TRUNCATION): Delete.
* config/ft32/ft32.h (TRULY_NOOP_TRUNCATION): Delete.
* config/h8300/h8300.h (TRULY_NOOP_TRUNCATION): Delete.
* config/i386/i386.h (TRULY_NOOP_TRUNCATION): Delete.
* config/ia64/ia64.h (TRULY_NOOP_TRUNCATION): Delete.
* config/iq2000/iq2000.h (TRULY_NOOP_TRUNCATION): Delete.
* config/lm32/lm32.h (TRULY_NOOP_TRUNCATION): Delete.
* config/m32c/m32c.h (TRULY_NOOP_TRUNCATION): Delete.
* config/m32r/m32r.h (TRULY_NOOP_TRUNCATION): Delete.
* config/m68k/m68k.h (TRULY_NOOP_TRUNCATION): Delete.
* config/mcore/mcore.h (TRULY_NOOP_TRUNCATION): Delete.
* config/microblaze/microblaze.h (TRULY_NOOP_TRUNCATION): Delete.
* config/mips/mips.h (TRULY_NOOP_TRUNCATION): Delete.
* config/mips/mips.c (mips_truly_noop_truncation): New function.
(TARGET_TRULY_NOOP_TRUNCATION): Redefine.
* config/mips/mips.md: Refer to TARGET_TRULY_NOOP_TRUNCATION
rather than TRULY_NOOP_TRUNCATION in comments.
* config/mmix/mmix.h (TRULY_NOOP_TRUNCATION): Delete.
* config/mn10300/mn10300.h (TRULY_NOOP_TRUNCATION): Delete.
* config/moxie/moxie.h (TRULY_NOOP_TRUNCATION): Delete.
* config/msp430/msp430.h (TRULY_NOOP_TRUNCATION): Delete.
* config/nds32/nds32.h (TRULY_NOOP_TRUNCATION): Delete.
* config/nios2/nios2.h (TRULY_NOOP_TRUNCATION): Delete.
* config/nvptx/nvptx.h (TRULY_NOOP_TRUNCATION): Delete.
* config/pa/pa.h (TRULY_NOOP_TRUNCATION): Delete.
* config/pdp11/pdp11.h (TRULY_NOOP_TRUNCATION): Delete.
* config/powerpcspe/powerpcspe.h (TRULY_NOOP_TRUNCATION): Delete.
* config/riscv/riscv.h (TRULY_NOOP_TRUNCATION): Delete.
* config/riscv/riscv.md: Refer to TARGET_TRULY_NOOP_TRUNCATION
rather than TRULY_NOOP_TRUNCATION in comments.
* config/rl78/rl78.h (TRULY_NOOP_TRUNCATION): Delete.
* config/rs6000/rs6000.h (TRULY_NOOP_TRUNCATION): Delete.
* config/rx/rx.h (TRULY_NOOP_TRUNCATION): Delete.
* config/s390/s390.h (TRULY_NOOP_TRUNCATION): Delete.
* config/sh/sh.h (MAYBE_BASE_REGISTER_RTX_P): Remove
TRULY_NOOP_TRUNCATION condition.
(MAYBE_INDEX_REGISTER_RTX_P): Likewise.
(TRULY_NOOP_TRUNCATION): Delete.
* config/sparc/sparc.h (TRULY_NOOP_TRUNCATION): Delete.
* config/spu/spu.h (TRULY_NOOP_TRUNCATION): Delete.
* config/spu/spu.c (spu_truly_noop_truncation): New function.
(TARGET_TRULY_NOOP_TRUNCATION): Redefine.
* config/stormy16/stormy16.h (TRULY_NOOP_TRUNCATION): Delete.
* config/tilegx/tilegx.h (TRULY_NOOP_TRUNCATION): Delete.
* config/tilegx/tilegx.c (tilegx_truly_noop_truncation): New fuction.
(TARGET_TRULY_NOOP_TRUNCATION): Redefine.
* config/tilegx/tilegx.md: Refer to TARGET_TRULY_NOOP_TRUNCATION
rather than TRULY_NOOP_TRUNCATION in comments.
* config/tilepro/tilepro.h (TRULY_NOOP_TRUNCATION): Delete.
* config/v850/v850.h (TRULY_NOOP_TRUNCATION): Delete.
* config/vax/vax.h (TRULY_NOOP_TRUNCATION): Delete.
* config/visium/visium.h (TRULY_NOOP_TRUNCATION): Delete.
* config/xtensa/xtensa.h (TRULY_NOOP_TRUNCATION): Delete.
* system.h (TRULY_NOOP_TRUNCATION): Poison.
2017-09-15 Christophe Lyon <christophe.lyon@linaro.org>
PR target/67591

View file

@ -7721,7 +7721,7 @@ make_extraction (machine_mode mode, rtx inner, HOST_WIDE_INT pos,
else if (!MEM_P (inner))
{
/* On the LHS, don't create paradoxical subregs implicitely truncating
the register unless TRULY_NOOP_TRUNCATION. */
the register unless TARGET_TRULY_NOOP_TRUNCATION. */
if (in_dest
&& !TRULY_NOOP_TRUNCATION_MODES_P (GET_MODE (inner),
wanted_inner_mode))
@ -12499,7 +12499,7 @@ simplify_comparison (enum rtx_code code, rtx *pop0, rtx *pop1)
(ne:DI (and:DI (reg:DI 4) (const_int 0xffffffff)) (const_int 0))
-> (ne:DI (reg:SI 4) (const_int 0))
unless TRULY_NOOP_TRUNCATION allows it or the register is
unless TARGET_TRULY_NOOP_TRUNCATION allows it or the register is
known to hold a value of the required mode the
transformation is invalid. */
if ((equality_comparison_p || unsigned_comparison_p)
@ -13339,8 +13339,8 @@ reg_truncated_to_mode (machine_mode mode, const_rtx x)
}
/* If X is a hard reg or a subreg record the mode that the register is
accessed in. For non-TRULY_NOOP_TRUNCATION targets we might be able
to turn a truncate into a subreg using this information. Return true
accessed in. For non-TARGET_TRULY_NOOP_TRUNCATION targets we might be
able to turn a truncate into a subreg using this information. Return true
if traversing X is complete. */
static bool

View file

@ -773,8 +773,6 @@ typedef struct
if we don't have to, for power-saving reasons. */
#define SLOW_BYTE_ACCESS 0
#define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1
#define NO_FUNCTION_CSE 1
/* Specify the machine mode that the hardware addresses have.

View file

@ -800,10 +800,6 @@ do { \
/* Define if loading short immediate values into registers sign extends. */
#define SHORT_IMMEDIATES_SIGN_EXTEND 1
/* Value is 1 if truncating an integer of INPREC bits to OUTPREC bits
is done just by pretending it is already truncated. */
#define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1
/* The CIX ctlz and cttz instructions return 64 for zero. */
#define CLZ_DEFINED_VALUE_AT_ZERO(MODE, VALUE) ((VALUE) = 64, \
TARGET_CIX ? 1 : 0)

View file

@ -1449,10 +1449,6 @@ do { \
*/
#define SHIFT_COUNT_TRUNCATED 1
/* Value is 1 if truncating an integer of INPREC bits to OUTPREC bits
is done just by pretending it is already truncated. */
#define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1
/* We assume that the store-condition-codes instructions store 0 for false
and some other value for true. This is the value stored for true. */
#define STORE_FLAG_VALUE 1

View file

@ -1897,9 +1897,6 @@ enum arm_auto_incmodes
rotates is modulo 32 used. */
/* #define SHIFT_COUNT_TRUNCATED 1 */
/* All integers have the same format so truncation is easy. */
#define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1
/* Calling from registers is a massive pain. */
#define NO_FUNCTION_CSE 1

View file

@ -471,8 +471,6 @@ typedef struct avr_args
#define MOVE_RATIO(speed) ((speed) ? 3 : 2)
#define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1
#define Pmode HImode
#define FUNCTION_MODE HImode

View file

@ -799,10 +799,6 @@ typedef struct {
#define NOTICE_UPDATE_CC(EXPR, INSN) 0
/* Value is 1 if truncating an integer of INPREC bits to OUTPREC bits
is done just by pretending it is already truncated. */
#define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1
/* Max number of bytes we can move from memory to memory
in one reasonably fast instruction. */
#define MOVE_MAX UNITS_PER_WORD

View file

@ -596,7 +596,6 @@ do { \
#define CASE_VECTOR_MODE SImode
#define MOVE_MAX 4
#define MOVE_RATIO(SPEED) 4
#define TRULY_NOOP_TRUNCATION(outprec, inprec) 1
#define CLZ_DEFINED_VALUE_AT_ZERO(MODE, VALUE) ((VALUE) = 32, 1)
#define Pmode SImode
#define FUNCTION_MODE QImode

View file

@ -551,8 +551,6 @@ struct cumulative_args
#define MOVE_MAX 4
#define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1
#define STORE_FLAG_VALUE 1
#define Pmode SImode

View file

@ -1038,8 +1038,6 @@ enum cris_symbol_type
/* Maybe SHIFT_COUNT_TRUNCATED is safe to define? FIXME: Check later. */
#define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1
#define CLZ_DEFINED_VALUE_AT_ZERO(MODE, VALUE) ((VALUE) = 32, 1)
#define CTZ_DEFINED_VALUE_AT_ZERO(MODE, VALUE) ((VALUE) = 32, 1)

View file

@ -840,10 +840,6 @@ do \
few bits. */
#define SHIFT_COUNT_TRUNCATED 1
/* Value is 1 if truncating an integer of INPREC bits to OUTPREC bits
is done just by pretending it is already truncated. */
#define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1
/* Specify the machine mode that pointers have.
After generation of rtl, the compiler makes no further distinction
between pointers and any other objects of this machine mode. */

View file

@ -776,18 +776,6 @@ fprintf (STREAM, "\t.word .L%d\n", VALUE)
memory to memory. */
#define MOVE_MAX 8
/* A C expression which is nonzero if on this machine it is safe to "convert"
an integer of INPREC bits to one of OUTPREC bits (where OUTPREC is smaller
than INPREC) by merely operating on it as if it had only OUTPREC bits.
On many machines, this expression can be 1.
When `TRULY_NOOP_TRUNCATION' returns 1 for a pair of sizes for modes for
which `TARGET_MODES_TIEABLE_P' is 0, suboptimal code can result.
If this is the case, making `TRULY_NOOP_TRUNCATION' return 0 in such
cases may improve things. */
#define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1
/* An alias for the machine mode for pointers. On most machines, define this
to be the integer mode corresponding to the width of a hardware pointer;
`SImode' on 32-bit machine or `DImode' on 64-bit machines. On some machines

View file

@ -1813,18 +1813,6 @@ fprintf (STREAM, "\t.word .L%d\n", VALUE)
memory to memory. */
#define MOVE_MAX 8
/* A C expression which is nonzero if on this machine it is safe to "convert"
an integer of INPREC bits to one of OUTPREC bits (where OUTPREC is smaller
than INPREC) by merely operating on it as if it had only OUTPREC bits.
On many machines, this expression can be 1.
When `TRULY_NOOP_TRUNCATION' returns 1 for a pair of sizes for modes
for which `TARGET_MODES_TIEABLE_P' is 0, suboptimal code can result.
If this is the case, making `TRULY_NOOP_TRUNCATION' return 0 in such
cases may improve things. */
#define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1
/* An alias for the machine mode for pointers. On most machines, define this
to be the integer mode corresponding to the width of a hardware pointer;
`SImode' on 32-bit machine or `DImode' on 64-bit machines. On some machines

View file

@ -449,7 +449,6 @@ do { \
quickly between memory and registers or between two memory
locations. */
#define MOVE_MAX 4
#define TRULY_NOOP_TRUNCATION(op,ip) 1
/* Define this to be nonzero if shift instructions ignore all but the low-order
few bits. */

View file

@ -561,10 +561,6 @@ struct cum_arg
of a shift count. */
/* #define SHIFT_COUNT_TRUNCATED */
/* Value is 1 if truncating an integer of INPREC bits to OUTPREC bits
is done just by pretending it is already truncated. */
#define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1
/* Specify the machine mode that pointers have.
After generation of rtl, the compiler makes no further distinction
between pointers and any other objects of this machine mode. */

View file

@ -1911,10 +1911,6 @@ typedef struct ix86_args {
/* #define SHIFT_COUNT_TRUNCATED */
/* Value is 1 if truncating an integer of INPREC bits to OUTPREC bits
is done just by pretending it is already truncated. */
#define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1
/* A macro to update M and UNSIGNEDP when an object whose type is
TYPE and which has the specified mode and signedness is to be
stored in a register. This macro is only called when TYPE is a

View file

@ -1567,12 +1567,6 @@ do { \
memory to memory. */
#define MOVE_MAX 8
/* A C expression which is nonzero if on this machine it is safe to "convert"
an integer of INPREC bits to one of OUTPREC bits (where OUTPREC is smaller
than INPREC) by merely operating on it as if it had only OUTPREC bits. */
#define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1
/* A C expression describing the value returned by a comparison operator with
an integral mode and stored by a store-flag instruction (`sCOND') when the
condition is true. */

View file

@ -526,8 +526,6 @@ while (0)
#define SHIFT_COUNT_TRUNCATED 1
#define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1
#define STORE_FLAG_VALUE 1
#define Pmode SImode

View file

@ -519,8 +519,6 @@ do { \
#define SHIFT_COUNT_TRUNCATED 1
#define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1
#define Pmode SImode
#define FUNCTION_MODE SImode

View file

@ -629,7 +629,6 @@ typedef struct m32c_cumulative_args
#define LOAD_EXTEND_OP(MEM) ZERO_EXTEND
#define MOVE_MAX 4
#define TRULY_NOOP_TRUNCATION(op,ip) 1
#define STORE_FLAG_VALUE 1

View file

@ -981,10 +981,6 @@ L2: .word STATIC
few bits. */
#define SHIFT_COUNT_TRUNCATED 1
/* Value is 1 if truncating an integer of INPREC bits to OUTPREC bits
is done just by pretending it is already truncated. */
#define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1
/* Specify the machine mode that pointers have.
After generation of rtl, the compiler makes no further distinction
between pointers and any other objects of this machine mode. */

View file

@ -665,8 +665,6 @@ __transfer_from_trampoline () \
#define MOVE_MAX 4
#define SLOW_BYTE_ACCESS 0
#define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1
/* The 68020 BFFFO and ColdFire FF1 instructions return 32 for zero. */
#define CLZ_DEFINED_VALUE_AT_ZERO(MODE, VALUE) ((VALUE) = 32, 1)

View file

@ -549,9 +549,6 @@ extern const enum reg_class regno_reg_class[FIRST_PSEUDO_REGISTER];
target. */
#define SHIFT_COUNT_TRUNCATED 0
/* All integers have the same format so truncation is easy. */
#define TRULY_NOOP_TRUNCATION(OUTPREC,INPREC) 1
/* Define this if addresses of constant functions
shouldn't be put through pseudo regs where they can be cse'd.
Desirable on machines where ordinary constants are expensive

View file

@ -554,11 +554,6 @@ typedef struct microblaze_args
#define SHIFT_COUNT_TRUNCATED 1
/* This results in inefficient code for 64 bit to 32 conversions.
Something needs to be done about this. Perhaps not use any 32 bit
instructions? Perhaps use PROMOTE_MODE? */
#define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1
#define Pmode SImode
#define FUNCTION_MODE SImode

View file

@ -22328,6 +22328,14 @@ mips_promote_function_mode (const_tree type ATTRIBUTE_UNUSED,
*punsignedp = unsignedp;
return mode;
}
/* Implement TARGET_TRULY_NOOP_TRUNCATION. */
static bool
mips_truly_noop_truncation (unsigned int outprec, unsigned int inprec)
{
return !TARGET_64BIT || inprec <= 32 || outprec > 32;
}
/* Initialize the GCC target structure. */
#undef TARGET_ASM_ALIGNED_HI_OP
@ -22623,6 +22631,9 @@ mips_promote_function_mode (const_tree type ATTRIBUTE_UNUSED,
#undef TARGET_CAN_CHANGE_MODE_CLASS
#define TARGET_CAN_CHANGE_MODE_CLASS mips_can_change_mode_class
#undef TARGET_TRULY_NOOP_TRUNCATION
#define TARGET_TRULY_NOOP_TRUNCATION mips_truly_noop_truncation
struct gcc_target targetm = TARGET_INITIALIZER;
#include "gt-mips.h"

View file

@ -2658,11 +2658,6 @@ typedef struct mips_args {
do not truncate the shift amount at all. */
#define SHIFT_COUNT_TRUNCATED (!TARGET_LOONGSON_VECTORS)
/* Value is 1 if truncating an integer of INPREC bits to OUTPREC bits
is done just by pretending it is already truncated. */
#define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) \
(TARGET_64BIT ? ((INPREC) <= 32 || (OUTPREC) > 32) : 1)
/* Specify the machine mode that pointers have.
After generation of rtl, the compiler makes no further distinction

View file

@ -3242,9 +3242,9 @@
(match_operand:GPR 2 "and_reg_operand")))])
;; The middle-end is not allowed to convert ANDing with 0xffff_ffff into a
;; zero_extendsidi2 because of TRULY_NOOP_TRUNCATION, so handle these here.
;; Note that this variant does not trigger for SI mode because we require
;; a 64-bit HOST_WIDE_INT and 0xffff_ffff wouldn't be a canonical
;; zero_extendsidi2 because of TARGET_TRULY_NOOP_TRUNCATION, so handle these
;; here. Note that this variant does not trigger for SI mode because we
;; require a 64-bit HOST_WIDE_INT and 0xffff_ffff wouldn't be a canonical
;; sign-extended SImode value.
;;
;; These are possible combinations for operand 1 and 2. The table
@ -3426,7 +3426,7 @@
;; modes is a no-op, as it is for most other GCC ports. Truncating
;; DImode values to SImode is not a no-op for TARGET_64BIT since we
;; need to make sure that the lower 32 bits are properly sign-extended
;; (see TRULY_NOOP_TRUNCATION). Truncating DImode values into modes
;; (see TARGET_TRULY_NOOP_TRUNCATION). Truncating DImode values into modes
;; smaller than SImode is equivalent to two separate truncations:
;;
;; A B
@ -3644,7 +3644,7 @@
;; Those for integer source operand are ordered widest source type first.
;; When TARGET_64BIT, all SImode integer and accumulator registers
;; should already be in sign-extended form (see TRULY_NOOP_TRUNCATION
;; should already be in sign-extended form (see TARGET_TRULY_NOOP_TRUNCATION
;; and truncdisi2). We can therefore get rid of register->register
;; instructions if we constrain the source to be in the same register as
;; the destination.

View file

@ -788,8 +788,6 @@ typedef struct { int regs; int lib; } CUMULATIVE_ARGS;
#define MOVE_MAX 8
#define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1
/* ??? MMIX allows a choice of STORE_FLAG_VALUE. Revisit later,
we don't have scc expanders yet. */

View file

@ -691,10 +691,6 @@ do { \
of a shift count. */
#define SHIFT_COUNT_TRUNCATED 1
/* Value is 1 if truncating an integer of INPREC bits to OUTPREC bits
is done just by pretending it is already truncated. */
#define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1
/* Specify the machine mode that pointers have.
After generation of rtl, the compiler makes no further distinction
between pointers and any other objects of this machine mode. */

View file

@ -409,7 +409,6 @@ enum reg_class
quickly between memory and registers or between two memory
locations. */
#define MOVE_MAX 4
#define TRULY_NOOP_TRUNCATION(op,ip) 1
/* All load operations zero extend. */
#define LOAD_EXTEND_OP(MEM) ZERO_EXTEND
@ -418,8 +417,6 @@ enum reg_class
valid memory address. */
#define MAX_REGS_PER_ADDRESS 1
#define TRULY_NOOP_TRUNCATION(op,ip) 1
/* An alias for a machine mode name. This is the machine mode that
elements of a jump-table should have. */
#define CASE_VECTOR_MODE SImode

View file

@ -204,8 +204,6 @@ extern const char * msp430_select_hwmult_lib (int, const char **);
#define RETURN_ADDR_RTX(COUNT, FA) \
msp430_return_addr_rtx (COUNT)
#define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1
#define SLOW_BYTE_ACCESS 0

View file

@ -998,11 +998,6 @@ enum reg_class
of bits needed to represent the size of the object being shifted. */
#define SHIFT_COUNT_TRUNCATED 1
/* A C expression which is nonzero if on this machine it is safe to "convert"
an integer of 'inprec' bits to one of 'outprec' bits by merely operating
on it as if it had only 'outprec' bits. */
#define TRULY_NOOP_TRUNCATION(outprec, inprec) 1
/* A C expression describing the value returned by a comparison operator with
an integral mode and stored by a store-flag instruction ('cstoremode4')
when the condition is true. */

View file

@ -515,8 +515,6 @@ do { \
#define CASE_VECTOR_MODE Pmode
#define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1
#define LOAD_EXTEND_OP(MODE) (ZERO_EXTEND)
#define WORD_REGISTER_OPERATIONS 1

View file

@ -310,7 +310,6 @@ struct GTY(()) machine_function
#define CASE_VECTOR_MODE SImode
#define MOVE_MAX 8
#define MOVE_RATIO(SPEED) 4
#define TRULY_NOOP_TRUNCATION(outprec, inprec) 1
#define FUNCTION_MODE QImode
#define HAS_INIT_SECTION 1

View file

@ -1019,10 +1019,6 @@ do { \
/* Nonzero if access to memory by bytes is slow and undesirable. */
#define SLOW_BYTE_ACCESS 1
/* Value is 1 if truncating an integer of INPREC bits to OUTPREC bits
is done just by pretending it is already truncated. */
#define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1
/* Specify the machine mode that pointers have.
After generation of rtl, the compiler makes no further distinction
between pointers and any other objects of this machine mode. */

View file

@ -432,10 +432,6 @@ extern int may_call_alloca;
/* Do not break .stabs pseudos into continuations. */
#define DBX_CONTIN_LENGTH 0
/* Value is 1 if truncating an integer of INPREC bits to OUTPREC bits
is done just by pretending it is already truncated. */
#define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1
/* Give a comparison code (EQ, NE etc) and the first operand of a COMPARE,
return the mode to be used for the comparison. For floating-point, CCFPmode
should be used. */

View file

@ -2108,10 +2108,6 @@ do { \
/* Define if loading short immediate values into registers sign extends. */
#define SHORT_IMMEDIATES_SIGN_EXTEND 1
/* Value is 1 if truncating an integer of INPREC bits to OUTPREC bits
is done just by pretending it is already truncated. */
#define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1
/* The cntlzw and cntlzd instructions return 32 and 64 for input of zero. */
#define CLZ_DEFINED_VALUE_AT_ZERO(MODE, VALUE) \
((VALUE) = GET_MODE_BITSIZE (MODE), 2)

View file

@ -637,8 +637,6 @@ typedef struct {
#define SHIFT_COUNT_TRUNCATED 1
#define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1
/* Specify the machine mode that pointers have.
After generation of rtl, the compiler makes no further distinction
between pointers and any other objects of this machine mode. */

View file

@ -1307,7 +1307,8 @@
(set_attr "mode" "HI")])
;; HImode constant generation; see riscv_move_integer for details.
;; si+si->hi without truncation is legal because of TRULY_NOOP_TRUNCATION.
;; si+si->hi without truncation is legal because of
;; TARGET_TRULY_NOOP_TRUNCATION.
(define_insn "*add<mode>hi3"
[(set (match_operand:HI 0 "register_operand" "=r,r")

View file

@ -151,8 +151,6 @@
#define MOVE_MAX 2
#define STARTING_FRAME_OFFSET 0
#define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1
#define ADDR_SPACE_NEAR 1
#define ADDR_SPACE_FAR 2

View file

@ -2006,10 +2006,6 @@ do { \
/* Define if loading short immediate values into registers sign extends. */
#define SHORT_IMMEDIATES_SIGN_EXTEND 1
/* Value is 1 if truncating an integer of INPREC bits to OUTPREC bits
is done just by pretending it is already truncated. */
#define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1
/* The cntlzw and cntlzd instructions return 32 and 64 for input of zero. */
#define CLZ_DEFINED_VALUE_AT_ZERO(MODE, VALUE) \
((VALUE) = GET_MODE_BITSIZE (MODE), 2)

View file

@ -171,8 +171,6 @@
#define MOVE_MAX 4
#define STARTING_FRAME_OFFSET 0
#define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1
#define HAVE_PRE_DECREMENT 1
#define HAVE_POST_INCREMENT 1

View file

@ -963,10 +963,6 @@ do { \
tablejump instruction. */
#define CASE_VECTOR_MODE (TARGET_64BIT ? DImode : SImode)
/* Value is 1 if truncating an integer of INPREC bits to OUTPREC bits
is done just by pretending it is already truncated. */
#define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1
/* Specify the machine mode that pointers have.
After generation of rtl, the compiler makes no further distinction
between pointers and any other objects of this machine mode. */

View file

@ -1430,8 +1430,6 @@ extern bool current_function_interrupt;
#define MAYBE_BASE_REGISTER_RTX_P(X, STRICT) \
((REG_P (X) && REG_OK_FOR_BASE_P (X, STRICT)) \
|| (GET_CODE (X) == SUBREG \
&& TRULY_NOOP_TRUNCATION (GET_MODE_BITSIZE (GET_MODE ((X))), \
GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (X)))) \
&& REG_P (SUBREG_REG (X)) \
&& REG_OK_FOR_BASE_P (SUBREG_REG (X), STRICT)))
@ -1441,8 +1439,6 @@ extern bool current_function_interrupt;
#define MAYBE_INDEX_REGISTER_RTX_P(X, STRICT) \
((REG_P (X) && REG_OK_FOR_INDEX_P (X, STRICT)) \
|| (GET_CODE (X) == SUBREG \
&& TRULY_NOOP_TRUNCATION (GET_MODE_BITSIZE (GET_MODE ((X))), \
GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (X)))) \
&& REG_P (SUBREG_REG (X)) \
&& SUBREG_OK_FOR_INDEX_P (SUBREG_REG (X), SUBREG_BYTE (X), STRICT)))
@ -1557,9 +1553,6 @@ extern bool current_function_interrupt;
more compact code. */
#define SHIFT_COUNT_TRUNCATED (0)
/* All integers have the same format so truncation is easy. */
#define TRULY_NOOP_TRUNCATION(OUTPREC,INPREC) (true)
/* Define this if addresses of constant functions
shouldn't be put through pseudo regs where they can be cse'd.
Desirable on machines where ordinary constants are expensive

View file

@ -1447,10 +1447,6 @@ do { \
few bits. */
#define SHIFT_COUNT_TRUNCATED 1
/* Value is 1 if truncating an integer of INPREC bits to OUTPREC bits
is done just by pretending it is already truncated. */
#define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1
/* For SImode, we make sure the top 32-bits of the register are clear and
then we subtract 32 from the lzd instruction result. */
#define CLZ_DEFINED_VALUE_AT_ZERO(MODE, VALUE) \

View file

@ -7173,6 +7173,14 @@ spu_can_change_mode_class (machine_mode from, machine_mode to, reg_class_t)
|| (GET_MODE_SIZE (from) <= 4 && GET_MODE_SIZE (to) <= 4)
|| (GET_MODE_SIZE (from) >= 16 && GET_MODE_SIZE (to) >= 16));
}
/* Implement TARGET_TRULY_NOOP_TRUNCATION. */
static bool
spu_truly_noop_truncation (unsigned int outprec, unsigned int inprec)
{
return inprec <= 32 && outprec <= inprec;
}
/* Table of machine attributes. */
static const struct attribute_spec spu_attribute_table[] =
@ -7407,6 +7415,9 @@ static const struct attribute_spec spu_attribute_table[] =
#undef TARGET_CAN_CHANGE_MODE_CLASS
#define TARGET_CAN_CHANGE_MODE_CLASS spu_can_change_mode_class
#undef TARGET_TRULY_NOOP_TRUNCATION
#define TARGET_TRULY_NOOP_TRUNCATION spu_truly_noop_truncation
struct gcc_target targetm = TARGET_INITIALIZER;
#include "gt-spu.h"

View file

@ -487,8 +487,6 @@ do { \
#define MOVE_MAX 16
#define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) ((INPREC) <= 32 && (OUTPREC) <= (INPREC))
#define STORE_FLAG_VALUE -1
#define Pmode SImode

View file

@ -478,8 +478,6 @@ enum reg_class
#define SHIFT_COUNT_TRUNCATED 1
#define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1
#define Pmode HImode
#define FUNCTION_MODE HImode

View file

@ -5560,7 +5560,14 @@ tilegx_file_end (void)
file_end_indicate_exec_stack ();
}
/* Implement TARGET_TRULY_NOOP_TRUNCATION. We represent all SI values
as sign-extended DI values in registers. */
static bool
tilegx_truly_noop_truncation (unsigned int outprec, unsigned int inprec)
{
return inprec <= 32 || outprec > 32;
}
#undef TARGET_HAVE_TLS
#define TARGET_HAVE_TLS HAVE_AS_TLS
@ -5724,6 +5731,9 @@ tilegx_file_end (void)
#undef TARGET_CAN_USE_DOLOOP_P
#define TARGET_CAN_USE_DOLOOP_P can_use_doloop_if_innermost
#undef TARGET_TRULY_NOOP_TRUNCATION
#define TARGET_TRULY_NOOP_TRUNCATION tilegx_truly_noop_truncation
struct gcc_target targetm = TARGET_INITIALIZER;
#include "gt-tilegx.h"

View file

@ -378,11 +378,6 @@ enum reg_class
#define SHORT_IMMEDIATES_SIGN_EXTEND 1
/* We represent all SI values as sign-extended DI values in
registers. */
#define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) \
((INPREC) <= 32 || (OUTPREC) > 32)
#define CLZ_DEFINED_VALUE_AT_ZERO(MODE, VALUE) ((VALUE) = 64, 1)
#define CTZ_DEFINED_VALUE_AT_ZERO(MODE, VALUE) ((VALUE) = 64, 1)

View file

@ -2004,8 +2004,8 @@
ld2s_add\t%0, %I1, %i1"
[(set_attr "type" "X0,Y2_2cycle,X1_2cycle")])
;; All SImode integer registers should already be in sign-extended
;; form (see TRULY_NOOP_TRUNCATION and truncdisi2). We can therefore
;; All SImode integer registers should already be in sign-extended form
;; (see TARGET_TRULY_NOOP_TRUNCATION and truncdisi2). We can therefore
;; get rid of register->register instructions if we constrain the
;; source to be in the same register as the destination.
(define_insn_and_split "extendsidi2"
@ -2028,7 +2028,7 @@
;; modes is a no-op, as it is for most other GCC ports. Truncating
;; DImode values to SImode is not a no-op since we
;; need to make sure that the lower 32 bits are properly sign-extended
;; (see TRULY_NOOP_TRUNCATION). Truncating DImode values into modes
;; (see TARGET_TRULY_NOOP_TRUNCATION). Truncating DImode values into modes
;; smaller than SImode is equivalent to two separate truncations:
;;
;; A B

View file

@ -337,8 +337,6 @@ enum reg_class
#define SHORT_IMMEDIATES_SIGN_EXTEND 1
#define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1
#define CLZ_DEFINED_VALUE_AT_ZERO(MODE, VALUE) ((VALUE) = 32, 1)
#define CTZ_DEFINED_VALUE_AT_ZERO(MODE, VALUE) ((VALUE) = 32, 1)

View file

@ -766,10 +766,6 @@ typedef enum
of a shift count. */
#define SHIFT_COUNT_TRUNCATED 1
/* Value is 1 if truncating an integer of INPREC bits to OUTPREC bits
is done just by pretending it is already truncated. */
#define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1
/* Specify the machine mode that pointers have.
After generation of rtl, the compiler makes no further distinction
between pointers and any other objects of this machine mode. */

View file

@ -448,10 +448,6 @@ enum reg_class { NO_REGS, ALL_REGS, LIM_REG_CLASSES };
of a shift count. */
/* #define SHIFT_COUNT_TRUNCATED */
/* Value is 1 if truncating an integer of INPREC bits to OUTPREC bits
is done just by pretending it is already truncated. */
#define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1
/* Specify the machine mode that pointers have.
After generation of rtl, the compiler makes no further distinction
between pointers and any other objects of this machine mode. */

View file

@ -1202,21 +1202,6 @@ do \
bitfield instructions. */
#define SHIFT_COUNT_TRUNCATED 0
/* `TRULY_NOOP_TRUNCATION (OUTPREC, INPREC)'
A C expression which is nonzero if on this machine it is safe to
"convert" an integer of INPREC bits to one of OUTPREC bits (where
OUTPREC is smaller than INPREC) by merely operating on it as if it
had only OUTPREC bits.
On many machines, this expression can be 1.
When `TRULY_NOOP_TRUNCATION' returns 1 for a pair of sizes for
modes for which `TARGET_MODES_TIEABLE_P' is 0, suboptimal code can result.
If this is the case, making `TRULY_NOOP_TRUNCATION' return 0 in
such cases may improve things. */
#define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1
/* `STORE_FLAG_VALUE'
A C expression describing the value returned by a comparison

View file

@ -669,10 +669,6 @@ typedef struct xtensa_args
/* Shift instructions ignore all but the low-order few bits. */
#define SHIFT_COUNT_TRUNCATED 1
/* Value is 1 if truncating an integer of INPREC bits to OUTPREC bits
is done just by pretending it is already truncated. */
#define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1
#define CLZ_DEFINED_VALUE_AT_ZERO(MODE, VALUE) ((VALUE) = 32, 1)
#define CTZ_DEFINED_VALUE_AT_ZERO(MODE, VALUE) ((VALUE) = -1, 1)

View file

@ -873,7 +873,7 @@ convert_to_integer_1 (tree type, tree expr, bool dofold)
break;
if (outprec >= BITS_PER_WORD
|| TRULY_NOOP_TRUNCATION (outprec, inprec)
|| targetm.truly_noop_truncation (outprec, inprec)
|| inprec > TYPE_PRECISION (TREE_TYPE (arg0))
|| inprec > TYPE_PRECISION (TREE_TYPE (arg1)))
{

View file

@ -10783,21 +10783,17 @@ nevertheless truncate the shift count, you may get better code
by overriding it.
@end deftypefn
@defmac TRULY_NOOP_TRUNCATION (@var{outprec}, @var{inprec})
A C expression which is nonzero if on this machine it is safe to
``convert'' an integer of @var{inprec} bits to one of @var{outprec}
bits (where @var{outprec} is smaller than @var{inprec}) by merely
operating on it as if it had only @var{outprec} bits.
@deftypefn {Target Hook} bool TARGET_TRULY_NOOP_TRUNCATION (unsigned int @var{outprec}, unsigned int @var{inprec})
This hook returns true if it is safe to ``convert'' a value of
@var{inprec} bits to one of @var{outprec} bits (where @var{outprec} is
smaller than @var{inprec}) by merely operating on it as if it had only
@var{outprec} bits. The default returns true unconditionally, which
is correct for most machines.
On many machines, this expression can be 1.
@c rearranged this, removed the phrase "it is reported that". this was
@c to fix an overfull hbox. --mew 10feb93
When @code{TRULY_NOOP_TRUNCATION} returns 1 for a pair of sizes for modes
for which @code{TARGET_MODES_TIEABLE_P} is false, suboptimal code can result.
If this is the case, making @code{TRULY_NOOP_TRUNCATION} return 0 in
such cases may improve things.
@end defmac
If @code{TARGET_MODES_TIEABLE_P} returns false for a pair of modes,
suboptimal code can result if this hook returns true for the corresponding
mode sizes. Making this hook return false in such cases may improve things.
@end deftypefn
@deftypefn {Target Hook} int TARGET_MODE_REP_EXTENDED (scalar_int_mode @var{mode}, scalar_int_mode @var{rep_mode})
The representation of an integral mode can be such that the values
@ -10823,7 +10819,7 @@ to define @code{LOAD_EXTEND_OP (mode)} to return the same type of
extension.
In order to enforce the representation of @code{mode},
@code{TRULY_NOOP_TRUNCATION} should return false when truncating to
@code{TARGET_TRULY_NOOP_TRUNCATION} should return false when truncating to
@code{mode}.
@end deftypefn

View file

@ -7482,21 +7482,7 @@ You need not define this macro if it would always have the value of zero.
@anchor{TARGET_SHIFT_TRUNCATION_MASK}
@hook TARGET_SHIFT_TRUNCATION_MASK
@defmac TRULY_NOOP_TRUNCATION (@var{outprec}, @var{inprec})
A C expression which is nonzero if on this machine it is safe to
``convert'' an integer of @var{inprec} bits to one of @var{outprec}
bits (where @var{outprec} is smaller than @var{inprec}) by merely
operating on it as if it had only @var{outprec} bits.
On many machines, this expression can be 1.
@c rearranged this, removed the phrase "it is reported that". this was
@c to fix an overfull hbox. --mew 10feb93
When @code{TRULY_NOOP_TRUNCATION} returns 1 for a pair of sizes for modes
for which @code{TARGET_MODES_TIEABLE_P} is false, suboptimal code can result.
If this is the case, making @code{TRULY_NOOP_TRUNCATION} return 0 in
such cases may improve things.
@end defmac
@hook TARGET_TRULY_NOOP_TRUNCATION
@hook TARGET_MODE_REP_EXTENDED

View file

@ -1854,7 +1854,7 @@ extract_bit_field_1 (rtx str_rtx, unsigned HOST_WIDE_INT bitsize,
&& !reverse
/* ??? We could limit the structure size to the part of OP0 that
contains the field, with appropriate checks for endianness
and TRULY_NOOP_TRUNCATION. */
and TARGET_TRULY_NOOP_TRUNCATION. */
&& get_best_reg_extraction_insn (&extv, pattern,
GET_MODE_BITSIZE (op0_mode.require ()),
tmode))
@ -2233,7 +2233,7 @@ extract_split_bit_field (rtx op0, opt_scalar_int_mode op0_mode,
a zero extension
- when MODE is smaller than SRC_MODE, the extraction involves
a truncation (and is thus subject to TRULY_NOOP_TRUNCATION).
a truncation (and is thus subject to TARGET_TRULY_NOOP_TRUNCATION).
In other words, this routine performs a computation, whereas the
gen_lowpart* routines are conceptually lvalue or rvalue subreg

View file

@ -2997,7 +2997,8 @@ assign_parm_setup_block (struct assign_parm_data_all *all,
to the value directly in mode MODE, otherwise we must
start with the register in word_mode and explicitly
convert it. */
if (TRULY_NOOP_TRUNCATION (size * BITS_PER_UNIT, BITS_PER_WORD))
if (targetm.truly_noop_truncation (size * BITS_PER_UNIT,
BITS_PER_WORD))
reg = gen_rtx_REG (mode, REGNO (entry_parm));
else
{

View file

@ -133,6 +133,13 @@ hook_bool_mode_uhwi_false (machine_mode, unsigned HOST_WIDE_INT)
return false;
}
/* Generic hook that takes (unsigned int, unsigned int) and returns true. */
bool
hook_bool_uint_uint_true (unsigned int, unsigned int)
{
return true;
}
/* Generic hook that takes (unsigned int, machine_mode) and returns false. */
bool
hook_bool_uint_mode_false (unsigned int, machine_mode)

View file

@ -39,6 +39,7 @@ extern bool hook_bool_const_rtx_insn_const_rtx_insn_true (const rtx_insn *,
const rtx_insn *);
extern bool hook_bool_mode_uhwi_false (machine_mode,
unsigned HOST_WIDE_INT);
extern bool hook_bool_uint_uint_true (unsigned int, unsigned int);
extern bool hook_bool_uint_mode_false (unsigned int, machine_mode);
extern bool hook_bool_uint_mode_true (unsigned int, machine_mode);
extern bool hook_bool_tree_false (tree);

View file

@ -781,8 +781,8 @@ extern scalar_int_mode ptr_mode;
extern void init_adjust_machine_modes (void);
#define TRULY_NOOP_TRUNCATION_MODES_P(MODE1, MODE2) \
TRULY_NOOP_TRUNCATION (GET_MODE_PRECISION (MODE1), \
GET_MODE_PRECISION (MODE2))
(targetm.truly_noop_truncation (GET_MODE_PRECISION (MODE1), \
GET_MODE_PRECISION (MODE2)))
#define HWI_COMPUTABLE_MODE_P(MODE) \
(SCALAR_INT_MODE_P (MODE) \

View file

@ -30,6 +30,7 @@ along with GCC; see the file COPYING3. If not see
#include "recog.h"
#include "rtlhooks-def.h"
#include "explow.h"
#include "target.h"
/* For speed, we will copy the RTX hooks struct member-by-member

View file

@ -914,7 +914,8 @@ extern void fancy_abort (const char *, int, const char *)
HARD_REGNO_CALL_PART_CLOBBERED HARD_REGNO_MODE_OK \
MODES_TIEABLE_P FUNCTION_ARG_PADDING SLOW_UNALIGNED_ACCESS \
HARD_REGNO_NREGS SECONDARY_MEMORY_NEEDED_MODE \
SECONDARY_MEMORY_NEEDED CANNOT_CHANGE_MODE_CLASS
SECONDARY_MEMORY_NEEDED CANNOT_CHANGE_MODE_CLASS \
TRULY_NOOP_TRUNCATION
/* Target macros only used for code built for the target, that have
moved to libgcc-tm.h or have never been present elsewhere. */

View file

@ -3130,6 +3130,20 @@ has an instruction for the division, and 2 if it does not.",
unsigned int, (machine_mode mode),
default_min_divisions_for_recip_mul)
DEFHOOK
(truly_noop_truncation,
"This hook returns true if it is safe to ``convert'' a value of\n\
@var{inprec} bits to one of @var{outprec} bits (where @var{outprec} is\n\
smaller than @var{inprec}) by merely operating on it as if it had only\n\
@var{outprec} bits. The default returns true unconditionally, which\n\
is correct for most machines.\n\
\n\
If @code{TARGET_MODES_TIEABLE_P} returns false for a pair of modes,\n\
suboptimal code can result if this hook returns true for the corresponding\n\
mode sizes. Making this hook return false in such cases may improve things.",
bool, (unsigned int outprec, unsigned int inprec),
hook_bool_uint_uint_true)
/* If the representation of integral MODE is such that values are
always sign-extended to a wider mode MODE_REP then return
SIGN_EXTEND. Return UNKNOWN otherwise. */
@ -3160,7 +3174,7 @@ to define @code{LOAD_EXTEND_OP (mode)} to return the same type of\n\
extension.\n\
\n\
In order to enforce the representation of @code{mode},\n\
@code{TRULY_NOOP_TRUNCATION} should return false when truncating to\n\
@code{TARGET_TRULY_NOOP_TRUNCATION} should return false when truncating to\n\
@code{mode}.",
int, (scalar_int_mode mode, scalar_int_mode rep_mode),
default_mode_rep_extended)