社団法人 電子情報通信学会

信学技報

THE INSTITUTE OF ELECTRONICS,
INFORMATION AND COMMUNICATION ENGINEERSTECHNICAL REPORT OF IEICE.

組込みプロセッサの命令セット拡張に適したソフトウェア開発ツール生成手法
久村 孝寛†,†† 多賀惣一朗††† 石浦菜岐佐††† 武内良典††

今井 正治††† 日本電気株式会社 〒 2168666 川崎市中原区下沼部 1753†† 大阪大学 〒 5650871 大阪府吹田市山田丘 1-5††† 関西学院大学 〒 6691337 兵庫県三田市学園 2-1
あらまし

組込みプロセッサの命令セット拡張およびレジスタの追加に適したソフトウェア開発ツール生成手法を提案する．本手法では，基本となるソフトウェア開発ツールに対してプラグインを追加することによって，ベースプロ
セッサへ追加された命令セットやレジスタを適切に扱えるソフトウェア開発ツールを生成する．生成可能なソフトウェ
ア開発ツールは，コンパイラ，アセンブラ，逆アセンブラ，命令レベルシミュレータなどである．本手法で生成されるコンパイラでは，追加命令に一対一に対応する組込み関数 (intrinsic function) を用いて記述された C 言語のソース
コードに対してコード生成を行う．従来のツール生成手法と比較して，本手法では，GNU ツールチェーンに対応したプロセッサをベースのプロセッサとして使用可能であること，コンパイラを含むツールチェーンを生成可能である
こと，が特徴である．本手法の有用性を示すために，組込み向けプロセッサである V850 に SIMD 命令を追加する場
合について評価を行った．SIMD 命令をアセンブラで直接記述したプログラムと，組込み関数を使って C 言語で記述したプログラムとについて，本手法で生成したソフトウェア開発ツールを用いて実行命令数を比較した．実験の結果，本手法を用いて生成されたコンパイラは，人手によるアセンブラ記述と比較して，実行命令数が平均でわずか 7%程度の増加という良質なコードを生成できることが確認された．
キーワード

アーキテクチャ記述言語，ツール生成，プラグイン

Software Development Tool Generation Method Suitable for
Instruction Set Extension of Embedded Processors†,††

Takahiro KUMURA†††, Soichiro TAGA†††

, Nagisa ISHIURA††, Yoshinori TAKEUCHI

, and

††

Masaharu IMAI

† NEC Corporation Shimonumabe 1753, Nakahara-ku, Kawasaki City, 2168666 Japan†† Osaka University Yamadaoka 15, Suita City, Osaka, 5650871 Japan††† Kwansei Gakuin University Gakuen 21, Mita City, Hyogo, 6691337 Japan

Abstract This paper proposes a method of software development tool generation suitable for instruction set exten-

sion of existing embedded processors. The key idea in the proposed method is to enhance a base processor's toolchain
by adding plugins, which are software components that handle additional instructions and registers. The proposed
method can generate a compiler, assembler, disassebler, and instruction set simulator. Generated compilers with theplugins provide intrinsic functions that are translated directly into the new instructions. To demonstrate that the
proposed method works eectively, this paper presents an experimental result of the proposed method in the studyof adding SIMD instructions to the embedded microprocessor V850. In the experiment, by using intrinsic functions,the compiler generated good code with only 7% increase in the number of instructions against the hand-optimized
assembly codes.
Key words Architecture description language, Tool generation, Plug-in

1

1.

はじめに

Additional ISA spec. document in XML
Register definitions of base processor
New register definitions
New instructions definitions

マルチメディア処理や無線通信処理などの組込みシステムに(ASIP, application specic
instruction set processor) が広く活用されている．ASIP は，
おいて、特定用途向けプロセッサ

ソフト書き換えにより仕様変更や機能追加に対応できる柔軟性

pluginBasecompiler

EnhancedcompilerpluginBasesimulator

Enhancedsimulator

pluginBaselinkerEnhancedlinkerpluginBasedisassembler

Enhanceddisassembler

pluginBaseassembler

Enhancedassembler

Tool generator!

HTML document
New instructions’ description
Intrinsic functions prototypesと，ターゲットアプリケーション向けにチューニングされた命ASIP は
図 1 Concept ow underlying tool generation
ASIP
設計ツールは，ASIP のハードウェア記述言語 (HDL, hardware
GNU Binutils に注目し，コン
description language) のソースコードや，ソフトウェア開発 手法は，主にアセンブラなどのパイラを含む GNU ツールチェーン全体を扱っていなかった．
ツールを生成するツールである．ASIP 設計ツールに関しては，
Xtensa 向けのツール生成手法は Xtensa 向けのコンパイラを
これまでに，nML, LISA, EXPRESSION といったアーキテ
含む GNU ツールチェーン全体を生成するが，この手法のター
クチャ記述言語 (ADL, architecture description language) を
ゲットプロセッサは Xtensa に限られ，他のプロセッサには対使って，プロセッサのマイクロアーキテクチャや命令セットを応していない．
検討する研究が数多くある [1]〜[4]．
そこで，GNU ツールチェーンをもとにした，複数のベース
ASIP の活用における重要な課題は C コンパイラなどのソフ プロセッサに対応可能な新たなツール生成手法を本論文は提案
Base tools: GNU Binutils, GDB, and GCC modified for adding the plugins

