pub const fn mmx_p_add_b(a: u64, b: u64) -> u64 {
let mut mask = 0xFF;
let mut r = ((a & mask).wrapping_add(b & mask)) & mask; mask <<= 8;
r |= ((a & mask).wrapping_add(b & mask)) & mask; mask <<= 8;
r |= ((a & mask).wrapping_add(b & mask)) & mask; mask <<= 8;
r |= ((a & mask).wrapping_add(b & mask)) & mask; mask <<= 8;
r |= ((a & mask).wrapping_add(b & mask)) & mask; mask <<= 8;
r |= ((a & mask).wrapping_add(b & mask)) & mask; mask <<= 8;
r |= ((a & mask).wrapping_add(b & mask)) & mask; mask <<= 8;
r |= ((a & mask).wrapping_add(b & mask)) & mask; r
}
pub const fn mmx_p_add_d(a: u64, b: u64) -> u64 {
let mut mask = 0xffffffff;
let r = ((a & mask).wrapping_add(b & mask)) & mask;
mask <<= 32;
r | ((a & mask).wrapping_add(b & mask)) & mask
}
pub const fn mmx_p_add_w(a: u64, b: u64) -> u64 {
let mut mask = 0xFFFF;
let mut r = ((a & mask).wrapping_add(b & mask)) & mask;
mask <<= 16;
r |= ((a & mask).wrapping_add(b & mask)) & mask;
mask <<= 16;
r |= ((a & mask).wrapping_add(b & mask)) & mask;
mask <<= 16;
r |= ((a & mask).wrapping_add(b & mask)) & mask;
r
}
pub const fn mmx_p_sll_d(a: u64, mut count: u32) -> u64 {
count &= 0x1F;
let mut mask = (0xFFFFFFFFu32 << count) as u64;
mask |= mask << 32;
(a << count) & mask
}
pub const fn mmx_p_srl_d(a: u64, mut count: u32) -> u64 {
count &= 0x1F;
let mut mask = (0xFFFFFFFFu32 >> count) as u64;
mask |= mask << 32;
(a >> count) & mask
}
pub const fn mmx_punpckldq(a: u64, b: u64) -> u64 {
(a & 0xFFFFFFFF) | (b & 0xFFFFFFFF) << 32
}
pub const fn mmx_punpckldq2(a: u64) -> u64 {
mmx_punpckldq(a, a)
}
#[test]
fn test_mmx() {
assert_eq!(mmx_punpckldq(0x1, 0x2), 0x200000001);
}