comparison src/impl/ppc/altivec.c @ 31:bf6ad516f1e6

Backed out changeset c6c99ab1088a
author Paper <paper@tflc.us>
date Fri, 25 Apr 2025 17:40:33 -0400
parents c6c99ab1088a
children 8b5e0974fd41
comparison
equal deleted inserted replaced
30:641d8c79b1da 31:bf6ad516f1e6
46 #undef VEC_DEFINE_IMPL_DATA 46 #undef VEC_DEFINE_IMPL_DATA
47 47
48 /* 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 */
49 #ifdef vec_mul 49 #ifdef vec_mul
50 # define VEC_ALTIVEC_DEFINE_MUL(sign, csign, bits, size) \ 50 # define VEC_ALTIVEC_DEFINE_MUL(sign, csign, bits, size) \
51 VEC_FUNC_IMPL 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) \
52 { \ 52 { \
53 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ 53 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
54 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \ 54 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \
55 \ 55 \
56 vec1d->altivec = vec_mul(vec1d->altivec, vec2d->altivec); \ 56 vec1d->altivec = vec_mul(vec1d->altivec, vec2d->altivec); \
57 return vec1d->vec; \ 57 return vec1d->vec; \
58 } 58 }
59 # define VEC_ALTIVEC_STRUCT_MUL(sign, csign, bits, size) \ 59 # define VEC_ALTIVEC_STRUCT_MUL(sign, csign, bits, size) \
60 .mul = v##sign##int##bits##x##size##_altivec_mul, 60 v##sign##int##bits##x##size##_altivec_mul
61 #else 61 #else
62 # define VEC_ALTIVEC_DEFINE_MUL(sign, csign, bits, size) 62 # define VEC_ALTIVEC_DEFINE_MUL(sign, csign, bits, size)
63 # define VEC_ALTIVEC_STRUCT_MUL(sign, csign, bits, size) \ 63 # define VEC_ALTIVEC_STRUCT_MUL(sign, csign, bits, size) \
64 /* nothing */ 64 v##sign##int##bits##x##size##_generic_mul
65 #endif 65 #endif
66 66
67 #ifdef vec_splats 67 #ifdef vec_splats
68 # define VEC_ALTIVEC_DEFINE_SPLAT(sign, csign, bits, size) \ 68 # define VEC_ALTIVEC_DEFINE_SPLAT(sign, csign, bits, size) \
69 VEC_FUNC_IMPL 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) \
70 { \ 70 { \
71 union v##sign##int##bits##x##size##_impl_data vec; \ 71 union v##sign##int##bits##x##size##_impl_data vec; \
72 vec.altivec = vec_splats(x); \ 72 vec.altivec = vec_splats(x); \
73 return vec.vec; \ 73 return vec.vec; \
74 } 74 }
75 # define VEC_ALTIVEC_STRUCT_SPLAT(sign, csign, bits, size) \ 75 # define VEC_ALTIVEC_STRUCT_SPLAT(sign, csign, bits, size) \
76 .splat = v##sign##int##bits##x##size##_altivec_splat, 76 v##sign##int##bits##x##size##_altivec_splat
77 #else 77 #else
78 # define VEC_ALTIVEC_DEFINE_SPLAT(sign, csign, bits, size) 78 # define VEC_ALTIVEC_DEFINE_SPLAT(sign, csign, bits, size)
79 # define VEC_ALTIVEC_STRUCT_SPLAT(sign, csign, bits, size) \ 79 # define VEC_ALTIVEC_STRUCT_SPLAT(sign, csign, bits, size) \
80 /* nothing */ 80 v##sign##int##bits##x##size##_generic_splat
81 #endif 81 #endif
82 82
83 #define VEC_ALTIVEC_uRSHIFT vec_sr 83 #define VEC_ALTIVEC_uRSHIFT vec_sr
84 #define VEC_ALTIVEC_RSHIFT vec_sra 84 #define VEC_ALTIVEC_RSHIFT vec_sra
85 85
86 #define VEC_ALTIVEC_DEFINE_uLRSHIFT(sign, csign, bits, size) \ 86 #define VEC_ALTIVEC_DEFINE_uLRSHIFT(sign, csign, bits, size) \
87 VEC_FUNC_IMPL 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) \
88 { \ 88 { \
89 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ 89 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
90 union vuint##bits##x##size##_impl_data *vec2d = (union vuint##bits##x##size##_impl_data *)&vec2; \ 90 union vuint##bits##x##size##_impl_data *vec2d = (union vuint##bits##x##size##_impl_data *)&vec2; \
91 \ 91 \
92 vec1d->altivec = vec_sr(vec1d->altivec, vec2d->altivec); \ 92 vec1d->altivec = vec_sr(vec1d->altivec, vec2d->altivec); \
93 return vec1d->vec; \ 93 return vec1d->vec; \
94 } 94 }
95 #define VEC_ALTIVEC_STRUCT_uLRSHIFT(sign, csign, bits, size) \ 95 #define VEC_ALTIVEC_STRUCT_uLRSHIFT(sign, csign, bits, size) \
96 .lrshift = v##sign##int##bits##x##size##_altivec_lrshift, 96 v##sign##int##bits##x##size##_altivec_lrshift
97 97
98 #define VEC_ALTIVEC_DEFINE_LRSHIFT(sign, csign, bits, size) 98 #define VEC_ALTIVEC_DEFINE_LRSHIFT(sign, csign, bits, size)
99 #define VEC_ALTIVEC_STRUCT_LRSHIFT(sign, csign, bits, size) /* nothing */ 99 #define VEC_ALTIVEC_STRUCT_LRSHIFT(sign, csign, bits, size) \
100 v##sign##int##bits##x##size##_generic_lrshift
100 101
101 #define VEC_ALTIVEC_CAST_BOOL_8 (vector signed char) 102 #define VEC_ALTIVEC_CAST_BOOL_8 (vector signed char)
102 #define VEC_ALTIVEC_CAST_BOOL_U8 (vector unsigned char) 103 #define VEC_ALTIVEC_CAST_BOOL_U8 (vector unsigned char)
103 #define VEC_ALTIVEC_CAST_BOOL_16 (vector signed short) 104 #define VEC_ALTIVEC_CAST_BOOL_16 (vector signed short)
104 #define VEC_ALTIVEC_CAST_BOOL_U16 (vector unsigned short) 105 #define VEC_ALTIVEC_CAST_BOOL_U16 (vector unsigned short)
106 #define VEC_ALTIVEC_CAST_BOOL_U32 (vector unsigned int) 107 #define VEC_ALTIVEC_CAST_BOOL_U32 (vector unsigned int)
107 108
108 /* 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
109 * one giant macro to define literally everything */ 110 * one giant macro to define literally everything */
110 #define VEC_DEFINE_OPERATIONS_SIGN(sign, csign, bits, size) \ 111 #define VEC_DEFINE_OPERATIONS_SIGN(sign, csign, bits, size) \
111 VEC_FUNC_IMPL 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]) \
112 { \ 113 { \
113 union v##sign##int##bits##x##size##_impl_data vec; \ 114 union v##sign##int##bits##x##size##_impl_data vec; \
114 vec.altivec = vec_ld(0, in); \ 115 vec.altivec = vec_ld(0, in); \
115 return vec.vec; \ 116 return vec.vec; \
116 } \ 117 } \
117 \ 118 \
118 VEC_FUNC_IMPL 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]) \
119 { \ 120 { \
120 union v##sign##int##bits##x##size##_impl_data vec; \ 121 union v##sign##int##bits##x##size##_impl_data vec; \
121 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)); \
122 return vec.vec; \ 123 return vec.vec; \
123 } \ 124 } \
124 \ 125 \
125 VEC_FUNC_IMPL 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]) \
126 { \ 127 { \
127 vec_st(((union v##sign##int##bits##x##size##_impl_data *)&vec)->altivec, 0, out); \ 128 vec_st(((union v##sign##int##bits##x##size##_impl_data *)&vec)->altivec, 0, out); \
128 } \ 129 } \
129 \ 130 \
130 VEC_FUNC_IMPL 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) \
131 { \ 132 { \
132 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ 133 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
133 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \ 134 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \
134 \ 135 \
135 vec1d->altivec = vec_add(vec1d->altivec, vec2d->altivec); \ 136 vec1d->altivec = vec_add(vec1d->altivec, vec2d->altivec); \
136 return vec1d->vec; \ 137 return vec1d->vec; \
137 } \ 138 } \
138 \ 139 \
139 VEC_FUNC_IMPL 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) \
140 { \ 141 { \
141 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ 142 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
142 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \ 143 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \
143 \ 144 \
144 vec1d->altivec = vec_sub(vec1d->altivec, vec2d->altivec); \ 145 vec1d->altivec = vec_sub(vec1d->altivec, vec2d->altivec); \
145 return vec1d->vec; \ 146 return vec1d->vec; \
146 } \ 147 } \
147 \ 148 \
148 VEC_ALTIVEC_DEFINE_MUL(sign, csign, bits, size) \ 149 VEC_ALTIVEC_DEFINE_MUL(sign, csign, bits, size) \
149 \ 150 \
150 VEC_FUNC_IMPL v##sign##int##bits##x##size v##sign##int##bits##x##size##_altivec_min(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) \
151 { \ 152 { \
152 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ 153 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
153 union vuint##bits##x##size##_impl_data *vec2d = (union vuint##bits##x##size##_impl_data *)&vec2; \ 154 union vuint##bits##x##size##_impl_data *vec2d = (union vuint##bits##x##size##_impl_data *)&vec2; \
154 \ 155 \
155 vec1d->altivec = vec_min(vec1d->altivec, vec2d->altivec); \ 156 vec1d->altivec = vec_sl(vec1d->altivec, vec2d->altivec); \
156 return vec1d->vec; \ 157 return vec1d->vec; \
157 } \ 158 } \
158 \ 159 \
159 VEC_FUNC_IMPL v##sign##int##bits##x##size v##sign##int##bits##x##size##_altivec_max(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) \
160 { \ 161 { \
161 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ 162 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
162 union vuint##bits##x##size##_impl_data *vec2d = (union vuint##bits##x##size##_impl_data *)&vec2; \ 163 union vuint##bits##x##size##_impl_data *vec2d = (union vuint##bits##x##size##_impl_data *)&vec2; \
163 \ 164 \
164 vec1d->altivec = vec_max(vec1d->altivec, vec2d->altivec); \
165 return vec1d->vec; \
166 } \
167 \
168 VEC_FUNC_IMPL 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) \
169 { \
170 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
171 union vuint##bits##x##size##_impl_data *vec2d = (union vuint##bits##x##size##_impl_data *)&vec2; \
172 \
173 vec1d->altivec = vec_sl(vec1d->altivec, vec2d->altivec); \
174 return vec1d->vec; \
175 } \
176 \
177 VEC_FUNC_IMPL 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) \
178 { \
179 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
180 union vuint##bits##x##size##_impl_data *vec2d = (union vuint##bits##x##size##_impl_data *)&vec2; \
181 \
182 vec1d->altivec = VEC_ALTIVEC_##sign##RSHIFT(vec1d->altivec, vec2d->altivec); \ 165 vec1d->altivec = VEC_ALTIVEC_##sign##RSHIFT(vec1d->altivec, vec2d->altivec); \
183 return vec1d->vec; \ 166 return vec1d->vec; \
184 } \ 167 } \
185 \ 168 \
186 VEC_ALTIVEC_DEFINE_##sign##LRSHIFT(sign, csign, bits, size) \ 169 VEC_ALTIVEC_DEFINE_##sign##LRSHIFT(sign, csign, bits, size) \
187 \ 170 \
188 VEC_FUNC_IMPL 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) \
189 { \ 172 { \
190 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ 173 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
191 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \ 174 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \
192 \ 175 \
193 vec1d->altivec = vec_avg(vec1d->altivec, vec2d->altivec); \ 176 vec1d->altivec = vec_avg(vec1d->altivec, vec2d->altivec); \
194 return vec1d->vec; \ 177 return vec1d->vec; \
195 } \ 178 } \
196 \ 179 \
197 VEC_FUNC_IMPL 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) \
198 { \ 181 { \
199 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ 182 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
200 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \ 183 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \
201 \ 184 \
202 vec1d->altivec = vec_and(vec1d->altivec, vec2d->altivec); \ 185 vec1d->altivec = vec_and(vec1d->altivec, vec2d->altivec); \
203 return vec1d->vec; \ 186 return vec1d->vec; \
204 } \ 187 } \
205 \ 188 \
206 VEC_FUNC_IMPL 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) \
207 { \ 190 { \
208 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ 191 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
209 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \ 192 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \
210 \ 193 \
211 vec1d->altivec = vec_or(vec1d->altivec, vec2d->altivec); \ 194 vec1d->altivec = vec_or(vec1d->altivec, vec2d->altivec); \
212 return vec1d->vec; \ 195 return vec1d->vec; \
213 } \ 196 } \
214 \ 197 \
215 VEC_FUNC_IMPL 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) \
216 { \ 199 { \
217 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ 200 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
218 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \ 201 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \
219 \ 202 \
220 vec1d->altivec = vec_xor(vec1d->altivec, vec2d->altivec); \ 203 vec1d->altivec = vec_xor(vec1d->altivec, vec2d->altivec); \
221 return vec1d->vec; \ 204 return vec1d->vec; \
222 } \ 205 } \
223 \ 206 \
224 VEC_ALTIVEC_DEFINE_SPLAT(sign, csign, bits, size) \ 207 VEC_ALTIVEC_DEFINE_SPLAT(sign, csign, bits, size) \
225 \ 208 \
226 VEC_FUNC_IMPL 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) \
227 { \ 210 { \
228 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ 211 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
229 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \ 212 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \
230 \ 213 \
231 vec1d->altivec = VEC_ALTIVEC_CAST_BOOL_##csign##bits vec_cmplt(vec1d->altivec, vec2d->altivec); \ 214 vec1d->altivec = VEC_ALTIVEC_CAST_BOOL_##csign##bits vec_cmplt(vec1d->altivec, vec2d->altivec); \
232 return vec1d->vec; \ 215 return vec1d->vec; \
233 } \ 216 } \
234 \ 217 \
235 VEC_FUNC_IMPL 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) \
236 { \ 219 { \
237 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ 220 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
238 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \ 221 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \
239 \ 222 \
240 vec1d->altivec = VEC_ALTIVEC_CAST_BOOL_##csign##bits vec_or(vec_cmplt(vec1d->altivec, vec2d->altivec), vec_cmpeq(vec1d->altivec, vec2d->altivec)); \ 223 vec1d->altivec = VEC_ALTIVEC_CAST_BOOL_##csign##bits vec_or(vec_cmplt(vec1d->altivec, vec2d->altivec), vec_cmpeq(vec1d->altivec, vec2d->altivec)); \
241 return vec1d->vec; \ 224 return vec1d->vec; \
242 } \ 225 } \
243 \ 226 \
244 VEC_FUNC_IMPL 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) \
245 { \ 228 { \
246 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ 229 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
247 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \ 230 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \
248 \ 231 \
249 vec1d->altivec = VEC_ALTIVEC_CAST_BOOL_##csign##bits vec_cmpeq(vec1d->altivec, vec2d->altivec); \ 232 vec1d->altivec = VEC_ALTIVEC_CAST_BOOL_##csign##bits vec_cmpeq(vec1d->altivec, vec2d->altivec); \
250 return vec1d->vec; \ 233 return vec1d->vec; \
251 } \ 234 } \
252 \ 235 \
253 VEC_FUNC_IMPL 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) \
254 { \ 237 { \
255 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ 238 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
256 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \ 239 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \
257 \ 240 \
258 vec1d->altivec = VEC_ALTIVEC_CAST_BOOL_##csign##bits vec_or(vec_cmpgt(vec1d->altivec, vec2d->altivec), vec_cmpeq(vec1d->altivec, vec2d->altivec)); \ 241 vec1d->altivec = VEC_ALTIVEC_CAST_BOOL_##csign##bits vec_or(vec_cmpgt(vec1d->altivec, vec2d->altivec), vec_cmpeq(vec1d->altivec, vec2d->altivec)); \
259 return vec1d->vec; \ 242 return vec1d->vec; \
260 } \ 243 } \
261 \ 244 \
262 VEC_FUNC_IMPL 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) \
263 { \ 246 { \
264 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ 247 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
265 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \ 248 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \
266 \ 249 \
267 vec1d->altivec = VEC_ALTIVEC_CAST_BOOL_##csign##bits vec_cmpgt(vec1d->altivec, vec2d->altivec); \ 250 vec1d->altivec = VEC_ALTIVEC_CAST_BOOL_##csign##bits vec_cmpgt(vec1d->altivec, vec2d->altivec); \
268 return vec1d->vec; \ 251 return vec1d->vec; \
269 } \ 252 } \
270 \ 253 \
271 const v##sign##int##bits##x##size##_impl v##sign##int##bits##x##size##_impl_altivec = { \ 254 const v##sign##int##bits##x##size##_impl v##sign##int##bits##x##size##_impl_altivec = { \
272 VEC_ALTIVEC_STRUCT_SPLAT(sign, csign, bits, size) \ 255 VEC_ALTIVEC_STRUCT_SPLAT(sign, csign, bits, size), \
273 .load_aligned = v##sign##int##bits##x##size##_altivec_load_aligned, \ 256 v##sign##int##bits##x##size##_altivec_load_aligned, \
274 .load = v##sign##int##bits##x##size##_altivec_load, \ 257 v##sign##int##bits##x##size##_altivec_load, \
275 .store_aligned = v##sign##int##bits##x##size##_altivec_store_aligned, \ 258 v##sign##int##bits##x##size##_altivec_store_aligned, \
276 .add = v##sign##int##bits##x##size##_altivec_add, \ 259 v##sign##int##bits##x##size##_generic_store, \
277 .sub = v##sign##int##bits##x##size##_altivec_sub, \ 260 v##sign##int##bits##x##size##_altivec_add, \
278 VEC_ALTIVEC_STRUCT_MUL(sign, csign, bits, size) \ 261 v##sign##int##bits##x##size##_altivec_sub, \
279 .avg = v##sign##int##bits##x##size##_altivec_avg, \ 262 VEC_ALTIVEC_STRUCT_MUL(sign, csign, bits, size), \
280 .band = v##sign##int##bits##x##size##_altivec_and, \ 263 v##sign##int##bits##x##size##_generic_div, \
281 .bor = v##sign##int##bits##x##size##_altivec_or, \ 264 v##sign##int##bits##x##size##_altivec_avg, \
282 .bxor = v##sign##int##bits##x##size##_altivec_xor, \ 265 v##sign##int##bits##x##size##_altivec_and, \
283 .lshift = v##sign##int##bits##x##size##_altivec_lshift, \ 266 v##sign##int##bits##x##size##_altivec_or, \
284 .rshift = v##sign##int##bits##x##size##_altivec_rshift, \ 267 v##sign##int##bits##x##size##_altivec_xor, \
285 VEC_ALTIVEC_STRUCT_##sign##LRSHIFT(sign, csign, bits, size) \ 268 v##sign##int##bits##x##size##_generic_not, \
286 .cmplt = v##sign##int##bits##x##size##_altivec_cmplt, \ 269 v##sign##int##bits##x##size##_altivec_lshift, \
287 .cmple = v##sign##int##bits##x##size##_altivec_cmple, \ 270 v##sign##int##bits##x##size##_altivec_rshift, \
288 .cmpeq = v##sign##int##bits##x##size##_altivec_cmpeq, \ 271 VEC_ALTIVEC_STRUCT_##sign##LRSHIFT(sign, csign, bits, size), \
289 .cmpge = v##sign##int##bits##x##size##_altivec_cmpge, \ 272 v##sign##int##bits##x##size##_altivec_cmplt, \
290 .cmpgt = v##sign##int##bits##x##size##_altivec_cmpgt, \ 273 v##sign##int##bits##x##size##_altivec_cmple, \
274 v##sign##int##bits##x##size##_altivec_cmpeq, \
275 v##sign##int##bits##x##size##_altivec_cmpge, \
276 v##sign##int##bits##x##size##_altivec_cmpgt, \
291 }; 277 };
292 278
293 #define VEC_DEFINE_OPERATIONS(bits, size) \ 279 #define VEC_DEFINE_OPERATIONS(bits, size) \
294 VEC_DEFINE_OPERATIONS_SIGN( , , bits, size) \ 280 VEC_DEFINE_OPERATIONS_SIGN( , , bits, size) \
295 VEC_DEFINE_OPERATIONS_SIGN(u, U, bits, size) 281 VEC_DEFINE_OPERATIONS_SIGN(u, U, bits, size)