diff options
author | Richard Sandiford <richard.sandiford@linaro.org> | 2017-09-15 13:47:41 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@gcc.gnu.org> | 2017-09-15 13:47:41 +0000 |
commit | bb149ca2e912038dce733f95ab1c24ff0d1af280 (patch) | |
tree | 0bb537d68bc00b31b84974e82a6633ac494aa4bc /gcc | |
parent | a75c63e02ab97abaaaf3508a25f8d87362ea238a (diff) | |
download | gcc-bb149ca2e912038dce733f95ab1c24ff0d1af280.zip gcc-bb149ca2e912038dce733f95ab1c24ff0d1af280.tar.gz gcc-bb149ca2e912038dce733f95ab1c24ff0d1af280.tar.bz2 |
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
Diffstat (limited to 'gcc')
68 files changed, 180 insertions, 236 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4791347..498d6b3 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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 diff --git a/gcc/combine.c b/gcc/combine.c index affc148..ccfee26 100644 --- a/gcc/combine.c +++ b/gcc/combine.c @@ -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 diff --git a/gcc/config/aarch64/aarch64.h b/gcc/config/aarch64/aarch64.h index c3f094e..128006d 100644 --- a/gcc/config/aarch64/aarch64.h +++ b/gcc/config/aarch64/aarch64.h @@ -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. diff --git a/gcc/config/alpha/alpha.h b/gcc/config/alpha/alpha.h index 6177020..82d04d6 100644 --- a/gcc/config/alpha/alpha.h +++ b/gcc/config/alpha/alpha.h @@ -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) diff --git a/gcc/config/arc/arc.h b/gcc/config/arc/arc.h index bfcb345..6c63430 100644 --- a/gcc/config/arc/arc.h +++ b/gcc/config/arc/arc.h @@ -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 diff --git a/gcc/config/arm/arm.h b/gcc/config/arm/arm.h index 1dc1361..e359946 100644 --- a/gcc/config/arm/arm.h +++ b/gcc/config/arm/arm.h @@ -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 diff --git a/gcc/config/avr/avr.h b/gcc/config/avr/avr.h index 531a2ce..6d00dbd 100644 --- a/gcc/config/avr/avr.h +++ b/gcc/config/avr/avr.h @@ -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 diff --git a/gcc/config/bfin/bfin.h b/gcc/config/bfin/bfin.h index 47d57fa..e0443da 100644 --- a/gcc/config/bfin/bfin.h +++ b/gcc/config/bfin/bfin.h @@ -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 diff --git a/gcc/config/c6x/c6x.h b/gcc/config/c6x/c6x.h index aa58f600..c8c4073 100644 --- a/gcc/config/c6x/c6x.h +++ b/gcc/config/c6x/c6x.h @@ -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 diff --git a/gcc/config/cr16/cr16.h b/gcc/config/cr16/cr16.h index a068b4b..ce54dd74 100644 --- a/gcc/config/cr16/cr16.h +++ b/gcc/config/cr16/cr16.h @@ -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 diff --git a/gcc/config/cris/cris.h b/gcc/config/cris/cris.h index 4b332a9..b44164f 100644 --- a/gcc/config/cris/cris.h +++ b/gcc/config/cris/cris.h @@ -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) diff --git a/gcc/config/epiphany/epiphany.h b/gcc/config/epiphany/epiphany.h index c9bd5b5..303ac5e 100644 --- a/gcc/config/epiphany/epiphany.h +++ b/gcc/config/epiphany/epiphany.h @@ -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. */ diff --git a/gcc/config/fr30/fr30.h b/gcc/config/fr30/fr30.h index 9aa0199..2e6b793 100644 --- a/gcc/config/fr30/fr30.h +++ b/gcc/config/fr30/fr30.h @@ -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 diff --git a/gcc/config/frv/frv.h b/gcc/config/frv/frv.h index ee32d47..350a59f 100644 --- a/gcc/config/frv/frv.h +++ b/gcc/config/frv/frv.h @@ -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 diff --git a/gcc/config/ft32/ft32.h b/gcc/config/ft32/ft32.h index 4eb3b7f..6438393 100644 --- a/gcc/config/ft32/ft32.h +++ b/gcc/config/ft32/ft32.h @@ -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. */ diff --git a/gcc/config/h8300/h8300.h b/gcc/config/h8300/h8300.h index c7bfc2a..8ff3860 100644 --- a/gcc/config/h8300/h8300.h +++ b/gcc/config/h8300/h8300.h @@ -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. */ diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h index 2f5ed83..6c8ae97 100644 --- a/gcc/config/i386/i386.h +++ b/gcc/config/i386/i386.h @@ -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 diff --git a/gcc/config/ia64/ia64.h b/gcc/config/ia64/ia64.h index b08824f..9cfb009 100644 --- a/gcc/config/ia64/ia64.h +++ b/gcc/config/ia64/ia64.h @@ -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. */ diff --git a/gcc/config/iq2000/iq2000.h b/gcc/config/iq2000/iq2000.h index 907d89b..ef4cd270 100644 --- a/gcc/config/iq2000/iq2000.h +++ b/gcc/config/iq2000/iq2000.h @@ -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 diff --git a/gcc/config/lm32/lm32.h b/gcc/config/lm32/lm32.h index 40f1562..9169834 100644 --- a/gcc/config/lm32/lm32.h +++ b/gcc/config/lm32/lm32.h @@ -519,8 +519,6 @@ do { \ #define SHIFT_COUNT_TRUNCATED 1 -#define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1 - #define Pmode SImode #define FUNCTION_MODE SImode diff --git a/gcc/config/m32c/m32c.h b/gcc/config/m32c/m32c.h index c4c0da0..594288b 100644 --- a/gcc/config/m32c/m32c.h +++ b/gcc/config/m32c/m32c.h @@ -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 diff --git a/gcc/config/m32r/m32r.h b/gcc/config/m32r/m32r.h index b0d2ceb..09d73bc 100644 --- a/gcc/config/m32r/m32r.h +++ b/gcc/config/m32r/m32r.h @@ -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. */ diff --git a/gcc/config/m68k/m68k.h b/gcc/config/m68k/m68k.h index 5d712ea..2fefc72 100644 --- a/gcc/config/m68k/m68k.h +++ b/gcc/config/m68k/m68k.h @@ -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) diff --git a/gcc/config/mcore/mcore.h b/gcc/config/mcore/mcore.h index e3b12ae..4e93343 100644 --- a/gcc/config/mcore/mcore.h +++ b/gcc/config/mcore/mcore.h @@ -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 diff --git a/gcc/config/microblaze/microblaze.h b/gcc/config/microblaze/microblaze.h index 639b4f4..1726e26 100644 --- a/gcc/config/microblaze/microblaze.h +++ b/gcc/config/microblaze/microblaze.h @@ -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 diff --git a/gcc/config/mips/mips.c b/gcc/config/mips/mips.c index 2af93d7..7eaff14 100644 --- a/gcc/config/mips/mips.c +++ b/gcc/config/mips/mips.c @@ -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" diff --git a/gcc/config/mips/mips.h b/gcc/config/mips/mips.h index 991bd8d..1f4cad8 100644 --- a/gcc/config/mips/mips.h +++ b/gcc/config/mips/mips.h @@ -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 diff --git a/gcc/config/mips/mips.md b/gcc/config/mips/mips.md index aae78fa..cfff63e 100644 --- a/gcc/config/mips/mips.md +++ b/gcc/config/mips/mips.md @@ -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. diff --git a/gcc/config/mmix/mmix.h b/gcc/config/mmix/mmix.h index dc632f2..7161656 100644 --- a/gcc/config/mmix/mmix.h +++ b/gcc/config/mmix/mmix.h @@ -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. */ diff --git a/gcc/config/mn10300/mn10300.h b/gcc/config/mn10300/mn10300.h index 9d909bc..1078b45 100644 --- a/gcc/config/mn10300/mn10300.h +++ b/gcc/config/mn10300/mn10300.h @@ -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. */ diff --git a/gcc/config/moxie/moxie.h b/gcc/config/moxie/moxie.h index 4730807..9ae5f82 100644 --- a/gcc/config/moxie/moxie.h +++ b/gcc/config/moxie/moxie.h @@ -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 diff --git a/gcc/config/msp430/msp430.h b/gcc/config/msp430/msp430.h index 8494bf2..5a99767 100644 --- a/gcc/config/msp430/msp430.h +++ b/gcc/config/msp430/msp430.h @@ -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 diff --git a/gcc/config/nds32/nds32.h b/gcc/config/nds32/nds32.h index 9a022f2..9106fe6 100644 --- a/gcc/config/nds32/nds32.h +++ b/gcc/config/nds32/nds32.h @@ -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. */ diff --git a/gcc/config/nios2/nios2.h b/gcc/config/nios2/nios2.h index 9a299f2..d911b54 100644 --- a/gcc/config/nios2/nios2.h +++ b/gcc/config/nios2/nios2.h @@ -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 diff --git a/gcc/config/nvptx/nvptx.h b/gcc/config/nvptx/nvptx.h index ab00e47..d02e854 100644 --- a/gcc/config/nvptx/nvptx.h +++ b/gcc/config/nvptx/nvptx.h @@ -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 diff --git a/gcc/config/pa/pa.h b/gcc/config/pa/pa.h index 37881dc..2edf0db 100644 --- a/gcc/config/pa/pa.h +++ b/gcc/config/pa/pa.h @@ -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. */ diff --git a/gcc/config/pdp11/pdp11.h b/gcc/config/pdp11/pdp11.h index 2a59f65..3c89327 100644 --- a/gcc/config/pdp11/pdp11.h +++ b/gcc/config/pdp11/pdp11.h @@ -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. */ diff --git a/gcc/config/powerpcspe/powerpcspe.h b/gcc/config/powerpcspe/powerpcspe.h index 4a31661..52c0376 100644 --- a/gcc/config/powerpcspe/powerpcspe.h +++ b/gcc/config/powerpcspe/powerpcspe.h @@ -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) diff --git a/gcc/config/riscv/riscv.h b/gcc/config/riscv/riscv.h index 53141bc..a04da2c 100644 --- a/gcc/config/riscv/riscv.h +++ b/gcc/config/riscv/riscv.h @@ -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. */ diff --git a/gcc/config/riscv/riscv.md b/gcc/config/riscv/riscv.md index 18dba3b..fd9236c 100644 --- a/gcc/config/riscv/riscv.md +++ b/gcc/config/riscv/riscv.md @@ -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") diff --git a/gcc/config/rl78/rl78.h b/gcc/config/rl78/rl78.h index 0716715..30dfee8 100644 --- a/gcc/config/rl78/rl78.h +++ b/gcc/config/rl78/rl78.h @@ -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 diff --git a/gcc/config/rs6000/rs6000.h b/gcc/config/rs6000/rs6000.h index 3866cb3..da2f4f5 100644 --- a/gcc/config/rs6000/rs6000.h +++ b/gcc/config/rs6000/rs6000.h @@ -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) diff --git a/gcc/config/rx/rx.h b/gcc/config/rx/rx.h index 93b51c1..4bc43c2 100644 --- a/gcc/config/rx/rx.h +++ b/gcc/config/rx/rx.h @@ -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 diff --git a/gcc/config/s390/s390.h b/gcc/config/s390/s390.h index 0f6ea87..00652da 100644 --- a/gcc/config/s390/s390.h +++ b/gcc/config/s390/s390.h @@ -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. */ diff --git a/gcc/config/sh/sh.h b/gcc/config/sh/sh.h index f020972..a18044d 100644 --- a/gcc/config/sh/sh.h +++ b/gcc/config/sh/sh.h @@ -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 diff --git a/gcc/config/sparc/sparc.h b/gcc/config/sparc/sparc.h index af350d7..946605d 100644 --- a/gcc/config/sparc/sparc.h +++ b/gcc/config/sparc/sparc.h @@ -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) \ diff --git a/gcc/config/spu/spu.c b/gcc/config/spu/spu.c index 413567b..4ce227b 100644 --- a/gcc/config/spu/spu.c +++ b/gcc/config/spu/spu.c @@ -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" diff --git a/gcc/config/spu/spu.h b/gcc/config/spu/spu.h index f41117e..3e60e19 100644 --- a/gcc/config/spu/spu.h +++ b/gcc/config/spu/spu.h @@ -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 diff --git a/gcc/config/stormy16/stormy16.h b/gcc/config/stormy16/stormy16.h index faa965f..0f19686 100644 --- a/gcc/config/stormy16/stormy16.h +++ b/gcc/config/stormy16/stormy16.h @@ -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 diff --git a/gcc/config/tilegx/tilegx.c b/gcc/config/tilegx/tilegx.c index 004cc93..368821e 100644 --- a/gcc/config/tilegx/tilegx.c +++ b/gcc/config/tilegx/tilegx.c @@ -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" diff --git a/gcc/config/tilegx/tilegx.h b/gcc/config/tilegx/tilegx.h index 2cedd42..55fd89a 100644 --- a/gcc/config/tilegx/tilegx.h +++ b/gcc/config/tilegx/tilegx.h @@ -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) diff --git a/gcc/config/tilegx/tilegx.md b/gcc/config/tilegx/tilegx.md index 48d8d34..f6188b2 100644 --- a/gcc/config/tilegx/tilegx.md +++ b/gcc/config/tilegx/tilegx.md @@ -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 diff --git a/gcc/config/tilepro/tilepro.h b/gcc/config/tilepro/tilepro.h index a865c8a..325b2ed 100644 --- a/gcc/config/tilepro/tilepro.h +++ b/gcc/config/tilepro/tilepro.h @@ -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) diff --git a/gcc/config/v850/v850.h b/gcc/config/v850/v850.h index 49fe3cd..da096f7 100644 --- a/gcc/config/v850/v850.h +++ b/gcc/config/v850/v850.h @@ -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. */ diff --git a/gcc/config/vax/vax.h b/gcc/config/vax/vax.h index b6d31c2..04a865c 100644 --- a/gcc/config/vax/vax.h +++ b/gcc/config/vax/vax.h @@ -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. */ diff --git a/gcc/config/visium/visium.h b/gcc/config/visium/visium.h index b415e3c..4b086d3 100644 --- a/gcc/config/visium/visium.h +++ b/gcc/config/visium/visium.h @@ -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 diff --git a/gcc/config/xtensa/xtensa.h b/gcc/config/xtensa/xtensa.h index abdd8ef..74c5e52 100644 --- a/gcc/config/xtensa/xtensa.h +++ b/gcc/config/xtensa/xtensa.h @@ -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) diff --git a/gcc/convert.c b/gcc/convert.c index bfe18fb..0045c12 100644 --- a/gcc/convert.c +++ b/gcc/convert.c @@ -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))) { diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi index 5b9e2b3..6277e88 100644 --- a/gcc/doc/tm.texi +++ b/gcc/doc/tm.texi @@ -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 diff --git a/gcc/doc/tm.texi.in b/gcc/doc/tm.texi.in index 57b017f..c66f8ce 100644 --- a/gcc/doc/tm.texi.in +++ b/gcc/doc/tm.texi.in @@ -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 diff --git a/gcc/expmed.c b/gcc/expmed.c index b9d3192..27f5ae4 100644 --- a/gcc/expmed.c +++ b/gcc/expmed.c @@ -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 diff --git a/gcc/function.c b/gcc/function.c index 3fc2d0e..41878a9 100644 --- a/gcc/function.c +++ b/gcc/function.c @@ -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 { diff --git a/gcc/hooks.c b/gcc/hooks.c index 3af7795..d383926 100644 --- a/gcc/hooks.c +++ b/gcc/hooks.c @@ -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) diff --git a/gcc/hooks.h b/gcc/hooks.h index 6838c23..711d0e2 100644 --- a/gcc/hooks.h +++ b/gcc/hooks.h @@ -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); diff --git a/gcc/machmode.h b/gcc/machmode.h index 46150bb..6667458 100644 --- a/gcc/machmode.h +++ b/gcc/machmode.h @@ -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) \ diff --git a/gcc/rtlhooks.c b/gcc/rtlhooks.c index b008b15..4d04ebd 100644 --- a/gcc/rtlhooks.c +++ b/gcc/rtlhooks.c @@ -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 diff --git a/gcc/system.h b/gcc/system.h index 1663a78..974d85c 100644 --- a/gcc/system.h +++ b/gcc/system.h @@ -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. */ diff --git a/gcc/target.def b/gcc/target.def index ed99549..885973b 100644 --- a/gcc/target.def +++ b/gcc/target.def @@ -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) |