gcc オプティマイザーを使用して効率的な x86-64 コードにコンパイルする、符号付き飽和 64 ビット加算用の C コードを探しています。移植可能なコードが理想的ですが、必要に応じて asm ソリューションを使用することもできます。
static const int64 kint64max = 0x7fffffffffffffffll;
static const int64 kint64min = 0x8000000000000000ll;
int64 signed_saturated_add(int64 x, int64 y) {
bool x_is_negative = (x & kint64min) != 0;
bool y_is_negative = (y & kint64min) != 0;
int64 sum = x+y;
bool sum_is_negative = (sum & kint64min) != 0;
if (x_is_negative != y_is_negative) return sum; // can't overflow
if (x_is_negative && !sum_is_negative) return kint64min;
if (!x_is_negative && sum_is_negative) return kint64max;
return sum;
}
書かれている関数は、いくつかの分岐を持つかなり長いアセンブリ出力を生成します。最適化に関するヒントはありますか? ADD
いくつかの指示だけで実装できるはずCMOV
ですが、私はこのようなものに少し慣れていません。