On Tue, Aug 20, 2019 at 01:59:06PM +0100, Richard Sandiford wrote:
> Segher Boessenkool <[email protected]> writes:
> >> [(set (match_operand:SI 0 "register_operand" "=d")
> >> (truncate:SI
> >> (lshiftrt:DI
> >
> > (this is optimised to a subreg, in many cases, for example).
>
> Right. MIPS avoids that one thanks to TARGET_TRULY_NOOP_TRUNCATION.
Trying 10 -> 18:
10: r200:TI=zero_extend(r204:DI)*zero_extend(r205:DI)
REG_DEAD r205:DI
REG_DEAD r204:DI
18: $2:DI=r200:TI#0
REG_DEAD r200:TI
Failed to match this instruction:
(set (reg/i:DI 2 $2)
(subreg:DI (mult:TI (zero_extend:TI (reg:DI 204))
(zero_extend:TI (reg:DI 205))) 0))
I'm afraid not.
This was
mips64-linux-gcc -Wall -W -O2 -S mulh.c -mips64 -mabi=64 -fdump-rtl-combine-all
on
===
typedef unsigned long S;
typedef unsigned __int128 D;
S mulh(S a, S b) { return (D)a*b >> (8*sizeof(S)); }
===
> >> float_narrow is different in that the plus (or whatever operation
> >> it's quoting) has to be kept in-place rather than folded away,
> >> otherwise the rtx itself is malformed and could trigger an ICE,
> >> just like the zero_extend of a const_int that I mentioned.
> >
> > Yes, it will not pass recog. Structurally it is just hunky-dory though.
>
> So maybe that's the main point of difference. We're introducing
> float_narrow to modify another rtx operation rather than to operate
> on an rtx value.
I wouldn't say it "operates" on anything. A float_narrow rtx means the
thing inside it does single-rounding to SP float. And it is just
notation: RTL itself knows *nothing* about float rounding, and because
of the way this is structured, nothing can change anything about the
float_narrow.
And yes, it is icky. But it is sound, as far as I can see.
> >> Whatever the number is, we'll still be listing them individually for
> >> built-in enumerations, internal_fn, and (I assume) optabs. But maybe
> >> after a certain point it does become too unwieldly for rtx codes.
> >> We have to keep it within 16 bits at least...
> >
> > My main concern is all the (simplification) code that parses RTL. All of
> > that will have to handle all variant versions as well.
>
> True, but we'd have to err on the side of caution whatever happens.
Yes.
> Not all existing PLUS simplifications necessarily apply as-is.
Yes. Everything will have to be checked. But not everything will
have to be modified, if we pick the defaults carefully. I hope. :-)
Segher