このページはstableではありません。(臨時情報です。)

2000/07/26現在の情報です。

   Call Convention の変更について

2000/07/01にnew core用のためにcall conventionを変更する話しがあったようです。現在のバージョンで変更が加えられているようですので内訳を書きたいと思います。

ATmega83,ATmega163には movw, mul が使えるnew coreが使用されるようです。movw命令を有効に使うために関数コールの値渡しに使用されるレジスタを変更しようというものです。

I'm currently testing my gcc changes to support the new AVR core.
This includes "movw" as well as "mul" (inline up to 16 bits -
mulhi3 is just 7 words, and works on any registers as long as
source and destination don't overlap, so I don't think a libgcc
call + some copying between registers will be really smaller),
and "lpm Rd,Z+" in tablejump.

(Marekさんの投稿より)

Cとアセンブラをリンクさせるときやインラインアセンブラでは、どのレジスタが使用されているかを知る必要がありますが、その引数の規則が変更されています。


今現在の新しいバージョンで試してみました。

現バージョンの特徴は、

●binutils
・8k以上のプログラムメモリ対応(new core用)
・それに伴いコア種類指定オプションの変更

●gcc
・call conventionの変更
・-mtiny-stackオプションの追加(2313のように256バイトメモリにフィットするもの、SPHは触らないようです)。
・-mpack-argsオプションの追加。以前のcall conventionに戻す。
・-menhancedオプションの追加。新しいコア用の命令も入れる。
・現バージョンではありませんが-fcall-savedでコードサイズが小さくなることがあるようです(これはgccの機能です)。

・ちなみにinfoのなかの記述は
AVR Options
-----------
These options are defined for AVR implementations:
`-mmcu=MCU'
Specify ATMEL AVR mcu
(at90s23xx,attiny22,at90s44xx,at90s85xx,atmega603, atmega103).
`-msize'
Output instruction size's to the asm file
`-minit-stack=N'
Specify the initial stack address
`-mno-interrupts'
Generated code is not compatible with hardware interrupts. Code
size will be smaller.
`-mcall-prologues'
Functions prologues/epilogues expanded as call to appropriate
subroutines. Code size will be smaller.
だそうです。


今回のインストール(私の備忘録です)

●binutilsのインストール

cvs アクセスするのが面倒でしたのでsnapshotで試してみました。binutilsは今では毎日のようにスナップショットが出ているようです。今回はbinutils-000725.tar.gzを使用しました。

展開して、

./configure --target=avr --prefix=構築したい場所

make

make install

以前のバージョンとコンフリクトしない場所にインストールしないといけません。
ここでbinディレクトリにパスを通しますが、以前のバージョンのパスは消しておきます。

●gccのインストール

こちらもスナップショットを使いました。今回はegcs-core-20000717.tar.gzを使用しました。--enable-languages=cを付けます。

展開して

./configure --target=avr --prefix=構築したい場所 --enable-languages=c

make

make install

●libcのインストール

現段階ではまだ対応したものがありません。よってスタートアップルーチンなどがないため、完全なプログラムは作れません。まあ、gcrt1.Sを参考に書けばいいのですが。


ためしにstableバージョン(binutils-2.9.5.0.46 と gcc-2.95.2)と比較してみます。

使用したプログラムは次のものです。

int func(char a,int b,char c,char d);
int zz;
int main(void)
{
	
	int i;
	char l,m,n,o;
	
	l = 1;
	m = 2;
	n = 3;
	o = 4;
	
	i = func(l,m,n,o);
}
int func(char a,int b,char c,char d)
{
	zz = b;
	zz += c * d;
	return a+zz;
}

これを avr-gcc -Os test.c -S などとしてアセンブラファイルをはかせてみます。

まずstableバージョンでの出力結果からコール部分を見てみると、
ldi r25,lo8(1)
ldi r22,lo8(3)
ldi r23,lo8(2)
ldi r24,hi8(2)
ldi r21,lo8(4)
rcall func
のようになっています。

現在のバージョンでの通常の出力結果では、
ldi r24,lo8(1)
ldi r20,lo8(3)
ldi r22,lo8(2)
ldi r23,hi8(2)
ldi r18,lo8(4)
rcall func
といったようにレジスタの使用がmovwできるように偶数のものから使用されています。

ここで-mpack-argsを使うとこの出力結果のように以前のstableバージョンと同じ関数コールに戻ります。コードサイズは最適化がよくなっているためか少し小さくなっていますね。

また-menhancedオプションをつけると出力結果はこのように
/* prologue end (size=0) */
mov r19,r24
muls r20,r18
movw r24,r0
clr r1
add r22,r24
新しい命令(movw,muls)が入るようになります。そしてコードサイズもさらに小さくなります。
conventional : 49命令
new avr-gcc with -menhanced : 28命令
安定バージョンのものと比較して半分近くまで小さくなっています(すごい)。

ちなみに-mpack-argsと-menhancedを同時に使うとおかしくなります(というより同時には使いませんが)。いまはlibc対応していないようです。以前のライブラリにリンクさせるのでしょうか?

> object/port.o(.text+0x40): undefined reference to `_mulhi3'
> make: *** [all] Error 1
>
> What is missing, what else do i have to link to the output file?

You must link libgcc.a which located at
/usr/local/lib/gcc-lib/avr/2.95.2/

Denis.

のように以前のバージョンのものをリンクさせないといけないこともあるようです。

I had the same problem, and solved it as follow.
There is a library file called libgcc.a which is needed for the _mulhi3
and all the other mathematical operators like % * etc.
I copied this file (/usr/local/avr/lib/gcc-lib/avr/2.95.2/libgcc.a ) to
/usr/local/avr/avr/lib on my machine. I suppose you can make a sym
link as well.

Good luck
Pieter

計算系はそうなっているようです。


まとめ

今変更途中のものを少し覗いてみただけですが、けれどもこの開発スピードには恐れ入ります。またある程度開発が進んだようなときにレポートしたいと思います。


戻る