<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>