+ mov $1000000000, %ecx /* number of nanoseconds in a second */
+ mov %edx, %ebx
+ mul %ecx
+ mov %edx, %edi
+ mov %eax, %esi
+ mov %ebx, %eax
+ mul %ecx
+ add %edi, %eax
+ adc $0, %edx /* result in edx:eax:esi */
+ mov %eax, %edi
+ mov _COMM_PAGE_NT_SHIFT,%ecx /* overloaded as the low 32 tscFreq */
+ xor %eax, %eax
+ xchg %edx, %eax
+ div %ecx
+ xor %eax, %eax
+ mov %edi, %eax
+ div %ecx
+ mov %eax, %ebx
+ mov %esi, %eax
+ div %ecx
+ mov %ebx, %edx /* result in edx:eax */
+ popl %esi /* recover generation */
+
+ add _COMM_PAGE_NT_NS_BASE,%eax
+ adc _COMM_PAGE_NT_NS_BASE+4,%edx
+
+ cmpl _COMM_PAGE_NT_GENERATION,%esi /* have the parameters changed? */
+ jne 0b /* yes, loop until stable */
+
+ pop %ebx
+ pop %edi
+ pop %esi
+ pop %ebp
+ ret /* result in edx:eax */
+
+ COMMPAGE_DESCRIPTOR(nanotime_slow,_COMM_PAGE_NANOTIME,kSlow,0)
+
+
+/* The 64-bit version. We return the 64-bit nanotime in %rax,
+ * and by convention we must preserve %r9, %r10, and %r11.
+ */
+ .text
+ .align 2
+ .code64
+Lnanotime_64: // NB: must preserve r9, r10, and r11
+ pushq %rbp // set up a frame for backtraces
+ movq %rsp,%rbp
+ movq $_COMM_PAGE_32_TO_64(_COMM_PAGE_TIME_DATA_START),%rsi