我有一个具有函数解码的C程序,该函数具有以下语句。
我的decode.c
脚本:
int decod(int x, int y, int z) {
int ty = y;
ty = ty - z;
int py = ty;
py = py << 31;
py = py >> 31;
ty = ty * x;
py = py ^ ty;
}
该程序的汇编代码(由gcc -S decod.c
生成)显示以下代码。
movl %edi, -20(%rbp)
movl %esi, -24(%rbp)
movl %edx, -28(%rbp)
movl -24(%rbp), %eax
movl %eax, -8(%rbp)
movl -28(%rbp), %eax
subl %eax, -8(%rbp)
movl -8(%rbp), %eax
movl %eax, -4(%rbp)
sall $31, -4(%rbp)
sarl $31, -4(%rbp)
movl -8(%rbp), %eax
imull -20(%rbp), %eax
movl %eax, -8(%rbp)
movl -8(%rbp), %eax
xorl %eax, -4(%rbp)
popq %rbp
.cfi_def_cfa 7, 8
ret
但是,我希望程序生成一个只包含以下代码行的汇编文件。
subl %edx, %esi
movl %esi, %eax
sall $31, %eax
sarl $31, %eax
imull %edi, %esi
xorl %esi, %eax
ret
我知道我非常接近编写一个可以生成上述代码的程序。但是,我很无能为什么脚本会生成不同的汇编代码。任何方向都会有所帮助。
答案 0 :(得分:3)
如果您按原样编译函数,则在优化级别3中,a <- c('>= 0.99', '0.66', '<= 0.01')
整个函数已经过优化。这是因为没有返回值,并且library(intervals)
b <- Intervals(cbind(left = c(0.99, 0.66, -Inf), right = c(Inf, 0.66, 0.01)))
b
# Object of class Intervals
# 3 intervals over R:
# [0.99, Inf]
# [0.66, 0.66]
# [-Inf, 0.01]
和-O3
在函数之后仍然被丢弃。
供参考,代码如下
py
但是,如果您在结尾处添加ty
,则生成的代码如下所示。
.globl decod
.def decod; .scl 2; .type 32; .endef
.seh_proc decod
decod:
.seh_endprologue
ret
.seh_endproc
这在功能上与您期望的相同。