令セットによる高い性能と，を兼ね備えている．近年，専用の設計ツールを使って開発されるようになってきた．

トウェア開発ツールをアーキテクチャ設計段階の早期に提供することである．優れたために，多くのC コンパイラを早期に提供可能にする

ASIP は基本的な命令セットを備えたベースプ

ロセッサとアプリケーション専用の機能ユニットとで構成されている．このような構成のASIP は Tensilica 社などいくつかの企業から提供されており，組込みシステムの市場で受け入れ

ASIP 設計ツールも CoWare 社や Target

られている．さらに，

Compiler 社などからリリースされている．
ASIP のソフトウェア開発ツールの生成に注目すると，従来の ASIP 設計ツールや関連研究の多くはツール全体をスクラッチから生成することに注力し，ベースプロセッサ向けの既存のツールを再利用することや，生成されたツールを人間が改良することを考慮していない．既存ツールを再利用することは，既存の組込みプロセッサをASIP のベースプロセッサとして使う

場合には特に重要である．なぜなら，既存の組込みプロセッサ

C コンパイラを含むソフトウェア開発ツーには，最適化された

ルがそろっているからである．その開発ツールにはプロファイ
ラなどの機能を備えたシミュレータが含まれるだろう．こうした既存の開発ツールの機能は，従来のASIP 設計ツールが生成するツールでは必ずしも利用可能になるとは限らない．

ASIP 用ソフトウェア開発ツール生成におけるもう一つの重要な点は，ツール生成のための基礎となるツールチェーンである．従来のASIP 設計ツールや関連研究の多くは，独自のコン

パイラ，アセンブラ，シミュレータなどにもとづいてソフトウェ
ア開発ツールを生成する[1],[3]〜[5],[8]．一方，GNU ツール

チェーンにもとづいてソフトウェア開発ツールを生成する手法もいくつか提案されている[6],[7],[9],[11]．GNU ツールチェー

ンはオープンソースのツールチェーンであり，組込み分野でもGNU ツールチェーンは数多くの組込みプ

広く使われている．

ロセッサに対応しているので，既存の組込みプロセッサにもとASIP のためのソフトウェア開発ツールを生成するのに適している．しかしながら，Xtensa 向けのツール生成を除いて，GNU ツールチェーンにもとづいたこれまでのツール生成
づいた

する．本手法は，ベースプロセッサのツールチェーンに対して，
プラグインと呼ばれるソフトウェアコンポーネントを追加することにより，追加命令セットや追加レジスタに対応したター
ゲットプロセッサ向けのソフトウェア開発ツールを生成する．
プラグインはベースプロセッサに対する追加命令セットや追加
レジスタなどに関する仕様情報にもとづいて生成される．ベー
スプロセッサのツールチェーンにプラグインを追加するために必要な修正は，プラグインを接続するためのソケットを追加することだけである．本論文では，このツール生成手法に関して，
ベースプロセッサへの追加要素の仕様を如何に記述するのか，追加要素を扱うためにどのようなプラグインが生成されるのか，

SIMD(single
instruction multiple data) 命令セットを備えた V850 プロセッなどを中心に述べる．さらに，本手法を使った，

サのためのソフトウェア開発ツールを生成する実験についても述べる．
2.

プラグインにもとづいたツール生成

我々の目的は，既存の組込みプロセッサをベースプロセッサとして，それに命令セットやレジスタを追加したターゲットプ
ロセッサのために，ソフトウェア開発ツールを効率よく生成する手法を提供することである．この目標を達成するために，プ
ラグインにもとづいたツール生成手法を提案する．プラグイ
ンとは，ベースプロセッサ用ツールチェーンの機能を拡張するためのソフトウェアコンポーネントである．例えば，追加命令
セットの字句解析，命令エンコード，命令デコードなどの機能をプラグインとして追加する．その結果，既存のツールチェー//

ンを活用して，コンパイラ アセンブラ シミュレータなどのターゲットプロセッサ向けのソフトウェア開発ツールを生成することができる．
2. 1

ツール生成フロー1 に示す．まず，ツール生成は XML(extensible markup language) でターゲットプ
提案手法によるツール生成の流れを図2

