老地方冰果室交流區

歡迎冰果室讀者在此交流
現在的時間是 12/10/2019 2:22 pm

所有顯示的時間為 UTC + 8 小時




發表新文章 回覆主題  [ 10 篇文章 ] 
發表人 內容
文章發表於 : 05/03/2005 11:28 am 
離線
留言破百
頭像

註冊時間: 04/29/2001 1:01 am
文章: 102
來自: 香港
之前的一篇討論中,謝孟叡兄跟ulysses兄均提及有關32 位元模式下支援 64 位元算術指令集的事情,比卡超不明白如可在只有32位元GPR的情況下,直接支援64位元算術。為了這個問題,比卡超特別查看過IBM的PowerPC Microprocessor Family: The Programming Environments for 32-Bit Microprocessors,內裡並未提及64 位元算術指令集,在此實在懷疑這64 位元算術指令集到底是什麼。

再者,比卡超也寫了一個笨程式:
代碼:
int main()
{
        long long int   integerA=0;
        long long int   integerB=0;
        integerA += integerB;
}


用gcc分別用32-bit跟64bit mode compile過,從生出的程式碼中發現:在32-bit mode下,64位元運算還是要用兩個32位元運算來做;反之在64-bit mode下,64位元運算還是真正用一個64位元運算來處理。

代碼:
Assemble code in 32-bit mode:
0x00002cdc <main+0>:    stmw    r30,-8(r1)
0x00002ce0 <main+4>:    stwu    r1,-64(r1)
0x00002ce4 <main+8>:    mr      r30,r1
0x00002ce8 <main+12>:   li      r2,0
0x00002cec <main+16>:   li      r3,0
0x00002cf0 <main+20>:   stw     r2,32(r30)
0x00002cf4 <main+24>:   stw     r3,36(r30)
0x00002cf8 <main+28>:   li      r2,0
0x00002cfc <main+32>:   li      r3,0
0x00002d00 <main+36>:   stw     r2,24(r30)
0x00002d04 <main+40>:   stw     r3,28(r30)
0x00002d08 <main+44>:   lwz     r9,32(r30)
0x00002d0c <main+48>:   lwz     r10,36(r30)
0x00002d10 <main+52>:   lwz     r2,24(r30)
0x00002d14 <main+56>:   lwz     r3,28(r30)
0x00002d18 <main+60>:   addc    r3,r3,r10
0x00002d1c <main+64>:   adde    r2,r2,r9
0x00002d20 <main+68>:   stw     r2,32(r30)
0x00002d24 <main+72>:   stw     r3,36(r30)
0x00002d28 <main+76>:   lwz     r1,0(r1)
0x00002d2c <main+80>:   lmw     r30,-8(r1)
0x00002d30 <main+84>:   blr


代碼:
Assemble code in 64-bit mode:
0x0000000000001f1c <main+0>:    std     r30,-16(r1)
0x0000000000001f20 <main+4>:    stdu    r1,-80(r1)
0x0000000000001f24 <main+8>:    mr      r30,r1
0x0000000000001f28 <main+12>:   li      r0,0
0x0000000000001f2c <main+16>:   std     r0,56(r30)
0x0000000000001f30 <main+20>:   li      r0,0
0x0000000000001f34 <main+24>:   std     r0,48(r30)
0x0000000000001f38 <main+28>:   ld      r2,56(r30)
0x0000000000001f3c <main+32>:   ld      r0,48(r30)
0x0000000000001f40 <main+36>:   add     r0,r2,r0
0x0000000000001f44 <main+40>:   std     r0,56(r30)
0x0000000000001f48 <main+44>:   ld      r1,0(r1)
0x0000000000001f4c <main+48>:   ld      r30,-16(r1)
0x0000000000001f50 <main+52>:   blr


到底什麼是64 位元算術指令集呢?真百思不得其解。 :roll:


最後由 比卡超 於 05/03/2005 1:45 pm 編輯,總共編輯了 1 次。

回頂端
 個人資料  
 
