インラインアセンブラで質問

typedef float MATRIX[4][4];
inline void foo(MATRIX& mat) {
 asm volatile("ここで mat に書き込む" :: "r"(&mat));
 // ここで mat 読み出す
}

こういうコードを書くと、gcc がインラインアセンブラで mat を書き換えたことに気づ
かず、レジスタに残ってる mat[4][4] の要素を再利用することがある。明示的に
mat 書き換えたよ、と宣言したいんだけどどうしたらいい?

いちおう解決方法は見つけたんだが、どっちもイマイチなんで。

1. clobbered registeres に "memory" と書く
 これだと mat に限らず、すべてのレジスタをいったん破棄してしまうから、効率が
 イマイチ…。
2. inline にしない
 これも効率の面から避けたい