|
反汇编arm9代码,为什么调用两次bic,gcc犯傻吗???
[复制链接]
如下三段汇编代码
a &= ~(1 << 7);//a &= ~0x80
e3c: e51b300c ldr r3, [fp, #-12]
e40: e3c33080 bic r3, r3, #128 ; 0x80
e44: e50b300c str r3, [fp, #-12]
a &= ~((1 << 2)|(1 << 3)| (1 << 4)| (1 << 8)| (1 << 16));//a &= ~0x10284 e1c: e51b300c ldr r3, [fp, #-12]
e20: e3c33801 bic r3, r3, #65536 ; 0x10000
e24: e3c33f47 bic r3, r3, #284 ; 0x11c
e28: e50b300c str r3, [fp, #-12]
tmpreg &= ~((7 << 0) | (7 << 4) | (7 << 8) | (8 << 16));//tmpreg &= ~0x80777 5b8: e51b3008 ldr r3, [fp, #-8]
5bc: e3c33702 bic r3, r3, #524288 ; 0x80000
5c0: e3c33e77 bic r3, r3, #1904 ; 0x770
5c4: e3c33007 bic r3, r3, #7 ; 0x7
5c8: e50b3008 str r3, [fp, #-8]
我发现反汇编后的bic指令,凡是数大于0xFFFF后就被分成多分,如果R3是16位寄存器,那么理论上0xFFFFFFFF这样的数执行两次bic指令也能运行完。
但是为什么第3个例子里好好的0x80777被分成0x80000、0x770、0x7呢?
虽然这样把代码分成了多份?是不是考虑到“三级流水线”而设计的呢?因为我不相信编译器会犯傻,或许这还是个妙招,保证流水线不被打乱。
虽然bic被分成2、3行代码,但与执行1行代码是等同效率的?
|
|