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 ]