ロセッサの仕様を記述することから始まる．提案手法においSyntax: MYADD reg1, reg2, reg3て，ターゲットプロセッサの命令セットは，変更不可能なベー

Fields:XML 文書には，ターゲッ
トプロセッサの追加命令セットの情報を記述する．図 2 の命令に対する XML 文書の記述例を図 3 に示す．図 3 の<insn>というタグが図 2 の命令 MYADD の仕様を表す．

reg1
reg2
reg3
opc0
opc1

令セットで構成されると仮定する．

この追加命令セットの情報には，ベースプロセッサの名前，
サへ追加されるレジスタや命令の情報，が含まれる．ただし，

XML 文書には，ベースプロセッサの基本命令セットの情報を記述しない．ターゲットプロセッサの設計者はこの XML 文書を作成し，ツールジェネレータに与える．

つづいて，ツールジェネレータは，ベースプロセッサのツー()

ルチェーン ベースツール へ追加するためのプラグインを生成する．プラグインを生成する前に，ベースツールを予め修正して，プラグインを接続できるようにしておく．予め修正されたベースツールへ生成されたプラグインが結合され，ター
ゲットプロセッサ用のツールチェーンとなる．生成されたツールチェーンは，ターゲットプロセッサの追加命令のアセンブル，
逆アセンブル，リロケーション，実行，などの機能を備える．
さらに，生成されたコンパイラでは追加命令に一対一に対応した組込み関数(intrinsic function) を利用することができる．ただし，本手法で生成されたコンパイラは追加命令を自動的に利用することはない．追加命令をコンパイラに出力させるためには，プログラマが組込み関数を明示的に記述する必要がある．
2. 2

図

reg3

27

26

16

opc1

15

reg2

11

10

opc0

5

4

reg1

0

Name Type Bits Description

スプロセッサの基本命令セットと，自由に変更が可能な追加命

ベースプロセッサのレジスタに関する情報，ベースプロセッ

31

GPR
GPR
GPR
opcodeopcode

図2

5
5
5
6
11

Register index of GPR registers
Register index of GPR registers
Register index of GPR registers
Bit pattern to identify the inst.
Bit pattern to identify the inst.

Instruction eld structure of MYADD

1: <Processor>
2: <nickname>cpu</nickname>
3: <register_type length="32">GPR_type</register_type>
4: <register_bank type="GPR_type" size="32"
5:prefix="R" base="true">GPR</register_bank>
6: <insn_length>32</insn_length>
7: <insn>
8: <mnemonic>MYADD</mnemonic>
9: <syntax>MYADD %reg1, %reg2, %reg3</syntax>
10: <field type="GPR"
length="5">reg1</field>
11: <field type="opcode" value="0b11_1111"
12:
length="6">opc0</field>
13: <field type="GPR"
length="5">reg2</field>
14: <field type="opcode" value="0b11111001000"
15:length="11">opc1</field>
16: <field type="GPR"
length="5">reg3</field>
17: <input>
18:<operand type="GPR" width="32">reg1</operand>
19:<operand type="GPR" width="32">reg2</operand>
20: </input>
21: <output>
22:<operand type="GPR" width="32">reg3</operand>
23: </output>
24: <description>
25: This instruction calculates the sum of the contents of
26: registers reg1 and reg2, and stores the sum to register reg3.
27: </description>
28: </insn>
29: <gdb>
30: <regnum name="R0">0</regnum>
31: ....
32: <regnum name="R31">31</regnum>
33: </gdb>
34: <behavior>cpu-isa.c</behavior>
35: </Processor>

生成されたプラグインの構成

4 は GNU ツールチェーン向けのプラグイン生成プロセス

図3

Example of an XML document with additional ISA specicationを表す．ツールジェネレータは，予め用意されたテンプレート
へ追加命令や追加レジスタの情報やコード断片を追加すること

xxxcpu.c.in

によって，プラグインを生成する．テンプレートファイルは全Binutils
pluginxxxcpu.h.in

GDB
pluginての追加命令や追加レジスタに共通して使用可能な関数やデータ構造を含んでいる．共通な関数の例としては，追加命令のエ
ンコード，デコード，アセンブル，逆アセンブルを行う関数がある．これらの関数は追加命令に関する情報にもとづいて動作する．その情報は，

XML 文書にもとづいて，データ配列とし

xxxcpu-sim.h.in

elf32-cpu.c.in

けのプラグインとなる．

GCC 向けのプラグインに対しては，ツールジェネレー

一方，

タは，レジスタに関する各種マクロと，追加命令のマシン記述(RTL テンプレート) とイントリンジック関数のプロトタイプ

定義，などをコード断片として生成する．生成されたコード断
片はテンプレートと結合されてLength & position!

