3 ms·
However, for -O3 on ARMv8, LLVM generates pretty good if slightly inscrutable code [1]: rec: // @rec bic w0,
by CalChris 6y ago
However, for -O3 on ARMv8, LLVM generates pretty good if slightly inscrutable code [1]:
rec: // @rec
bic w0, w0, w0, asr #31
ret
That's taking the sign bit, replicating it to 32b and then using it as a not'd mask.
negative numbers:
w0, asr #31 => -1
bic w0, w0, -1 => and w0, w0, 0 => ret 0
positive numbers:
w0, asr #31 => 0
bic w0, w0, 0 => and w0, w0, 0xffffffff => ret w0
gcc is also pretty good [2]:
rec:
cmp w0, 0
csel w0, w0, wzr, gt
ret
[1] https://godbolt.org/z/q9hM7z https://godbolt.org/z/q9hM7z
[2] https://godbolt.org/z/6rbE5e https://godbolt.org/z/6rbE5e