こんにちは。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.he2 studioインストールフォルダ\internal\projectgen\rx\Generate\CCRXConversion\inc\CCRXmachine.c
こんにちは。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*/}