Alex Susu via llvm-dev
2017-Jan-19 04:50 UTC
[llvm-dev] Implementing ASM loop branching instruction
Hello.
I am implementing for my processor back end 2 loop instructions:
set_loop_counter and
Jump_if_counter_not_zero instruction (this is similar to PowerPC's CTR count
register and
MTCTR and BCTR instructions, which is implemented in the LLVM PowerPC back end,
but I did
not generate code for PPC with LLVM; see
http://www.ibm.com/developerworks/library/l-powasm3/ for details).
For this I defined LLVM intrinsics: int_connex_repeat_x_times (for
set_loop_counter)
and int_connex_end_repeat (for Jump_if_counter_not_zero instruction).
But then, in TableGen it seems I cannot give jump semantics for the
Jump_if_counter_not_zero instruction, because it is already an ASM intrinsic.
More
exactly, I give:
class END_REPEAT_DESC_BASE<InstrItinClass itin = NoItinerary> {
dag OutOperandList = (outs);
dag InOperandList = (ins);
string AsmString = "END_REPEAT; // END_REPEAT";
list<dag> Pattern = [(int_connex_end_repeat)];
bit hasSideEffects = 1;
InstrItinClass Itinerary = itin;
}
I should give ISD::BRCOND semantics to my Jump_if_counter_not_zero (Connex)
ASM
instruction in order for the back end to perform eventual optimizations on the
code such
as loop invariant code motion, etc.
Should I do this in the TableGen END_REPEAT_DESC_BASE spec by chaning the
line:
list<dag> Pattern = [(int_connex_end_repeat)];
with
list<dag> Pattern = [(brcond targetAddress)];
Or should I maybe do this in [Target]ISelLowering or [Target]ISelDAGToDAG
by adding
there BRCOND instead of the int_connex_end_repeat machine-independent node?
Thank you,
Alex