GNURX用のCCRXmachine.hとCCRXmachine.cというソースがe2 studioフォルダにありました(内容は概ね名前から予想される通りのものでした)

こんにちは。NoMaYです。

e2 studio v6.3.0がリリースされていたので、インストールして幾つかプロジェクトを作成して、いつものようにe2 studioのインストールフォルダを眺めていたら、CCRXmachine.hとCCRXmachine.cというファイルがあることに気付きました。中を見てみると、概ねファイル名から予想される通りのソースファイルでした。(今までのe2 studioのインストールフォルダを見直してみたところ、以前からあったことが分かりましたが、今まで気付きませんでした。) ただ、一部コメントアウトされているものがあったり、以前に別スレッド『GUNRX用プロジェクトのスマートコンフィグレータのBSPを見ていて気付いた変な移植コード』で話題にしたことと同じ元のコードの意図を理解していない書き換えがあったり、ちょっと惜しいような気もしました。

e2 studioインストールフォルダ\internal\projectgen\rx\Generate\CCRXConversion\inc\CCRXmachine.h



e2 studioインストールフォルダ\internal\projectgen\rx\Generate\CCRXConversion\inc\CCRXmachine.c



Parents
  • こんにちは。NoMaYです。

    私の前の投稿のxchg()関数のインラインアセンブラ記述の件は、何か腑に落ちない、という感じがしていたのですが、今朝目が覚めて暫くして、GCCの気持ちとして、ひょっとして以下のようなことなのかな?というのが頭に思い浮かびました。

    ● インラインアセンブラ記述部のInputOperandとしてポインタの値だけというのは変だよね。少なくとも以下の何れか1つは一緒に指定されていないと変だよね。
    (1) OutputOperandにポインタの値を加工した値の出力
    (2) InputOperandにポインタの値(もしくは加工した値)によるメモリのリード
    (3) OutputOperandにポインタの値(もしくは加工した値)によるメモリのライト(もしくはリードモデファイライト)
    ●この何れも指定されていないのであれば、ポインタの値は実質使われていない、ということだから壊しても構わないよね。

    そこで、以下のように記述してみたところ、意図したコードが生成されました。

    static __inline__ void xchg(signed long *data1, signed long *data2) __attribute__((always_inline));
    static __inline__ void xchg(signed long *data1, signed long *data2)
    {
    /* CC-RX V2.03
            MOV.L [R1], R14
            XCHG [R2].L, R14
            MOV.L R14, [R1]
            RTS
    */
        signed long temp;
        __asm__ volatile
        (
            /* AssemblerTemplate */
            "MOV.L [%[R1]], %[R14]\n\t"
            "XCHG [%[R2]].L, %[R14]\n\t"
            "MOV.L %[R14], [%[R1]]"
            : /* OutputOperands */
                [R14] "=r" (temp),
                      "+m" (*data1),
                      "+m" (*data2)
            : /* InputOperands */
                [R1] "r" (data1),
                [R2] "r" (data2)

        );
        return;
    /* GNURX 2018q1
      92 0010 EC 15                         MOV.L [r1], r5
      93 0012 06 A0 10 25                   XCHG [r2].L, r5
      94 0016 E3 15                         MOV.L r5, [r1]
      97 0018 02                            rts
    */
    }

     

Reply
  • こんにちは。NoMaYです。

    私の前の投稿のxchg()関数のインラインアセンブラ記述の件は、何か腑に落ちない、という感じがしていたのですが、今朝目が覚めて暫くして、GCCの気持ちとして、ひょっとして以下のようなことなのかな?というのが頭に思い浮かびました。

    ● インラインアセンブラ記述部のInputOperandとしてポインタの値だけというのは変だよね。少なくとも以下の何れか1つは一緒に指定されていないと変だよね。
    (1) OutputOperandにポインタの値を加工した値の出力
    (2) InputOperandにポインタの値(もしくは加工した値)によるメモリのリード
    (3) OutputOperandにポインタの値(もしくは加工した値)によるメモリのライト(もしくはリードモデファイライト)
    ●この何れも指定されていないのであれば、ポインタの値は実質使われていない、ということだから壊しても構わないよね。

    そこで、以下のように記述してみたところ、意図したコードが生成されました。

    static __inline__ void xchg(signed long *data1, signed long *data2) __attribute__((always_inline));
    static __inline__ void xchg(signed long *data1, signed long *data2)
    {
    /* CC-RX V2.03
            MOV.L [R1], R14
            XCHG [R2].L, R14
            MOV.L R14, [R1]
            RTS
    */
        signed long temp;
        __asm__ volatile
        (
            /* AssemblerTemplate */
            "MOV.L [%[R1]], %[R14]\n\t"
            "XCHG [%[R2]].L, %[R14]\n\t"
            "MOV.L %[R14], [%[R1]]"
            : /* OutputOperands */
                [R14] "=r" (temp),
                      "+m" (*data1),
                      "+m" (*data2)
            : /* InputOperands */
                [R1] "r" (data1),
                [R2] "r" (data2)

        );
        return;
    /* GNURX 2018q1
      92 0010 EC 15                         MOV.L [r1], r5
      93 0012 06 A0 10 25                   XCHG [r2].L, r5
      94 0016 E3 15                         MOV.L r5, [r1]
      97 0018 02                            rts
    */
    }

     

Children
No Data