<div dir="ltr">I think Akira Hatanaka might have made this change recently.</div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Feb 4, 2015 at 9:41 AM, Daniel Sanders <span dir="ltr"><<a href="mailto:Daniel.Sanders@imgtec.com" target="_blank">Daniel.Sanders@imgtec.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">





<div lang="EN-GB" link="blue" vlink="purple">
<div>
<p class="MsoNormal">Hi All,<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">Does anyone remember why clang rejects inline assembly where an input and output are tied together but are differently sized types? The code that rejects it (Sema::ActOnGCCAsmStmt()) is looking like it's intentional but it's not clear why
 it does so.<u></u><u></u></p>
<p class="MsoNormal">My current theory is that it's to avoid dealing with cases where a register has to be tied to its own subregister or something along those lines.<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">Here's a trimmed version of the original failing case from the Linux Kernel:<u></u><u></u></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">static __inline__ __sum16 csum_ipv6_magic(const struct in6_addr *saddr,<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">                                          const struct in6_addr *daddr,<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">                                          __u32 len, unsigned short proto,<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">                                          __wsum sum)<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">{<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">        __asm__(<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">        /* snip */<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">        "       addu    %0, %5          # proto (long in network byte order)\n"<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">        "       sltu    $1, %0, %5      \n"<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">        /* snip */<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">        "       lw      %1, 0(%2)       # four words source address\n"<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">        /* snip */<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">        : "=r" (sum), "=r" (proto)<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">        : "r" (saddr), "r" (daddr),<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">          "0" (htonl(len)), "1" (htonl(proto)), "r" (sum));<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New""><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">        return csum_fold(sum);<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">}<u></u><u></u></span></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">Clang objects to the 'htonl(proto)' on the grounds that the type doesn't match 'proto':<u></u><u></u></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">arch/mips/include/asm/checksum.h:285:27: error: unsupported inline asm: input with type '__be32' (aka 'unsigned int') matching output with type 'unsigned short'<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">          "0" (htonl(len)), "1" (htonl(proto)), "r" (sum));<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">                                 ^~~~~~~~~~~~<u></u><u></u></span></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal" style="text-align:justify"><b><span style="font-size:12.0pt;font-family:"Arial","sans-serif";color:#3333ff">Daniel Sanders<u></u><u></u></span></b></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:10.0pt;font-family:"Arial","sans-serif";color:#3333ff">Leading Software Design Engineer, MIPS Processor IP<u></u><u></u></span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:10.0pt;font-family:"Arial","sans-serif";color:#3333ff">Imagination Technologies Limited<u></u><u></u></span></p>
<p class="MsoNormal" style="text-align:justify"><a href="http://www.imgtec.com/" target="_blank"><span style="font-size:10.0pt;font-family:"Arial","sans-serif";color:blue">www.imgtec.com</span></a><span style="font-size:10.0pt;font-family:"Arial","sans-serif""><u></u><u></u></span></p>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
</div>

<br>_______________________________________________<br>
cfe-dev mailing list<br>
<a href="mailto:cfe-dev@cs.uiuc.edu">cfe-dev@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev</a><br>
<br></blockquote></div><br></div>