According to "info gcc", the 'A' constraint denotes the `a' and `d' registers, as a pair (for instructions that return half the result in one and half in the other). However, in reality 'A' is treated simply as a 64-bit long integer in %rax under x86-64. For example, the following code piece: #include <stdint.h> uint64_t rdtsc(void) { uint64_t ret; asm ("rdtsc":"=A"(ret)); return ret; } produces: [zuxy@Rainbow31 bin]$ objdump -d a.o a.o: file format elf64-x86-64 Disassembly of section .text: 0000000000000000 <rdtsc>: 0: 0f 31 rdtsc 2: c3 retq
You just misunderstand it. You'd need a 128-bit int __attribute__((mode (TI))) value if you want it to mean a pair, because for -m64 registers are 64-bit. If you use smaller precision type, "A" constraint acts just as a constraint allowing both ax and dx registers and it is up to the compiler which one it chooses. rdtsc returns result in %eax and %edx, even for 64-bit code, so you need to use unsigned int low, high; "=a" (low), "=d" (high) and then combine that into a 64-bit value.