Other Parts Discussed in Thread: HALCOGEN
Crosspost from compiler forum
Hi!
Embedded abs function have unexpected behavior. When I call abs(some_big_int64-other_big_int64) I expect
1) Calculate difference
2) Strip int64 value to int
3) return abs value
But result is very strange. Abs function return NEGATIVE value! I thest this code on TMS570LS0914 using arm_15.12.3.LTS
static int abs_ (int x) {
if (x < 0) {
return -x;
}
return x;
}
int main() {
int64_t v1, v2, v3, v4, v5, v6, v7;
v1 = 0x7FFFFFFFUL;
v2 = v1 + 1;
v3 = abs (v2 - v1); //!!!!! v3=-1
v4 = v2 - v1;
v5 = abs (v4);
v6 = abs_ (v2 - v1);
v7 = abs_ (v4);
LOG_WARNING (SYS, "v1=%" PRId64 " 0x%" PRIX64, v1, v1); //v1=2147483647 0x7FFFFFFF
LOG_WARNING (SYS, "v2=%" PRId64 " 0x%" PRIX64, v2, v2); //v2=2147483648 0x80000000
LOG_WARNING (SYS, "v3=%" PRId64 " 0x%" PRIX64, v3, v3); //v3=-1 0xFFFFFFFFFFFFFFFF
LOG_WARNING (SYS, "v4=%" PRId64 " 0x%" PRIX64, v4, v4); //v4=1 0x1
LOG_WARNING (SYS, "v5=%" PRId64 " 0x%" PRIX64, v5, v5); //v5=1 0x1
LOG_WARNING (SYS, "v6=%" PRId64 " 0x%" PRIX64, v6, v6); //v6=1 0x1
LOG_WARNING (SYS, "v7=%" PRId64 " 0x%" PRIX64, v7, v7); //v7=1 0x1
}