Skip to main content

carbon_simd/x86_64/
integer.rs

1use crate::SimdIntegerElement;
2use core::arch::x86_64::*;
3
4unsafe impl SimdIntegerElement for i8 {
5    #[inline(always)]
6    unsafe fn and(left: Self::Vector, right: Self::Vector) -> Self::Vector {
7        unsafe { _mm256_and_si256(left, right) }
8    }
9
10    #[inline(always)]
11    unsafe fn or(left: Self::Vector, right: Self::Vector) -> Self::Vector {
12        unsafe { _mm256_or_si256(left, right) }
13    }
14
15    #[inline(always)]
16    unsafe fn not(left: Self::Vector) -> Self::Vector {
17        unsafe {
18            let all_set = _mm256_set1_epi32(-1);
19            Self::xor(left, all_set)
20        }
21    }
22
23    #[inline(always)]
24    unsafe fn xor(left: Self::Vector, right: Self::Vector) -> Self::Vector {
25        unsafe { _mm256_xor_si256(left, right) }
26    }
27}
28
29unsafe impl SimdIntegerElement for u8 {
30    #[inline(always)]
31    unsafe fn and(left: Self::Vector, right: Self::Vector) -> Self::Vector {
32        unsafe { _mm256_and_si256(left, right) }
33    }
34
35    #[inline(always)]
36    unsafe fn or(left: Self::Vector, right: Self::Vector) -> Self::Vector {
37        unsafe { _mm256_or_si256(left, right) }
38    }
39
40    #[inline(always)]
41    unsafe fn not(left: Self::Vector) -> Self::Vector {
42        unsafe {
43            let all_set = _mm256_set1_epi32(-1);
44            Self::xor(left, all_set)
45        }
46    }
47
48    #[inline(always)]
49    unsafe fn xor(left: Self::Vector, right: Self::Vector) -> Self::Vector {
50        unsafe { _mm256_xor_si256(left, right) }
51    }
52}
53
54unsafe impl SimdIntegerElement for i16 {
55    #[inline(always)]
56    unsafe fn and(left: Self::Vector, right: Self::Vector) -> Self::Vector {
57        unsafe { _mm256_and_si256(left, right) }
58    }
59
60    #[inline(always)]
61    unsafe fn or(left: Self::Vector, right: Self::Vector) -> Self::Vector {
62        unsafe { _mm256_or_si256(left, right) }
63    }
64
65    #[inline(always)]
66    unsafe fn not(left: Self::Vector) -> Self::Vector {
67        unsafe {
68            let all_set = _mm256_set1_epi32(-1);
69            Self::xor(left, all_set)
70        }
71    }
72
73    #[inline(always)]
74    unsafe fn xor(left: Self::Vector, right: Self::Vector) -> Self::Vector {
75        unsafe { _mm256_xor_si256(left, right) }
76    }
77}
78
79unsafe impl SimdIntegerElement for u16 {
80    #[inline(always)]
81    unsafe fn and(left: Self::Vector, right: Self::Vector) -> Self::Vector {
82        unsafe { _mm256_and_si256(left, right) }
83    }
84
85    #[inline(always)]
86    unsafe fn or(left: Self::Vector, right: Self::Vector) -> Self::Vector {
87        unsafe { _mm256_or_si256(left, right) }
88    }
89
90    #[inline(always)]
91    unsafe fn not(left: Self::Vector) -> Self::Vector {
92        unsafe {
93            let all_set = _mm256_set1_epi32(-1);
94            Self::xor(left, all_set)
95        }
96    }
97
98    #[inline(always)]
99    unsafe fn xor(left: Self::Vector, right: Self::Vector) -> Self::Vector {
100        unsafe { _mm256_xor_si256(left, right) }
101    }
102}
103
104unsafe impl SimdIntegerElement for i32 {
105    #[inline(always)]
106    unsafe fn and(left: Self::Vector, right: Self::Vector) -> Self::Vector {
107        unsafe { _mm256_and_si256(left, right) }
108    }
109
110    #[inline(always)]
111    unsafe fn or(left: Self::Vector, right: Self::Vector) -> Self::Vector {
112        unsafe { _mm256_or_si256(left, right) }
113    }
114
115    #[inline(always)]
116    unsafe fn not(left: Self::Vector) -> Self::Vector {
117        unsafe {
118            let all_set = _mm256_set1_epi32(-1);
119            Self::xor(left, all_set)
120        }
121    }
122
123    #[inline(always)]
124    unsafe fn xor(left: Self::Vector, right: Self::Vector) -> Self::Vector {
125        unsafe { _mm256_xor_si256(left, right) }
126    }
127}
128
129unsafe impl SimdIntegerElement for u32 {
130    #[inline(always)]
131    unsafe fn and(left: Self::Vector, right: Self::Vector) -> Self::Vector {
132        unsafe { _mm256_and_si256(left, right) }
133    }
134
135    #[inline(always)]
136    unsafe fn or(left: Self::Vector, right: Self::Vector) -> Self::Vector {
137        unsafe { _mm256_or_si256(left, right) }
138    }
139
140    #[inline(always)]
141    unsafe fn not(left: Self::Vector) -> Self::Vector {
142        unsafe {
143            let all_set = _mm256_set1_epi32(-1);
144            Self::xor(left, all_set)
145        }
146    }
147
148    #[inline(always)]
149    unsafe fn xor(left: Self::Vector, right: Self::Vector) -> Self::Vector {
150        unsafe { _mm256_xor_si256(left, right) }
151    }
152}
153
154unsafe impl SimdIntegerElement for i64 {
155    #[inline(always)]
156    unsafe fn and(left: Self::Vector, right: Self::Vector) -> Self::Vector {
157        unsafe { _mm256_and_si256(left, right) }
158    }
159
160    #[inline(always)]
161    unsafe fn or(left: Self::Vector, right: Self::Vector) -> Self::Vector {
162        unsafe { _mm256_or_si256(left, right) }
163    }
164
165    #[inline(always)]
166    unsafe fn not(left: Self::Vector) -> Self::Vector {
167        unsafe {
168            let all_set = _mm256_set1_epi32(-1);
169            Self::xor(left, all_set)
170        }
171    }
172
173    #[inline(always)]
174    unsafe fn xor(left: Self::Vector, right: Self::Vector) -> Self::Vector {
175        unsafe { _mm256_xor_si256(left, right) }
176    }
177}
178
179unsafe impl SimdIntegerElement for u64 {
180    #[inline(always)]
181    unsafe fn and(left: Self::Vector, right: Self::Vector) -> Self::Vector {
182        unsafe { _mm256_and_si256(left, right) }
183    }
184
185    #[inline(always)]
186    unsafe fn or(left: Self::Vector, right: Self::Vector) -> Self::Vector {
187        unsafe { _mm256_or_si256(left, right) }
188    }
189
190    #[inline(always)]
191    unsafe fn not(left: Self::Vector) -> Self::Vector {
192        unsafe {
193            let all_set = _mm256_set1_epi32(-1);
194            Self::xor(left, all_set)
195        }
196    }
197
198    #[inline(always)]
199    unsafe fn xor(left: Self::Vector, right: Self::Vector) -> Self::Vector {
200        unsafe { _mm256_xor_si256(left, right) }
201    }
202}