Use SHLD/SHRD instruction when performing double shift pattern combine for any unsigned integer type.
template<typename T, typename SH>
T shld(T x, T, y, SH bits) {
return (x << bits) | ( y >> (sizeof(T) *8- bits))
}
T - any of unsigned integer type
SH - any of signed or unsigned integer type
Most of these tests should probably be in shift-double.ll (tested on 32 and 64bit targets) and just the 2*i64 cases kept here in shift-double-x86_64.ll