老地方冰果室交流區
http://ubb.frostyplace.com/

迷思 : PPC 64 位元算術指令集
http://ubb.frostyplace.com/viewtopic.php?f=13&t=16751
1 頁 (共 1 頁)

發表人:  比卡超 [ 05/03/2005 11:28 am ]
文章主題 :  迷思 : PPC 64 位元算術指令集

之前的一篇討論中,謝孟叡兄跟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:

發表人:  digdog [ 05/03/2005 11:50 am ]
文章主題 :  Re: 迷思 : PPC 64 位元算術指令集

http://developer.apple.com/documentatio ... 3-CJBHHCCA

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

發表人:  比卡超 [ 05/03/2005 12:02 pm ]
文章主題 :  Re: 迷思 : PPC 64 位元算術指令集

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嗎?

發表人:  janusng [ 05/03/2005 12:07 pm ]
文章主題 : 

小弟以為,比卡超君是在問,只 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?

發表人:  ulysses [ 05/03/2005 12:20 pm ]
文章主題 :  Re: 迷思 : PPC 64 位元算術指令集

比卡超 寫:


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

發表人:  janusng [ 05/03/2005 12:25 pm ]
文章主題 : 

還是簡單地問,什麼是「32 位元模式下支援 64 位元算術指令集」呢?

發表人:  比卡超 [ 05/03/2005 1:40 pm ]
文章主題 : 

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 ]
文章主題 : 

代碼:
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 ]
文章主題 : 

引言回覆:
這種程式根本不能代表啥.... 我不是說你寫不好.... 是說例子不好....
用 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,可惜結果並非如此。詳細我已把它生成的程式碼列出來。

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

發表人:  JCE10 [ 05/05/2005 11:23 am ]
文章主題 : 

比卡超 寫:
引言回覆:
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

1 頁 (共 1 頁) 所有顯示的時間為 UTC + 8 小時
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/