CPU実験室

誰も見向きもしない古いCPUをいじって動かしてみようというプロジェクトです

コンパイラ変更

LSIC-86のコード生成はいまいちで、特に浮動小数点処理をするとき頻繁にサブルーチンコールする
ので効率が良くありません
ここではDOSアプリ時代に相当お世話になったMicrosoft-C Compiler Ver6.00を利用してやってみよう
と思います。
DOSアプリ用のコンパイラは、生成したバイナリも当然MS-DOS環境下で実行されることを想定している
のでOSが無い組込み用ファームやROM化は簡単ではありません

問題は
・スタートアップルーチンの付加
・各セグメントの割付けを走行環境のROM/RAMに合わせて再配置
・OSのサービスを利用しない処理をしなければならない
といったところです。

先ずはMSC6.0がどんなコードを吐くか試してみます
例題は386ボードでもやってみたマンデルブロ集合判定です

unsigned char mandel_chk(double a,double b)
{
	double x,y,x1,y1;
	int n;
	
	x=y=0;
	for(n=1;n<NMAX;n++){
		x1=x*x-y*y+a;
		y1=2*x*y-b;
		if((x1*x1+y1*y1)>4) return (n % 256);
		x=x1;
		y=y1;
	}
	return 0;
}

このソースを以下のコマンドラインコンパイルしてみました
  cl /c /G2 /Ox /FPi87 /Fatest test.c   //プロセッサ=80286 最適化MAX、80x87インライン命令生成

出力されたアセンブルソースはこんな具合です
_mandel_chk	PROC NEAR
	enter	18,0
	push	si
	fldz	
	fldz	
	fwait	
	mov	dx,1
	fld	QWORD PTR $T20004
	fld	QWORD PTR [bp+12]	;b
$F303:
	fld	ST(3)
	fmul	ST(0),ST(3)
	fmul	ST(0),ST(2)
	fsub	ST(0),ST(1)
	fstp	QWORD PTR [bp-10]	;y1
	fld	ST(2)
	fmul	ST(0),ST(3)
	fld	ST(4)
	fmul	ST(0),ST(5)
	fsub	
	fadd	QWORD PTR [bp+4]	;a
	fst	QWORD PTR [bp-18]	;x1
	fmul	QWORD PTR [bp-18]	;x1
	fld	QWORD PTR [bp-10]	;y1
	fmul	QWORD PTR [bp-10]	;y1
	fadd	
	fcom	QWORD PTR $T20005
	fstp	ST(0)
	fstsw	ax
	sahf	
	ja	$L20006
	fld	QWORD PTR [bp-18]	;x1
	fstp	ST(3)
	fld	QWORD PTR [bp-10]	;y1
	fstp	ST(4)
	inc	dx
	cmp	dx,1024
	jl	$F303
	fstp	ST(0)
	fstp	ST(0)
	fstp	ST(0)
	fstp	ST(0)
	jmp	SHORT $FB305
	nop	
$L20006:
	fstp	ST(0)
	fstp	ST(0)
	fstp	ST(0)
	fstp	ST(0)
	mov	si,dx
	mov	cx,256
	mov	ax,si
	cwd	
	idiv	cx
	mov	ax,dx
	pop	si
	leave	
	ret	
	nop	
$FB305:
	sub	al,al
	pop	si
	leave	
	ret	
	nop	

_mandel_chk	ENDP

当然ですがサブルーチンコールは一切無くインラインで浮動小数点命令が使われており
いい感じです
平方根や超越関数をつかうとFPU命令を前処理後処理でラップしたライブラリ内関数をコールして
しまいますが、四則演算だけならばインラインでいけます