Re: Inline asm - unexpected optimization

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Jeremy Hall schrieb:
Hi,
Looking at the assembler for this speculative code, I saw that without
asm volatile, the second call to rdrand was removed and the value
"low" used twice.
gcc 4.6.1 with any optimization turned on.  It looks to me like this
optimization will stop the code working.

My question is:  is this my ignorance of inline assembler (most
likely) or is it a bug in gcc which I should report?

It's not a bug in gcc.

The inlne asm has side effects you didn't report to gcc, so you need the volatile here.

I know its a new instruction.  The retry loop etc is removed to
simplify the test case.

#include <stdio.h>
typedef unsigned long long qword;
// #define asm __asm__ __volatile__

int
main( int argc, char *argv[] )
{
  qword result;

    /* for 32 bit mode call rdrand twice */
  unsigned int low, high;
  asm( "rdrand %0" : "=r" (low) );
  asm( "rdrand %0" : "=r" (high) );
  result = ((qword)high << 32U) | low;

  printf("64 bit random number: %llu\n", result );
}


[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux