http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54236
--- Comment #7 from Oleg Endo <olegendo at gcc dot gnu.org> --- (In reply to Oleg Endo from comment #6) > Created attachment 31144 [details] > stitching addc insns > > The attached patch is an example that shows how widening additions can be > stitched together. One application would be arithmetic on user defined > integer types with an arbitrary number of bits. > For example (requires c++11): > > template <unsigned int Bits> class integer > { > public: > typedef unsigned int word_type; > typedef unsigned long long ext_word_type; > > static constexpr unsigned int bit_count = Bits; > static constexpr unsigned int word_bit_count = sizeof (word_type) * 8; > static constexpr unsigned int word_count = (bit_count + word_bit_count - 1) > / word_bit_count; > > private: > word_type word[word_count]; > > public: > friend integer > operator + (const integer& a, const integer& b) > { > integer result; > > word_type carry = 0; > for (unsigned int i = 0; i < word_count; ++i) > { > auto sum = (ext_word_type)a.word[i] + (ext_word_type)b.word[i] + carry; > result.word[i] = (word_type)sum; > carry = (sum >> word_bit_count) == 0 ? 0 : 1; > } > > return result; > } > }; > I forgot to mention that the patch works only if the type of the carry variable is 'unsigned int' or 'unsigned long long'. If a signed or boolean type is used some weird things seem to happen and there are some sign extensions somewhere around the T bit.