carbon_simd/x86_64/
integer.rs1use 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}