前の記事でも紹介したとおり、GCC 5.1になってMIPS Architecture Release-6 に対応したので、早速ビルドして使ってみた。
ビルドの方法も、今回も例によってVagrantで仮想化してみたので、このやり方も後日まとめておこうと思う。あとChef化したい。
さて、インストールしたGCC5.1を使って、どういうオプションが使えるのか早速試してみた。
$ mipsel-linux-elf-gcc -v Using built-in specs. COLLECT_GCC=mipsel-linux-elf-gcc COLLECT_LTO_WRAPPER=/usr/local/libexec/gcc/mipsel-linux-elf/5.1.0/lto-wrapper Target: mipsel-linux-elf Configured with: ../configure --target=mipsel-linux-elf --disable-nls --disable-libssp --with-gnu-ld --with-gnu-as --disable-shared --enable-languages='c c++' --with-newlib Thread model: single gcc version 5.1.0 (GCC)
5.1になった!
$ mipsel-linux-elf-gcc --help=target ... Known MIPS ABIs (for use with the -mabi= option): 32 64 eabi n32 o64 Known MIPS CPUs (for use with the -march= and -mtune= options): 10000 1004kc 1004kf 1004kf1_1 1004kf2_1 10k 12000 12k 14000 14k 16000 16k 2000 20kc 24kc 24kec 24kef 24kef1_1 24kef2_1 24kefx 24kex 24kf 24kf1_1 24kf2_1 24kfx 24kx 2k 3000 34kc 34kf 34kf1_1 34kf2_1 34kfx 34kn 34kx 3900 3k 4000 4100 4111 4120 4130 4300 4400 4600 4650 4700 4k 4kc 4kec 4kem 4kep 4km 4kp 4ksc 4ksd 5000 5400 5500 5900 5k 5kc 5kf 6000 6k 7000 74kc 74kf 74kf1_1 74kf2_1 74kf3_2 74kfx 74kx 7k 8000 8k 9000 9k from-abi loongson2e loongson2f loongson3a m14k m14kc m14ke m14kec m4k mips1 mips2 mips3 mips32 mips32r2 mips32r3 mips32r5 mips32r6 mips4 mips64 mips64r2 mips64r3 mips64r5 mips64r6 native octeon octeon+ octeon2 octeon3 orion p5600 r10000 r1004kc r1004kf r1004kf1_1 r1004kf2_1 r10k r12000 r12k r14000 r14k r16000 r16k r2000 r20kc r24kc r24kec r24kef r24kef1_1 r24kef2_1 r24kefx r24kex r24kf r24kf1_1 r24kf2_1 r24kfx r24kx r2k r3000 r34kc r34kf r34kf1_1 r34kf2_1 r34kfx r34kn r34kx r3900 r3k r4000 r4100 r4111 r4120 r4130 r4300 r4400 r4600 r4650 r4700 r4k r4kc r4kec r4kem r4kep r4km r4kp r4ksc r4ksd r5000 r5400 r5500 r5900 r5k r5kc r5kf r6000 r6k r7000 r74kc r74kf r74kf1_1 r74kf2_1 r74kf3_2 r74kfx r74kx r7k r8000 r8k r9000 r9k rm7000 rm7k rm9000 rm9k sb1 sb1a sr71000 sr71k vr4100 vr4111 vr4120 vr4130 vr4300 vr5000 vr5400 vr5500 vr5k xlp xlr Valid arguments to -mcode-readable=: no pcrel yes Known MIPS IEEE 754 settings (for use with the -mabs= and -mnan= options): 2008 legacy Known MIPS ISA levels (for use with the -mips option): 1 2 3 32 32r2 32r3 32r5 32r6 4 64 64r2 64r3 64r5 64r6 Valid arguments to -mr10k-cache-barrier=: load-store none store
-mips32r6, -mips64r6 が加わっている。
$ cat count.c int count (int x) { int i; int total = 0; for (i = 0; i < x; i++) { total += i; } return total; }
上記のようなプログラムを食わしてみる。簡単すぎるのであまり効果がないかもしれないが。。。 というか、分岐遅延が削除されるかどうかを見てみたい。
$ mipsel-linux-elf-gcc -O3 -c count.c -mips64r5; mipsel-linux-elf-objdump -d count.o count.o: file format elf32-littlemips Disassembly of section .text: 00000000 <count>: 0: 18800008 blez a0,24 <count+0x24> 4: 00001021 move v0,zero 8: 00001821 move v1,zero c: 00431021 addu v0,v0,v1 10: 24630001 addiu v1,v1,1 14: 1483fffe bne a0,v1,10 <count+0x10> 18: 00431021 addu v0,v0,v1 1c: 03e00008 jr ra 20: 00431023 subu v0,v0,v1 24: 03e00008 jr ra 28: 00000000 nop
$ mipsel-linux-elf-gcc -O3 -c count.c -mips64r6; mipsel-linux-elf-objdump -d count.o count.o: file format elf32-littlemips Disassembly of section .text: 00000000 <count>: 0: 1880ffff blez a0,0 <count> 4: 00001021 move v0,zero 8: 00001821 move v1,zero c: 00431021 addu v0,v0,v1 00000010 <$L7>: 10: 24630001 addiu v1,v1,1 14: 1483ffff bne a0,v1,14 <$L7+0x4> 18: 00431021 addu v0,v0,v1 1c: 03e00009 jr ra 20: 00431023 subu v0,v0,v1 00000024 <$L8>: 24: 03e00009 jr ra 28: 00000000 nop
表現は変わったが、本質的なところは何も変わってないなあ。。。 --help=targetしてみたが、新しいオプションが加わっているかどうかは分からなかった。遅延分岐を削除するようなオプションも存在しない。 やっぱり、Coremarkとかを使って生成される命令をチェックするしかないかな。