packusqd (saturated clamp from unsigned long long to unsigned long),
packssqud (saturated clamp from signed long long to unsigned long):
There is a condition for unsigned long long inputs, range is “only” [0x0000000000000000, 0x7FFFFFFFFFFF].
There is a no condition for signed long long inputs.
// from-scratch, no helper available
/* -1 */
pcmpeqd mm6, mm6
/* x >> 32 > -1 */
movq mm4, mmc0
movq mm5, mm2
/* no psraq/pshufd/pshufw available,
* duplicate ((x >> 32) | x) */
punpckhdq mm4, mmc0
punpckhdq mm5, mm2
pcmpgtd mm4, mm6
pcmpgtd mm5, mm6
pand mmc0, mm4
pand mm2, mm5
/* 0 */
pxor mm7, mm7
/* x >> 32 == 0 */
movq mm4, mmc0
movq mm5, mm2
/* no psraq/pshufd/pshufw available,
* duplicate ((x >> 32) | x) */
punpckhdq mm4, mmc0
punpckhdq mm5, mm2
pcmpeqd mm4, mm7
pcmpeqd mm5, mm7
pand mmc0, mm4
pand mm2, mm5
/* 0xFFFFFFFF */
pandn mm4, mm6
pandn mm5, mm6
por mmc0, mm4
por mm2, mm5
punpckldq mmc0, mm2