4
回答
郁闷大了,请教 GCC版本支持64位汇编指令的问题
开发十年,就只剩下这套Java开发体系了   

我正在对<linux  下 C 编程 和make使用方法 >做内容更新。在处理clk计数器的时候,遇到个问题。

通过intel的rdtsc指令,是可以实现频率计数获取。这个是我一直用来测试算法性能使用的。通常系统的测试时间只能到毫秒。用rdtsc可以达到准确的频率翻转次数。

也就是说,一个函数如果运行了100个指令,在1G主频的CPU上,实际上只在0.1个微秒内就完成了。传统的方法无法检测该函数的优化从150个cycle是否确实降低到100cycle。这是我用rdtsc的原因。

但现在问题来了。以前一直使用抄袭别人的汇编,也没多想过选择方案。如下,

#define GET_CPU_CLK(re) do { \
     unsigned int __a,__d; \
     __asm__ __volatile__("rdtsc" : "=a" (__a), "=d" (__d)); \
     (re) = ((unsigned long)__a) | (((unsigned long)__d)<<32); \
} while(0)

但是我发现有如下方式可以直接操作

#define GET_CPU_CLK(re) __asm__ __volatile__("rdtsc" : "=A" (re))

以上定义的re变量都是64位的。

但后一种方法,尝试了几种方式都不行。虽然gcc的内联汇编资料里,确实有 =A是将64位数据对应输出。但是实际在我的机器里

ubuntu 64位,gcc 4.6.1下,仍然是只提取了32位出来。我不清楚GCC是否有专门的32位和64位汇编之分,目前使用 -march=XXX,均无法处理。

不知道是否有人可以帮忙解决这个问题。也即,上述汇编指令 =A,可以实现GCC内联汇编的64位的数据传递。

INTEL CPU上用标准GCC处理的内联汇编用的不多,以前只搞过MMX,SSE2。结果今天查了半天,发现有英文帖子也提出同样问题,但是没有解决方案。

 

GCC
举报
中山野鬼
发帖于7年前 4回/1K+阅
顶部