Mercurial > vec
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) |