<div dir="ltr"><div dir="ltr"><div>Hi paulr,</div><div>Thank you for your response :)</div><div><br></div><div>Hi Krzysztof,</div><div>This is really helpful! Thank you for your guidance!!</div><div>I would like to trace the Hexagon's llvm implementation.</div><div>I am very interested on how Hexagon implement instruction</div><div>pattern matching, instruction scheduling, and register</div><div>allocation, could you give me some suggestions or reading</div><div>lists to help me understand Hexagon's llvm implementation?</div><div>Thank you :)</div><div><br></div><div>CY</div></div><br><div class="gmail_quote"><div dir="ltr">2018年12月11日(火) 4:19 Krzysztof Parzyszek via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>>:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">In the intermediate language that assembler works on an instruction is <br>
represented by an MCInst. An MCInst can have other instructions as <br>
operands, and this is how the Hexagon backend implements bundles.<br>
<br>
A top-level MCInst (i.e. the entire bundle) is encoded all at once from <br>
the point of view of the target-independent mechanisms. Those mechanisms <br>
use target-specific code that each implementation needs to provide, and <br>
in your code you can handle each bundle as you want.<br>
<br>
Check MCCodeEmitter and how different targets implement it.<br>
<br>
As for the syntax---the parser needs to be able to determine the bundle <br>
boundary. (For example Hexagon uses braces {} to enclose each bundle.) <br>
The way the assembler works is that it constructs an instruction and <br>
passes it to the associated streamer. The streamer is typically an <br>
assembly streamer (i.e. printing the instruction assembly), or an object <br>
file streamer (e.g. ELF, etc.)<br>
<br>
The answers to all your questions are "yes", or "it's doable", but the <br>
degree of complexity may vary between different choices.<br>
<br>
The major suggestion that I have is to make sure that the syntax is <br>
unambiguous, specifically when it comes to bundle boundaries. Another <br>
suggestion is to maintain the "mnemonic op, op, ..." syntax for <br>
individual instructions (i.e. mnemonic followed by a list of operands). <br>
Hexagon has its own assembly syntax that doesn't follow that, and it <br>
makes things a bit more complicated.<br>
<br>
-Krzysztof<br><br>
-- <br>
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,<br>
hosted by The Linux Foundation<br>
_______________________________________________<br>
LLVM Developers mailing list<br>
<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a><br>
</blockquote></div></div>