9
9
//! [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
10
10
11
11
use crate :: {
12
- core_arch:: { simd:: * , simd_llvm :: * , x86:: * } ,
12
+ core_arch:: { simd:: * , x86:: * } ,
13
13
mem:: transmute,
14
14
} ;
15
15
@@ -31,7 +31,7 @@ pub unsafe fn _mm_setzero_si64() -> __m64 {
31
31
#[ target_feature( enable = "mmx" ) ]
32
32
#[ cfg_attr( test, assert_instr( paddb) ) ]
33
33
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)
35
35
}
36
36
37
37
/// Adds packed 8-bit integers in `a` and `b`.
@@ -47,7 +47,7 @@ pub unsafe fn _m_paddb(a: __m64, b: __m64) -> __m64 {
47
47
#[ target_feature( enable = "mmx" ) ]
48
48
#[ cfg_attr( test, assert_instr( paddw) ) ]
49
49
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)
51
51
}
52
52
53
53
/// Adds packed 16-bit integers in `a` and `b`.
@@ -63,7 +63,7 @@ pub unsafe fn _m_paddw(a: __m64, b: __m64) -> __m64 {
63
63
#[ target_feature( enable = "mmx" ) ]
64
64
#[ cfg_attr( test, assert_instr( paddd) ) ]
65
65
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)
67
67
}
68
68
69
69
/// Adds packed 32-bit integers in `a` and `b`.
@@ -79,7 +79,7 @@ pub unsafe fn _m_paddd(a: __m64, b: __m64) -> __m64 {
79
79
#[ target_feature( enable = "mmx" ) ]
80
80
#[ cfg_attr( test, assert_instr( paddsb) ) ]
81
81
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)
83
83
}
84
84
85
85
/// 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 {
95
95
#[ target_feature( enable = "mmx" ) ]
96
96
#[ cfg_attr( test, assert_instr( paddsw) ) ]
97
97
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)
99
99
}
100
100
101
101
/// 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 {
111
111
#[ target_feature( enable = "mmx" ) ]
112
112
#[ cfg_attr( test, assert_instr( paddusb) ) ]
113
113
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)
115
115
}
116
116
117
117
/// 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 {
127
127
#[ target_feature( enable = "mmx" ) ]
128
128
#[ cfg_attr( test, assert_instr( paddusw) ) ]
129
129
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)
131
131
}
132
132
133
133
/// 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 {
143
143
#[ target_feature( enable = "mmx" ) ]
144
144
#[ cfg_attr( test, assert_instr( psubb) ) ]
145
145
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)
147
147
}
148
148
149
149
/// 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 {
159
159
#[ target_feature( enable = "mmx" ) ]
160
160
#[ cfg_attr( test, assert_instr( psubw) ) ]
161
161
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)
163
163
}
164
164
165
165
/// 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 {
175
175
#[ target_feature( enable = "mmx" ) ]
176
176
#[ cfg_attr( test, assert_instr( psubd) ) ]
177
177
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)
179
179
}
180
180
181
181
/// 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 {
192
192
#[ target_feature( enable = "mmx" ) ]
193
193
#[ cfg_attr( test, assert_instr( psubsb) ) ]
194
194
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)
196
196
}
197
197
198
198
/// 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 {
210
210
#[ target_feature( enable = "mmx" ) ]
211
211
#[ cfg_attr( test, assert_instr( psubsw) ) ]
212
212
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)
214
214
}
215
215
216
216
/// 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 {
228
228
#[ target_feature( enable = "mmx" ) ]
229
229
#[ cfg_attr( test, assert_instr( psubusb) ) ]
230
230
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)
232
232
}
233
233
234
234
/// 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 {
246
246
#[ target_feature( enable = "mmx" ) ]
247
247
#[ cfg_attr( test, assert_instr( psubusw) ) ]
248
248
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)
250
250
}
251
251
252
252
/// Subtract packed unsigned 16-bit integers in `b` from packed unsigned
@@ -475,6 +475,34 @@ pub unsafe fn _mm_cvtsi64_si32(a: __m64) -> i32 {
475
475
476
476
#[ allow( improper_ctypes) ]
477
477
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 ;
478
506
#[ link_name = "llvm.x86.mmx.packsswb" ]
479
507
fn packsswb ( a : __m64 , b : __m64 ) -> __m64 ;
480
508
#[ link_name = "llvm.x86.mmx.packssdw" ]
0 commit comments