H8SXのブロック転送命令における制限事項というのがあります。
下のようなコードの場合は
00cc 01016976 mov.l @(4,er7),er6
00d0 01006975 mov.l @er7,er5
00d4 7BB4 movmd.l
00d6 01580506 mov.w @er5,@er6
メモリからer5に転送したあとに、movmdを実行するのではなく
00cc 01016976 mov.l @(4,er7),er6
00d0 01006975 mov.l @er7,er5
00d4 0000 nop
00d6 7BB4 movmd.l
00d8 01580506 mov.w @er5,@er6
nopとかの命令を挿入しないとおかしな動作をしますよという事です。
gccには、こういう時に便利に使えるpeephole2という機能があります。
どういう機能かというと特定できる命令のパターンの組み合わせを登録しておくと
その命令のパターンの組み合わせを見つけた時に別の命令の組み合わせに変更できるのです。
(他にも、ある命令をarchに合わせて分解するようなことも出来るのです。)
命令の記述にはmd形式という形で表現されています。
movmd-movsd.patchこの中は覗かないほうがいいかもしれない。
peephole2は最適化オプションが1以上でないと機能しないので、ご注意を
[0回]
PR