5 ms·
> Does it auto-vectorise it if you also do the operation on the a's? Good point. Combined with fixing my loop increment (that jcranmer made me realize was wron
by abainbridge 8y ago
> Does it auto-vectorise it if you also do the operation on the a's?
Good point. Combined with fixing my loop increment (that jcranmer made me realize was wrong), I now get some vectory goodness: https://godbolt.org/z/yTJzKH https://godbolt.org/z/yTJzKH
No idea what it all means. It'll be interesting to benchmark.
- wmu 8y agoThe code is not optimal, because there are implicit conversions to int (32-bit values) which are quite expansive. There should be explicit casts to uint16_t, like this: dest.r = uint16_t(uint16_t(dest.r * invAlpha) + uint16_t(c.r * c.a)) >> 8;
- abainbridge 8y agoAdding a single uint16_t cast like this: dest.r = uint16_t(dest.r * invAlpha + c.r * c.a) >> 8; Seems to get all of the benefit. The result is 34 instructions in the loop. (Was 38). Amazingly, switching from gcc 8.2 to gcc trunk, reduces the instructions in the loop to 18. See https://godbolt.org/z/sEvz2w https://godbolt.org/z/sEvz2w