<div dir="ltr">Can you file a bug on this? I suspect it was broken in r290539 when the clobber list was removed because it was made an error to clobber an input or output.</div><div class="gmail_extra"><br clear="all"><div><div class="gmail_signature" data-smartmail="gmail_signature">~Craig</div></div>
<br><div class="gmail_quote">On Wed, Nov 1, 2017 at 11:05 PM, Liu Hao via cfe-dev <span dir="ltr"><<a href="mailto:cfe-dev@lists.llvm.org" target="_blank">cfe-dev@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb"><div class="h5">On 2017/11/1 22:08, LIANG Xingliang via cfe-dev wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
I just find a serious bug. Windows prebuilt binary.<br>
------------------------------<wbr>------------------------------<wbr>------------------------------<wbr>-------------<br>
#include <stdio.h><br>
#include <intrin.h><br>
<br>
//this function is just copyed from `intrin.h': __movsb(), __x86_64__<br>
static __inline__ void __attribute__((__always_inline<wbr>__, __nodebug__))<br>
__movsb_buggy(unsigned char *__dst, unsigned char const *__src, size_t __n) {<br>
//for(size_t i=0; i<__n; i++) __dst[i] = __src[i]; //OK<br>
__asm__("rep movsb" : : "D"(__dst), "S"(__src), "c"(__n)); //FAIL<br>
}<br>
<br>
int main(int argc, const char ** argv)<br>
{<br>
unsigned char dst[4]={'a', 'b', 'c', '\0'};<br>
unsigned char src[4]={'1', '2', '3', '\0'};<br>
__movsb_buggy(dst, src, 1);<br>
puts((char*)dst); //expect "1bc", but get "bc"<br>
puts((char*)src); //expect "123", but get "23"<br>
return 0;<br>
}<br>
------------------------------<wbr>------------------------------<wbr>------------------------------<wbr>------<br>
<br>
</blockquote></div></div>
This implementation looks wrong to me.<br>
<br>
First, `movsb` alters RDI, RSI and RCX, so all three parameters must be in-out ones. Second, the memory area offset from RDI is written to and the one offset from RSI is read from, but this __asm__ statement fails to say that.<br>
<br>
AFAICT the correct implementation should be:<br>
```<span class=""><br>
static __inline__ void __attribute__((__always_inline<wbr>__, __nodebug__))<br></span>
__movsb(unsigned char *__dst, unsigned char const *__src, size_t __n)<br>
{<br>
  __asm__ ("rep movsb"<br>
    : "+D"(__dst), "+S"(__src), "+c"(__n), "=m"(*(char (*)[])__dst)<br>
    : "m"(*(char (*)[])__src)<br>
  );<br>
}<br>
```<span class="HOEnZb"><font color="#888888"><br>
<br>
<br>
-- <br>
Best regards,<br>
LH_Mouse<br>
<br>
______________________________<wbr>_________________<br>
cfe-dev mailing list<br>
<a href="mailto:cfe-dev@lists.llvm.org" target="_blank">cfe-dev@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/cfe-dev</a><br>
</font></span></blockquote></div><br></div>