comparison src/impl/ppc/altivec.c @ 28:c6c99ab1088a

*: add min/max functions and a big big refactor (again) agh, this time I added a few more implementations (and generally made the code just a little faster...)
author Paper <paper@tflc.us>
date Thu, 24 Apr 2025 00:54:02 -0400
parents 92156fe32755
children bf6ad516f1e6
comparison
equal deleted inserted replaced
27:d00b95f95dd1 28:c6c99ab1088a
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 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 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) \
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 v##sign##int##bits##x##size##_altivec_mul 60 .mul = 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 v##sign##int##bits##x##size##_generic_mul 64 /* nothing */
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 static v##sign##int##bits##x##size v##sign##int##bits##x##size##_altivec_splat(vec_##sign##int##bits x) \ 69 VEC_FUNC_IMPL 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 v##sign##int##bits##x##size##_altivec_splat 76 .splat = 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 v##sign##int##bits##x##size##_generic_splat 80 /* nothing */
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 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 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) \
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 v##sign##int##bits##x##size##_altivec_lrshift 96 .lrshift = 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) \ 99 #define VEC_ALTIVEC_STRUCT_LRSHIFT(sign, csign, bits, size) /* nothing */
100 v##sign##int##bits##x##size##_generic_lrshift
101 100
102 #define VEC_ALTIVEC_CAST_BOOL_8 (vector signed char) 101 #define VEC_ALTIVEC_CAST_BOOL_8 (vector signed char)
103 #define VEC_ALTIVEC_CAST_BOOL_U8 (vector unsigned char) 102 #define VEC_ALTIVEC_CAST_BOOL_U8 (vector unsigned char)
104 #define VEC_ALTIVEC_CAST_BOOL_16 (vector signed short) 103 #define VEC_ALTIVEC_CAST_BOOL_16 (vector signed short)
105 #define VEC_ALTIVEC_CAST_BOOL_U16 (vector unsigned short) 104 #define VEC_ALTIVEC_CAST_BOOL_U16 (vector unsigned short)
107 #define VEC_ALTIVEC_CAST_BOOL_U32 (vector unsigned int) 106 #define VEC_ALTIVEC_CAST_BOOL_U32 (vector unsigned int)
108 107
109 /* Since altivec conveniently made their API super user friendly, we can just use 108 /* Since altivec conveniently made their API super user friendly, we can just use
110 * one giant macro to define literally everything */ 109 * one giant macro to define literally everything */
111 #define VEC_DEFINE_OPERATIONS_SIGN(sign, csign, bits, size) \ 110 #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]) \ 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]) \
113 { \ 112 { \
114 union v##sign##int##bits##x##size##_impl_data vec; \ 113 union v##sign##int##bits##x##size##_impl_data vec; \
115 vec.altivec = vec_ld(0, in); \ 114 vec.altivec = vec_ld(0, in); \
116 return vec.vec; \ 115 return vec.vec; \
117 } \ 116 } \
118 \ 117 \
119 static v##sign##int##bits##x##size v##sign##int##bits##x##size##_altivec_load(const vec_##sign##int##bits in[size]) \ 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]) \
120 { \ 119 { \
121 union v##sign##int##bits##x##size##_impl_data vec; \ 120 union v##sign##int##bits##x##size##_impl_data vec; \
122 vec.altivec = vec_perm(vec_ld(0, in), vec_ld(15, in), vec_lvsl(0, in)); \ 121 vec.altivec = vec_perm(vec_ld(0, in), vec_ld(15, in), vec_lvsl(0, in)); \
123 return vec.vec; \ 122 return vec.vec; \
124 } \ 123 } \
125 \ 124 \
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]) \ 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]) \
127 { \ 126 { \
128 vec_st(((union v##sign##int##bits##x##size##_impl_data *)&vec)->altivec, 0, out); \ 127 vec_st(((union v##sign##int##bits##x##size##_impl_data *)&vec)->altivec, 0, out); \
129 } \ 128 } \
130 \ 129 \
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) \ 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) \
132 { \ 131 { \
133 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ 132 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
134 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \ 133 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \
135 \ 134 \
136 vec1d->altivec = vec_add(vec1d->altivec, vec2d->altivec); \ 135 vec1d->altivec = vec_add(vec1d->altivec, vec2d->altivec); \
137 return vec1d->vec; \ 136 return vec1d->vec; \
138 } \ 137 } \
139 \ 138 \
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) \ 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) \
141 { \ 140 { \
142 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ 141 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
143 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \ 142 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \
144 \ 143 \
145 vec1d->altivec = vec_sub(vec1d->altivec, vec2d->altivec); \ 144 vec1d->altivec = vec_sub(vec1d->altivec, vec2d->altivec); \
146 return vec1d->vec; \ 145 return vec1d->vec; \
147 } \ 146 } \
148 \ 147 \
149 VEC_ALTIVEC_DEFINE_MUL(sign, csign, bits, size) \ 148 VEC_ALTIVEC_DEFINE_MUL(sign, csign, bits, size) \
150 \ 149 \
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) \ 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 { \
152 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 \
155 vec1d->altivec = vec_min(vec1d->altivec, vec2d->altivec); \
156 return vec1d->vec; \
157 } \
158 \
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 { \
161 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 \
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) \
152 { \ 169 { \
153 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ 170 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
154 union vuint##bits##x##size##_impl_data *vec2d = (union vuint##bits##x##size##_impl_data *)&vec2; \ 171 union vuint##bits##x##size##_impl_data *vec2d = (union vuint##bits##x##size##_impl_data *)&vec2; \
155 \ 172 \
156 vec1d->altivec = vec_sl(vec1d->altivec, vec2d->altivec); \ 173 vec1d->altivec = vec_sl(vec1d->altivec, vec2d->altivec); \
157 return vec1d->vec; \ 174 return vec1d->vec; \
158 } \ 175 } \
159 \ 176 \
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) \ 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) \
161 { \ 178 { \
162 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ 179 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
163 union vuint##bits##x##size##_impl_data *vec2d = (union vuint##bits##x##size##_impl_data *)&vec2; \ 180 union vuint##bits##x##size##_impl_data *vec2d = (union vuint##bits##x##size##_impl_data *)&vec2; \
164 \ 181 \
165 vec1d->altivec = VEC_ALTIVEC_##sign##RSHIFT(vec1d->altivec, vec2d->altivec); \ 182 vec1d->altivec = VEC_ALTIVEC_##sign##RSHIFT(vec1d->altivec, vec2d->altivec); \
166 return vec1d->vec; \ 183 return vec1d->vec; \
167 } \ 184 } \
168 \ 185 \
169 VEC_ALTIVEC_DEFINE_##sign##LRSHIFT(sign, csign, bits, size) \ 186 VEC_ALTIVEC_DEFINE_##sign##LRSHIFT(sign, csign, bits, size) \
170 \ 187 \
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) \ 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) \
172 { \ 189 { \
173 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ 190 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
174 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \ 191 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \
175 \ 192 \
176 vec1d->altivec = vec_avg(vec1d->altivec, vec2d->altivec); \ 193 vec1d->altivec = vec_avg(vec1d->altivec, vec2d->altivec); \
177 return vec1d->vec; \ 194 return vec1d->vec; \
178 } \ 195 } \
179 \ 196 \
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) \ 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) \
181 { \ 198 { \
182 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ 199 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
183 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \ 200 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \
184 \ 201 \
185 vec1d->altivec = vec_and(vec1d->altivec, vec2d->altivec); \ 202 vec1d->altivec = vec_and(vec1d->altivec, vec2d->altivec); \
186 return vec1d->vec; \ 203 return vec1d->vec; \
187 } \ 204 } \
188 \ 205 \
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) \ 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) \
190 { \ 207 { \
191 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ 208 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
192 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \ 209 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \
193 \ 210 \
194 vec1d->altivec = vec_or(vec1d->altivec, vec2d->altivec); \ 211 vec1d->altivec = vec_or(vec1d->altivec, vec2d->altivec); \
195 return vec1d->vec; \ 212 return vec1d->vec; \
196 } \ 213 } \
197 \ 214 \
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) \ 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) \
199 { \ 216 { \
200 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ 217 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
201 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \ 218 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \
202 \ 219 \
203 vec1d->altivec = vec_xor(vec1d->altivec, vec2d->altivec); \ 220 vec1d->altivec = vec_xor(vec1d->altivec, vec2d->altivec); \
204 return vec1d->vec; \ 221 return vec1d->vec; \
205 } \ 222 } \
206 \ 223 \
207 VEC_ALTIVEC_DEFINE_SPLAT(sign, csign, bits, size) \ 224 VEC_ALTIVEC_DEFINE_SPLAT(sign, csign, bits, size) \
208 \ 225 \
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) \ 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) \
210 { \ 227 { \
211 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ 228 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
212 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \ 229 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \
213 \ 230 \
214 vec1d->altivec = VEC_ALTIVEC_CAST_BOOL_##csign##bits vec_cmplt(vec1d->altivec, vec2d->altivec); \ 231 vec1d->altivec = VEC_ALTIVEC_CAST_BOOL_##csign##bits vec_cmplt(vec1d->altivec, vec2d->altivec); \
215 return vec1d->vec; \ 232 return vec1d->vec; \
216 } \ 233 } \
217 \ 234 \
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) \ 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) \
219 { \ 236 { \
220 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ 237 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
221 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \ 238 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \
222 \ 239 \
223 vec1d->altivec = VEC_ALTIVEC_CAST_BOOL_##csign##bits vec_or(vec_cmplt(vec1d->altivec, vec2d->altivec), vec_cmpeq(vec1d->altivec, vec2d->altivec)); \ 240 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; \ 241 return vec1d->vec; \
225 } \ 242 } \
226 \ 243 \
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) \ 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) \
228 { \ 245 { \
229 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ 246 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
230 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \ 247 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \
231 \ 248 \
232 vec1d->altivec = VEC_ALTIVEC_CAST_BOOL_##csign##bits vec_cmpeq(vec1d->altivec, vec2d->altivec); \ 249 vec1d->altivec = VEC_ALTIVEC_CAST_BOOL_##csign##bits vec_cmpeq(vec1d->altivec, vec2d->altivec); \
233 return vec1d->vec; \ 250 return vec1d->vec; \
234 } \ 251 } \
235 \ 252 \
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) \ 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) \
237 { \ 254 { \
238 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ 255 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
239 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \ 256 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \
240 \ 257 \
241 vec1d->altivec = VEC_ALTIVEC_CAST_BOOL_##csign##bits vec_or(vec_cmpgt(vec1d->altivec, vec2d->altivec), vec_cmpeq(vec1d->altivec, vec2d->altivec)); \ 258 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; \ 259 return vec1d->vec; \
243 } \ 260 } \
244 \ 261 \
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) \ 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) \
246 { \ 263 { \
247 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ 264 union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \
248 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \ 265 union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \
249 \ 266 \
250 vec1d->altivec = VEC_ALTIVEC_CAST_BOOL_##csign##bits vec_cmpgt(vec1d->altivec, vec2d->altivec); \ 267 vec1d->altivec = VEC_ALTIVEC_CAST_BOOL_##csign##bits vec_cmpgt(vec1d->altivec, vec2d->altivec); \
251 return vec1d->vec; \ 268 return vec1d->vec; \
252 } \ 269 } \
253 \ 270 \
254 const v##sign##int##bits##x##size##_impl v##sign##int##bits##x##size##_impl_altivec = { \ 271 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), \ 272 VEC_ALTIVEC_STRUCT_SPLAT(sign, csign, bits, size) \
256 v##sign##int##bits##x##size##_altivec_load_aligned, \ 273 .load_aligned = v##sign##int##bits##x##size##_altivec_load_aligned, \
257 v##sign##int##bits##x##size##_altivec_load, \ 274 .load = v##sign##int##bits##x##size##_altivec_load, \
258 v##sign##int##bits##x##size##_altivec_store_aligned, \ 275 .store_aligned = v##sign##int##bits##x##size##_altivec_store_aligned, \
259 v##sign##int##bits##x##size##_generic_store, \ 276 .add = v##sign##int##bits##x##size##_altivec_add, \
260 v##sign##int##bits##x##size##_altivec_add, \ 277 .sub = v##sign##int##bits##x##size##_altivec_sub, \
261 v##sign##int##bits##x##size##_altivec_sub, \ 278 VEC_ALTIVEC_STRUCT_MUL(sign, csign, bits, size) \
262 VEC_ALTIVEC_STRUCT_MUL(sign, csign, bits, size), \ 279 .avg = v##sign##int##bits##x##size##_altivec_avg, \
263 v##sign##int##bits##x##size##_generic_div, \ 280 .band = v##sign##int##bits##x##size##_altivec_and, \
264 v##sign##int##bits##x##size##_altivec_avg, \ 281 .bor = v##sign##int##bits##x##size##_altivec_or, \
265 v##sign##int##bits##x##size##_altivec_and, \ 282 .bxor = v##sign##int##bits##x##size##_altivec_xor, \
266 v##sign##int##bits##x##size##_altivec_or, \ 283 .lshift = v##sign##int##bits##x##size##_altivec_lshift, \
267 v##sign##int##bits##x##size##_altivec_xor, \ 284 .rshift = v##sign##int##bits##x##size##_altivec_rshift, \
268 v##sign##int##bits##x##size##_generic_not, \ 285 VEC_ALTIVEC_STRUCT_##sign##LRSHIFT(sign, csign, bits, size) \
269 v##sign##int##bits##x##size##_altivec_lshift, \ 286 .cmplt = v##sign##int##bits##x##size##_altivec_cmplt, \
270 v##sign##int##bits##x##size##_altivec_rshift, \ 287 .cmple = v##sign##int##bits##x##size##_altivec_cmple, \
271 VEC_ALTIVEC_STRUCT_##sign##LRSHIFT(sign, csign, bits, size), \ 288 .cmpeq = v##sign##int##bits##x##size##_altivec_cmpeq, \
272 v##sign##int##bits##x##size##_altivec_cmplt, \ 289 .cmpge = v##sign##int##bits##x##size##_altivec_cmpge, \
273 v##sign##int##bits##x##size##_altivec_cmple, \ 290 .cmpgt = v##sign##int##bits##x##size##_altivec_cmpgt, \
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, \
277 }; 291 };
278 292
279 #define VEC_DEFINE_OPERATIONS(bits, size) \ 293 #define VEC_DEFINE_OPERATIONS(bits, size) \
280 VEC_DEFINE_OPERATIONS_SIGN( , , bits, size) \ 294 VEC_DEFINE_OPERATIONS_SIGN( , , bits, size) \
281 VEC_DEFINE_OPERATIONS_SIGN(u, U, bits, size) 295 VEC_DEFINE_OPERATIONS_SIGN(u, U, bits, size)