std::min(max, std::max(min, v));
maxsd xmm0, xmm1
minsd xmm0, xmm2
std::min(std::max(v, min), max); maxsd xmm1, xmm0
minsd xmm2, xmm1
movapd xmm0, xmm2
For min/max on x86 if any operand is NaN the instruction copies the second operand into the first. So the compiler can't reorder the second case to look like the first (to leave the result in xmm0 for the return value).The reason for this NaN behavior is that minsd is implemented to look like `(a < b) ? a : b`, where if any of a or b is NaN the condition is false, and the expression evaluates to b.
Possibly std::clamp has the comparisons ordered like the second case?