Currently, I run into a problem in selecting a multiply-add-forward instruction in my backend.
%bin = xor i16 %1, %2 (any binary operation)
%mul = mul i16 %3, %4
%add = add i16 %mul, %bin
should generate a multiply-add-forward instruction as
XOR R0, R1, R2 ; R1 xor R2 → R0
MULADDFWD R5, R3, R4 ; R3 * R4 + result of (R1 xor R2) → R5
(Note the implicit operand of MULADDFWD is the result of previous binary instruction, not the R0 register. In my target, there is no data forwarding path, only the immediate result can be directly used, otherwise, several noops need to be inserted.)
As the result generated by the binary operation is stored in an implicit forwarding register and flushed every cycle, I need to stick AND and MULADDFWD instructions together.
I can use a custom node with SDNPInGlue property to select MULADDFWD, but how can I make the binary operation output a glue, so that I use the glue to stick them together?
This may be confusing, but I work in a not-so-normal target. Look forward to your reply.