SPARC用コードを書く…

Ludiaのメーリングリストで、以下のような要望が出ていた。
http://lists.sourceforge.jp/mailman/archives/ludia-users/2006-December/000011.html


SPARCかあ。
昔調べた結果が使えるぞウヒヒ…


一応、Monoでの実装を見てみる。

static inline gint32 InterlockedExchangeAdd(volatile gint32 *_dest, gint32 add)
{
       register volatile gint32 *dest asm("g1") = _dest;
       register gint32 tmp asm("o4");
       register gint32 ret asm("o5");

       __asm__ __volatile__(
               "1:     ld      [%%g1], %%o4\n\t"
               "       add     %%o4, %3, %%o5\n\t"
               /*      cas     [%%g1], %%o4, %%o5 */
               "       .word   0xdbe0500c\n\t"
               "       cmp     %%o4, %%o5\n\t"
               "       bne     1b\n\t"
               "        add    %%o5, %3, %%o5"
               : "=&r" (tmp), "=&r" (ret)
               : "r" (dest), "r" (add)
               : "memory", "cc");

        return ret;
}

…う〜ん、命令は想像つくが、その前のasm3つが謎だ。
そもそもgとoがよーわからん。gはgeneralかなあ。oはoutput?
SPARC仕様書を読めばいいんだけど、かなりメンドイ。


oは、getcontextの怪で出てきた
レジスタウィンドウからみだとは思うんだけど…
と思って検索したら、Wikipediaに案外詳しい説明が載っていた。ふむふむ、出力ね。


それより、Monoの実装でcas命令がバイナリで展開してあるのが気になる。gasが通さないのかな?それはヤだな…
実機がない環境で確認できないのがツラい。クロスコンパイルは大変だしな…