>   where then the target may declare class machine_mode
>   target_int_mode ("HI", 16),

This is where we disagree.  The *target* shouldn't map types to modes.
The *MI* should map types to modes.  The target just creates the modes
it supports and describes them.  The MI looks them up by description
(NOT NAME).  If the MI needs a 32 bit unsigned scalar, it does
lookup_mode(32, M_SCALAR, M_UNSIGNED) and uses whatever gets returned.

The fact that you're still trying to assign a "well known name" to a
given type/mode/whatever means you haven't gotten away from the (to
me) fundamental problem, that MI chooses modes according to what
they're *for* instead of according to what they *are*.

>   target_unit_mode // presumably the target's smallest addressable datum.

BImode in most cases, not really useful that way.

>   target_word_mode // presumably the target's largest addressable datum.

BLKmode in all cases.  Also not useful.

>   as there seems no valid reason for the target neutral portion of the
>   compiler to ever refer to XXmode under any circumstance?

Ah, but in your case it *is* aware, it just calls it
"target_word_mode" instead of "SImode" with all the same problems with
assumptions.

>   where correspondingly the MI portions of GCC utilizes the appropriate
>   pointer mode as a function of the type of access being performed,

In my case, the target has to check the attributes of the
function/data to decide what kind of pointer to use.  Again, "MI
assuming" that all function pointers are the same is WRONG.

> - understood, although I honestly don't believe there are that many, and
>   it eliminates any possible confusion, and a host of other #defines.

My current port supports maybe 4-5 hard modes.  There are 19
machine_modes defined.  That's about 4x as many as I really need to
define, and that doesn't even include synthetic vector modes and such.

> - as you've noted, all the information GCC MI portion needs to "do the
>   right thing" already exists scattered in various target definitions,
>   but it hasn't prevented mode assumptions from being made, and XXmodes
>   being hard-coded into the MI sources on occasion; which is the only
>   reason that I thought that by forcing target_TYPE_mode's to be the
>   only thing available, GCC would indirectly be forced to always to the
>   "right thing"?

The less available the better, true.  But target_*_modes don't need to
be available either.  If you use a query/lookup API, MI can assume
there are a *lot* of machine modes (one for each variable, one for
each function, one for each C data type, etc), and let the target map
them to available modes.

        targetm.modes.set_mode_for_decl(decl);

See?  This allows for a custom mode just for the given decl (it might
be a 17 bit ternary value in a DSP), doesn't make assumptions about
available machine modes, and MI can provide a naive default hook for
targets that do "the usual thing".

        if (!TYPE_MODE (TREE_TYPE (decl)))
          TYPE_MODE (TREE_TYPE (decl)) = find_mode_for_type (TREE_TYPE (decl));
        DECL_MODE (decl) = TYPE_MODE (TREE_TYPE (decl));

or something like that.  Caching is OK if you cache it the right way
(with a type, not in a global "this is a pointer" variable).

Reply via email to