Mercurial > vec
comparison src/impl/ppc/altivec.c @ 34:8b5e0974fd41
Backed out changeset 92156fe32755
author | Paper <paper@tflc.us> |
---|---|
date | Fri, 25 Apr 2025 17:40:46 -0400 |
parents | bf6ad516f1e6 |
children |
comparison
equal
deleted
inserted
replaced
33:4655b49eaf9f | 34:8b5e0974fd41 |
---|---|
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | 21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
22 * SOFTWARE. | 22 * SOFTWARE. |
23 **/ | 23 **/ |
24 | 24 |
25 #include "vec/impl/ppc/altivec.h" | 25 #include "vec/impl/ppc/altivec.h" |
26 #include "vec/impl/generic.h" | |
27 | 26 |
28 #include <altivec.h> | 27 #include <altivec.h> |
29 | |
30 #define VEC_DEFINE_IMPL_DATA(sign, bits, size, type) \ | |
31 union v##sign##int##bits##x##size##_impl_data { \ | |
32 v##sign##int##bits##x##size vec; \ | |
33 vector type altivec; \ | |
34 }; \ | |
35 \ | |
36 VEC_STATIC_ASSERT(VEC_ALIGNOF(vector type) <= VEC_ALIGNOF(v##sign##int##bits##x##size), "vec: v" #sign "int" #bits "x" #size " alignment needs to be expanded to fit intrinsic type size"); \ | |
37 VEC_STATIC_ASSERT(sizeof(vector type) <= sizeof(v##sign##int##bits##x##size), "vec: v" #sign "int" #bits "x" #size " needs to be expanded to fit intrinsic type size"); | |
38 | |
39 VEC_DEFINE_IMPL_DATA( , 8, 16, signed char) | |
40 VEC_DEFINE_IMPL_DATA(u, 8, 16, unsigned char) | |
41 VEC_DEFINE_IMPL_DATA( , 16, 8, signed short) | |
42 VEC_DEFINE_IMPL_DATA(u, 16, 8, unsigned short) | |
43 VEC_DEFINE_IMPL_DATA( , 32, 4, signed int) | |
44 VEC_DEFINE_IMPL_DATA(u, 32, 4, unsigned int) | |
45 | |
46 #undef VEC_DEFINE_IMPL_DATA | |
47 | 28 |
48 /* GCC 4.2.1 on Mac OS X doesn't have these for some reason */ | 29 /* GCC 4.2.1 on Mac OS X doesn't have these for some reason */ |
49 #ifdef vec_mul | 30 #ifdef vec_mul |
50 # define VEC_ALTIVEC_DEFINE_MUL(sign, csign, bits, size) \ | 31 # define VEC_ALTIVEC_DEFINE_MUL(sign, csign, bits, size) \ |
51 static v##sign##int##bits##x##size v##sign##int##bits##x##size##_altivec_mul(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \ | 32 static v##sign##int##bits##x##size v##sign##int##bits##x##size##_altivec_mul(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \ |
52 { \ | 33 { \ |
53 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ | 34 v##sign##int##bits##x##size vec; \ |
54 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \ | 35 vec.altivec = vec_mul(vec1.altivec, vec2.altivec); \ |
55 \ | 36 return vec; \ |
56 vec1d->altivec = vec_mul(vec1d->altivec, vec2d->altivec); \ | |
57 return vec1d->vec; \ | |
58 } | 37 } |
59 # define VEC_ALTIVEC_STRUCT_MUL(sign, csign, bits, size) \ | 38 # define VEC_ALTIVEC_STRUCT_MUL(sign, csign, bits, size) \ |
60 v##sign##int##bits##x##size##_altivec_mul | 39 v##sign##int##bits##x##size##_altivec_mul |
61 #else | 40 #else |
62 # define VEC_ALTIVEC_DEFINE_MUL(sign, csign, bits, size) | 41 # define VEC_ALTIVEC_DEFINE_MUL(sign, csign, bits, size) |
63 # define VEC_ALTIVEC_STRUCT_MUL(sign, csign, bits, size) \ | 42 # define VEC_ALTIVEC_STRUCT_MUL(sign, csign, bits, size) NULL |
64 v##sign##int##bits##x##size##_generic_mul | |
65 #endif | 43 #endif |
66 | 44 |
67 #ifdef vec_splats | 45 #ifdef vec_splats |
68 # define VEC_ALTIVEC_DEFINE_SPLAT(sign, csign, bits, size) \ | 46 # define VEC_ALTIVEC_DEFINE_SPLAT(sign, csign, bits, size) \ |
69 static v##sign##int##bits##x##size v##sign##int##bits##x##size##_altivec_splat(vec_##sign##int##bits x) \ | 47 static v##sign##int##bits##x##size v##sign##int##bits##x##size##_altivec_splat(vec_##sign##int##bits x) \ |
70 { \ | 48 { \ |
71 union v##sign##int##bits##x##size##_impl_data vec; \ | 49 v##sign##int##bits##x##size vec; \ |
72 vec.altivec = vec_splats(x); \ | 50 vec.altivec = vec_splats(x); \ |
73 return vec.vec; \ | 51 return vec; \ |
74 } | 52 } |
75 # define VEC_ALTIVEC_STRUCT_SPLAT(sign, csign, bits, size) \ | 53 # define VEC_ALTIVEC_STRUCT_SPLAT(sign, csign, bits, size) \ |
76 v##sign##int##bits##x##size##_altivec_splat | 54 v##sign##int##bits##x##size##_altivec_splat |
77 #else | 55 #else |
78 # define VEC_ALTIVEC_DEFINE_SPLAT(sign, csign, bits, size) | 56 # define VEC_ALTIVEC_DEFINE_SPLAT(sign, csign, bits, size) |
79 # define VEC_ALTIVEC_STRUCT_SPLAT(sign, csign, bits, size) \ | 57 # define VEC_ALTIVEC_STRUCT_SPLAT(sign, csign, bits, size) NULL |
80 v##sign##int##bits##x##size##_generic_splat | |
81 #endif | 58 #endif |
82 | 59 |
83 #define VEC_ALTIVEC_uRSHIFT vec_sr | 60 #define VEC_ALTIVEC_uRSHIFT vec_sr |
84 #define VEC_ALTIVEC_RSHIFT vec_sra | 61 #define VEC_ALTIVEC_RSHIFT vec_sra |
85 | 62 |
86 #define VEC_ALTIVEC_DEFINE_uLRSHIFT(sign, csign, bits, size) \ | 63 #define VEC_ALTIVEC_DEFINE_uLRSHIFT(sign, csign, bits, size) \ |
87 static v##sign##int##bits##x##size v##sign##int##bits##x##size##_altivec_lrshift(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \ | 64 static v##sign##int##bits##x##size v##sign##int##bits##x##size##_altivec_lrshift(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \ |
88 { \ | 65 { \ |
89 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ | 66 v##sign##int##bits##x##size vec; \ |
90 union vuint##bits##x##size##_impl_data *vec2d = (union vuint##bits##x##size##_impl_data *)&vec2; \ | 67 vec.altivec = vec_sr(vec1.altivec, vec2.altivec); \ |
91 \ | 68 return vec; \ |
92 vec1d->altivec = vec_sr(vec1d->altivec, vec2d->altivec); \ | |
93 return vec1d->vec; \ | |
94 } | 69 } |
95 #define VEC_ALTIVEC_STRUCT_uLRSHIFT(sign, csign, bits, size) \ | 70 #define VEC_ALTIVEC_STRUCT_uLRSHIFT(sign, csign, bits, size) \ |
96 v##sign##int##bits##x##size##_altivec_lrshift | 71 v##sign##int##bits##x##size##_altivec_lrshift |
97 | 72 |
98 #define VEC_ALTIVEC_DEFINE_LRSHIFT(sign, csign, bits, size) | 73 #define VEC_ALTIVEC_DEFINE_LRSHIFT(sign, csign, bits, size) |
99 #define VEC_ALTIVEC_STRUCT_LRSHIFT(sign, csign, bits, size) \ | 74 #define VEC_ALTIVEC_STRUCT_LRSHIFT(sign, csign, bits, size) NULL |
100 v##sign##int##bits##x##size##_generic_lrshift | |
101 | 75 |
102 #define VEC_ALTIVEC_CAST_BOOL_8 (vector signed char) | 76 #define VEC_ALTIVEC_CAST_BOOL_8 (vector signed char) |
103 #define VEC_ALTIVEC_CAST_BOOL_U8 (vector unsigned char) | 77 #define VEC_ALTIVEC_CAST_BOOL_U8 (vector unsigned char) |
104 #define VEC_ALTIVEC_CAST_BOOL_16 (vector signed short) | 78 #define VEC_ALTIVEC_CAST_BOOL_16 (vector signed short) |
105 #define VEC_ALTIVEC_CAST_BOOL_U16 (vector unsigned short) | 79 #define VEC_ALTIVEC_CAST_BOOL_U16 (vector unsigned short) |
109 /* Since altivec conveniently made their API super user friendly, we can just use | 83 /* Since altivec conveniently made their API super user friendly, we can just use |
110 * one giant macro to define literally everything */ | 84 * one giant macro to define literally everything */ |
111 #define VEC_DEFINE_OPERATIONS_SIGN(sign, csign, bits, size) \ | 85 #define VEC_DEFINE_OPERATIONS_SIGN(sign, csign, bits, size) \ |
112 static v##sign##int##bits##x##size v##sign##int##bits##x##size##_altivec_load_aligned(const vec_##sign##int##bits in[size]) \ | 86 static v##sign##int##bits##x##size v##sign##int##bits##x##size##_altivec_load_aligned(const vec_##sign##int##bits in[size]) \ |
113 { \ | 87 { \ |
114 union v##sign##int##bits##x##size##_impl_data vec; \ | 88 v##sign##int##bits##x##size vec; \ |
115 vec.altivec = vec_ld(0, in); \ | 89 vec.altivec = vec_ld(0, in); \ |
116 return vec.vec; \ | 90 return vec; \ |
117 } \ | 91 } \ |
118 \ | 92 \ |
119 static v##sign##int##bits##x##size v##sign##int##bits##x##size##_altivec_load(const vec_##sign##int##bits in[size]) \ | 93 static v##sign##int##bits##x##size v##sign##int##bits##x##size##_altivec_load(const vec_##sign##int##bits in[size]) \ |
120 { \ | 94 { \ |
121 union v##sign##int##bits##x##size##_impl_data vec; \ | 95 v##sign##int##bits##x##size vec; \ |
122 vec.altivec = vec_perm(vec_ld(0, in), vec_ld(15, in), vec_lvsl(0, in)); \ | 96 vec.altivec = vec_perm(vec_ld(0, in), vec_ld(15, in), vec_lvsl(0, in)); \ |
123 return vec.vec; \ | 97 return vec; \ |
124 } \ | 98 } \ |
125 \ | 99 \ |
126 static void v##sign##int##bits##x##size##_altivec_store_aligned(v##sign##int##bits##x##size vec, vec_##sign##int##bits out[size]) \ | 100 static void v##sign##int##bits##x##size##_altivec_store_aligned(v##sign##int##bits##x##size vec, vec_##sign##int##bits out[size]) \ |
127 { \ | 101 { \ |
128 vec_st(((union v##sign##int##bits##x##size##_impl_data *)&vec)->altivec, 0, out); \ | 102 vec_st(vec.altivec, 0, out); \ |
129 } \ | 103 } \ |
130 \ | 104 \ |
131 static v##sign##int##bits##x##size v##sign##int##bits##x##size##_altivec_add(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \ | 105 static v##sign##int##bits##x##size v##sign##int##bits##x##size##_altivec_add(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \ |
132 { \ | 106 { \ |
133 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ | 107 v##sign##int##bits##x##size vec; \ |
134 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \ | 108 vec.altivec = vec_add(vec1.altivec, vec2.altivec); \ |
135 \ | 109 return vec; \ |
136 vec1d->altivec = vec_add(vec1d->altivec, vec2d->altivec); \ | |
137 return vec1d->vec; \ | |
138 } \ | 110 } \ |
139 \ | 111 \ |
140 static v##sign##int##bits##x##size v##sign##int##bits##x##size##_altivec_sub(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \ | 112 static v##sign##int##bits##x##size v##sign##int##bits##x##size##_altivec_sub(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \ |
141 { \ | 113 { \ |
142 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ | 114 v##sign##int##bits##x##size vec; \ |
143 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \ | 115 vec.altivec = vec_sub(vec1.altivec, vec2.altivec); \ |
144 \ | 116 return vec; \ |
145 vec1d->altivec = vec_sub(vec1d->altivec, vec2d->altivec); \ | |
146 return vec1d->vec; \ | |
147 } \ | 117 } \ |
148 \ | 118 \ |
149 VEC_ALTIVEC_DEFINE_MUL(sign, csign, bits, size) \ | 119 VEC_ALTIVEC_DEFINE_MUL(sign, csign, bits, size) \ |
150 \ | 120 \ |
151 static v##sign##int##bits##x##size v##sign##int##bits##x##size##_altivec_lshift(v##sign##int##bits##x##size vec1, vuint##bits##x##size vec2) \ | 121 static v##sign##int##bits##x##size v##sign##int##bits##x##size##_altivec_lshift(v##sign##int##bits##x##size vec1, vuint##bits##x##size vec2) \ |
152 { \ | 122 { \ |
153 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ | 123 v##sign##int##bits##x##size vec; \ |
154 union vuint##bits##x##size##_impl_data *vec2d = (union vuint##bits##x##size##_impl_data *)&vec2; \ | 124 vec.altivec = vec_sl(vec1.altivec, vec2.altivec); \ |
155 \ | 125 return vec; \ |
156 vec1d->altivec = vec_sl(vec1d->altivec, vec2d->altivec); \ | |
157 return vec1d->vec; \ | |
158 } \ | 126 } \ |
159 \ | 127 \ |
160 static v##sign##int##bits##x##size v##sign##int##bits##x##size##_altivec_rshift(v##sign##int##bits##x##size vec1, vuint##bits##x##size vec2) \ | 128 static v##sign##int##bits##x##size v##sign##int##bits##x##size##_altivec_rshift(v##sign##int##bits##x##size vec1, vuint##bits##x##size vec2) \ |
161 { \ | 129 { \ |
162 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ | 130 v##sign##int##bits##x##size vec; \ |
163 union vuint##bits##x##size##_impl_data *vec2d = (union vuint##bits##x##size##_impl_data *)&vec2; \ | 131 vec.altivec = VEC_ALTIVEC_##sign##RSHIFT(vec1.altivec, vec2.altivec); \ |
164 \ | 132 return vec; \ |
165 vec1d->altivec = VEC_ALTIVEC_##sign##RSHIFT(vec1d->altivec, vec2d->altivec); \ | |
166 return vec1d->vec; \ | |
167 } \ | 133 } \ |
168 \ | 134 \ |
169 VEC_ALTIVEC_DEFINE_##sign##LRSHIFT(sign, csign, bits, size) \ | 135 VEC_ALTIVEC_DEFINE_##sign##LRSHIFT(sign, csign, bits, size) \ |
170 \ | 136 \ |
171 static v##sign##int##bits##x##size v##sign##int##bits##x##size##_altivec_avg(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \ | 137 static v##sign##int##bits##x##size v##sign##int##bits##x##size##_altivec_avg(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \ |
172 { \ | 138 { \ |
173 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ | 139 v##sign##int##bits##x##size vec; \ |
174 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \ | 140 vec.altivec = vec_avg(vec1.altivec, vec2.altivec); \ |
175 \ | 141 return vec; \ |
176 vec1d->altivec = vec_avg(vec1d->altivec, vec2d->altivec); \ | |
177 return vec1d->vec; \ | |
178 } \ | 142 } \ |
179 \ | 143 \ |
180 static v##sign##int##bits##x##size v##sign##int##bits##x##size##_altivec_and(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \ | 144 static v##sign##int##bits##x##size v##sign##int##bits##x##size##_altivec_and(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \ |
181 { \ | 145 { \ |
182 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ | 146 v##sign##int##bits##x##size vec; \ |
183 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \ | 147 vec.altivec = vec_and(vec1.altivec, vec2.altivec); \ |
184 \ | 148 return vec; \ |
185 vec1d->altivec = vec_and(vec1d->altivec, vec2d->altivec); \ | |
186 return vec1d->vec; \ | |
187 } \ | 149 } \ |
188 \ | 150 \ |
189 static v##sign##int##bits##x##size v##sign##int##bits##x##size##_altivec_or(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \ | 151 static v##sign##int##bits##x##size v##sign##int##bits##x##size##_altivec_or(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \ |
190 { \ | 152 { \ |
191 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ | 153 v##sign##int##bits##x##size vec; \ |
192 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \ | 154 vec.altivec = vec_or(vec1.altivec, vec2.altivec); \ |
193 \ | 155 return vec; \ |
194 vec1d->altivec = vec_or(vec1d->altivec, vec2d->altivec); \ | |
195 return vec1d->vec; \ | |
196 } \ | 156 } \ |
197 \ | 157 \ |
198 static v##sign##int##bits##x##size v##sign##int##bits##x##size##_altivec_xor(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \ | 158 static v##sign##int##bits##x##size v##sign##int##bits##x##size##_altivec_xor(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \ |
199 { \ | 159 { \ |
200 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ | 160 v##sign##int##bits##x##size vec; \ |
201 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \ | 161 vec.altivec = vec_xor(vec1.altivec, vec2.altivec); \ |
202 \ | 162 return vec; \ |
203 vec1d->altivec = vec_xor(vec1d->altivec, vec2d->altivec); \ | |
204 return vec1d->vec; \ | |
205 } \ | 163 } \ |
206 \ | 164 \ |
207 VEC_ALTIVEC_DEFINE_SPLAT(sign, csign, bits, size) \ | 165 VEC_ALTIVEC_DEFINE_SPLAT(sign, csign, bits, size) \ |
208 \ | 166 \ |
209 static v##sign##int##bits##x##size v##sign##int##bits##x##size##_altivec_cmplt(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \ | 167 static v##sign##int##bits##x##size v##sign##int##bits##x##size##_altivec_cmplt(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \ |
210 { \ | 168 { \ |
211 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ | 169 v##sign##int##bits##x##size vec; \ |
212 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \ | 170 vec.altivec = VEC_ALTIVEC_CAST_BOOL_##csign##bits vec_cmplt(vec1.altivec, vec2.altivec); \ |
213 \ | 171 return vec; \ |
214 vec1d->altivec = VEC_ALTIVEC_CAST_BOOL_##csign##bits vec_cmplt(vec1d->altivec, vec2d->altivec); \ | |
215 return vec1d->vec; \ | |
216 } \ | 172 } \ |
217 \ | 173 \ |
218 static v##sign##int##bits##x##size v##sign##int##bits##x##size##_altivec_cmple(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \ | 174 static v##sign##int##bits##x##size v##sign##int##bits##x##size##_altivec_cmple(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \ |
219 { \ | 175 { \ |
220 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ | 176 v##sign##int##bits##x##size vec; \ |
221 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \ | 177 vec.altivec = VEC_ALTIVEC_CAST_BOOL_##csign##bits vec_or(vec_cmplt(vec1.altivec, vec2.altivec), vec_cmpeq(vec1.altivec, vec2.altivec)); \ |
222 \ | 178 return vec; \ |
223 vec1d->altivec = VEC_ALTIVEC_CAST_BOOL_##csign##bits vec_or(vec_cmplt(vec1d->altivec, vec2d->altivec), vec_cmpeq(vec1d->altivec, vec2d->altivec)); \ | |
224 return vec1d->vec; \ | |
225 } \ | 179 } \ |
226 \ | 180 \ |
227 static v##sign##int##bits##x##size v##sign##int##bits##x##size##_altivec_cmpeq(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \ | 181 static v##sign##int##bits##x##size v##sign##int##bits##x##size##_altivec_cmpeq(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \ |
228 { \ | 182 { \ |
229 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ | 183 v##sign##int##bits##x##size vec; \ |
230 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \ | 184 vec.altivec = VEC_ALTIVEC_CAST_BOOL_##csign##bits vec_cmpeq(vec1.altivec, vec2.altivec); \ |
231 \ | 185 return vec; \ |
232 vec1d->altivec = VEC_ALTIVEC_CAST_BOOL_##csign##bits vec_cmpeq(vec1d->altivec, vec2d->altivec); \ | |
233 return vec1d->vec; \ | |
234 } \ | 186 } \ |
235 \ | 187 \ |
236 static v##sign##int##bits##x##size v##sign##int##bits##x##size##_altivec_cmpge(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \ | 188 static v##sign##int##bits##x##size v##sign##int##bits##x##size##_altivec_cmpge(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \ |
237 { \ | 189 { \ |
238 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ | 190 v##sign##int##bits##x##size vec; \ |
239 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \ | 191 vec.altivec = VEC_ALTIVEC_CAST_BOOL_##csign##bits vec_or(vec_cmpgt(vec1.altivec, vec2.altivec), vec_cmpeq(vec1.altivec, vec2.altivec)); \ |
240 \ | 192 return vec; \ |
241 vec1d->altivec = VEC_ALTIVEC_CAST_BOOL_##csign##bits vec_or(vec_cmpgt(vec1d->altivec, vec2d->altivec), vec_cmpeq(vec1d->altivec, vec2d->altivec)); \ | |
242 return vec1d->vec; \ | |
243 } \ | 193 } \ |
244 \ | 194 \ |
245 static v##sign##int##bits##x##size v##sign##int##bits##x##size##_altivec_cmpgt(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \ | 195 static v##sign##int##bits##x##size v##sign##int##bits##x##size##_altivec_cmpgt(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \ |
246 { \ | 196 { \ |
247 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ | 197 v##sign##int##bits##x##size vec; \ |
248 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \ | 198 vec.altivec = VEC_ALTIVEC_CAST_BOOL_##csign##bits vec_cmpgt(vec1.altivec, vec2.altivec); \ |
249 \ | 199 return vec; \ |
250 vec1d->altivec = VEC_ALTIVEC_CAST_BOOL_##csign##bits vec_cmpgt(vec1d->altivec, vec2d->altivec); \ | 200 } \ |
251 return vec1d->vec; \ | 201 \ |
252 } \ | 202 static v##sign##int##bits##x##size##_impl v##sign##int##bits##x##size##_impl_altivec = { \ |
253 \ | |
254 const v##sign##int##bits##x##size##_impl v##sign##int##bits##x##size##_impl_altivec = { \ | |
255 VEC_ALTIVEC_STRUCT_SPLAT(sign, csign, bits, size), \ | 203 VEC_ALTIVEC_STRUCT_SPLAT(sign, csign, bits, size), \ |
256 v##sign##int##bits##x##size##_altivec_load_aligned, \ | 204 v##sign##int##bits##x##size##_altivec_load_aligned, \ |
257 v##sign##int##bits##x##size##_altivec_load, \ | 205 v##sign##int##bits##x##size##_altivec_load, \ |
258 v##sign##int##bits##x##size##_altivec_store_aligned, \ | 206 v##sign##int##bits##x##size##_altivec_store_aligned, \ |
259 v##sign##int##bits##x##size##_generic_store, \ | 207 /* .store = */ NULL, \ |
260 v##sign##int##bits##x##size##_altivec_add, \ | 208 v##sign##int##bits##x##size##_altivec_add, \ |
261 v##sign##int##bits##x##size##_altivec_sub, \ | 209 v##sign##int##bits##x##size##_altivec_sub, \ |
262 VEC_ALTIVEC_STRUCT_MUL(sign, csign, bits, size), \ | 210 VEC_ALTIVEC_STRUCT_MUL(sign, csign, bits, size), \ |
263 v##sign##int##bits##x##size##_generic_div, \ | 211 /* .div = */ NULL, \ |
264 v##sign##int##bits##x##size##_altivec_avg, \ | 212 v##sign##int##bits##x##size##_altivec_avg, \ |
265 v##sign##int##bits##x##size##_altivec_and, \ | 213 v##sign##int##bits##x##size##_altivec_and, \ |
266 v##sign##int##bits##x##size##_altivec_or, \ | 214 v##sign##int##bits##x##size##_altivec_or, \ |
267 v##sign##int##bits##x##size##_altivec_xor, \ | 215 v##sign##int##bits##x##size##_altivec_xor, \ |
268 v##sign##int##bits##x##size##_generic_not, \ | 216 /* .not = */ NULL, \ |
269 v##sign##int##bits##x##size##_altivec_lshift, \ | 217 v##sign##int##bits##x##size##_altivec_lshift, \ |
270 v##sign##int##bits##x##size##_altivec_rshift, \ | 218 v##sign##int##bits##x##size##_altivec_rshift, \ |
271 VEC_ALTIVEC_STRUCT_##sign##LRSHIFT(sign, csign, bits, size), \ | 219 VEC_ALTIVEC_STRUCT_##sign##LRSHIFT(sign, csign, bits, size), \ |
272 v##sign##int##bits##x##size##_altivec_cmplt, \ | 220 v##sign##int##bits##x##size##_altivec_cmplt, \ |
273 v##sign##int##bits##x##size##_altivec_cmple, \ | 221 v##sign##int##bits##x##size##_altivec_cmple, \ |