什么导致GCC 7.2.1在ARM上对于某些常量使用从内存(lr
)加载,而在其他一些情况下使用立即数(mov
)?具体来说,我看到以下内容:
GCC 7.2.1适用于ARM编译了这个:
extern void abc(int);
int test() { abc(1199); return 0; }
…进入那个:
test():
push {r4, lr}
ldr r0, .L4 // ??!
bl abc(int)
mov r0, #0
pop {r4, lr}
bx lr
.L4:
.word 1199
和这个:
extern void abc(int);
int test() { abc(1200); return 0; }
......进入其中:
test():
push {r4, lr}
mov r0, #1200 // OK
bl abc(int)
mov r0, #0
pop {r4, lr}
bx lr
一开始我以为1200是某种独特的截止值,但也存在其他类似于这样的截止值,比如1024(1024使用mov r0, #1024
,而1025使用ldr
),还有其他值。
为什么GCC会使用从内存读取常量的方式,而不是使用立即数?