Syntax!

Type!

Method to execute!

Default value!

Fields info.!

Method to encode!
Method to decode!

Instruction behavior funcs.

Tool generator!

Method to parse!

Register banks info.

Name & aliases!
Width!

Register groups info.

Register numbers!

XML
Name & aliases!
Generated
code for GCC

cpu.c.in

cpu.md.in

Binutils や GDB 向Name!

Data arrays

bfd-in.h.in

種のデータベースとして使われる．

やコード断片はテンプレートと結合されてGenerated
code for
Binutils & GDB

Register info.

xxx.h.inて生成される．そして，そのデータ配列は追加命令に関する一表す関数をコード断片として生成する．生成されたデータ配列

Code fragments

reloc.c.in

cpu.h.in

Binutils や GDB 向けのプラグインに対しては，ツールジェ
ネレータは，アセンブル/逆アセンブル/リンク/命令実行などに必要な命令情報 (ニモニック，シンタックス，命令フィールド構造など) をデータ配列として生成する．さらに，命令動作を

templates

xxxcpu-bfd.c.in
xxxcpu-bfd.h.in

Instruction info.
Data arrays

xxxcpu-sim.c.in

Instruction
behavior
description
Register macros

cpu-builtins.md.in
xxxcpu-gcc.c.in

Width!

Names!

Register numbers!

Classes!

templates

cpu-protos.h.in

Usage!

Letters!

Code fragments

GCC
pluginMachine description (RTL template)!
Instruction info.
Code fragments

opcode/libccg-cpu.cinclude/opcode/libccg-cpu.h
include/elf/xxx.h
bfd/elf32-cpu.c
Binutils
bfd/reloc.c
pluginbfd/bfd-in.h

opcode/libccg-cpu.cinclude/opcode/libccg-cpu.h
sim/cpu/xxxcpu-sim.c
GDB
sim/cpu/xxxcpu-sim.h
pluginPrototypes of intrinsic functions!
Functions to check operand types
cpu/cpu.c
cpu/cpu.h
cpu/cpu-protos.h GCC
cpu/cpu.md
plugin

図4

Generating plugins for GNU Binutils, GDB, and GCC

2. 3

ベースツールに対するプラグインの組込みターゲットプロセッサ用ツールチェーンにおいて，プラグイ

5 に示す．図 5 は，ターゲット/
ル/命令エンコード/命令デコード/命令実行等の処理を単純化

ンをどのように使用するかを図

プロセッサ用ツールチェーンにおけるアセンブル 逆アセンブ

GCC 向けのプラグインとなる． したフローチャートである．ターゲット用ツールチェーンにお3

uses the plugins
An unprocessed
instruction left?

begin

end
!"#$%&'(#)'*%+,%-./%(&

yes

Get aninstruction

New
instruction?

no

yes

The plugins are internally used to handle
new instructions on the generated tools
for assembling, disassembling,
relocating, or executing.

Base
instruction?

no

error

yes

Process itusing the plugins

F"9;.<.&)"'%($9:;"+&&&GBH3GG&0233!

!"#$%&'%()"*+&&&&,-../)&&(01&(21&334!

no;#<(-:;"&9;.<+&&GBH3GG&GGGG!
9;.<!
9;.<!
-../)!
(0! 1! (2!
:"#;(-369*/%(#'(*%).(<&-../)!
(0! 1! (2! 1!
33!
'A78;@! 'A78;@! 'A78;@! <B#(<'');"!

0"#12().)23'#-'4'*/%(&

Process it underthe base tool!"'%($9:;"&9-".).-%<'!

-../)!

9;.<!
9;.<!
56.! 1! 56-! 1! 5)77!

'$8/)!

56.! 1! 56-! 1! 5)77!

-"./)!

56.! 1! 56-! 1! 5)77!

'A78;@!;#<(-".& ;#<(-".&;#<(-".&
C-()-8@<& C-()-8@<&
C-()-8@<&D(<*)'%<(E! D(<*)'%<(E! D)77<.)-%<E!

図 5Tool internal ow for enhanced assemblers, disassemblers,
linkers, and simulators working with plugins

けるこれらの処理において，命令は，ベースツールの処理パス
か，プラグインによる処理パス，のいずれかで処理される．まず，ターゲット用ツールは，与えられた命令が追加命令であるか否かを判定する．つづいて，その命令が追加命令であればプラグインによる処理パスでその命令は処理され，そうでなければベースツールの処理パスで処理される．ターゲット用ツール
チェーンをこのように動作させるために，ベースツールを予め

図6

7"#8,'62()#*24*942/%(&-../)!

