Mercurial > vec
comparison utils/genaltivec.c @ 42:ca0f0223a62d
altivec: use vec_splat_* funcs if available
author | Paper <paper@tflc.us> |
---|---|
date | Tue, 29 Apr 2025 16:36:35 -0400 |
parents | c6e0df09b86f |
children | b0a3f0248ecc |
comparison
equal
deleted
inserted
replaced
41:c6e0df09b86f | 42:ca0f0223a62d |
---|---|
111 }; | 111 }; |
112 | 112 |
113 #define UPSIGN(x) ((x) ? "" : "U") | 113 #define UPSIGN(x) ((x) ? "" : "U") |
114 #define LOSIGN(x) ((x) ? "" : "u") | 114 #define LOSIGN(x) ((x) ? "" : "u") |
115 | 115 |
116 #define LOAVSIGN(x) ((x) ? "s" : "u") | |
117 | |
116 static void print_gcc_op(enum op op, int is_signed, int bits, int size) | 118 static void print_gcc_op(enum op op, int is_signed, int bits, int size) |
117 { | 119 { |
118 int i; | 120 int i; |
119 | 121 |
120 /* compatibility with ancient gcc */ | 122 /* compatibility with ancient gcc */ |
121 switch (op) { | 123 switch (op) { |
122 case OP_MUL: | 124 case OP_MUL: |
123 puts("#ifdef vec_mul"); | 125 puts("#ifdef vec_mul"); |
124 break; | 126 break; |
125 case OP_SPLAT: | 127 case OP_SPLAT: |
126 puts("#ifdef vec_splats"); | 128 printf("#if defined(vec_splats) || defined(vec_splat_%s%d)\n", (is_signed) ? "s" : "u", bits); |
127 break; | 129 break; |
128 default: | 130 default: |
129 break; | 131 break; |
130 } | 132 } |
131 | 133 |
213 puts(")\n{"); | 215 puts(")\n{"); |
214 | 216 |
215 switch (op) { | 217 switch (op) { |
216 case OP_SPLAT: | 218 case OP_SPLAT: |
217 printf("\tv%sint%dx%d vec;\n", LOSIGN(is_signed), bits, size); | 219 printf("\tv%sint%dx%d vec;\n", LOSIGN(is_signed), bits, size); |
218 printf("\tvec.altivec = vec_splats(x);\n"); | 220 puts("#ifdef vec_splats"); |
221 puts("\tvec.altivec = vec_splats(x);"); | |
222 printf("#elif defined(vec_splat_%s%d)\n", LOAVSIGN(is_signed), bits); | |
223 printf("\tvec.altivec = vec_splat_%s%d(x);\n", LOAVSIGN(is_signed), bits); | |
224 puts("#else"); | |
225 puts("# error logic error"); | |
226 puts("#endif"); | |
219 printf("\treturn vec;\n"); | 227 printf("\treturn vec;\n"); |
220 break; | 228 break; |
221 case OP_LOAD_ALIGNED: | 229 case OP_LOAD_ALIGNED: |
222 printf("\tv%sint%dx%d vec;\n", LOSIGN(is_signed), bits, size); | 230 printf("\tv%sint%dx%d vec;\n", LOSIGN(is_signed), bits, size); |
223 puts("\tvec.altivec = vec_ld(0, x);"); | 231 puts("\tvec.altivec = vec_ld(0, x);"); |