在
之前的一篇討論中,謝孟叡兄跟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 位元算術指令集呢?真百思不得其解。
