comparison src/impl/ppc/altivec.c @ 25:92156fe32755

impl/ppc/altivec: update to new implementation the signed average function is wrong; it needs to round up the number when only one of them is odd, but that doesn't necessarily seem to be true because altivec is weird, and that's what we need to emulate the quirks for. ugh. also the altivec backend uses the generic functions instead of fallbacks because it does indeed use the exact same memory structure as the generic implementation...
author Paper <paper@tflc.us>
date Sun, 24 Nov 2024 11:15:59 +0000
parents e26874655738
children
comparison
equal deleted inserted replaced
24:e49e70f7012f 25:92156fe32755
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"
26 27
27 #include <altivec.h> 28 #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
28 47
29 /* GCC 4.2.1 on Mac OS X doesn't have these for some reason */ 48 /* GCC 4.2.1 on Mac OS X doesn't have these for some reason */
30 #ifdef vec_mul 49 #ifdef vec_mul
31 # define VEC_ALTIVEC_DEFINE_MUL(sign, csign, bits, size) \ 50 # define VEC_ALTIVEC_DEFINE_MUL(sign, csign, bits, size) \
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) \ 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) \
33 { \ 52 { \
34 v##sign##int##bits##x##size vec; \ 53 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
35 vec.altivec = vec_mul(vec1.altivec, vec2.altivec); \ 54 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \
36 return vec; \ 55 \
56 vec1d->altivec = vec_mul(vec1d->altivec, vec2d->altivec); \
57 return vec1d->vec; \
37 } 58 }
38 # define VEC_ALTIVEC_STRUCT_MUL(sign, csign, bits, size) \ 59 # define VEC_ALTIVEC_STRUCT_MUL(sign, csign, bits, size) \
39 v##sign##int##bits##x##size##_altivec_mul 60 v##sign##int##bits##x##size##_altivec_mul
40 #else 61 #else
41 # define VEC_ALTIVEC_DEFINE_MUL(sign, csign, bits, size) 62 # define VEC_ALTIVEC_DEFINE_MUL(sign, csign, bits, size)
42 # define VEC_ALTIVEC_STRUCT_MUL(sign, csign, bits, size) NULL 63 # define VEC_ALTIVEC_STRUCT_MUL(sign, csign, bits, size) \
64 v##sign##int##bits##x##size##_generic_mul
43 #endif 65 #endif
44 66
45 #ifdef vec_splats 67 #ifdef vec_splats
46 # define VEC_ALTIVEC_DEFINE_SPLAT(sign, csign, bits, size) \ 68 # define VEC_ALTIVEC_DEFINE_SPLAT(sign, csign, bits, size) \
47 static v##sign##int##bits##x##size v##sign##int##bits##x##size##_altivec_splat(vec_##sign##int##bits x) \ 69 static v##sign##int##bits##x##size v##sign##int##bits##x##size##_altivec_splat(vec_##sign##int##bits x) \
48 { \ 70 { \
49 v##sign##int##bits##x##size vec; \ 71 union v##sign##int##bits##x##size##_impl_data vec; \
50 vec.altivec = vec_splats(x); \ 72 vec.altivec = vec_splats(x); \
51 return vec; \ 73 return vec.vec; \
52 } 74 }
53 # define VEC_ALTIVEC_STRUCT_SPLAT(sign, csign, bits, size) \ 75 # define VEC_ALTIVEC_STRUCT_SPLAT(sign, csign, bits, size) \
54 v##sign##int##bits##x##size##_altivec_splat 76 v##sign##int##bits##x##size##_altivec_splat
55 #else 77 #else
56 # define VEC_ALTIVEC_DEFINE_SPLAT(sign, csign, bits, size) 78 # define VEC_ALTIVEC_DEFINE_SPLAT(sign, csign, bits, size)
57 # define VEC_ALTIVEC_STRUCT_SPLAT(sign, csign, bits, size) NULL 79 # define VEC_ALTIVEC_STRUCT_SPLAT(sign, csign, bits, size) \
80 v##sign##int##bits##x##size##_generic_splat
58 #endif 81 #endif
59 82
60 #define VEC_ALTIVEC_uRSHIFT vec_sr 83 #define VEC_ALTIVEC_uRSHIFT vec_sr
61 #define VEC_ALTIVEC_RSHIFT vec_sra 84 #define VEC_ALTIVEC_RSHIFT vec_sra
62 85
63 #define VEC_ALTIVEC_DEFINE_uLRSHIFT(sign, csign, bits, size) \ 86 #define VEC_ALTIVEC_DEFINE_uLRSHIFT(sign, csign, bits, size) \
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) \ 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) \
65 { \ 88 { \
66 v##sign##int##bits##x##size vec; \ 89 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
67 vec.altivec = vec_sr(vec1.altivec, vec2.altivec); \ 90 union vuint##bits##x##size##_impl_data *vec2d = (union vuint##bits##x##size##_impl_data *)&vec2; \
68 return vec; \ 91 \
92 vec1d->altivec = vec_sr(vec1d->altivec, vec2d->altivec); \
93 return vec1d->vec; \
69 } 94 }
70 #define VEC_ALTIVEC_STRUCT_uLRSHIFT(sign, csign, bits, size) \ 95 #define VEC_ALTIVEC_STRUCT_uLRSHIFT(sign, csign, bits, size) \
71 v##sign##int##bits##x##size##_altivec_lrshift 96 v##sign##int##bits##x##size##_altivec_lrshift
72 97
73 #define VEC_ALTIVEC_DEFINE_LRSHIFT(sign, csign, bits, size) 98 #define VEC_ALTIVEC_DEFINE_LRSHIFT(sign, csign, bits, size)
74 #define VEC_ALTIVEC_STRUCT_LRSHIFT(sign, csign, bits, size) NULL 99 #define VEC_ALTIVEC_STRUCT_LRSHIFT(sign, csign, bits, size) \
100 v##sign##int##bits##x##size##_generic_lrshift
75 101
76 #define VEC_ALTIVEC_CAST_BOOL_8 (vector signed char) 102 #define VEC_ALTIVEC_CAST_BOOL_8 (vector signed char)
77 #define VEC_ALTIVEC_CAST_BOOL_U8 (vector unsigned char) 103 #define VEC_ALTIVEC_CAST_BOOL_U8 (vector unsigned char)
78 #define VEC_ALTIVEC_CAST_BOOL_16 (vector signed short) 104 #define VEC_ALTIVEC_CAST_BOOL_16 (vector signed short)
79 #define VEC_ALTIVEC_CAST_BOOL_U16 (vector unsigned short) 105 #define VEC_ALTIVEC_CAST_BOOL_U16 (vector unsigned short)
83 /* Since altivec conveniently made their API super user friendly, we can just use 109 /* Since altivec conveniently made their API super user friendly, we can just use
84 * one giant macro to define literally everything */ 110 * one giant macro to define literally everything */
85 #define VEC_DEFINE_OPERATIONS_SIGN(sign, csign, bits, size) \ 111 #define VEC_DEFINE_OPERATIONS_SIGN(sign, csign, bits, 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]) \ 112 static v##sign##int##bits##x##size v##sign##int##bits##x##size##_altivec_load_aligned(const vec_##sign##int##bits in[size]) \
87 { \ 113 { \
88 v##sign##int##bits##x##size vec; \ 114 union v##sign##int##bits##x##size##_impl_data vec; \
89 vec.altivec = vec_ld(0, in); \ 115 vec.altivec = vec_ld(0, in); \
90 return vec; \ 116 return vec.vec; \
91 } \ 117 } \
92 \ 118 \
93 static v##sign##int##bits##x##size v##sign##int##bits##x##size##_altivec_load(const vec_##sign##int##bits in[size]) \ 119 static v##sign##int##bits##x##size v##sign##int##bits##x##size##_altivec_load(const vec_##sign##int##bits in[size]) \
94 { \ 120 { \
95 v##sign##int##bits##x##size vec; \ 121 union v##sign##int##bits##x##size##_impl_data vec; \
96 vec.altivec = vec_perm(vec_ld(0, in), vec_ld(15, in), vec_lvsl(0, in)); \ 122 vec.altivec = vec_perm(vec_ld(0, in), vec_ld(15, in), vec_lvsl(0, in)); \
97 return vec; \ 123 return vec.vec; \
98 } \ 124 } \
99 \ 125 \
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]) \ 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]) \
101 { \ 127 { \
102 vec_st(vec.altivec, 0, out); \ 128 vec_st(((union v##sign##int##bits##x##size##_impl_data *)&vec)->altivec, 0, out); \
103 } \ 129 } \
104 \ 130 \
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) \ 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) \
106 { \ 132 { \
107 v##sign##int##bits##x##size vec; \ 133 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
108 vec.altivec = vec_add(vec1.altivec, vec2.altivec); \ 134 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \
109 return vec; \ 135 \
136 vec1d->altivec = vec_add(vec1d->altivec, vec2d->altivec); \
137 return vec1d->vec; \
110 } \ 138 } \
111 \ 139 \
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) \ 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) \
113 { \ 141 { \
114 v##sign##int##bits##x##size vec; \ 142 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
115 vec.altivec = vec_sub(vec1.altivec, vec2.altivec); \ 143 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \
116 return vec; \ 144 \
145 vec1d->altivec = vec_sub(vec1d->altivec, vec2d->altivec); \
146 return vec1d->vec; \
117 } \ 147 } \
118 \ 148 \
119 VEC_ALTIVEC_DEFINE_MUL(sign, csign, bits, size) \ 149 VEC_ALTIVEC_DEFINE_MUL(sign, csign, bits, size) \
120 \ 150 \
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) \ 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) \
122 { \ 152 { \
123 v##sign##int##bits##x##size vec; \ 153 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
124 vec.altivec = vec_sl(vec1.altivec, vec2.altivec); \ 154 union vuint##bits##x##size##_impl_data *vec2d = (union vuint##bits##x##size##_impl_data *)&vec2; \
125 return vec; \ 155 \
156 vec1d->altivec = vec_sl(vec1d->altivec, vec2d->altivec); \
157 return vec1d->vec; \
126 } \ 158 } \
127 \ 159 \
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) \ 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) \
129 { \ 161 { \
130 v##sign##int##bits##x##size vec; \ 162 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
131 vec.altivec = VEC_ALTIVEC_##sign##RSHIFT(vec1.altivec, vec2.altivec); \ 163 union vuint##bits##x##size##_impl_data *vec2d = (union vuint##bits##x##size##_impl_data *)&vec2; \
132 return vec; \ 164 \
165 vec1d->altivec = VEC_ALTIVEC_##sign##RSHIFT(vec1d->altivec, vec2d->altivec); \
166 return vec1d->vec; \
133 } \ 167 } \
134 \ 168 \
135 VEC_ALTIVEC_DEFINE_##sign##LRSHIFT(sign, csign, bits, size) \ 169 VEC_ALTIVEC_DEFINE_##sign##LRSHIFT(sign, csign, bits, size) \
136 \ 170 \
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) \ 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) \
138 { \ 172 { \
139 v##sign##int##bits##x##size vec; \ 173 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
140 vec.altivec = vec_avg(vec1.altivec, vec2.altivec); \ 174 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \
141 return vec; \ 175 \
176 vec1d->altivec = vec_avg(vec1d->altivec, vec2d->altivec); \
177 return vec1d->vec; \
142 } \ 178 } \
143 \ 179 \
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) \ 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) \
145 { \ 181 { \
146 v##sign##int##bits##x##size vec; \ 182 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
147 vec.altivec = vec_and(vec1.altivec, vec2.altivec); \ 183 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \
148 return vec; \ 184 \
185 vec1d->altivec = vec_and(vec1d->altivec, vec2d->altivec); \
186 return vec1d->vec; \
149 } \ 187 } \
150 \ 188 \
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) \ 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) \
152 { \ 190 { \
153 v##sign##int##bits##x##size vec; \ 191 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
154 vec.altivec = vec_or(vec1.altivec, vec2.altivec); \ 192 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \
155 return vec; \ 193 \
194 vec1d->altivec = vec_or(vec1d->altivec, vec2d->altivec); \
195 return vec1d->vec; \
156 } \ 196 } \
157 \ 197 \
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) \ 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) \
159 { \ 199 { \
160 v##sign##int##bits##x##size vec; \ 200 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
161 vec.altivec = vec_xor(vec1.altivec, vec2.altivec); \ 201 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \
162 return vec; \ 202 \
203 vec1d->altivec = vec_xor(vec1d->altivec, vec2d->altivec); \
204 return vec1d->vec; \
163 } \ 205 } \
164 \ 206 \
165 VEC_ALTIVEC_DEFINE_SPLAT(sign, csign, bits, size) \ 207 VEC_ALTIVEC_DEFINE_SPLAT(sign, csign, bits, size) \
166 \ 208 \
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) \ 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) \
168 { \ 210 { \
169 v##sign##int##bits##x##size vec; \ 211 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
170 vec.altivec = VEC_ALTIVEC_CAST_BOOL_##csign##bits vec_cmplt(vec1.altivec, vec2.altivec); \ 212 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \
171 return vec; \ 213 \
214 vec1d->altivec = VEC_ALTIVEC_CAST_BOOL_##csign##bits vec_cmplt(vec1d->altivec, vec2d->altivec); \
215 return vec1d->vec; \
172 } \ 216 } \
173 \ 217 \
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) \ 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) \
175 { \ 219 { \
176 v##sign##int##bits##x##size vec; \ 220 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
177 vec.altivec = VEC_ALTIVEC_CAST_BOOL_##csign##bits vec_or(vec_cmplt(vec1.altivec, vec2.altivec), vec_cmpeq(vec1.altivec, vec2.altivec)); \ 221 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \
178 return vec; \ 222 \
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; \
179 } \ 225 } \
180 \ 226 \
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) \ 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) \
182 { \ 228 { \
183 v##sign##int##bits##x##size vec; \ 229 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
184 vec.altivec = VEC_ALTIVEC_CAST_BOOL_##csign##bits vec_cmpeq(vec1.altivec, vec2.altivec); \ 230 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \
185 return vec; \ 231 \
232 vec1d->altivec = VEC_ALTIVEC_CAST_BOOL_##csign##bits vec_cmpeq(vec1d->altivec, vec2d->altivec); \
233 return vec1d->vec; \
186 } \ 234 } \
187 \ 235 \
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) \ 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) \
189 { \ 237 { \
190 v##sign##int##bits##x##size vec; \ 238 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
191 vec.altivec = VEC_ALTIVEC_CAST_BOOL_##csign##bits vec_or(vec_cmpgt(vec1.altivec, vec2.altivec), vec_cmpeq(vec1.altivec, vec2.altivec)); \ 239 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \
192 return vec; \ 240 \
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; \
193 } \ 243 } \
194 \ 244 \
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) \ 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) \
196 { \ 246 { \
197 v##sign##int##bits##x##size vec; \ 247 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
198 vec.altivec = VEC_ALTIVEC_CAST_BOOL_##csign##bits vec_cmpgt(vec1.altivec, vec2.altivec); \ 248 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \
199 return vec; \ 249 \
200 } \ 250 vec1d->altivec = VEC_ALTIVEC_CAST_BOOL_##csign##bits vec_cmpgt(vec1d->altivec, vec2d->altivec); \
201 \ 251 return vec1d->vec; \
202 static v##sign##int##bits##x##size##_impl v##sign##int##bits##x##size##_impl_altivec = { \ 252 } \
253 \
254 const v##sign##int##bits##x##size##_impl v##sign##int##bits##x##size##_impl_altivec = { \
203 VEC_ALTIVEC_STRUCT_SPLAT(sign, csign, bits, size), \ 255 VEC_ALTIVEC_STRUCT_SPLAT(sign, csign, bits, size), \
204 v##sign##int##bits##x##size##_altivec_load_aligned, \ 256 v##sign##int##bits##x##size##_altivec_load_aligned, \
205 v##sign##int##bits##x##size##_altivec_load, \ 257 v##sign##int##bits##x##size##_altivec_load, \
206 v##sign##int##bits##x##size##_altivec_store_aligned, \ 258 v##sign##int##bits##x##size##_altivec_store_aligned, \
207 /* .store = */ NULL, \ 259 v##sign##int##bits##x##size##_generic_store, \
208 v##sign##int##bits##x##size##_altivec_add, \ 260 v##sign##int##bits##x##size##_altivec_add, \
209 v##sign##int##bits##x##size##_altivec_sub, \ 261 v##sign##int##bits##x##size##_altivec_sub, \
210 VEC_ALTIVEC_STRUCT_MUL(sign, csign, bits, size), \ 262 VEC_ALTIVEC_STRUCT_MUL(sign, csign, bits, size), \
211 /* .div = */ NULL, \ 263 v##sign##int##bits##x##size##_generic_div, \
212 v##sign##int##bits##x##size##_altivec_avg, \ 264 v##sign##int##bits##x##size##_altivec_avg, \
213 v##sign##int##bits##x##size##_altivec_and, \ 265 v##sign##int##bits##x##size##_altivec_and, \
214 v##sign##int##bits##x##size##_altivec_or, \ 266 v##sign##int##bits##x##size##_altivec_or, \
215 v##sign##int##bits##x##size##_altivec_xor, \ 267 v##sign##int##bits##x##size##_altivec_xor, \
216 /* .not = */ NULL, \ 268 v##sign##int##bits##x##size##_generic_not, \
217 v##sign##int##bits##x##size##_altivec_lshift, \ 269 v##sign##int##bits##x##size##_altivec_lshift, \
218 v##sign##int##bits##x##size##_altivec_rshift, \ 270 v##sign##int##bits##x##size##_altivec_rshift, \
219 VEC_ALTIVEC_STRUCT_##sign##LRSHIFT(sign, csign, bits, size), \ 271 VEC_ALTIVEC_STRUCT_##sign##LRSHIFT(sign, csign, bits, size), \
220 v##sign##int##bits##x##size##_altivec_cmplt, \ 272 v##sign##int##bits##x##size##_altivec_cmplt, \
221 v##sign##int##bits##x##size##_altivec_cmple, \ 273 v##sign##int##bits##x##size##_altivec_cmple, \