文章發表於 : 05/03/2005 11:50 am 
離線
討論區管理員
頭像

註冊時間: 05/02/2001 1:01 am
文章: 1297
http://developer.apple.com/documentatio ... 3-CJBHHCCA

http://developer.apple.com/documentatio ... 7-CACJEBAC

_________________
[digdog dig];


回頂端
 個人資料  
 
文章發表於 : 05/03/2005 12:02 pm 
離線
留言破百
頭像

註冊時間: 04/29/2001 1:01 am
文章: 102
來自: 香港
digdog 寫:
http://developer.apple.com/documentation/DeveloperTools/Reference/Assembler/ModeIndependent/chapter_8_section_1.html#//apple_ref/doc/uid/TP30000851-CH213-CJBHHCCA

http://developer.apple.com/documentatio ... 7-CACJEBAC


digdog兄的意思是, 64 位元算術指令集只是FAT binary嗎?


回頂端
 個人資料  
 
 文章主題 :
文章發表於 : 05/03/2005 12:07 pm 
離線
嗜冰客
頭像

註冊時間: 04/30/2001 1:01 am
文章: 1048
來自: Metropolis Asylum
小弟以為,比卡超君是在問,只 implement 了 32-bit PPC instruction set 的 MPU,如 PPC601、PPC603、PPC604、PPC750、PPC64xx 等,是否也有 instructions,可以直接 manipulate 64-bit value,而不是用多個 32-bit instructions 來完成?

還是只有 Altivec 才有可直接 manipulate 64-bit value 的 instructions?

_________________
圖檔
It is not god who created man. It is man who created God.

Light travels faster than sound. This is why some people appear bright until you hear them speak.


回頂端
 個人資料  
 
文章發表於 : 05/03/2005 12:20 pm 
離線
討論區管理員
頭像

註冊時間: 05/18/2001 1:01 am
文章: 2475
來自: Forgotten Realm
比卡超 寫:


應該是說,64 位元的算術指令集就是給 64 位元的 CPU 用的,32 位元 CPU 不可能用 64 位元指令集。同樣的動作在不同的 CPU 上就必須使用不同的指令集,不管是 32 位元,64 位元還是 AltiVec,都要靠 Compiler 來產生相對應的 Objective Code。但是如果直接寫 Assembly Code,寫的人就必須注意指令的執行模式。Apple SDK 提供的解決方案就是用 Marco,讓同樣的 Assembly 指令也能夠編譯成『使用 32 位元指令集』以及『使用 64 位元指令集』兩種 Objective Code。

_________________
ash nazg durbatuluk, ash nazg gimbatul,
ash nazg thrakatuluk agh burzum-ishi krimpatul.


回頂端
 個人資料  
 
 文章主題 :
文章發表於 : 05/03/2005 12:25 pm 
離線
嗜冰客
頭像

註冊時間: 04/30/2001 1:01 am
文章: 1048
來自: Metropolis Asylum
還是簡單地問,什麼是「32 位元模式下支援 64 位元算術指令集」呢?

_________________
圖檔
It is not god who created man. It is man who created God.

Light travels faster than sound. This is why some people appear bright until you hear them speak.


回頂端
 個人資料  
 
 文章主題 :
文章發表於 : 05/03/2005 1:40 pm 
離線
留言破百
頭像

註冊時間: 04/29/2001 1:01 am
文章: 102
來自: 香港
janusng 寫:
還是簡單地問,什麼是「32 位元模式下支援 64 位元算術指令集」呢?


對,這不只是謝孟叡兄跟ulysses兄提過,連謝兄提及的技術文件當中的Myth#4也有提及:
引言回覆:
Myth #4:
Myth: My application will have much faster performance if it is a “native” 64-bit application.

Fact: This is true for some other architectures because the number of registers and the width of registers changes between 32-bit and 64-bit mode. However, the PowerPC architecture does not have either of these limitations. It was designed for 64-bit computing from the beginning, and supports 64-bit arithmetic instructions in 32-bit mode. Thus, on PowerPC architectures, software does not generally become faster (and may actually slow down) when compiled as a 64-bit executable.


