[all-commits] [llvm/llvm-project] 586952: Optimize std::midpoint for integers

Jorg Brown via All-commits all-commits at lists.llvm.org
Mon Nov 4 19:26:29 PST 2019


  Branch: refs/heads/master
  Home:   https://github.com/llvm/llvm-project
  Commit: 586952f4cefd809b7becd16c6d1e751ea923adfd
      https://github.com/llvm/llvm-project/commit/586952f4cefd809b7becd16c6d1e751ea923adfd
  Author: Jorg Brown <jorg at google.com>
  Date:   2019-11-04 (Mon, 04 Nov 2019)

  Changed paths:
    M libcxx/include/numeric

  Log Message:
  -----------
  Optimize std::midpoint for integers

Same idea as the current algorithm, that is, add (half of the difference between a and b) to a.

But we use a different technique for computing the difference: we compute b - a into a pair of integers that are named "sign_bit" and "diff". We have to use a pair because subtracting two 32-bit integers produces a 33-bit result.

Computing half of that is a simple matter of shifting diff right by 1, and adding sign_bit shifted left by 31. llvm knows how to do that with one instruction: shld.

The only tricky part is that if the difference is odd and negative, then shifting it by one isn't the same as dividing it by two - shifting a negative one produces a negative one, for example. So there's one more adjustment: if the sign bit and the low bit of diff are one, we add one.

For a demonstration of the codegen difference, see https://godbolt.org/z/7ar3K9 , which also has a built-in test.

Differential Revision: https://reviews.llvm.org/D69459




More information about the All-commits mailing list