SPARC用コードを書く…
Ludiaのメーリングリストで、以下のような要望が出ていた。
http://lists.sourceforge.jp/mailman/archives/ludia-users/2006-December/000011.html
一応、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が通さないのかな?それはヤだな…
実機がない環境で確認できないのがツラい。クロスコンパイルは大変だしな…