忍者ブログ

なんだか

知らないほうが幸せかもしれない

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

h8300-elfのgccを作ろうとしたら、続き

ターゲットのコンパイルオプションに-fomit-frame-pointerをつけて
やってみたら、またもや、ビルドがコケた。

../../../../../../gcc-4.7.2/libstdc++-v3/libsupc++/pmem_type_info.cc:47:1: エラー: 認識できない命令:
(insn 96 9 97 2 (parallel [
            (set/f (mem:SI (plus:SI (reg/f:SI 7 sp)
                        (const_int -4 [0xfffffffffffffffc])) [0 S4 A32])
                (reg:SI 5 r5))
            (set/f (mem:SI (plus:SI (reg/f:SI 7 sp)
                        (const_int -8 [0xfffffffffffffff8])) [0 S4 A32])
                (reg:SI 6 r6))
            (set/f (reg/f:SI 7 sp)
                (plus:SI (reg/f:SI 7 sp)
                    (const_int -8 [0xfffffffffffffff8])))
        ]) ../../../../../../gcc-4.7.2/libstdc++-v3/libsupc++/pmem_type_info.cc:37 -1
     (expr_list:REG_DEAD (reg:SI 6 r6)
        (expr_list:REG_DEAD (reg:SI 5 r5)
            (nil))))
../../../../../../gcc-4.7.2/libstdc++-v3/libsupc++/pmem_type_info.cc:47:1: コンパイラ内部エラー: extract_insn 内、位置 recog.c:2123
完全なバグ報告を送って下さい。
適切ならば前処理後のソースをつけてください。
<http://gcc.gnu.org/bugs.html> を見れば方法が書いてあります。

バグ報告してね、って書いてあるけど、ここは自力で何とかしてみましょう。
スタックにレジスタの退避をしてるようなので

(define_insn "*stm_h8300s"
  [(set (mem:SI (plus:SI (reg:SI SP_REG)
                         (const_int -4)))
        (reg:SI 5))
   (set (mem:SI (plus:SI (reg:SI SP_REG)
                         (const_int -8)))
        (reg:SI 6))
   (set (reg:SI SP_REG)
        (plus:SI (reg:SI SP_REG)
                 (const_int -8)))]
  "TARGET_H8300S"
  "mov.l\ter5,@-er7\n\tmov.l\ter6,@-er7\t!gcc push bug"
  [(set_attr "cc" "none")
   (set_attr "length" "4")])

これをgcc/config/h8300/h8300.mdにスタック操作している場所に突っ込んでみました。
これで合ってるのかはわかりませんが、アセブンルリストを眺めた限りでは大丈夫そうでした。
(この修正は前に作ったものなのです。)

と思って、よくよくソースを見直してたら、間違いらしきところを見つけました。

gcc/config/h8300/h8300.c
--- h8300.c.push_bug    2012-08-06 23:34:27.000000000 +0900
+++ h8300.c    2012-12-16 21:55:57.345816636 +0900
@@ -817,15 +817,14 @@ h8300_expand_prologue (void)
       if (TARGET_H8300S)
         {
           /* See how many registers we can push at the same time.  */
-          if ((!TARGET_H8300SX || (regno & 3) == 0)
+          if ((TARGET_H8300SX || (regno & 3) == 0)
           && ((saved_regs >> regno) & 0x0f) == 0x0f)
         n_regs = 4;
 
-          else if ((!TARGET_H8300SX || (regno & 3) == 0)
+          else if ((TARGET_H8300SX || (regno & 3) == 0)
                && ((saved_regs >> regno) & 0x07) == 0x07)
         n_regs = 3;
-
-          else if ((!TARGET_H8300SX || (regno & 1) == 0)
+          else if ((TARGET_H8300SX || (regno & 1) == 0)
                && ((saved_regs >> regno) & 0x03) == 0x03)
         n_regs = 2;
         }

!TARGET_8300SXの!が余計だったという。逆のことをやってるところでは!はついていないので大丈夫だったようです。

拍手[0回]

PR

コメント

お名前
タイトル
文字色
メールアドレス
URL
コメント
パスワード Vodafone絵文字 i-mode絵文字 Ezweb絵文字

カレンダー

03 2024/04 05
S M T W T F S
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

フリーエリア

最新CM

最新記事

(07/27)
(03/27)
(03/26)
(03/23)
(03/22)
(03/19)
(03/18)
(03/18)
(03/15)
(03/14)
(03/13)
(03/12)
(03/11)
(03/11)
(03/08)
(03/08)
(03/06)
(03/05)
(03/02)
(03/01)
(02/28)
(02/27)
(02/24)
(02/23)
(02/22)

プロフィール

HN:
kenrou
性別:
非公開

バーコード

ブログ内検索

最古記事

(12/15)
(12/16)
(12/17)
(12/18)
(12/19)
(12/20)
(12/21)
(12/22)
(12/23)
(12/24)
(12/25)
(12/26)
(12/27)
(12/28)
(12/29)
(12/30)
(12/31)
(01/01)
(01/02)
(01/21)
(01/22)
(01/23)
(01/24)
(01/24)
(01/28)

P R

忍者アナライズ

コガネモチ

忍者カウンター

カレンダー

03 2024/04 05
S M T W T F S
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30