为什么生成此代码以取消引用浮点指针?
Why is this code generated to dereference a float pointer?
我有这个生成奇怪机器码的文件float_deref.c
:
float float_deref(float *ptr)
{
return *ptr;
}
这里是avr-gcc -mmcu=atmega328p -O3 -S -o - float_deref.c
生成的程序集:
.file "float_deref.c"
__SP_H__ = 0x3e
__SP_L__ = 0x3d
__SREG__ = 0x3f
__tmp_reg__ = 0
__zero_reg__ = 1
.text
.global float_deref
.type float_deref, @function
float_deref:
push r28
push r29
rcall .
rcall .
in r28,__SP_L__
in r29,__SP_H__
/* prologue: function */
/* frame size = 4 */
/* stack size = 6 */
.L__stack_usage = 6
movw r30,r24
ld r18,Z
ldd r19,Z+1
ldd r20,Z+2
ldd r21,Z+3
movw r24,r20
movw r22,r18
/* epilogue start */
pop __tmp_reg__
pop __tmp_reg__
pop __tmp_reg__
pop __tmp_reg__
pop r29
pop r28
ret
.size float_deref, .-float_deref
.ident "GCC: (Homebrew AVR GCC 9.3.0) 9.3.0"
我不明白为什么代码将四个额外的字节压入堆栈并将堆栈指针加载到 Y
。据我所知,Y
从未在函数中使用过。
这是 v9+ 中的一个已知问题,请参阅 https://gcc.gnu.org/PR90706
我有这个生成奇怪机器码的文件float_deref.c
:
float float_deref(float *ptr)
{
return *ptr;
}
这里是avr-gcc -mmcu=atmega328p -O3 -S -o - float_deref.c
生成的程序集:
.file "float_deref.c"
__SP_H__ = 0x3e
__SP_L__ = 0x3d
__SREG__ = 0x3f
__tmp_reg__ = 0
__zero_reg__ = 1
.text
.global float_deref
.type float_deref, @function
float_deref:
push r28
push r29
rcall .
rcall .
in r28,__SP_L__
in r29,__SP_H__
/* prologue: function */
/* frame size = 4 */
/* stack size = 6 */
.L__stack_usage = 6
movw r30,r24
ld r18,Z
ldd r19,Z+1
ldd r20,Z+2
ldd r21,Z+3
movw r24,r20
movw r22,r18
/* epilogue start */
pop __tmp_reg__
pop __tmp_reg__
pop __tmp_reg__
pop __tmp_reg__
pop r29
pop r28
ret
.size float_deref, .-float_deref
.ident "GCC: (Homebrew AVR GCC 9.3.0) 9.3.0"
我不明白为什么代码将四个额外的字节压入堆栈并将堆栈指针加载到 Y
。据我所知,Y
从未在函数中使用过。
这是 v9+ 中的一个已知问题,请参阅 https://gcc.gnu.org/PR90706