annotate utils/genaltivec.c @ 41:c6e0df09b86f default tip

*: performance improvements with old GCC, reimplement altivec
author Paper <paper@tflc.us>
date Mon, 28 Apr 2025 16:31:59 -0400
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
41
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
1 /**
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
2 * vec - a tiny SIMD vector library in C99
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
3 *
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
4 * Copyright (c) 2024-2025 Paper
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
5 *
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
7 * of this software and associated documentation files (the "Software"), to deal
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
8 * in the Software without restriction, including without limitation the rights
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
10 * copies of the Software, and to permit persons to whom the Software is
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
11 * furnished to do so, subject to the following conditions:
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
12 *
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
13 * The above copyright notice and this permission notice shall be included in all
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
14 * copies or substantial portions of the Software.
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
15 *
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
22 * SOFTWARE.
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
23 **/
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
24
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
25 /* Use this file to generate include/vec/impl/ppc/altivec.h !!
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
26 *
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
27 * `gcc -o genaltivec genaltivec.c` */
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
28
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
29 #include <stdio.h>
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
30 #include <stdlib.h>
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
31 #include <string.h>
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
32 #include <ctype.h>
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
33
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
34 #define ARRAY_SIZE(x) (sizeof(x)/sizeof((x)[0]))
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
35
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
36 /* ------------------------------------------------------------------------ */
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
37
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
38 /* #define USE_VSX_EXTENSIONS */
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
39
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
40 enum op {
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
41 /* return vector, take in a integer */
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
42 OP_SPLAT = 0,
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
43
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
44 /* return vector, take in an array */
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
45 OP_LOAD_ALIGNED,
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
46 OP_LOAD,
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
47
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
48 /* void, take in vector and array */
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
49 OP_STORE_ALIGNED,
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
50 OP_STORE,
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
51
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
52 /* return vector, takes in two vectors */
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
53 OP_ADD,
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
54 OP_SUB,
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
55 OP_MUL,
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
56 OP_AND,
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
57 OP_OR,
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
58 OP_XOR,
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
59 OP_CMPLT,
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
60 OP_CMPEQ,
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
61 OP_CMPGT,
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
62 #ifdef USE_VSX_EXTENSIONS
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
63 OP_CMPLE,
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
64 OP_CMPGE,
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
65 #endif
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
66 OP_MIN,
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
67 OP_MAX,
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
68 OP_AVG,
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
69
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
70 /* return vector, takes in a vector and an explicitly unsigned vector */
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
71 OP_LSHIFT,
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
72 OP_LRSHIFT,
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
73 OP_RSHIFT,
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
74
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
75 OP_FINAL_,
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
76
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
77 /* unimplemented, no altivec version :) */
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
78 OP_NOT,
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
79 };
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
80
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
81 /* convert op -> string */
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
82 static struct {
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
83 const char *u;
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
84 const char *l;
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
85 } op_names[] = {
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
86 [OP_SPLAT] = {"SPLAT", "splat"},
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
87 [OP_LOAD_ALIGNED] = {"LOAD_ALIGNED", "load_aligned"},
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
88 [OP_LOAD] = {"LOAD", "load"},
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
89 [OP_STORE_ALIGNED] = {"STORE_ALIGNED", "store_aligned"},
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
90 [OP_STORE] = {"STORE", "store"},
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
91 [OP_ADD] = {"ADD", "add"},
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
92 [OP_SUB] = {"SUB", "sub"},
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
93 [OP_MUL] = {"MUL", "mul"},
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
94 [OP_AVG] = {"AVG", "avg"},
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
95 [OP_AND] = {"AND", "and"},
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
96 [OP_OR] = {"OR", "or"},
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
97 [OP_XOR] = {"XOR", "xor"},
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
98 [OP_NOT] = {"NOT", "not"},
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
99 [OP_CMPLT] = {"CMPLT", "cmplt"},
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
100 [OP_CMPEQ] = {"CMPEQ", "cmpeq"},
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
101 [OP_CMPGT] = {"CMPGT", "cmpgt"},
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
102 #ifdef USE_VSX_EXTENSIONS
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
103 [OP_CMPLE] = {"CMPLE", "cmple"},
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
104 [OP_CMPGE] = {"CMPGE", "cmpge"},
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
105 #endif
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
106 [OP_MIN] = {"MIN", "min"},
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
107 [OP_MAX] = {"MAX", "max"},
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
108 [OP_RSHIFT] = {"RSHIFT", "rshift"},
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
109 [OP_LRSHIFT] = {"LRSHIFT", "lrshift"},
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
110 [OP_LSHIFT] = {"LSHIFT", "lshift"},
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
111 };
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
112
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
113 #define UPSIGN(x) ((x) ? "" : "U")
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
114 #define LOSIGN(x) ((x) ? "" : "u")
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
115
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
116 static void print_gcc_op(enum op op, int is_signed, int bits, int size)
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
117 {
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
118 int i;
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
119
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
120 /* compatibility with ancient gcc */
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
121 switch (op) {
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
122 case OP_MUL:
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
123 puts("#ifdef vec_mul");
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
124 break;
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
125 case OP_SPLAT:
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
126 puts("#ifdef vec_splats");
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
127 break;
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
128 default:
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
129 break;
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
130 }
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
131
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
132 printf("#ifndef V%sINT%dx%d_%s_DEFINED\n", UPSIGN(is_signed), bits, size, op_names[op].u);
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
133
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
134 printf("VEC_FUNC_IMPL ");
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
135
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
136 /* first; the return value */
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
137 switch (op) {
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
138 case OP_SPLAT:
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
139 case OP_LOAD_ALIGNED:
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
140 case OP_LOAD:
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
141 case OP_ADD:
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
142 case OP_SUB:
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
143 case OP_MUL:
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
144 case OP_AND:
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
145 case OP_OR:
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
146 case OP_XOR:
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
147 case OP_CMPLT:
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
148 case OP_CMPEQ:
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
149 case OP_CMPGT:
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
150 #ifdef USE_VSX_EXTENSIONS
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
151 case OP_CMPLE:
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
152 case OP_CMPGE:
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
153 #endif
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
154 case OP_MIN:
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
155 case OP_MAX:
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
156 case OP_AVG:
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
157 case OP_RSHIFT:
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
158 case OP_LRSHIFT:
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
159 case OP_LSHIFT:
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
160 case OP_NOT:
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
161 printf("v%sint%dx%d", LOSIGN(is_signed), bits, size);
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
162 break;
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
163 case OP_STORE_ALIGNED:
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
164 case OP_STORE:
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
165 printf("void");
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
166 break;
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
167 }
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
168
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
169 /* whitespace and function name */
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
170 printf(" v%sint%dx%d_%s(", LOSIGN(is_signed), bits, size, op_names[op].l);
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
171
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
172 /* parameters */
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
173 switch (op) {
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
174 case OP_SPLAT:
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
175 printf("vec_%sint%d x", LOSIGN(is_signed), bits);
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
176 break;
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
177 case OP_LOAD_ALIGNED:
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
178 case OP_LOAD:
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
179 printf("const vec_%sint%d x[%d]", LOSIGN(is_signed), bits, size);
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
180 break;
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
181 case OP_STORE_ALIGNED:
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
182 case OP_STORE:
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
183 printf("v%sint%dx%d vec, vec_%sint%d arr[%d]", LOSIGN(is_signed), bits, size, LOSIGN(is_signed), bits, size);
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
184 break;
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
185 case OP_ADD:
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
186 case OP_SUB:
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
187 case OP_MUL:
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
188 case OP_AND:
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
189 case OP_OR:
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
190 case OP_XOR:
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
191 case OP_CMPLT:
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
192 case OP_CMPEQ:
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
193 case OP_CMPGT:
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
194 #ifdef USE_VSX_EXTENSIONS
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
195 case OP_CMPLE:
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
196 case OP_CMPGE:
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
197 #endif
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
198 case OP_MIN:
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
199 case OP_MAX:
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
200 case OP_AVG:
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
201 printf("v%sint%dx%d vec1, v%sint%dx%d vec2", LOSIGN(is_signed), bits, size, LOSIGN(is_signed), bits, size);
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
202 break;
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
203 case OP_RSHIFT:
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
204 case OP_LRSHIFT:
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
205 case OP_LSHIFT:
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
206 printf("v%sint%dx%d vec1, vuint%dx%d vec2", LOSIGN(is_signed), bits, size, bits, size);
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
207 break;
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
208 case OP_NOT:
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
209 printf("v%sint%dx%d vec", LOSIGN(is_signed), bits, size);
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
210 break;
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
211 }
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
212
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
213 puts(")\n{");
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
214
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
215 switch (op) {
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
216 case OP_SPLAT:
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
217 printf("\tv%sint%dx%d vec;\n", LOSIGN(is_signed), bits, size);
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
218 printf("\tvec.altivec = vec_splats(x);\n");
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
219 printf("\treturn vec;\n");
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
220 break;
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
221 case OP_LOAD_ALIGNED:
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
222 printf("\tv%sint%dx%d vec;\n", LOSIGN(is_signed), bits, size);
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
223 puts("\tvec.altivec = vec_ld(0, x);");
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
224 printf("\treturn vec;\n");
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
225 break;
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
226 case OP_LOAD:
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
227 printf("\tv%sint%dx%d vec;\n", LOSIGN(is_signed), bits, size);
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
228 puts("\tvec.altivec = vec_perm(vec_ld(0, x), vec_ld(16, x), vec_lvsl(0, x));");
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
229 printf("\treturn vec;\n");
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
230 break;
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
231 case OP_STORE_ALIGNED:
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
232 puts("\tvec_st(vec.altivec, 0, arr);");
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
233 break;
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
234 case OP_STORE:
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
235 /* ??? */
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
236 puts("\tmemcpy(arr, &vec, sizeof(vec));");
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
237 break;
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
238 case OP_ADD:
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
239 case OP_SUB:
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
240 case OP_MUL:
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
241 case OP_AND:
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
242 case OP_OR:
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
243 case OP_XOR:
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
244 case OP_AVG:
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
245 case OP_CMPLT:
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
246 case OP_CMPEQ:
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
247 case OP_CMPGT:
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
248 #ifdef USE_VSX_EXTENSIONS
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
249 case OP_CMPLE:
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
250 case OP_CMPGE:
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
251 #endif
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
252 case OP_LSHIFT:
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
253 case OP_LRSHIFT:
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
254 case OP_RSHIFT:
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
255 case OP_MIN:
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
256 case OP_MAX: {
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
257 static const char *op_altivec[OP_LRSHIFT - OP_ADD + 1] = {"add", "sub", "mul", "and", "or", "xor", "cmplt", "cmpeq", "cmpgt",
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
258 #ifdef USE_VSX_EXTENSIONS
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
259 "cmple",
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
260 "cmpge",
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
261 #endif
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
262 "min", "max", "avg", "sl", "sr"};
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
263 static const char *types[] = {"char", "short", NULL, "int"};
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
264
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
265 printf("\tv%sint%dx%d vec;\n", LOSIGN(is_signed), bits, size);
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
266 if (op == OP_RSHIFT) {
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
267 printf("\tvec.altivec = vec_sr%s(vec1.altivec, vec2.altivec);\n", (is_signed) ? "a" : "");
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
268 } else {
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
269 printf("\tvec.altivec = (vector %s %s)vec_%s(vec1.altivec, vec2.altivec);\n", (is_signed) ? "signed" : "unsigned", types[(bits / 8) - 1], op_altivec[op - OP_ADD]);
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
270 }
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
271 printf("\treturn vec;\n");
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
272 break;
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
273 }
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
274 default:
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
275 printf("#error implement this operation");
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
276 break;
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
277 }
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
278
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
279 /* end function definition */
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
280 puts("}");
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
281
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
282 printf("# define V%sINT%dx%d_%s_DEFINED\n", UPSIGN(is_signed), bits, size, op_names[op].u);
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
283 puts("#endif");
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
284
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
285 switch (op) {
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
286 case OP_SPLAT:
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
287 case OP_MUL:
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
288 puts("#endif");
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
289 break;
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
290 default:
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
291 break;
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
292 }
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
293 }
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
294
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
295 static inline void print_ops(int is_signed, int bits, int size)
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
296 {
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
297 int i;
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
298
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
299 printf("\n\n/* v%sint%dx%d */\n\n", (is_signed ? "u" : ""), bits, size);
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
300
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
301 for (i = 0; i < OP_FINAL_; i++)
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
302 print_gcc_op(i, is_signed, bits, size);
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
303 }
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
304
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
305 #ifdef USE_VSX_EXTENSIONS
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
306 # define HEADER_GUARD_NAME "VSX"
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
307 #else
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
308 # define HEADER_GUARD_NAME "ALTIVEC"
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
309 #endif
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
310
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
311 static const char *header =
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
312 "/**\n"
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
313 " * vec - a tiny SIMD vector library in C99\n"
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
314 " * \n"
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
315 " * Copyright (c) 2024-2025 Paper\n"
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
316 " * \n"
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
317 " * Permission is hereby granted, free of charge, to any person obtaining a copy\n"
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
318 " * of this software and associated documentation files (the \"Software\"), to deal\n"
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
319 " * in the Software without restriction, including without limitation the rights\n"
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
320 " * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n"
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
321 " * copies of the Software, and to permit persons to whom the Software is\n"
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
322 " * furnished to do so, subject to the following conditions:\n"
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
323 " * \n"
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
324 " * The above copyright notice and this permission notice shall be included in all\n"
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
325 " * copies or substantial portions of the Software.\n"
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
326 " * \n"
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
327 " * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n"
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
328 " * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n"
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
329 " * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n"
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
330 " * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n"
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
331 " * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n"
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
332 " * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n"
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
333 " * SOFTWARE.\n"
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
334 "**/\n"
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
335 "\n"
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
336 "/* This file is automatically generated! Do not edit it directly!\n"
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
337 " * Edit the code that generates it in utils/genaltivec.c --paper */\n"
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
338 "\n"
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
339 "#ifndef VEC_IMPL_PPC_" HEADER_GUARD_NAME "_H_\n"
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
340 "#define VEC_IMPL_PPC_" HEADER_GUARD_NAME "_H_\n"
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
341 "\n";
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
342
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
343 static const char *footer =
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
344 "#endif /* VEC_IMPL_PPC_" HEADER_GUARD_NAME "_H_ */\n";
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
345
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
346 int main(void)
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
347 {
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
348 static struct {
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
349 int bits, size;
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
350 } defs[] = {
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
351 /* -- 8-bit */
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
352 {8, 16},
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
353 /* -- 16-bit */
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
354 {16, 8},
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
355
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
356 /* -- 32-bit */
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
357 {32, 4},
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
358
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
359 #ifdef USE_VSX_EXTENSIONS
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
360 /* -- 64-bit */
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
361 {64, 2},
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
362 #endif
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
363 };
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
364 int i;
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
365
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
366 puts(header);
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
367
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
368 for (i = 0; i < ARRAY_SIZE(defs); i++) {
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
369 print_ops(1, defs[i].bits, defs[i].size);
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
370 print_ops(0, defs[i].bits, defs[i].size);
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
371 }
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
372
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
373 puts(footer);
c6e0df09b86f *: performance improvements with old GCC, reimplement altivec
Paper <paper@tflc.us>
parents:
diff changeset
374 }