https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89081
Andrew Pinski <pinskia at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Component|target |middle-end
Severity|normal |enhancement
--- Comment #3 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
This is better:
xorl %eax, %eax
testq %rdi, %rdi
cmovle %rdi, %rax
negq %rax
Or:
movq %rdi, %rax
sarq $63, %rax
andq %rdi, %rax
negq %rax
That is -MIN<x,0> but MAX<-x,0> gives the best:
negq %rdi
movl $0, %eax
cmovns %rdi, %rax
That is all three of these functions should give the same code gen:
#include <stdint.h>
uint64_t clamp1(int64_t x) {
return -((x < 0) ? x : 0);
}
uint64_t clamp3(int64_t x) {
x = -x;
return ((x > 0) ? x : 0);
}
uint64_t clamp2(int64_t x) {
return ((x < 0) ? -x : 0);
}