[前][次][番号順一覧][スレッド一覧][生データ]

yarv-dev:347

From: SASADA Koichi <ko1 atdot.net>
Date: Mon, 6 Dec 2004 08:55:56 +0900
Subject: [yarv-dev:347] Re: Operand unification

 ささだです。

> * ラベルが多すぎるので、GCC がコードを共有するのを諦めたらよりよい
>   コードを生成した

 どうやらこれのような気がします。


INSN_ENTRY(setlocal){
  /* declare stack push val */
  /* declare and initialize default opes */
  /* declare and get from iseq */
  ulong idx = GET_OPERAND(1);
  /* declare and pop from stack */
  VALUE val = TOPN(0);
  /* management */
  ADD_PC(1+1);
  POPN(1);
  #define CURRENT_INSN_setlocal 1
  /* for debug */
  USAGE_ANALYSIS_INSN(BIN(setlocal));
  USAGE_ANALYSIS_OPERAND(BIN(setlocal), 0, idx);
{
  (*(GET_LFP() - idx)) = val;
  /* push stack val */
  #undef CURRENT_INSN_setlocal
  END_INSN();
}}


(ふつーのとき)
====>
.stabn 68,0,2077,LM975-_thread_eval_body
LM975:
	movl	-296(%ebp), %ecx
LBE186:
LBE185:
LBB187:
	movl	4(%ecx), %eax
.stabn 68,0,2079,LM976-_thread_eval_body
LM976:
	movl	-300(%ebp), %ebx
	movl	-4(%ebx), %edx
.stabn 68,0,2081,LM977-_thread_eval_body
LM977:
	addl	$8, %ecx
	movl	%ecx, -296(%ebp)
.stabn 68,0,2082,LM978-_thread_eval_body
LM978:
	subl	$4, %ebx
	movl	%ebx, -300(%ebp)
.stabn 68,0,2088,LM979-_thread_eval_body
LM979:
	sall	$2, %eax
	movl	-304(%ebp), %esi
	subl	%eax, %esi
	movl	%edx, (%esi)
.stabn 68,0,2091,LM980-_thread_eval_body
LM980:
	jmp	L631                       # このジャンプが一個余分
...
L631:
	 # basic block 3
	movl	(%ecx), %eax
	jmp	*%eax




(命令がたくさんあるとき)
====>

	 # basic block 1271
.stabn 68,0,10687,LM2589-_thread_eval_body
LM2589:
	movl	-296(%ebp), %ecx
LBB618:
	movl	4(%ecx), %eax
.stabn 68,0,10689,LM2590-_thread_eval_body
LM2590:
	movl	-300(%ebp), %ebx
	movl	-4(%ebx), %edx
.stabn 68,0,10691,LM2591-_thread_eval_body
LM2591:
	addl	$8, %ecx
	movl	%ecx, -296(%ebp)
.stabn 68,0,10692,LM2592-_thread_eval_body
LM2592:
	subl	$4, %ebx
	movl	%ebx, -300(%ebp)
.stabn 68,0,10698,LM2593-_thread_eval_body
LM2593:
	sall	$2, %eax
	movl	-304(%ebp), %esi
	subl	%eax, %esi
	movl	%edx, (%esi)
.stabn 68,0,10701,LM2594-_thread_eval_body
LM2594:
	movl	(%ecx), %eax
LBE618:
	jmp	*%eax


 ジャンプ命令が一個余分ですねえ。

 しかし、こういうコード生成って制御できないんですかね。gcc のマニュア
ルを見てみたんですが、この辺をどうするってオプションを見つけられません
でした。

 当分はダミー命令を付加してこういうコードを吐かせるようにするしかない
のかな。

 ちなみに両方とも -O2 です。

・・・

 探したらちゃんとありました。-fno-crossjumping で同じ結果になりまし
た。やれやれ。

 命令統合で遅くなったのはなんでなんでしょうねえ。

 VC にも同じオプションはあるのかしらん。


--
ML: yarv-dev quickml.atdot.net
使い方: http://www.atdot.net/~ko1/quickml

[前][次][番号順一覧][スレッド一覧][生データ]

       346 2004-12-06 07:34 [ko1 atdot.net       ] Operand unification                     
->     347 2004-12-06 08:55 ┣[ko1 atdot.net       ]                                       
       348 2004-12-06 09:06 ┣[matz ruby-lang.org  ]                                       
       349 2004-12-06 09:10 ┃┗[ko1 atdot.net       ]                                     
       350 2004-12-06 11:25 ┗[shudo computer.org  ]                                       
       351 2004-12-06 16:47  ┗[ko1 atdot.net       ]