मैं हस्ताक्षरित संतृप्त 64 बिट अतिरिक्त के लिए कुछ सी कोड ढूंढ रहा हूं जो gcc अनुकूलक के साथ कुशल X86-64 कोड को संकलित करता है। पोर्टेबल कोड आदर्श होगा, हालांकि यदि आवश्यक हो तो एक एएसएम समाधान का उपयोग किया जा सकता है।64-बिट इनट्स के संतृप्त जोड़ पर हस्ताक्षर किए गए?
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;
}
लिखित कार्य कई शाखाओं के साथ काफी लंबा असेंबली आउटपुट उत्पन्न करता है। अनुकूलन पर कोई सुझाव? ऐसा लगता है कि इसे कुछ सीएमओवी निर्देशों के साथ केवल एक एडीडी के साथ कार्यान्वित किया जाना चाहिए, लेकिन मैं इस सामान के साथ थोड़ा सा जंगली हूं।
आपके मूल्यों के संकेत की गणना करने का आपका तरीका बहुत जटिल है, क्यों न केवल '(x <0) 'उदा? पोर्टेबल उपयोग 'u] int64_t' होने के लिए। फिर आपके पास 'INT64_MAX' और' INT64_MIN' निःशुल्क है और इसके लिए अपने स्वयं के स्थिरांक का उपयोग करने की आवश्यकता नहीं है। –
सी (एचडब्ल्यू) में बिटवाइड संतृप्त परिवर्धन के संभावित डुप्लिकेट (http://stackoverflow.com/questions/5277623/bitwise-saturated-addition-in-c-hw) – jxh
जीसीसी 128-बिट संख्याओं पर संचालन को अनुकूलित कर सकता है। कुछ क्लैंप ((int128_t) x + y, INT64_MIN, INT64_MAX) जैसे काम करने की कोशिश करें) और देखें कि यह स्वीकार्य है या नहीं। – zch