<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Word 14 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri","sans-serif";
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri","sans-serif";}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal">The following is an extraction from the Operand class hierarchy of Target.td. I am trying to define a parameterized version of AsmOperandClass with a passed-in bit size.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">// from Target.td<o:p></o:p></p>
<p class="MsoNormal">class AsmOperandClass {<o:p></o:p></p>
<p class="MsoNormal">   string Name;<o:p></o:p></p>
<p class="MsoNormal">}<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">class Operand {<o:p></o:p></p>
<p class="MsoNormal">   AsmOperandClass ParserMatchClass;<o:p></o:p></p>
<p class="MsoNormal">}<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">// A parameterized AsmOperandClass<o:p></o:p></p>
<p class="MsoNormal">class myAsmOperandClass<int n> : AsmOperandClass {<o:p></o:p></p>
<p class="MsoNormal">  string Name = "Class" # n;<o:p></o:p></p>
<p class="MsoNormal">}<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">// A concrete instance<o:p></o:p></p>
<p class="MsoNormal">def myImm5Class: myAsmOperandClass<5>;<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">// Assign ParserMatchClass from the concrete instance: OK<o:p></o:p></p>
<p class="MsoNormal">def myImm5 : Operand {<o:p></o:p></p>
<p class="MsoNormal">  let ParserMatchClass = myImm5Class;  <o:p></o:p></p>
<p class="MsoNormal">}  <o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">// Now try to abstract the above by parameterizing the size<o:p></o:p></p>
<p class="MsoNormal">class myImmClass<int n>: Operand {<o:p></o:p></p>
<p class="MsoNormal">  let ParserMatchClass = myAsmOperandClass<n>;<o:p></o:p></p>
<p class="MsoNormal">}  <o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">// Fails<o:p></o:p></p>
<p class="MsoNormal">def myImm6 : myImmClass<6>;<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">On the real .td file from which this was taken, tablegen complains that the Name field of myImm6’s ParserMatchClass is not a string. The reason is revealed by looking at the raw output from tablegen:<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">------------- Defs -----------------<o:p></o:p></p>
<p class="MsoNormal">def myImm5Class {       // AsmOperandClass myAsmOperandClass<o:p></o:p></p>
<p class="MsoNormal">  string Name = "Class5";<o:p></o:p></p>
<p class="MsoNormal">}<o:p></o:p></p>
<p class="MsoNormal">def myImm5 {    // Operand<o:p></o:p></p>
<p class="MsoNormal">  AsmOperandClass ParserMatchClass = myImm5Class;<o:p></o:p></p>
<p class="MsoNormal">}<o:p></o:p></p>
<p class="MsoNormal">def anonymous_0 {       // AsmOperandClass myAsmOperandClass<o:p></o:p></p>
<p class="MsoNormal">  string Name = !strconcat("Class", !cast<string>(myImmClass:n));<o:p></o:p></p>
<p class="MsoNormal">}<o:p></o:p></p>
<p class="MsoNormal">def myImm6 {    // Operand myImmClass<o:p></o:p></p>
<p class="MsoNormal">  AsmOperandClass ParserMatchClass = anonymous_0;<o:p></o:p></p>
<p class="MsoNormal">}<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">In the myImm5Class def used by myImm5, the !strconcat operation has been applied to compute the Name as “Class5”. But in the anonymous def used by myImm6, the !strconcat operation has not been applied. Why not? How is the anonymous definition
 any different than the explicit one?<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Is this a known ‘feature’/deficiency? Or am I the first to ‘discover’ it (seems unlikely).<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">-Alan <o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</body>
</html>