https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68804
Bug ID: 68804
Summary: Code generated by _addcarry_u64 is wrong in O3 mode
Product: gcc
Version: 5.2.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: target
Assignee: unassigned at gcc dot gnu.org
Reporter: furyusss at yahoo dot fr
Target Milestone: ---
When compiled with -O3, the following code generates incorrect assembly code on
my machine:
int main()
{
unsigned long long r;
_addcarry_u64(0, 0, 9872702152712425062ull, &r);
unsigned long long test_h = 8574040432038206621ull + r;
unsigned long long h = (test_h << 8) | (218ull);
unsigned long long p;
_addcarry_u64(1, h, 258554859004771ull, &p);
if (p == 18446621455085053758ull)
{
std::cout << "OK!";
}
else
{
std::cout << "KO!";
}
return 0;
}
In the second _addcarry_u64, the 1 input is ignored and the result is
18446621455085053757ull.
Replacing the first _addcarry_u64 by r = 9872702152712425062ull gives the
correct result.