1pub const fn mmx_p_add_b(a: u64, b: u64) -> u64 {
5 let mut mask = 0xFF;
6 let mut r = ((a & mask).wrapping_add(b & mask)) & mask; mask <<= 8;
8 r |= ((a & mask).wrapping_add(b & mask)) & mask; mask <<= 8;
10 r |= ((a & mask).wrapping_add(b & mask)) & mask; mask <<= 8;
12 r |= ((a & mask).wrapping_add(b & mask)) & mask; mask <<= 8;
14 r |= ((a & mask).wrapping_add(b & mask)) & mask; mask <<= 8;
16 r |= ((a & mask).wrapping_add(b & mask)) & mask; mask <<= 8;
18 r |= ((a & mask).wrapping_add(b & mask)) & mask; mask <<= 8;
20 r |= ((a & mask).wrapping_add(b & mask)) & mask; r
22}
23
24pub const fn mmx_p_add_d(a: u64, b: u64) -> u64 {
26 let mut mask = 0xffffffff;
27 let r = ((a & mask).wrapping_add(b & mask)) & mask;
28 mask <<= 32;
29 r | ((a & mask).wrapping_add(b & mask)) & mask
30}
31
32pub const fn mmx_p_add_w(a: u64, b: u64) -> u64 {
34 let mut mask = 0xFFFF;
35 let mut r = ((a & mask).wrapping_add(b & mask)) & mask;
36 mask <<= 16;
37 r |= ((a & mask).wrapping_add(b & mask)) & mask;
38 mask <<= 16;
39 r |= ((a & mask).wrapping_add(b & mask)) & mask;
40 mask <<= 16;
41 r |= ((a & mask).wrapping_add(b & mask)) & mask;
42 r
43}
44
45pub const fn mmx_p_sll_d(a: u64, mut count: u32) -> u64 {
47 count &= 0x1F;
48 let mut mask = (0xFFFFFFFFu32 << count) as u64;
49 mask |= mask << 32;
50 (a << count) & mask
51}
52
53pub const fn mmx_p_srl_d(a: u64, mut count: u32) -> u64 {
55 count &= 0x1F;
56 let mut mask = (0xFFFFFFFFu32 >> count) as u64;
57 mask |= mask << 32;
58 (a >> count) & mask
59}
60
61pub const fn mmx_punpckldq(a: u64, b: u64) -> u64 {
63 (a & 0xFFFFFFFF) | (b & 0xFFFFFFFF) << 32
64}
65
66pub const fn mmx_punpckldq2(a: u64) -> u64 {
68 mmx_punpckldq(a, a)
69}
70
71#[test]
72fn test_mmx() {
73 assert_eq!(mmx_punpckldq(0x1, 0x2), 0x200000001);
74}