Skip to content

Commit b51ba3f

Browse files
bjorn3gnzlbg
authored andcommitted
Revert mmx changes
On i586 the simd_* intrinsics don't compile to MMX instructions, even with `#[target_feature(enable = "mmx")]`.
1 parent 14575e9 commit b51ba3f

File tree

1 file changed

+43
-15
lines changed
  • crates/core_arch/src/x86

1 file changed

+43
-15
lines changed

crates/core_arch/src/x86/mmx.rs

+43-15
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::*, simd_llvm::*, x86::*},
12+
core_arch::{simd::*, 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-
transmute(simd_add(a.as_i8x8(), b.as_i8x8()))
34+
paddb(a, b)
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-
transmute(simd_add(a.as_i16x4(), b.as_i16x4()))
50+
paddw(a, b)
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-
transmute(simd_add(a.as_i32x2(), b.as_i32x2()))
66+
paddd(a, b)
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-
transmute(simd_saturating_add(a.as_i8x8(), b.as_i8x8()))
82+
paddsb(a, b)
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-
transmute(simd_saturating_add(a.as_i16x4(), b.as_i16x4()))
98+
paddsw(a, b)
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-
transmute(simd_saturating_add(a.as_u8x8(), b.as_u8x8()))
114+
paddusb(a, b)
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-
transmute(simd_saturating_add(a.as_u16x4(), b.as_u16x4()))
130+
paddusw(a, b)
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-
transmute(simd_sub(a.as_i8x8(), b.as_i8x8()))
146+
psubb(a, b)
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-
transmute(simd_sub(a.as_i16x4(), b.as_i16x4()))
162+
psubw(a, b)
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-
transmute(simd_sub(a.as_i32x2(), b.as_i32x2()))
178+
psubd(a, b)
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-
transmute(simd_saturating_sub(a.as_i8x8(), b.as_i8x8()))
195+
psubsb(a, b)
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-
transmute(simd_saturating_sub(a.as_i16x4(), b.as_i16x4()))
213+
psubsw(a, b)
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-
transmute(simd_saturating_sub(a.as_u8x8(), b.as_u8x8()))
231+
psubusb(a, b)
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-
transmute(simd_saturating_sub(a.as_u16x4(), b.as_u16x4()))
249+
psubusw(a, b)
250250
}
251251

252252
/// Subtract packed unsigned 16-bit integers in `b` from packed unsigned
@@ -475,6 +475,34 @@ 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;
478506
#[link_name = "llvm.x86.mmx.packsswb"]
479507
fn packsswb(a: __m64, b: __m64) -> __m64;
480508
#[link_name = "llvm.x86.mmx.packssdw"]

0 commit comments

Comments
 (0)