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