(0!

1!

33!

2!

33!

1!

(2!

1!

33!

1!

(2!

1!

33!

!"#$%&)"'%($9:;"!
-../)!

(0!

5"#$%&'(#*%+,26.-%(&-../)! 56.! 1! 56-! 1! 5)77!
=-%9><.&!"'%($9:;"&?&'<@<9%<.&-7;"*&9-".).-%<'!

Assembling instructions on the plugins

1: ;; syntax: myadd reg1, reg2, reg3
2: (define_insn "builtin_cpu_MYADD"
3: [
4: (set
5: (match_operand:SI 0 "cpu_gpr_regs_operand" "=r")
6: (unspec:VOID [7:(match_operand:SI 1 "cpu_gpr_regs_operand" "r")8:(match_operand:SI 2 "cpu_gpr_regs_operand" "r")9:
] UNSPEC_BUILTIN_MYADD))
10: ]
11: ""
12: "myadd %1, %2, %0"
13: [(set_attr "length" "4")]14: )

修正しておく必要がある．
2. 4;#<(-".&C-@$<'! 0!

図7

追加命令のアセンブル方法

A generated instruction pattern

ターゲットプロセッサ用アセンブラが追加命令をどのようにアセンブルするかについて説明する．ターゲットプロセッサ用
アセンブラに組込まれるパーサプラグインは，ニモニック形式，
関数形式，算術形式，の三つの命令記述スタイルに対応してい

2. 5

追加命令のマシン記述

ツールジェネレータは追加命令のマシン記述を生成する．マシン記述とは，追加命令の命令パターンであり，GCC のプロ

セッサ機種依存部で使用されるものである．命令パターンは，

C 言語の関数の戻り値を出力 GCC 独自の中間言語である RTL(register transfer language)
で記述される．図 7 は生成されたマシン記述の例である．
オペランドへ代入するように命令を記述する形式である．算術る．ニモニック形式は，ニモニックの後に複数のオペランド記
述する形式である．関数形式は，形式は，算術演算子や論理演算子を使って命令を記述する形式
である．パーサプラグインの命令処理手順を図6 に示す．命令をアセンブルした後で，もし未解決のシンボルを含むオペラン
ドがあれば，ターゲットプロセッサ用アセンブラはその未解決
トークン分解: パーサプラグインは入力文字列をトークンに分解する．トークンは，シンボル，数式，コードのいずれかのトークンに分類される．図2.

6 では，トークンは 6 個ある．

命令候補選択: パーサプラグインは入力文字列と同じ数のトークンをもつ命令の候補を選択する．図6 では，三つの命令が候補として選択されている．
3.

トークン比較: 選択された各命令候補について，パーサプ

ラグインは，対応する位置にあるトークンを比較し，入力命令と同じトークンのパターンをもつ命令

X を候補の中から見つけ

6 では，命令 add3i が入力命令と同じトークンのパター
ンをもつ命令 X である．
オペランド計算 命令 X において%xxx というトークンは
る．図

4.

:

オペランド変数を意味する．パーサプラグインはオペランド変数を表すトークンから命令

X のオペランドの値を計算する．例

えば，オペランド変数を表すトークンがレジスタ名を表すなら
ば，パーサプラグインはそのレジスタ名からレジスタの番号を求める．
5.

命令エンコーディング: パーサプラグインは，命令どんな演算を実行するのかを

GCC に伝えるのである．しかし，ツールジェネレータが生成する追加命令の命令パターンには，記述する．このようにすることで，命令パターンの生成が単純化され，さらに追加命令のスケジューリングに最低限必要な入出力オペランドを

GCC に認識させることができる．この場合，
GCC が自動的

動作記述のない命令パターンをもつ追加命令をに使用することはないが，組込み関数を提供するにはそれで十分である．
もしターゲットプロセッサが追加レジスタへの転送命令をもつなら，ツールジェネレータはその転送命令のための命令パ
ターンを生成する．転送命令の命令パターンは転送を意味する
動作記述をふくんでおり，

GCC がその命令パターンを認識して，コード生成プロセスにおいて使えるようにしている．
2. 6

GCC に対する組込み関数の追加

GCC に組込み関数を追加するには，TARGET_INIT_BUILTINSと TARGET_EXPAND_BUILTIN という二つのマクロが使われる．

TARGET_INIT_BUILTINS は組込み関数の初期化を行う関数の名前を表す．この初期化関数は，各組込み関数の名前，戻り値，引ID 番号，などの情報を GCC に登録する．ツールジェネレー

数，

X のオ

ペコードとオペランドの値とを使って，入力命令をエンコード
する．

令パターンに命令の動作を記述することによって，その命令が意味のある動作を記述せずに，単に入出力のオペランドだけをシンボルに対するリロケーション情報を作成する．
1.

一般的には，命令パターンには命令の動作が記述される．命タは，この登録処理のステートメントを各組込み関数ごとに生成する．生成されたステートメントは TARGET_INIT_BUILTINSで表される関数の中に挿入される．

4

TARGET_EXPAND_BUILTIN は与えられた組込み関数から命令

Instruction memory

パターンを生成する関数の名前を表す．この命令パターン生成
うべきかを判断し，組込み関数の引数を命令パターンのオペ

32 general
purposeregisters

ランドに変換する．ツールジェネレータは，与えられた命令パターンから命令パターンとそのオペランドタイプを得るためのGCC では，組込み関数の代わりにインラインアセンブラを
C コードに記述することもできる．しかし，以下の点で，組込み関数の方がインラインア
センブラよりも優れている．

•

GCC に与えられていれば，その命令を GCC はスケ/
ンアセンブラで記述された命令を GCC が最適化したり効率よ
ジューリング 最適化できる可能性がある．しかし，インライ
くスケージューリングすることはない．

GCC は入出力オペランドの型を検査する．一方，インラインアセンブラに対しては，GCC•

組込み関数に対しては，はそのような検査を行わない．

•

インラインアセンブラで記述したコードはターゲットプ

ロセッサでのみで動作するのに対して，組込み関数は非ター
ゲットプロセッサ上でもエミュレーションを使って動作させられる可能性がある．
こうした理由から，提案手法では，インラインアセンブラではBarrel shifter
32 64-bit
registers

ALU
SIMD ALU
Data memory

図8

Block diagram of the V850 processor with SIMD extension

表 1

Architecture summary of the V850 microcontroller with
SIMD extension

組込み関数に対応する命令のレイテンシや命令語長などの情報がAdditional
components

Multiplyer

Systemregisters

テーブルを生成する．

使うことによって，追加命令などをInstruction
queue

Programcounter関数は，与えられた組込み関数に対してどの命令パターンを使

RISC processor for emmbedded systems.
Base
Harvard architecture.
architecture Single cycle instruction execution.
Compact code size allowed by 2-byte insts.
32 32-bit general purpose registers
32 64-bit registers
Data types: 16 bits×4, 32 bits×2, 64 bits×1.
SIMD
Packed arithmetic insts.
extension
Load/store insts.
Data type conversion.
Logical operation.
表 2

The code amount of the generated plugins for the SIMD
extension.
Base tools
GNU Binutils 2.17
GDB 6.6
GCC 3.4.6# of instructions
179# of lines of the input XML le5934# of lines of the input behavior description
4436# of lines of the assembler plugin
8903# of lines of the simulator plugin
7699
13496
# of lines of the compiler code fragments

なく，組込み関数を選んだ．
3. 1

3.

実

験

れたツールチェーン

ここでは提案手法を用いたツール生成に関する実験について述

V850[10]をベースプロセッサとして使用する．V850 へ SIMD(single instruction multiple data) 命令セットと 64 ビットレジスタを追べる．実験では，組み込み向けマイクロコントローラ

加したものをターゲットプロセッサとして，コンパイラ等のソ
フト開発ツールをツールジェネレータを使って生成する．生成されたコンパイラとSIMD 拡張を備えた V850 プロセッサ向けに生成さSIMD 拡張向けの組込み関数を使って，生成されたコンパイラのコード効率を示す．

SIMD 拡張を活用する方法として，組込み関数の代

ここで，

このような
様を

SIMD 拡張の命令セットとレジスタに関する仕XML で記述し，ツールジェネレータを使って，コンパイ

ラ等のソフトウェア開発ツールを生成した．ツールジェネレー

2 に示す．ベースプロセッ
サ V850 へ追加した SIMD 命令の数は 179 個で，ツールジェ
ネレータへの入力ファイル (XML と動作記述の C コード) は
合計で 10370 行である．一方，ツールジェネレータから生成されたプラグインは合計で 30098 行である．入力ファイルの規模タが生成したプラグインの規模を表

は出力ファイルよりも非常に小さいわけではないが，ひとつの//わりにインラインアセンブラを使うことはできないことに注意

仕様記述からアセンブラ シミュレータ コンパイラ等のツール

して欲しい．なぜなら，この実験ではチェーンが生成されることは非常にメリットがある．

64 ビットレジスタを追加するが，それらのレジスタをベースプロセッサ向けのコンパイラで扱うことはできないからである．提案手法が生成するプ

3. 2

組込み関数を使ったコード生成

本実験で生成されたコンパイラのコード生成効率を調べるた

めに，(1) 組込み関数を使ってコンパイラが生成したコードと，(2)
手書きアセンブラコードと，を比較する．両方とも SIMD
よってはじめて，64 ビットレジスタを含む SIMD 拡張をコン
命令セットを使用するが，(1) では C コードの中に SIMD 命令
パイラが活用できるようになる．
セットに一対一に対応する組込み関数を記述し，(2) ではアセターゲットプロセッサの構成を図 8 と表 8 に示す．V850 に対して追加する SIMD 拡張は，32 個の 64 ビットレジスタと， ンブラコードの中に SIMD 命令セットを記述する．フィルタ，64 ビット幅のパックドデータを扱う SIMD 演算器と，147 個の FFT などの基本的な信号処理とソートなどの 28 個のプログ
SIMD 命令セットからなる．利用可能なデータタイプは 16 ビッ ラムについて，二種類のプログラムを作成し，シミュレータを使って，関数内で実行された命令の数を計測した．
ト ×4, 32 ビット ×2, 64 ビット ×1，の三種類である．SIMD
図 9 は手書きアセンブラコードに対するコンパイラ生成コー
命令セットは，加算/減算/乗算などの算術演算，型変換，ロードの命令数の比率を表す図である．図9 によると，手書きアセ
ド/ストア，論理演算，データインターリーブ，などを含む．
5
ラグインをベースプロセッサ向けコンパイラへ追加することにrbinutils が生成可能なのは GNU Binutils だけで，シミュレー
タやコンパイラを生成することはできなかった．Baldassin は2003 年から，仕様記述にもとづいて GNU Binutils やシミュ
レータを生成するツール ArchC を開発し，オープンソースソ
フトとして提供している．文献 [9] において、ArchC を使って複数の CPU で GNU Binutils のリターゲッティングとシミュ

100%: hand-optimized assembly codes

32-bit complex FFT (N=256)
16-bit complex FFT (N=256)
32-bit bitonic sort (N=64)
16-bit bitonic sort (N=64)
16-bit complex FIR (N=16, T=16)
16-bit complex FIR (N=1, T=16)
32-bit complex FIR (N=16, T=16)
32-bit complex FIR (N=1, T=16)
16-bit FIR (N=16, T=16)
16-bit FIR (N=1, T=16)
32-bit FIR (N=16, T=16)
32-bit FIR (N=1, T=16)
16-bit IIR w/o scaling (N=8, B=2)
16-bit IIR w/o scaling (N=1, B=2)
16-bit IIR with scaling (N=8, B=2)
16-bit IIR with scaling (N=1, B=2)
32-bit IIR w/o scaling (N=8, B=2)
32-bit IIR w/o scaling (N=1, B=2)
32-bit IIR with scaling (N=8, B=2)
32-bit IIR with scaling (N=1, B=2)
16-bit LMS adaptive FIR (N=1,T=16)
32-bit LMS adaptive FIR (N=1,T=16)
16-bit maximum search (N=64)32-bit maximum search (N=64)
16-bit minimum search (N=64)32-bit minimum search (N=64)
16-bit normalization (N=64)32-bit normalization (N=64)

107% on average

レータ生成が可能であることが報告された．

95%

図9

100%

105%

110%

115%

な機能を，一般的な
120%

Increase in the number of executed instructions of compilergenerated codes using intrinsic functions against that ofhand-optimized assembly codes

ンブラコードに比べてコンパイラ生成コードの命令数は平均で7%増加する．手書きアセンブラコードに対するコンパイラ生

成コードの明らかなメリットは，レジスタ割当てをコンパイラに任せられることである．つまり，組込み関数を使用する場合には，手書きアセンブラコードに対して7%程度の命令数増加を許容することで，プログラマがレジスタ割当てから解放され7%増る．ソースコードのメンテナンス性を高めるという点で，
加は十分に許容できると考える．この平均

7%の命令数増加の要因は以下のとおりである．
ループ回数検査 コンパイラ生成コードでは，ループ突入前にループ回数が変数である場合に0 か否か必ずチェックする．手書きアセンブラコードではチェックしない．
冗長なレジスタ間転送 コンパイラのコードには，引数や戻り値に関する冗長な転送命令がある．引数，戻り値，ローカル変数に対するレジスタ割当てが別々に行われることが原因．回避困難と考えられる．
4.

サに提供するものである．さらに，本提案は追加命令のための新たなリロケーションタイプを追加したり，追加命令と等価な演算を行なうエミュレーション関数を追加したり，することができる．本提案以外はニモニック形式の命令シンタックスだけが使用可能であるが，本提案はニモニック形式だけでなく，関数形式や算術形式の命令シンタックスを使用することができ

V850 プロセッサの他
ARM および MIPS をベースプロセッサとする場合についる．実験には詳細を記述しなかったが，に，ても、数個の命令を追加するような簡易な実験によって、ツール生成が可能であることも確認している．
5.

おわりに

組込みプロセッサの命令セット拡張およびレジスタの追加に適したソフトウェア開発ツール生成手法を提案した．本手法では，基本となるソフトウェア開発ツールに対してプラグインを追加することによって，ベースプロセッサへ追加された命令セッ(

トやレジスタを適切に扱えるソフトウェア開発ツール アセン)
V850 に SIMD 命令を追加する
実験をとおして，本手法により，SIMD 拡張を備えた V850 向ブラ，逆アセンブラ，リンカ，シミュレータ，コンパイラ を生成する．組込み向けプロセッサ

けのツールチェーンを生成可能であることを示した．さらに，本手法を用いて生成されたコンパイラは，手書きアセンブラ

関連研究と考察GNU Binutils の retargetting に関する関連研究と，本提案
Tensilica は1990 年代後半にカスタマイズ可能なプロセッサ Xtensa[12] を開発し，Xtensa 向けのソフト開発ツールを生成するシステムを提供した．ターゲットアーキテクチャは Xtensa に限られるとを比較し，本提案の位置付けについて議論する．

が，レジスタ数や演算器や命令セットをカスタマイズ可能であXtensa のための GNU Binutils，GDB，シミュレータ，コンパイラを生成できる．文献 [12] によると，

コードと比較して，実行命令数が平均でわずか残念ながら新たなリロケーションの追加については記載がない．

Red Hat 社は 2000 年に，GNU Biutils や GDB の移植を容易にするためのツール CGEN[6] をオープンソースソフトウェ
アとしてリリースした．CGEN は GNU Biutils 全体をリター
ゲッティングするものではなく，命令のエンコードやデコード

opcode や命令実行の関数群だけをプロセッ

文
[1]

[2]

[3]

[4]

[5]

[6]
[7]
[8]

[9]

[10]

サ仕様記述から生成する．

Abbaspour は 2002 年に，仕様記述にもとづいて GNU Binutils を生成するツール rbinutils を開発した [7]．しかしながら，7%程度の増加という良質なコードを生成できることが確認された．

り，カスタマイズしたを行なうライブラリ

Xtensa 用ツールジェネレータとほぼ等価
GNU ツールチェーンに対応するプロセッ

一方，提案手法は，
N: Number of input samples
T: Number of filter taps
B: Number of biquad stages

[11]
[12]

献

A. Fauth, J. Van Praet, and M. Freericks, Describing Instruction Set
Processors Using nML, Proceedings of the European Design and Test
Conference, pp. 503-507, March 1995.
Paul C. Clements, A Survey of Architecture Description Languages, Proceedings of the 8th International Workshop on Software Specication and
Design, pp. 16, March 22-23, 1996
Vojin Zivojnovic, Stefan Pees, and Heinrich Meyr, LISA-machine description language and generic machine model for HW/SW co-design, Proceedings of the IEEE Workshop on VLSI Signal Processing IX, pp. 127136, 1996.
Ashok Halambi, Peter Grun, Vijay Ganesh, Asheesh Khare, Nikil Dutt,and Alex Nicolau, EXPRESSION: A Language for Architecture Exploration through Compiler/Simulator Retargetability, Proceedings of Design Automation and Test in Europe (DATE 99), pp. 485-490, 1999.
S. Kobayashi, Y. Takeuchi, A. Kitajima, M. Imai, Compiler Generationin PEAS-III: an ASIP Development System, International Workshop on
Software and Compilers for Embedded Processors (SCOPES), 2001.
CGEN, the Cpu tools GENerator,
see http://sources.redhat.com/cgen/ .
Maghsoud Abbaspour, Jianwen Zhu, Retargetable Binary Utilities, Proceedings of the 39th Design Automation Conference, pp. 331-336, 2002.
Manuel Hohenauer, Hanno Scharwaechter, Kingshuk Karuri, Oliver
Wahlen, Tim Kogel, Rainer Leupers, Gerd Ascheid, Heinrich Meyr, Gunnar Braun, and Hans van Someren, A Methodology and Tool Suite for
C Compiler Generation from ADL Processor Models, Proceedings ofthe Design, Automation and Test in Europe Conference and Exhibition(DATE'04), 2004.
Alexandro Baldassin, Paulo Centoducatte, and Sandro Rigo, An OpenSource Binary Utility Generator, ACM Transactions on Design Automation of Electronic Systems, Vol. 13, No. 2, Article 27, April 2008.
NEC Electronics Corp., User's Manual: V850 Family for Architectur, Document No. U10243EJ7V0UM00, March 2001, available at
http://www.necel.com/ .
Ricardo E. Gonzalez, Xtensa: A Congurable and Extensible Processor,IEEE Micro, Volume 20, Issue 2, pp. 60-70, March-April 2000.
Tensilica, Inc., Tensilica Instruction Extension (TIE) Language Reference
Manual, Nov. 2006.

6