RE: unspec in machine description file

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



> Thanks for your reply. But I am afraid your pointer does not make it
> clearer to me. The excerpt of "define_insn "<u>mulsidi3_64bit_hilo" "
> I specified is from an older version of GCC which I need to stick to,
> so I need to understand why and when to use "unspec" as I am extending
> a GCC backend based on the MIPS one.

> >> 1. names of constants (UNSPEC_LOAD_LOW, UNSPEC_LOAD_HIGH, .. so on) :
> >> I understand that these are just names, but Why UNSPEC_ preceding each
> >> name ?

These are just unique values for the various operations which GCC does not
inherently understand. The names give meaning to an unspec operation
but that information will/can only be used by the backend.

> >> 2. some define_insn patterns have the "unspec" rtl expression. What
> >> does "unspec" precisely mean here - unspecified operation ? How does
> >> that work in the RTL generation pass ? E.g. :
 
Unspec is unspecified in terms of the standard GCC internals. All the core
code knows about the operation is that it has inputs and output(s).

A backend must explicitly expand to a pattern which includes an unspec
in order to generate it. So a named instruction would need to be expanded
and generate an instruction which includes an unspec for it to 'exist'.
(Or an instruction can be just constructed using gen_rtx_UNSPEC.

Andrew's example shows one level up from the pattern you referred to.
As part of <u>mulsidi3_64bit_split expansion then the instruction you
referred to gets generated. <u>mulsidi3_64bit_split itself is not a standard
named instruction so you then need to look at what generates that
instruction explicitly until you hit a standard named instruction.

The multiplication pattern expansion for MIPS is very complex and has
several layers. Perhaps look at another use of UNSPEC/unspec to help you
understand its role.

If you are adding new multiply instructions as part of your work then
you will have to take time to understand the whole set of multiply
instructions before extending them. If the work you are doing will not
get contributed back (which would be a shame) then you could try
simplifying the code to remove the cases which you do not care about
for your project. If you intend to contribute the code back then you
will need to do it properly.

Thanks,
Matthew

> On Wed, Sep 3, 2014 at 3:03 AM, Andrew Haley <aph@xxxxxxxxxx> wrote:
> > On 03/09/14 02:31, Cherry Vanc wrote:
> >> I cannot seem to pin down the scope of the keyword "unspec" in the
> >> machine description files. From the MIPS backend files, I see the word
> >> "unspec" being used in two ways :
> >>
> >> 1. names of constants (UNSPEC_LOAD_LOW, UNSPEC_LOAD_HIGH, .. so on) :
> >> I understand that these are just names, but Why UNSPEC_ preceding each
> >> name ?
> >> 2. some define_insn patterns have the "unspec" rtl expression. What
> >> does "unspec" precisely mean here - unspecified operation ? How does
> >> that work in the RTL generation pass ? E.g. :
> >>
> >> (define_insn "<u>mulsidi3_64bit_hilo"
> >>   [(set (match_operand:TI 0 "register_operand" "=x")
> >>   (unspec:TI
> >>     [(mult:DI
> >>        (any_extend:DI (match_operand:SI 1 "register_operand" "d"))
> >>        (any_extend:DI (match_operand:SI 2 "register_operand" "d")))]
> >>     UNSPEC_SET_HILO))]
> >>   "TARGET_64BIT && !TARGET_FIX_R4000"
> >>   "mult<u>\t%1,%2"
> >>   [(set_attr "type" "imul")
> >>    (set_attr "mode" "SI")])
> >
> > Look at
> >
> > (define_expand "<u>mulsidi3_64bit_split"
> >   [(set (match_operand:DI 0 "register_operand")
> >         (mult:DI (any_extend:DI (match_operand:SI 1 "register_operand"))
> >                  (any_extend:DI (match_operand:SI 2 "register_operand"))))
> >    (clobber (match_operand:DI 3 "register_operand"))]
> >   ""
> > {
> >   rtx hilo;
> >
> >   hilo = gen_rtx_REG (TImode, MD_REG_FIRST);
> >   emit_insn (gen_<u>mulsidi3_64bit_hilo (hilo, operands[1], operands[2]));
> >
> >   ...
> >
> > Andrew.
> >





[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux