Projects
openEuler:24.03:SP1:Everything
gcc
_service:tar_scm:0132-Backport-SME-mode-switchi...
Sign Up
Log In
Username
Password
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File _service:tar_scm:0132-Backport-SME-mode-switching-Tweak-the-macro-hook-doc.patch of Package gcc
From c980e40d2c27ac3ee33c9b6aea6d2b0d4080852e Mon Sep 17 00:00:00 2001 From: Richard Sandiford <richard.sandiford@arm.com> Date: Sat, 11 Nov 2023 17:28:54 +0000 Subject: [PATCH 033/157] [Backport][SME] mode-switching: Tweak the macro/hook documentation Reference: https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=8479a3759025961f80cf0cd6bb3f127e09d0510d I found the documentation for the mode-switching macros/hooks a bit hard to follow at first. This patch tries to add the information that I think would have made it easier to understand. Of course, documentation preferences are personal, and so I could be changing something that others understood to something that seems impenetrable. Some notes on specific changes: - "in an optimizing compilation" didn't seem accurate; the pass is run even at -O0, and often needs to be for correctness. - "at run time" meant when the compiler was run, rather than when the compiled code was run. - Removing the list of optional macros isn't a clarification, but it means that upcoming patches don't create an absurdly long list. - I don't really understand the purpose of TARGET_MODE_PRIORITY, so I mostly left that alone. gcc/ * target.def: Tweak documentation of mode-switching hooks. * doc/tm.texi.in (OPTIMIZE_MODE_SWITCHING): Tweak documentation. (NUM_MODES_FOR_MODE_SWITCHING): Likewise. * doc/tm.texi: Regenerate. --- gcc/doc/tm.texi | 69 ++++++++++++++++++++++++++++------------------ gcc/doc/tm.texi.in | 26 +++++++++-------- gcc/target.def | 43 ++++++++++++++++++----------- 3 files changed, 84 insertions(+), 54 deletions(-) diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi index 851d31c18..553aa4cf2 100644 --- a/gcc/doc/tm.texi +++ b/gcc/doc/tm.texi @@ -10234,7 +10234,7 @@ The following macros control mode switching optimizations: @defmac OPTIMIZE_MODE_SWITCHING (@var{entity}) Define this macro if the port needs extra instructions inserted for mode -switching in an optimizing compilation. +switching. For an example, the SH4 can perform both single and double precision floating point operations, but to perform a single precision operation, @@ -10244,73 +10244,88 @@ purpose register as a scratch register, hence these FPSCR sets have to be inserted before reload, i.e.@: you cannot put this into instruction emitting or @code{TARGET_MACHINE_DEPENDENT_REORG}. -You can have multiple entities that are mode-switched, and select at run time -which entities actually need it. @code{OPTIMIZE_MODE_SWITCHING} should -return nonzero for any @var{entity} that needs mode-switching. +You can have multiple entities that are mode-switched, some of which might +only be needed conditionally. The entities are identified by their index +into the @code{NUM_MODES_FOR_MODE_SWITCHING} initializer, with the length +of the initializer determining the number of entities. + +@code{OPTIMIZE_MODE_SWITCHING} should return nonzero for any @var{entity} +that needs mode-switching. + If you define this macro, you also have to define @code{NUM_MODES_FOR_MODE_SWITCHING}, @code{TARGET_MODE_NEEDED}, @code{TARGET_MODE_PRIORITY} and @code{TARGET_MODE_EMIT}. -@code{TARGET_MODE_AFTER}, @code{TARGET_MODE_ENTRY}, and @code{TARGET_MODE_EXIT} -are optional. +The other macros in this section are optional. @end defmac @defmac NUM_MODES_FOR_MODE_SWITCHING If you define @code{OPTIMIZE_MODE_SWITCHING}, you have to define this as initializer for an array of integers. Each initializer element N refers to an entity that needs mode switching, and specifies the number -of different modes that might need to be set for this entity. -The position of the initializer in the initializer---starting counting at +of different modes that are defined for that entity. +The position of the element in the initializer---starting counting at zero---determines the integer that is used to refer to the mode-switched entity in question. -In macros that take mode arguments / yield a mode result, modes are -represented as numbers 0 @dots{} N @minus{} 1. N is used to specify that no mode -switch is needed / supplied. +Modes are represented as numbers 0 @dots{} N @minus{} 1. +In mode arguments and return values, N either represents an unknown +mode or ``no mode'', depending on context. @end defmac @deftypefn {Target Hook} void TARGET_MODE_EMIT (int @var{entity}, int @var{mode}, int @var{prev_mode}, HARD_REG_SET @var{regs_live}) Generate one or more insns to set @var{entity} to @var{mode}. @var{hard_reg_live} is the set of hard registers live at the point where the insn(s) are to be inserted. @var{prev_moxde} indicates the mode -to switch from. Sets of a lower numbered entity will be emitted before +to switch from, or is the number of modes if the previous mode is not +known. Sets of a lower numbered entity will be emitted before sets of a higher numbered entity to a mode of the same or lower priority. @end deftypefn @deftypefn {Target Hook} int TARGET_MODE_NEEDED (int @var{entity}, rtx_insn *@var{insn}) @var{entity} is an integer specifying a mode-switched entity. -If @code{OPTIMIZE_MODE_SWITCHING} is defined, you must define this macro -to return an integer value not larger than the corresponding element -in @code{NUM_MODES_FOR_MODE_SWITCHING}, to denote the mode that @var{entity} -must be switched into prior to the execution of @var{insn}. +If @code{OPTIMIZE_MODE_SWITCHING} is defined, you must define this hook +to return the mode that @var{entity} must be switched into prior to the +execution of @var{insn}, or the number of modes if @var{insn} has no +such requirement. @end deftypefn @deftypefn {Target Hook} int TARGET_MODE_AFTER (int @var{entity}, int @var{mode}, rtx_insn *@var{insn}) @var{entity} is an integer specifying a mode-switched entity. -If this macro is defined, it is evaluated for every @var{insn} during mode -switching. It determines the mode that an insn results -in (if different from the incoming mode). +If this hook is defined, it is evaluated for every @var{insn} during mode +switching. It returns the mode that @var{entity} is in after @var{insn} +has been executed. @var{mode} is the mode that @var{entity} was in +before @var{insn} was executed, taking account of @var{TARGET_MODE_NEEDED}. + +@var{mode} is equal to the number of modes defined for @var{entity} +if the mode before @var{insn} is unknown. The hook should likewise return +the number of modes if it does not know what mode @var{entity} has after +@var{insn}. + +Not defining the hook is equivalent to returning @var{mode}. @end deftypefn @deftypefn {Target Hook} int TARGET_MODE_ENTRY (int @var{entity}) -If this macro is defined, it is evaluated for every @var{entity} that -needs mode switching. It should evaluate to an integer, which is a mode -that @var{entity} is assumed to be switched to at function entry. +If this hook is defined, it is evaluated for every @var{entity} that +needs mode switching. It should return the mode that @var{entity} is +guaranteed to be in on entry to the function, or the number of modes +if there is no such guarantee. If @code{TARGET_MODE_ENTRY} is defined then @code{TARGET_MODE_EXIT} must be defined. @end deftypefn @deftypefn {Target Hook} int TARGET_MODE_EXIT (int @var{entity}) -If this macro is defined, it is evaluated for every @var{entity} that -needs mode switching. It should evaluate to an integer, which is a mode -that @var{entity} is assumed to be switched to at function exit. +If this hook is defined, it is evaluated for every @var{entity} that +needs mode switching. It should return the mode that @var{entity} must +be in on return from the function, or the number of modes if there is no +such requirement. If @code{TARGET_MODE_EXIT} is defined then @code{TARGET_MODE_ENTRY} must be defined. @end deftypefn @deftypefn {Target Hook} int TARGET_MODE_PRIORITY (int @var{entity}, int @var{n}) -This macro specifies the order in which modes for @var{entity} +This hook specifies the order in which modes for @var{entity} are processed. 0 is the highest priority, @code{NUM_MODES_FOR_MODE_SWITCHING[@var{entity}] - 1} the lowest. -The value of the macro should be an integer designating a mode +The hook returns an integer designating a mode for @var{entity}. For any fixed @var{entity}, @code{mode_priority} (@var{entity}, @var{n}) shall be a bijection in 0 @dots{} @code{num_modes_for_mode_switching[@var{entity}] - 1}. diff --git a/gcc/doc/tm.texi.in b/gcc/doc/tm.texi.in index ac95cdf7a..9ec11b15c 100644 --- a/gcc/doc/tm.texi.in +++ b/gcc/doc/tm.texi.in @@ -6879,7 +6879,7 @@ The following macros control mode switching optimizations: @defmac OPTIMIZE_MODE_SWITCHING (@var{entity}) Define this macro if the port needs extra instructions inserted for mode -switching in an optimizing compilation. +switching. For an example, the SH4 can perform both single and double precision floating point operations, but to perform a single precision operation, @@ -6889,27 +6889,31 @@ purpose register as a scratch register, hence these FPSCR sets have to be inserted before reload, i.e.@: you cannot put this into instruction emitting or @code{TARGET_MACHINE_DEPENDENT_REORG}. -You can have multiple entities that are mode-switched, and select at run time -which entities actually need it. @code{OPTIMIZE_MODE_SWITCHING} should -return nonzero for any @var{entity} that needs mode-switching. +You can have multiple entities that are mode-switched, some of which might +only be needed conditionally. The entities are identified by their index +into the @code{NUM_MODES_FOR_MODE_SWITCHING} initializer, with the length +of the initializer determining the number of entities. + +@code{OPTIMIZE_MODE_SWITCHING} should return nonzero for any @var{entity} +that needs mode-switching. + If you define this macro, you also have to define @code{NUM_MODES_FOR_MODE_SWITCHING}, @code{TARGET_MODE_NEEDED}, @code{TARGET_MODE_PRIORITY} and @code{TARGET_MODE_EMIT}. -@code{TARGET_MODE_AFTER}, @code{TARGET_MODE_ENTRY}, and @code{TARGET_MODE_EXIT} -are optional. +The other macros in this section are optional. @end defmac @defmac NUM_MODES_FOR_MODE_SWITCHING If you define @code{OPTIMIZE_MODE_SWITCHING}, you have to define this as initializer for an array of integers. Each initializer element N refers to an entity that needs mode switching, and specifies the number -of different modes that might need to be set for this entity. -The position of the initializer in the initializer---starting counting at +of different modes that are defined for that entity. +The position of the element in the initializer---starting counting at zero---determines the integer that is used to refer to the mode-switched entity in question. -In macros that take mode arguments / yield a mode result, modes are -represented as numbers 0 @dots{} N @minus{} 1. N is used to specify that no mode -switch is needed / supplied. +Modes are represented as numbers 0 @dots{} N @minus{} 1. +In mode arguments and return values, N either represents an unknown +mode or ``no mode'', depending on context. @end defmac @hook TARGET_MODE_EMIT diff --git a/gcc/target.def b/gcc/target.def index c9bb2b4c2..b87b0f927 100644 --- a/gcc/target.def +++ b/gcc/target.def @@ -6992,51 +6992,62 @@ DEFHOOK "Generate one or more insns to set @var{entity} to @var{mode}.\n\ @var{hard_reg_live} is the set of hard registers live at the point where\n\ the insn(s) are to be inserted. @var{prev_moxde} indicates the mode\n\ -to switch from. Sets of a lower numbered entity will be emitted before\n\ +to switch from, or is the number of modes if the previous mode is not\n\ +known. Sets of a lower numbered entity will be emitted before\n\ sets of a higher numbered entity to a mode of the same or lower priority.", void, (int entity, int mode, int prev_mode, HARD_REG_SET regs_live), NULL) DEFHOOK (needed, "@var{entity} is an integer specifying a mode-switched entity.\n\ -If @code{OPTIMIZE_MODE_SWITCHING} is defined, you must define this macro\n\ -to return an integer value not larger than the corresponding element\n\ -in @code{NUM_MODES_FOR_MODE_SWITCHING}, to denote the mode that @var{entity}\n\ -must be switched into prior to the execution of @var{insn}.", +If @code{OPTIMIZE_MODE_SWITCHING} is defined, you must define this hook\n\ +to return the mode that @var{entity} must be switched into prior to the\n\ +execution of @var{insn}, or the number of modes if @var{insn} has no\n\ +such requirement.", int, (int entity, rtx_insn *insn), NULL) DEFHOOK (after, "@var{entity} is an integer specifying a mode-switched entity.\n\ -If this macro is defined, it is evaluated for every @var{insn} during mode\n\ -switching. It determines the mode that an insn results\n\ -in (if different from the incoming mode).", +If this hook is defined, it is evaluated for every @var{insn} during mode\n\ +switching. It returns the mode that @var{entity} is in after @var{insn}\n\ +has been executed. @var{mode} is the mode that @var{entity} was in\n\ +before @var{insn} was executed, taking account of @var{TARGET_MODE_NEEDED}.\n\ +\n\ +@var{mode} is equal to the number of modes defined for @var{entity}\n\ +if the mode before @var{insn} is unknown. The hook should likewise return\n\ +the number of modes if it does not know what mode @var{entity} has after\n\ +@var{insn}.\n\ +\n\ +Not defining the hook is equivalent to returning @var{mode}.", int, (int entity, int mode, rtx_insn *insn), NULL) DEFHOOK (entry, - "If this macro is defined, it is evaluated for every @var{entity} that\n\ -needs mode switching. It should evaluate to an integer, which is a mode\n\ -that @var{entity} is assumed to be switched to at function entry.\n\ + "If this hook is defined, it is evaluated for every @var{entity} that\n\ +needs mode switching. It should return the mode that @var{entity} is\n\ +guaranteed to be in on entry to the function, or the number of modes\n\ +if there is no such guarantee.\n\ If @code{TARGET_MODE_ENTRY} is defined then @code{TARGET_MODE_EXIT}\n\ must be defined.", int, (int entity), NULL) DEFHOOK (exit, - "If this macro is defined, it is evaluated for every @var{entity} that\n\ -needs mode switching. It should evaluate to an integer, which is a mode\n\ -that @var{entity} is assumed to be switched to at function exit.\n\ + "If this hook is defined, it is evaluated for every @var{entity} that\n\ +needs mode switching. It should return the mode that @var{entity} must\n\ +be in on return from the function, or the number of modes if there is no\n\ +such requirement.\n\ If @code{TARGET_MODE_EXIT} is defined then @code{TARGET_MODE_ENTRY}\n\ must be defined.", int, (int entity), NULL) DEFHOOK (priority, - "This macro specifies the order in which modes for @var{entity}\n\ + "This hook specifies the order in which modes for @var{entity}\n\ are processed. 0 is the highest priority,\n\ @code{NUM_MODES_FOR_MODE_SWITCHING[@var{entity}] - 1} the lowest.\n\ -The value of the macro should be an integer designating a mode\n\ +The hook returns an integer designating a mode\n\ for @var{entity}. For any fixed @var{entity}, @code{mode_priority}\n\ (@var{entity}, @var{n}) shall be a bijection in 0 @dots{}\n\ @code{num_modes_for_mode_switching[@var{entity}] - 1}.", -- 2.33.0
Locations
Projects
Search
Status Monitor
Help
Open Build Service
OBS Manuals
API Documentation
OBS Portal
Reporting a Bug
Contact
Mailing List
Forums
Chat (IRC)
Twitter
Open Build Service (OBS)
is an
openSUSE project
.
浙ICP备2022010568号-2