1
1
//! Utilities used in testing the x86 intrinsics
2
2
3
3
use crate :: core_arch:: x86:: * ;
4
+ use std:: mem:: transmute;
4
5
5
6
#[ target_feature( enable = "sse2" ) ]
6
7
pub unsafe fn assert_eq_m128i ( a : __m128i , b : __m128i ) {
7
- union A {
8
- a : __m128i ,
9
- b : [ u64 ; 2 ] ,
10
- }
11
- assert_eq ! ( A { a } . b, A { a: b } . b)
8
+ assert_eq ! ( transmute:: <_, [ u64 ; 2 ] >( a) , transmute:: <_, [ u64 ; 2 ] >( b) )
12
9
}
13
10
14
11
#[ target_feature( enable = "sse2" ) ]
@@ -20,11 +17,7 @@ pub unsafe fn assert_eq_m128d(a: __m128d, b: __m128d) {
20
17
21
18
#[ target_feature( enable = "sse2" ) ]
22
19
pub unsafe fn get_m128d ( a : __m128d , idx : usize ) -> f64 {
23
- union A {
24
- a : __m128d ,
25
- b : [ f64 ; 2 ] ,
26
- } ;
27
- A { a } . b [ idx]
20
+ transmute :: < _ , [ f64 ; 2 ] > ( a) [ idx]
28
21
}
29
22
30
23
#[ target_feature( enable = "sse" ) ]
@@ -37,11 +30,7 @@ pub unsafe fn assert_eq_m128(a: __m128, b: __m128) {
37
30
38
31
#[ target_feature( enable = "sse" ) ]
39
32
pub unsafe fn get_m128 ( a : __m128 , idx : usize ) -> f32 {
40
- union A {
41
- a : __m128 ,
42
- b : [ f32 ; 4 ] ,
43
- } ;
44
- A { a } . b [ idx]
33
+ transmute :: < _ , [ f32 ; 4 ] > ( a) [ idx]
45
34
}
46
35
47
36
// not actually an intrinsic but useful in various tests as we proted from
@@ -53,11 +42,7 @@ pub unsafe fn _mm_setr_epi64x(a: i64, b: i64) -> __m128i {
53
42
54
43
#[ target_feature( enable = "avx" ) ]
55
44
pub unsafe fn assert_eq_m256i ( a : __m256i , b : __m256i ) {
56
- union A {
57
- a : __m256i ,
58
- b : [ u64 ; 4 ] ,
59
- }
60
- assert_eq ! ( A { a } . b, A { a: b } . b)
45
+ assert_eq ! ( transmute:: <_, [ u64 ; 4 ] >( a) , transmute:: <_, [ u64 ; 4 ] >( b) )
61
46
}
62
47
63
48
#[ target_feature( enable = "avx" ) ]
@@ -70,11 +55,7 @@ pub unsafe fn assert_eq_m256d(a: __m256d, b: __m256d) {
70
55
71
56
#[ target_feature( enable = "avx" ) ]
72
57
pub unsafe fn get_m256d ( a : __m256d , idx : usize ) -> f64 {
73
- union A {
74
- a : __m256d ,
75
- b : [ f64 ; 4 ] ,
76
- } ;
77
- A { a } . b [ idx]
58
+ transmute :: < _ , [ f64 ; 4 ] > ( a) [ idx]
78
59
}
79
60
80
61
#[ target_feature( enable = "avx" ) ]
@@ -87,11 +68,7 @@ pub unsafe fn assert_eq_m256(a: __m256, b: __m256) {
87
68
88
69
#[ target_feature( enable = "avx" ) ]
89
70
pub unsafe fn get_m256 ( a : __m256 , idx : usize ) -> f32 {
90
- union A {
91
- a : __m256 ,
92
- b : [ f32 ; 8 ] ,
93
- } ;
94
- A { a } . b [ idx]
71
+ transmute :: < _ , [ f32 ; 8 ] > ( a) [ idx]
95
72
}
96
73
97
74
// These intrinsics doesn't exist on x86 b/c it requires a 64-bit register,
@@ -101,6 +78,7 @@ mod x86_polyfill {
101
78
use crate :: core_arch:: x86:: * ;
102
79
103
80
pub unsafe fn _mm_insert_epi64 ( a : __m128i , val : i64 , idx : i32 ) -> __m128i {
81
+ #[ repr( C ) ]
104
82
union A {
105
83
a : __m128i ,
106
84
b : [ i64 ; 2 ] ,
@@ -112,6 +90,7 @@ mod x86_polyfill {
112
90
113
91
#[ target_feature( enable = "avx2" ) ]
114
92
pub unsafe fn _mm256_insert_epi64 ( a : __m256i , val : i64 , idx : i32 ) -> __m256i {
93
+ #[ repr( C ) ]
115
94
union A {
116
95
a : __m256i ,
117
96
b : [ i64 ; 4 ] ,
@@ -128,11 +107,7 @@ mod x86_polyfill {
128
107
pub use self :: x86_polyfill:: * ;
129
108
130
109
pub unsafe fn assert_eq_m512i ( a : __m512i , b : __m512i ) {
131
- union A {
132
- a : __m512i ,
133
- b : [ i32 ; 16 ] ,
134
- }
135
- assert_eq ! ( A { a } . b, A { a: b } . b)
110
+ assert_eq ! ( transmute:: <_, [ i32 ; 16 ] >( a) , transmute:: <_, [ i32 ; 16 ] >( b) )
136
111
}
137
112
138
113
pub unsafe fn assert_eq_m512 ( a : __m512 , b : __m512 ) {
0 commit comments