關於PPC上關閉浮點暫存器的使用

2021-09-05 13:27:32 字數 1643 閱讀 1685

這段時間出現pid中的pno被清零問題,估計是由於使用的浮點暫存器導致,在壓力測試下,頻繁使用64位浮點暫存器實現pid[正好64位]的賦值時,pno[剛好是低32位起始]偶而會被清零。

看來避免編譯器使用硬體浮點暫存器是根本,今晚做了乙個試驗:

void rex_fd()

void rex_fd1()

------------------------------

原編譯選項下的反彙編結果:

disassembly of section .text:

00000000 stwu r1,-32(r1)

00000004 stw r31,28(r1)

00000008 mr r31,r1

0000000c lfd f0,16(r31)

00000010 stfd f0,8(r31)

00000014 lwz r11,0(r1)

00000018 lwz r31,-4(r11)

0000001c mr r1,r11

00000020 blr

00000024 stwu r1,-32(r1)

00000028 stw r31,28(r1)

0000002c mr r31,r1

00000030 lwz r0,16(r31)

00000034 stw r0,8(r31)

00000038 lhz r0,20(r31)

0000003c sth r0,12(r31)

00000040 lwz r11,0(r1)

00000044 lwz r31,-4(r11)

00000048 mr r1,r11

0000004c blr

------------------------------

增加-msoft-float編譯選項後的反彙編結果:

disassembly of section .text:

00000000 stwu r1,-32(r1)

00000004 stw r31,28(r1)

00000008 mr r31,r1

0000000c lwz r9,16(r31)

00000010 lwz r10,20(r31)

00000014 stw r9,8(r31)

00000018 stw r10,12(r31)

0000001c lwz r11,0(r1)

00000020 lwz r31,-4(r11)

00000024 mr r1,r11

00000028 blr

0000002c stwu r1,-32(r1)

00000030 stw r31,28(r1)

00000034 mr r31,r1

00000038 lwz r0,16(r31)

0000003c stw r0,8(r31)

00000040 lhz r0,20(r31)

00000044 sth r0,12(r31)

00000048 lwz r11,0(r1)

0000004c lwz r31,-4(r11)

00000050 mr r1,r11

00000054 blr

關於暫存器的總結

本章學習圍繞暫存器展開,學習了cpu概述 通用暫存器 字在暫存器中的存放 彙編指令 mov,add 8086給出實體地址的方法 段暫存器cs和指令指標暫存器ip這幾個知識點。以下我便逐個寫出我認為該知識點中的值得注意的地方。1 cpu中有字長與位寬兩個概念,字長表示cpu在單位時間內能一次處理的二進...

標誌暫存器df 關於標誌暫存器的各個標誌

運算結果標誌位 1 進製標誌cf carry flag 進製標誌cf主要用來反映運算是否產生進製或借位。如果運算結果的最高位產生了乙個進製或借位,那麼,其值為1,否則其值為0。使用該標誌位的情況有 多字 位元組 數的加減運算,無符號數的大小比較運算,移位操作,字 位元組 之間移位,專門改變cf值的指...

關於CPU暫存器的那些事兒(2) 暫存器是什麼

暫存器是cpu內部用來存放資料的一些小型儲存區域 主要是用於儲存資料的!主要是用於儲存資料的!主要是用於儲存資料的!當然,有時候也會儲存一些標誌資訊 控制資訊等,這些都可以看成一資料。x86架構cpu的指指令集是複雜指令集 cisc 提供了豐富的指令來實現強大的功能,與此同時也提供了大量暫存器來輔助...