assembly 强制arm64 gcc使用指令构造双浮点数,无.rodata段

7tofc5zh  于 2022-11-30  发布在  其他
关注(0)|答案(1)|浏览(157)

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函数一样。

ioekq8ef

ioekq8ef1#

您想要的选项称为-mslow-flash-data,但我的gcc版本的手册至少说明这只支持ARMv7M架构。

相关问题