<div dir="ltr">Hi!<div><br></div><div>I wonder if the following code snippet with assembly is broken, or Clang is wrong:</div><div><br></div><div><div><div>$ cat tmp/asm/rsp.c </div><div>void cpuid2 ( unsigned int* eax, unsigned int* ebx, unsigned int* ecx, unsigned int* edx, </div>
<div>    unsigned int index, unsigned int ecx_in )</div><div>{</div><div>  unsigned int a, b, c, d;</div><div>  __asm__ __volatile__ ("push %%ebx\n\tcpuid\n\tmovl %%ebx, %%esi\n\tpop%%ebx"</div><div><span class="" style="white-space:pre">                </span>: "=a" (a), "=S" (b), "=c" (c), "=d" (d) \</div>
<div><span class="" style="white-space:pre">            </span>: "0" (index), "2"(ecx_in) );</div><div>  *eax = a; *ebx = b; *ecx = c; *edx = d;</div><div>}</div></div><div><br></div><div>$ ./bin/clang tmp/asm/rsp.c -c -o tmp/asm/rsp.o</div>
<div>$ objdump -d tmp/asm/rsp.o</div><div><...></div><div><div>0000000000000000 <cpuid2>:</div><div>   0:<span class="" style="white-space:pre">  </span>48 89 7c 24 f8       <span class="" style="white-space:pre">     </span>mov    %rdi,-0x8(%rsp)    <---- %rdi is saved on stack</div>
<div>   5:<span class="" style="white-space:pre">       </span>48 89 74 24 f0       <span class="" style="white-space:pre">     </span>mov    %rsi,-0x10(%rsp)</div><div>   a:<span class="" style="white-space:pre">       </span>48 89 54 24 e8       <span class="" style="white-space:pre">     </span>mov    %rdx,-0x18(%rsp)</div>
<div>   f:<span class="" style="white-space:pre">       </span>48 89 4c 24 e0       <span class="" style="white-space:pre">     </span>mov    %rcx,-0x20(%rsp)</div><div>  14:<span class="" style="white-space:pre">       </span>44 89 44 24 dc       <span class="" style="white-space:pre">     </span>mov    %r8d,-0x24(%rsp)</div>
<div>  19:<span class="" style="white-space:pre">       </span>44 89 4c 24 d8       <span class="" style="white-space:pre">     </span>mov    %r9d,-0x28(%rsp)</div><div>  1e:<span class="" style="white-space:pre">       </span>44 8b 44 24 dc       <span class="" style="white-space:pre">     </span>mov    -0x24(%rsp),%r8d</div>
<div>  23:<span class="" style="white-space:pre">       </span>44 8b 4c 24 d8       <span class="" style="white-space:pre">     </span>mov    -0x28(%rsp),%r9d</div><div>  28:<span class="" style="white-space:pre">       </span>44 89 c0             <span class="" style="white-space:pre">     </span>mov    %r8d,%eax</div>
<div>  2b:<span class="" style="white-space:pre">       </span>44 89 c9             <span class="" style="white-space:pre">     </span>mov    %r9d,%ecx</div><div>  2e:<span class="" style="white-space:pre">      </span>53                   <span class="" style="white-space:pre">     </span>push   %rbx <--------------------------- % rbx is pushed on stack and overwrites %rdi</div>
<div>  2f:<span class="" style="white-space:pre">       </span>0f a2                <span class="" style="white-space:pre">     </span>cpuid  </div><div>  31:<span class="" style="white-space:pre">       </span>89 de                <span class="" style="white-space:pre">     </span>mov    %ebx,%esi</div>
<div>  33:<span class="" style="white-space:pre">       </span>5b                   <span class="" style="white-space:pre">     </span>pop    %rbx</div><div>  34:<span class="" style="white-space:pre">   </span>89 44 24 d4          <span class="" style="white-space:pre">     </span>mov    %eax,-0x2c(%rsp)</div>
<div>  38:<span class="" style="white-space:pre">       </span>89 74 24 d0          <span class="" style="white-space:pre">     </span>mov    %esi,-0x30(%rsp)</div><div>  3c:<span class="" style="white-space:pre">       </span>89 4c 24 cc          <span class="" style="white-space:pre">     </span>mov    %ecx,-0x34(%rsp)</div>
<div>  40:<span class="" style="white-space:pre">       </span>89 54 24 c8          <span class="" style="white-space:pre">     </span>mov    %edx,-0x38(%rsp)</div><div>  44:<span class="" style="white-space:pre">       </span>8b 44 24 d4          <span class="" style="white-space:pre">     </span>mov    -0x2c(%rsp),%eax</div>
<div>  48:<span class="" style="white-space:pre">       </span>48 8b 7c 24 f8       <span class="" style="white-space:pre">     </span>mov    -0x8(%rsp),%rdi   <----- %rdi is restored incorrectly</div><div>  4d:<span class="" style="white-space:pre">       </span>89 07                <span class="" style="white-space:pre">     </span>mov    %eax,(%rdi)</div>
<div><....></div></div><div><br></div><div style>Adding %rsp to the clobber-list doesn't help (and doesn't change generated code).</div><div><br></div><div>-- <br><div>Alexey Samsonov, MSK</div>
</div></div></div>