ARM64指令为32位长,因此如果要使用64位浮点常量,通常使用数据段来存储文字。
然而,我发现在某些情况下,AArch64 gcc编译器使用几条指令从立即数构造一个双浮点数,而不是将常量存储在数据段中。有没有办法强制实现这个特性?
我不想在嵌入式代码中引入数据节。
000000000044fda0 <foo>: 1.1, 2.2
44fda0: d2800000 mov x0, #0x0 // #0
44fda4: b0000002 adrp x2, 450000 <pmalloc+0x78> // cal data address
44fda8: b0000001 adrp x1, 450000 <pmalloc+0x78>
44fdac: fd472c41 ldr d1, [x2, #3672] // load the double
44fdb0: fd473020 ldr d0, [x1, #3680]
44fdb4: 6d000001 stp d1, d0, [x0]
...
44fdbc: d65f03c0 ret
000000000044fda0 <foo>: 5.5, 6.6
44fda0: d2800000 mov x0, #0x0 // #0
44fda4: b203e7e1 mov x1, #0x6666666666666666 // #7378697629483820646
44fda8: 1e62d001 fmov d1, #5.500000000000000000e+00
44fdac: f2e80341 movk x1, #0x401a, lsl #48
44fdb0: 9e670020 fmov d0, x1
44fdb4: 6d000001 stp d1, d0, [x0]
...
44fdbc: d65f03c0 ret
我希望gcc不使用任何数据段来构造双精度浮点型或整型文字,就像我展示的第二个foo
函数一样。
1条答案
按热度按时间ioekq8ef1#
您想要的选项称为
-mslow-flash-data
,但我的gcc版本的手册至少说明这只支持ARMv7M架构。