Skip to content

Commit 94f19a6

Browse files
bjorn3gnzlbg
authored andcommitted
Use simd_* in x86/mmx.rs where possible
1 parent 416095b commit 94f19a6

File tree

2 files changed

+58
-43
lines changed

2 files changed

+58
-43
lines changed

crates/core_arch/src/x86/mmx.rs

Lines changed: 15 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
//! [intel64_ref]: http://www.intel.de/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-instruction-set-reference-manual-325383.pdf
1010
1111
use crate::{
12-
core_arch::{simd::*, x86::*},
12+
core_arch::{simd::*, simd_llvm::*, x86::*},
1313
mem::transmute,
1414
};
1515

@@ -31,7 +31,7 @@ pub unsafe fn _mm_setzero_si64() -> __m64 {
3131
#[target_feature(enable = "mmx")]
3232
#[cfg_attr(test, assert_instr(paddb))]
3333
pub unsafe fn _mm_add_pi8(a: __m64, b: __m64) -> __m64 {
34-
paddb(a, b)
34+
transmute(simd_add(a.as_i8x8(), b.as_i8x8()))
3535
}
3636

3737
/// Adds packed 8-bit integers in `a` and `b`.
@@ -47,7 +47,7 @@ pub unsafe fn _m_paddb(a: __m64, b: __m64) -> __m64 {
4747
#[target_feature(enable = "mmx")]
4848
#[cfg_attr(test, assert_instr(paddw))]
4949
pub unsafe fn _mm_add_pi16(a: __m64, b: __m64) -> __m64 {
50-
paddw(a, b)
50+
transmute(simd_add(a.as_i16x4(), b.as_i16x4()))
5151
}
5252

5353
/// Adds packed 16-bit integers in `a` and `b`.
@@ -63,7 +63,7 @@ pub unsafe fn _m_paddw(a: __m64, b: __m64) -> __m64 {
6363
#[target_feature(enable = "mmx")]
6464
#[cfg_attr(test, assert_instr(paddd))]
6565
pub unsafe fn _mm_add_pi32(a: __m64, b: __m64) -> __m64 {
66-
paddd(a, b)
66+
transmute(simd_add(a.as_i32x2(), b.as_i32x2()))
6767
}
6868

6969
/// Adds packed 32-bit integers in `a` and `b`.
@@ -79,7 +79,7 @@ pub unsafe fn _m_paddd(a: __m64, b: __m64) -> __m64 {
7979
#[target_feature(enable = "mmx")]
8080
#[cfg_attr(test, assert_instr(paddsb))]
8181
pub unsafe fn _mm_adds_pi8(a: __m64, b: __m64) -> __m64 {
82-
paddsb(a, b)
82+
transmute(simd_saturating_add(a.as_i8x8(), b.as_i8x8()))
8383
}
8484

8585
/// Adds packed 8-bit integers in `a` and `b` using saturation.
@@ -95,7 +95,7 @@ pub unsafe fn _m_paddsb(a: __m64, b: __m64) -> __m64 {
9595
#[target_feature(enable = "mmx")]
9696
#[cfg_attr(test, assert_instr(paddsw))]
9797
pub unsafe fn _mm_adds_pi16(a: __m64, b: __m64) -> __m64 {
98-
paddsw(a, b)
98+
transmute(simd_saturating_add(a.as_i16x4(), b.as_i16x4()))
9999
}
100100

101101
/// Adds packed 16-bit integers in `a` and `b` using saturation.
@@ -111,7 +111,7 @@ pub unsafe fn _m_paddsw(a: __m64, b: __m64) -> __m64 {
111111
#[target_feature(enable = "mmx")]
112112
#[cfg_attr(test, assert_instr(paddusb))]
113113
pub unsafe fn _mm_adds_pu8(a: __m64, b: __m64) -> __m64 {
114-
paddusb(a, b)
114+
transmute(simd_saturating_add(a.as_u8x8(), b.as_u8x8()))
115115
}
116116

117117
/// Adds packed unsigned 8-bit integers in `a` and `b` using saturation.
@@ -127,7 +127,7 @@ pub unsafe fn _m_paddusb(a: __m64, b: __m64) -> __m64 {
127127
#[target_feature(enable = "mmx")]
128128
#[cfg_attr(test, assert_instr(paddusw))]
129129
pub unsafe fn _mm_adds_pu16(a: __m64, b: __m64) -> __m64 {
130-
paddusw(a, b)
130+
transmute(simd_saturating_add(a.as_u16x4(), b.as_u16x4()))
131131
}
132132

133133
/// Adds packed unsigned 16-bit integers in `a` and `b` using saturation.
@@ -143,7 +143,7 @@ pub unsafe fn _m_paddusw(a: __m64, b: __m64) -> __m64 {
143143
#[target_feature(enable = "mmx")]
144144
#[cfg_attr(test, assert_instr(psubb))]
145145
pub unsafe fn _mm_sub_pi8(a: __m64, b: __m64) -> __m64 {
146-
psubb(a, b)
146+
transmute(simd_sub(a.as_i8x8(), b.as_i8x8()))
147147
}
148148

149149
/// Subtract packed 8-bit integers in `b` from packed 8-bit integers in `a`.
@@ -159,7 +159,7 @@ pub unsafe fn _m_psubb(a: __m64, b: __m64) -> __m64 {
159159
#[target_feature(enable = "mmx")]
160160
#[cfg_attr(test, assert_instr(psubw))]
161161
pub unsafe fn _mm_sub_pi16(a: __m64, b: __m64) -> __m64 {
162-
psubw(a, b)
162+
transmute(simd_sub(a.as_i16x4(), b.as_i16x4()))
163163
}
164164

165165
/// Subtract packed 16-bit integers in `b` from packed 16-bit integers in `a`.
@@ -175,7 +175,7 @@ pub unsafe fn _m_psubw(a: __m64, b: __m64) -> __m64 {
175175
#[target_feature(enable = "mmx")]
176176
#[cfg_attr(test, assert_instr(psubd))]
177177
pub unsafe fn _mm_sub_pi32(a: __m64, b: __m64) -> __m64 {
178-
psubd(a, b)
178+
transmute(simd_sub(a.as_i32x2(), b.as_i32x2()))
179179
}
180180

181181
/// Subtract packed 32-bit integers in `b` from packed 32-bit integers in `a`.
@@ -192,7 +192,7 @@ pub unsafe fn _m_psubd(a: __m64, b: __m64) -> __m64 {
192192
#[target_feature(enable = "mmx")]
193193
#[cfg_attr(test, assert_instr(psubsb))]
194194
pub unsafe fn _mm_subs_pi8(a: __m64, b: __m64) -> __m64 {
195-
psubsb(a, b)
195+
transmute(simd_saturating_sub(a.as_i8x8(), b.as_i8x8()))
196196
}
197197

198198
/// Subtract packed 8-bit integers in `b` from packed 8-bit integers in `a`
@@ -210,7 +210,7 @@ pub unsafe fn _m_psubsb(a: __m64, b: __m64) -> __m64 {
210210
#[target_feature(enable = "mmx")]
211211
#[cfg_attr(test, assert_instr(psubsw))]
212212
pub unsafe fn _mm_subs_pi16(a: __m64, b: __m64) -> __m64 {
213-
psubsw(a, b)
213+
transmute(simd_saturating_sub(a.as_i16x4(), b.as_i16x4()))
214214
}
215215

216216
/// Subtract packed 16-bit integers in `b` from packed 16-bit integers in `a`
@@ -228,7 +228,7 @@ pub unsafe fn _m_psubsw(a: __m64, b: __m64) -> __m64 {
228228
#[target_feature(enable = "mmx")]
229229
#[cfg_attr(test, assert_instr(psubusb))]
230230
pub unsafe fn _mm_subs_pu8(a: __m64, b: __m64) -> __m64 {
231-
psubusb(a, b)
231+
transmute(simd_saturating_sub(a.as_u8x8(), b.as_u8x8()))
232232
}
233233

234234
/// Subtract packed unsigned 8-bit integers in `b` from packed unsigned 8-bit
@@ -246,7 +246,7 @@ pub unsafe fn _m_psubusb(a: __m64, b: __m64) -> __m64 {
246246
#[target_feature(enable = "mmx")]
247247
#[cfg_attr(test, assert_instr(psubusw))]
248248
pub unsafe fn _mm_subs_pu16(a: __m64, b: __m64) -> __m64 {
249-
psubusw(a, b)
249+
transmute(simd_saturating_sub(a.as_u16x4(), b.as_u16x4()))
250250
}
251251

252252
/// Subtract packed unsigned 16-bit integers in `b` from packed unsigned
@@ -475,34 +475,6 @@ pub unsafe fn _mm_cvtsi64_si32(a: __m64) -> i32 {
475475

476476
#[allow(improper_ctypes)]
477477
extern "C" {
478-
#[link_name = "llvm.x86.mmx.padd.b"]
479-
fn paddb(a: __m64, b: __m64) -> __m64;
480-
#[link_name = "llvm.x86.mmx.padd.w"]
481-
fn paddw(a: __m64, b: __m64) -> __m64;
482-
#[link_name = "llvm.x86.mmx.padd.d"]
483-
fn paddd(a: __m64, b: __m64) -> __m64;
484-
#[link_name = "llvm.x86.mmx.padds.b"]
485-
fn paddsb(a: __m64, b: __m64) -> __m64;
486-
#[link_name = "llvm.x86.mmx.padds.w"]
487-
fn paddsw(a: __m64, b: __m64) -> __m64;
488-
#[link_name = "llvm.x86.mmx.paddus.b"]
489-
fn paddusb(a: __m64, b: __m64) -> __m64;
490-
#[link_name = "llvm.x86.mmx.paddus.w"]
491-
fn paddusw(a: __m64, b: __m64) -> __m64;
492-
#[link_name = "llvm.x86.mmx.psub.b"]
493-
fn psubb(a: __m64, b: __m64) -> __m64;
494-
#[link_name = "llvm.x86.mmx.psub.w"]
495-
fn psubw(a: __m64, b: __m64) -> __m64;
496-
#[link_name = "llvm.x86.mmx.psub.d"]
497-
fn psubd(a: __m64, b: __m64) -> __m64;
498-
#[link_name = "llvm.x86.mmx.psubs.b"]
499-
fn psubsb(a: __m64, b: __m64) -> __m64;
500-
#[link_name = "llvm.x86.mmx.psubs.w"]
501-
fn psubsw(a: __m64, b: __m64) -> __m64;
502-
#[link_name = "llvm.x86.mmx.psubus.b"]
503-
fn psubusb(a: __m64, b: __m64) -> __m64;
504-
#[link_name = "llvm.x86.mmx.psubus.w"]
505-
fn psubusw(a: __m64, b: __m64) -> __m64;
506478
#[link_name = "llvm.x86.mmx.packsswb"]
507479
fn packsswb(a: __m64, b: __m64) -> __m64;
508480
#[link_name = "llvm.x86.mmx.packssdw"]

crates/core_arch/src/x86/mod.rs

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -351,6 +351,49 @@ mod test;
351351
#[cfg(test)]
352352
pub use self::test::*;
353353

354+
#[allow(non_camel_case_types)]
355+
#[unstable(feature = "stdimd_internal", issue = "0")]
356+
pub(crate) trait m64Ext: Sized {
357+
fn as_m64(self) -> __m64;
358+
359+
#[inline]
360+
fn as_u8x8(self) -> crate::core_arch::simd::u8x8 {
361+
unsafe { transmute(self.as_m64()) }
362+
}
363+
364+
#[inline]
365+
fn as_u16x4(self) -> crate::core_arch::simd::u16x4 {
366+
unsafe { transmute(self.as_m64()) }
367+
}
368+
369+
#[inline]
370+
fn as_u32x2(self) -> crate::core_arch::simd::u32x2 {
371+
unsafe { transmute(self.as_m64()) }
372+
}
373+
374+
#[inline]
375+
fn as_i8x8(self) -> crate::core_arch::simd::i8x8 {
376+
unsafe { transmute(self.as_m64()) }
377+
}
378+
379+
#[inline]
380+
fn as_i16x4(self) -> crate::core_arch::simd::i16x4 {
381+
unsafe { transmute(self.as_m64()) }
382+
}
383+
384+
#[inline]
385+
fn as_i32x2(self) -> crate::core_arch::simd::i32x2 {
386+
unsafe { transmute(self.as_m64()) }
387+
}
388+
}
389+
390+
impl m64Ext for __m64 {
391+
#[inline]
392+
fn as_m64(self) -> Self {
393+
self
394+
}
395+
}
396+
354397
#[allow(non_camel_case_types)]
355398
#[unstable(feature = "stdimd_internal", issue = "0")]
356399
pub(crate) trait m128iExt: Sized {

0 commit comments

Comments
 (0)