アーキテクチャの gcc バックエンドに取り組んでいます。アーキテクチャには、インデックス付き配列アクセスの命令があります。したがって、はwhere is ald r0, (r1, r2)
と同等です。r0 = r1[r2]
r1
int32_t*
.md
これをファイルで次のパターンで表しています。
(define_insn "*si_load_indexed"
[
(set
(match_operand:SI 0 "register_operand" "=r")
(mem:SI
(plus:SI
(mult:SI
(match_operand:SI 1 "register_operand" "%r")
(const_int 4))
(match_operand:SI 2 "register_operand" "r"))))
]
""
"ld %0, (%2, %1)"
[(set_attr "length" "4")]
)
ただし、命令が実際に発行されることはありません。命令結合ステージからのデバッグ出力を見ると、次のように表示されます。
Trying 8, 9 -> 10:
Successfully matched this instruction:
(set (reg:SI 47 [ *_5 ])
(mem:SI (plus:SI (mult:SI (reg/v:SI 43 [ b ])
(const_int 4 [0x4]))
(reg:SI 0 r0 [ a ])) [2 *_5+0 S4 A32]))
rejecting combination of insns 8, 9 and 10
original costs 8 + 4 + 4 = 16
replacement cost 32
これを正しく読んだ場合、命令パターンは一致したが、元の命令よりもコストが高いために命令が拒否されたことを示しています。
では、私の指導の費用はどのように計算されているのでしょうか? その 32 はどこから得ているのでしょうか (これは奇妙に高いようです)。この命令を実際に使用するようにgccを説得するにはどうすればよいですか?