免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1505 | 回复: 2
打印 上一主题 下一主题

gcc优化编译问题请教 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-08-07 21:49 |只看该作者 |倒序浏览
#include "stdio.h"

typedef unsigned long long u64;
typedef unsigned int u32;

inline u64 mod_mul(u64 a, u64 b, u64 p)
{
u64 ret;
__asm__(
"movq %0, %%rax;\n"
"mulq %1;\n"
"divq %2;\n"
"movq %%rdx, %3;"
:
:"g"(a), "g"(b), "g"(p), "g"(ret)
:"%rax", "rdx"
);
return ret;
}

u64 mod_test(u64 a, u64 n, u64 p)

{
u64 ret = 1;
u64 b = mod_mul(a, a, p);
ret = mod_mul(ret, b, p);
return ret;
}

int main()
{
u64 ret = mod_test(2, 3, 10);
printf("%llu\n", ret);
return 0;
}
gcc版本是4.1.1-1
x86-64版本的fc5
在不加优化的情况下运行正常,输出为4
在加了-O2或-O1优化后,输出为1
加-S查看汇编代码,发现问题在mod_test函数中
主要汇编代码如下:
mod_test:
.LFB13:
movq%rdx, %rcx
#APP
movq %rdi, %rax;
mulq %rdi;
divq %rcx;
movq %rdx, %rax;//内联mod_mul(a, a, p)结束(1)
movq $1, %rax;//此处出现问题 (2)
mulq %rax;//(3)
divq %rcx;
movq %rdx, %rax;
在(1)结束之后,应该对b进行赋值的,而不是将返回值暂存在rax中
暂存在rax中的好处是少一次movq指令,但怎么能保证在b = mod_mul(a, a, p)到(3)之间rax没有变化呢
并且在(2)中,第一个参数(ret)已经使用了rax,第二个参数怎么还能用rax来传进来

论坛徽章:
0
2 [报告]
发表于 2006-08-07 21:50 |只看该作者
把程序改成这样子,汇编代码就正确了(但这样不能够实现功能)
#include "stdio.h"

typedef unsigned long long u64;
typedef unsigned int u32;

inline u64 mod_mul(u64 a, u64 b, u64 p)
{
u64 ret = (a * b)%p;
return ret;
}

u64 mod_test(u64 a, u64 n, u64 p)

{

u64 ret = 0x3344;

u64 b = mod_mul(a, a, p);
ret = mod_mul(ret, b, p);
return ret;

}

int main()
{
u64 ret = mod_test(2, 3, 10);
printf("%llu\n", ret);
return 0;
}
生成的主要汇编代码:
mod_test:
.LFB13:
movq%rdi, %rax
movq%rdx, %rsi
xorl%edx, %edx
imulq%rdi, %rax
divq%rsi //内联mod_mul(a, a, p)结束 (1)
imulq$13124, %rdx, %rax
xorl%edx, %edx
divq%rsi
movq%rdx, %rax
ret
主要的不同在于(1)之后没有把rdx传到rax中,也就是用rdx保存b的值(内联把返回值也给省掉了),这样后面就没有冲突了
不知道第一个程序为什么会生成错误的汇编代码

论坛徽章:
0
3 [报告]
发表于 2006-08-07 21:51 |只看该作者
gcc优化选项对内联汇编有什么要求?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP