关于PPC上关闭浮点寄存器的使用

    这段时间出现PID中的PNO被清零问题,估计是由于使用的浮点寄存器导致,在压力测试下,频繁使用64位浮点寄存器实现PID[正好64位]的赋值时,PNO[刚好是低32位起始]偶而会被清零。
    看来避免编译器使用硬件浮点寄存器是根本,今晚做了一个试验:

void Rex_fd()
{
    PID pid1,pid2;
   
    pid1 = pid2;   
}

void Rex_fd1()
{
    PID pid1,pid2;
   
    pid1.CpuNode = pid2.CpuNode;   
    pid1.Pno     = pid2.Pno;
}

------------------------------
原编译选项下的反汇编结果:
Disassembly of section .text:
00000000 <Rex_fd> stwu r1,-32(r1)
00000004 <Rex_fd+4> stw r31,28(r1)
00000008 <Rex_fd+8> mr r31,r1
0000000c <Rex_fd+c> lfd f0,16(r31)
00000010 <Rex_fd+10> stfd f0,8(r31)

00000014 <Rex_fd+14> lwz r11,0(r1)
00000018 <Rex_fd+18> lwz r31,-4(r11)
0000001c <Rex_fd+1c> mr r1,r11
00000020 <Rex_fd+20> blr
00000024 <Rex_fd1> stwu r1,-32(r1)
00000028 <Rex_fd1+4> stw r31,28(r1)
0000002c <Rex_fd1+8> mr r31,r1
00000030 <Rex_fd1+c> lwz r0,16(r31)
00000034 <Rex_fd1+10> stw r0,8(r31)
00000038 <Rex_fd1+14> lhz r0,20(r31)
0000003c <Rex_fd1+18> sth r0,12(r31)
00000040 <Rex_fd1+1c> lwz r11,0(r1)
00000044 <Rex_fd1+20> lwz r31,-4(r11)
00000048 <Rex_fd1+24> mr r1,r11
0000004c <Rex_fd1+28> blr
------------------------------
增加-msoft-float编译选项后的反汇编结果:
Disassembly of section .text:
00000000 <Rex_fd> stwu r1,-32(r1)
00000004 <Rex_fd+4> stw r31,28(r1)
00000008 <Rex_fd+8> mr r31,r1
0000000c <Rex_fd+c> lwz r9,16(r31)
00000010 <Rex_fd+10> lwz r10,20(r31)
00000014 <Rex_fd+14> stw r9,8(r31)
00000018 <Rex_fd+18> stw r10,12(r31)

0000001c <Rex_fd+1c> lwz r11,0(r1)
00000020 <Rex_fd+20> lwz r31,-4(r11)
00000024 <Rex_fd+24> mr r1,r11
00000028 <Rex_fd+28> blr
0000002c <Rex_fd1> stwu r1,-32(r1)
00000030 <Rex_fd1+4> stw r31,28(r1)
00000034 <Rex_fd1+8> mr r31,r1
00000038 <Rex_fd1+c> lwz r0,16(r31)
0000003c <Rex_fd1+10> stw r0,8(r31)
00000040 <Rex_fd1+14> lhz r0,20(r31)
00000044 <Rex_fd1+18> sth r0,12(r31)
00000048 <Rex_fd1+1c> lwz r11,0(r1)
0000004c <Rex_fd1+20> lwz r31,-4(r11)
00000050 <Rex_fd1+24> mr r1,r11
00000054 <Rex_fd1+28> blr

你可能感兴趣的:(使用)