《おまけ》V850E2 シミュレータ　中森章

　このファイルを見ているということは，筆者のシミュレータに興味があって，わざわざダウンロードしてくれた方ですよね？ありがとうございます．
　本誌では，RISC-VとCortex-M0のシミュレータを解説しましたが，暇なので，V850E2のシミュレータも作成してみました．使い方は他と同じです．
　さて，問題はコンパイラをどこからもってくるかですが，ネットを検索してもコンパイル済みでフリーなV850E2向けコンパイラをなかなか見つけることができません．果たして，CQ出版のInterface誌のダウンロード・サイト（以下）から，ARM，SH，RX，V850，M68K，FR30向けのGCC（Cygwin用）をダウンロードすることができることが判明しました．

http://www.cqpub.co.jp/interface/download/contents.htm
2013年12月号のところを参照してください．

…で，早速ダウンロードしてCygwin上で動かしてみようとしたのですが，「libiconv-2.dllという共有ライブラリがない」というエラー・メッセージが出力されてGCCが起動しません．これで，半ば諦めかけたのですが，以下のサイトなどからフリーのlibiconv-2.dllをダウンロードしてきて，Cygwinのbinディレクトリに格納したら，無事GCCが動作するようになりました．

https://jp.dll-files.com/libiconv-2.dll.html
何でこんな大事なファイルがデフォルトで用意されてないのか不思議です．恐らくは，昔のCygwinではサポートされていたのでしょうね．

　SH-2版のGCCではincludeディレクトリが空になっています．通常のCソースをコンパイルするためには，少なくとも，stdio.hやstdlib.hが必要になります．空のファイルでいいので，ダミーでこれらのヘッダ・ファイルを作成しておきましょう．また，GCCがデフォルトでは標準includeディレクトリを参照しません．「-I」オびっぐプションで標準のincludeディレクトリを指定してください．
　たとえば．

../../gcc-481/local/v850/bin/v850-elf-gcc -o dhry2.out -mv850e2 -O2 -I../../gcc-481/local/v850/include -nostdlib -Ttext 8000 dhry_all.c -lgcc

という感じです．「-mv850e2」はV850E2用のコードを生成することを意味します．初代のV850のコードを生成する場合は「-m」オプションを指定しません．

　さて，今回V850E2のシミュレータを作るモチベーションは，ずばり「2バイト可変長命令」です．これまで作ってきた，RISC-V，ARM（Cortex-M0），MIPS，SH-2では，4バイトか2バイトの命令長でした．V850は2バイトから8バイトまでのバリエーションがあります．結構，デコードが複雑になることが予想されます．これに挑戦してみました．
　設計の参考にしたのは『V850E2M　ユーザーズマニュアル アーキテクチャ編』です．このドキュメントはルネサスエレクトロニクスのサイトからダウンロードできます．

　V850E2（参考にしたのはV850E2Mですが）のISAの特徴は以下の通りです．
・2バイトから8バイトまでの，16ビット可変長命令
　これは，MOV命令のイミディエート値やロード/ストア命令のディスプレースメントにビット長のバリエーションをもたせ，コードサイズを最適化する目的があります．
・メモリの単一ビットをセット，クリア，反転，テストする命令がある
　これは，メモリに対するリード・モディファイ・ライト操作を行いますので，RISCとしては異例です．
・メモリに対する連続ロード/ストア命令がある
　これは．関数の入り口でレジスタを退避するとともにスタックフレームを確保するPREPARE命令と，関数の出口でレジスタを回復するとともにスタックフレームを解放するDISPOSE命令です．面白いのはDISPOSE命令には分岐機能があり，スタックフレームの解法を行いながら関数から復帰できるようになっています．これは，Armにおいて，関数の入り口で戻りアドレスが格納されたr14をプッシュしておき，関数の出口でr14をr15（PC）にポップして関数からの復帰を行う機能によくにています．
・飽和演算命令がある．
・アトミックにデータを交換するコンペア＆スワップ命令がある．

まあ，こんなところでしょうか．

　シミュレータを作るうえでは，デコード処理に多くの時間がかかりました．V850E2の命令エンコーディングを見た人は少ないと思いますが，レジスタの値が0であるかないかによって命令の種類が変わったりするなど，非常に複雑です．オペコードが0x3c、0x3dの辺りのエンコーディングは超絶技巧もので，デコーダの設計時には涙が緒緒切れました．
　当然，シミュレータを作り上げても，なかなか思った通りにはうごかず，デバッグに苦しました．Dhrystoneベンチマーク，Stanfordベンチマーク，Coremarkで試したのですが，Coremarkを最適化レベル1「-O1」でコンパイルしたコードが最後までPASSしませんでした．最適化レベル2「-O2」と最適化なし「-O0」でPASSしているようなので見なかったことにしています．

　CoremarkがPASSしない問題はありますが，命令の動作を勉強する分には十分だと思います．みなさんも遊んでみてください．

[EOF]

