Finding the Maximum of Four Integers
2018-02-26Inspired by an analysis of the source code of Rogue, I decided to find out how modern compilers encode selecting the maximum of four integers.
int max(int a, int b, int c, int d) {
return a > b ? (a > c ? (a > d ? a : d) : (c > d ? c : d))
: (b > c ? (b > d ? b : d) : (c > d ? c : d));
}
It is important to note that this is isolated code generation and a modern compiler could probably do better if more context was available.
Using Clang 5.0, I get the following (with optimizations enabled, of course).
0: 39 f7 cmp edi, esi
2: 0f 4d f7 cmovge esi, edi
5: 39 d6 cmp esi, edx
7: 0f 4c f2 cmovl esi, edx
a: 39 ce cmp esi, ecx
c: 0f 4c f1 cmovl esi, ecx
f: 89 f0 mov eax, esi
11: c3 ret
I will rename the code according to the calling convention used here.
a -> edi
b -> esi
c -> edx
d -> ecx
The result follows with some comments on what the code is doing.
cmp a, b
cmovge b, a # If a >= b, assign a to b.
# Now b has max(a, b).
cmp b, c
cmovl b, c # If max(a, b) < c, assign c to b.
# Now b has max(max(a, b), c).
cmp b, d
cmovl b, d # If max(max(a, b), c) < d, assign d to b.
# Now b has max(max(max(a, b), c), d).
mov eax, b # Return b through eax.
ret
I don’t think it can be done in less code than this.
As one might expect, using C++ and std::max, we get almost identical x86.