そろそろ64ビット環境へ引越してよいかなと思い、64Bit版をクリーン・インストールしてデータを移行した。とりあえずは問題なく動作している。Chromeの動作がちょっとおかしい気がするが。
次にコンパイル環境も64bit化してしまおうとして、VC2010 Express+SDK 7.1を導入。 続いてBoostをaddress-model=64にてコンパイルした。これも問題なく完了した。
64bitになってどう変わるのか少し調べてみた。
参照・引用:IntelR 64 and IA-32 Architectures Software Developer's Manual Volume 1: Basic Architecturehttp://www.intel.com/Assets/PDF/manual/253665.pdf
- 汎用レジスタがすべて64bit長になり、さらにr8-r15の8本のレジスタが追加される。
レジスタ一覧は下記のような感じ。すごいね。。? 64-bit general-purpose registers (RAX, RBX, RCX, RDX, RSI, RDI, RSP, RBP, or R8-R15)
? 32-bit general-purpose registers (EAX, EBX, ECX, EDX, ESI, EDI, ESP, EBP, or R8D-R15D)
? 16-bit general-purpose registers (AX, BX, CX, DX, SI, DI, SP, BP, or R8W-R15W)
? 8-bit general-purpose registers: AL, BL, CL, DL, SIL, DIL, SPL, BPL, and R8LR15L are available using REX prefixes; AL, BL, CL, DL, AH, BH, CH, DH are available without using REX prefixes.
? Segment registers (CS, DS, SS, ES, FS, and GS)
? RFLAGS register
? x87 FPU registers (ST0 through ST7, status word, control word, tag word, data operand pointer, and instruction pointer)
? MMX registers (MM0 through MM7)
? XMM registers (XMM0 through XMM15) and the MXCSR register
? Control registers (CR0, CR2, CR3, CR4, and CR8) and system table pointer registers (GDTR, LDTR, IDTR, and task register)
? Debug registers (DR0, DR1, DR2, DR3, DR6, and DR7)
? MSR registers
? RDX:RAX register pair representing a 128-bit operan
- Flagレジスタ、Instruction Pointerが64Bit化(rip)される。Flagレジスタの拡張された部分は予備。64bit環境ではripでの相対アドレッシングモードが追加される。
- XMMレジスタが8本から16本に拡張される。
- アドレス空間が拡張される。(4GB -> 今のところWindows7 Ultimateで192GBまで)
- FPU Instruction Pointerが48Bitから64Bitに拡張される。
- FPU Data (Operand) Pointerが48Bitから64Bitに拡張される。
などなど。命令なども拡張されているのだけれど読みきれないな。。
C++でのプログラミングにおいては、int・longは32bit長のまま、ポインタは64bit長になる。関数呼び出しは__fastcallのみとなり、引数が4以下だとレジスタ渡しになる
参考:x64 アセンブリ言語プログラミングhttp://homepage1.nifty.com/herumi/prog/x64.html
64bitになれば使えるメモリも増えるし、使えるレジスタ・命令が増えるので高速化されるので楽しみだ。ゆくゆくはVST Hostアプリも64bit仕様で完成させたいがそれはいつの日になるだろうか。