FPGA開発日記

FPGAというより、コンピュータアーキテクチャかもね! カテゴリ別記事インデックス https://sites.google.com/site/fpgadevelopindex/

MIPS版GCC5.1でアーキテクチャRelease 6を試行

前の記事でも紹介したとおり、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とかを使って生成される命令をチェックするしかないかな。