到底什麼是supports 64-bit arithmetic instructions in 32-bit mode呢?

就用以上的assemble code來提問,難到64-bit mode binary還不比32-bit mode binary快嗎?


回頂端
 個人資料  
 
 文章主題 :
文章發表於 : 05/03/2005 1:54 pm 
離線
冰果室元老
頭像

註冊時間: 03/16/2005 5:18 pm
文章: 3205
來自: insoler.com
代碼:
int main()
{
        long long int   integerA=0;
        long long int   integerB=0;
        integerA += integerB;
}


這種程式根本不能代表啥.... 我不是說你寫不好.... 是說例子不好....
用 64-bit mode 編譯出來的 Assembly code 要是比 32-bit mode 又臭又長,那個 compile 可以扔垃圾桶了~~ :lol:

我是不明白,這個累加程式跟你的問題有關係嗎???


回頂端
 個人資料  
 
 文章主題 :
文章發表於 : 05/03/2005 2:10 pm 
離線
留言破百
頭像

註冊時間: 04/29/2001 1:01 am
文章: 102
來自: 香港
引言回覆:
這種程式根本不能代表啥.... 我不是說你寫不好.... 是說例子不好....
用 64-bit mode 編譯出來的 Assembly code 要是比 32-bit mode 又臭又長,那個 compile 可以扔垃圾桶了~~ :lol:

我是不明白,這個累加程式跟你的問題有關係嗎???


我用這程式是通過long long int manipulation來測試一下64bit mode跟32bit mode下所生成的程式碼有什麼分別。因為聽說"32 位元模式下支援 64 位元算術指令集",所以預期會於32-bit mode compile下,會生成64-bit arithmetic instruction,可惜結果並非如此。詳細我已把它生成的程式碼列出來。

進藤光兄所說例子不好,請問是在那一方面呢?


回頂端
 個人資料  
 
 文章主題 :
文章發表於 : 05/05/2005 11:23 am 
離線
新生訓練中

註冊時間: 05/05/2005 11:03 am
文章: 3
比卡超 寫:
引言回覆:
Myth #4:
Myth: My application will have much faster performance if it is a “native” 64-bit application.

Fact: This is true for some other architectures because the number of registers and the width of registers changes between 32-bit and 64-bit mode. However, the PowerPC architecture does not have either of these limitations. It was designed for 64-bit computing from the beginning, and supports 64-bit arithmetic instructions in 32-bit mode. Thus, on PowerPC architectures, software does not generally become faster (and may actually slow down) when compiled as a 64-bit executable.


到底什麼是supports 64-bit arithmetic instructions in 32-bit mode呢?

就用以上的assemble code來提問,難到64-bit mode binary還不比32-bit mode binary快嗎?


小弟對"64-bit arithmetic instructions in 32-bit mode"的解讀啊... 應該是很單純的能夠做64-bit的運算
它並沒有說只用一個instruction就能處理64-bit data, 對吧?
在64-bit mode裡面的一個add被分成32-bit mode的addc跟adde就是很好的例子
平常做32-bit運算時你會需要addc加adde嗎? 不會吧?
所以這應該就是所謂的"64-bit arithmetic instructions", 因為這是為64-bit data而設計的

反方向想, 如果沒有addc, adde, 跟carry register, 那要做64-bit的加法不是很麻煩?
所以"64-bit arithmetic instruction"應該是這個意思...
如果你一直想說一個instruction處理64-bit data, 看了這種解釋可能會覺得有點白爛吧 :D


回頂端
 個人資料  
 
顯示文章 :  排序  
發表新文章 回覆主題  [ 10 篇文章 ] 

所有顯示的時間為 UTC + 8 小時


不能 在這個版面發表主題
不能 在這個版面回覆主題
不能 在這個版面編輯您的文章
不能 在這個版面刪除您的文章
不能 在這個版面上傳附加檔案

搜尋:
前往 :  
cron
POWERED_BY
正體中文語系由 竹貓星球 維護製作