annotate gen/genaltivec.c @ 45:7955bed1d169 default tip

*: add preliminary floating point support no x86 intrinsics just yet, but I did add altivec since it's (arguably) the simplest :)
author Paper <paper@tflc.us>
date Wed, 30 Apr 2025 18:36:38 -0400
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
45
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
1 /**
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
2 * vec - a tiny SIMD vector library in C99
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
3 *
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
4 * Copyright (c) 2024-2025 Paper
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
5 *
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
7 * of this software and associated documentation files (the "Software"), to deal
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
8 * in the Software without restriction, including without limitation the rights
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
10 * copies of the Software, and to permit persons to whom the Software is
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
11 * furnished to do so, subject to the following conditions:
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
12 *
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
13 * The above copyright notice and this permission notice shall be included in all
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
14 * copies or substantial portions of the Software.
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
15 *
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
22 * SOFTWARE.
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
23 **/
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
24
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
25 #include "genlib.h"
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
26
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
27 #define ARRAY_SIZE(x) (sizeof(x)/sizeof((x)[0]))
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
28
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
29 /* ------------------------------------------------------------------------ */
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
30
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
31 /* #define USE_VSX_EXTENSIONS */
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
32 /* #define USE_POWER8_EXTENSIONS */
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
33
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
34 static int altivec_check(int op, int type, int bits, int size)
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
35 {
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
36 switch (bits) {
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
37 case 8:
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
38 case 16:
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
39 case 32:
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
40 #ifdef USE_VSX_EXTENSIONS
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
41 case 64:
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
42 # ifndef USE_POWER8_EXTENSIONS
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
43 /* VSX has double, but not int64 */
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
44 if ((bits == 64) && (type != TYPE_FLOAT))
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
45 return 0;
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
46 # endif
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
47 #endif
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
48 if (bits * size == 128)
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
49 return 1;
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
50 default:
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
51 break;
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
52 }
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
53
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
54 return 0;
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
55 }
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
56
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
57 static int altivec_check_int(int op, int type, int bits, int size)
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
58 {
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
59 return (altivec_check(op, type, bits, size) && type != TYPE_FLOAT);
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
60 }
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
61
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
62 static int altivec_check_float(int op, int type, int bits, int size)
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
63 {
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
64 return (altivec_check(op, type, bits, size) && type == TYPE_FLOAT);
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
65 }
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
66
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
67 static void altivec_ppcheck(int op, int type, int bits, int size)
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
68 {
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
69 /* old gcc had a broken partial implementation
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
70 * (why even bother adding it at all?) */
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
71 switch (op) {
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
72 case OP_MUL: printf("defined(vec_mul)"); break;
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
73 case OP_SPLAT: printf("defined(vec_splats)"); break;
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
74 }
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
75 }
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
76
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
77 static void altivec_splat(int op, int type, int bits, int size)
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
78 {
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
79 printf("\t");
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
80 gen_print_vtype(type, bits, size);
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
81 printf(" vec;\n");
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
82
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
83 puts("\tvec.altivec = vec_splats(x);");
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
84 puts("\treturn vec;");
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
85 }
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
86
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
87 static void altivec_load(int op, int type, int bits, int size)
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
88 {
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
89 printf("\t");
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
90 gen_print_vtype(type, bits, size);
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
91 printf(" vec;\n");
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
92
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
93 puts("\tvec.altivec = vec_perm(vec_ld(0, x), vec_ld(16, x), vec_lvsl(0, x));");
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
94 puts("\treturn vec;");
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
95 }
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
96
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
97 static void altivec_load_aligned(int op, int type, int bits, int size)
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
98 {
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
99 printf("\t");
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
100 gen_print_vtype(type, bits, size);
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
101 printf(" vec;\n");
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
102
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
103 puts("\tvec.altivec = vec_ld(0, x);");
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
104 puts("\treturn vec;");
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
105 }
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
106
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
107 static void altivec_store_aligned(int op, int type, int bits, int size)
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
108 {
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
109 puts("\tvec_st(vec.altivec, 0, x);");
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
110 }
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
111
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
112 /* no store? */
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
113
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
114 static void altivec_print_native_type(int type, int bits)
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
115 {
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
116 /* WITH DIRECTION AND MAGNITUDE! */
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
117 printf("vector ");
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
118
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
119 switch (type) {
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
120 case TYPE_INT:
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
121 printf("signed ");
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
122 break;
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
123 case TYPE_UINT:
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
124 printf("unsigned ");
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
125 break;
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
126 case TYPE_FLOAT:
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
127 /* nothing */
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
128 break;
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
129 }
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
130
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
131 switch (type) {
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
132 case TYPE_INT:
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
133 case TYPE_UINT:
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
134 switch (bits) {
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
135 case 8: printf("char"); break;
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
136 case 16: printf("short"); break;
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
137 case 32: printf("int"); break;
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
138 case 64: printf("long long"); break;
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
139 default: break;
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
140 }
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
141 break;
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
142 case TYPE_FLOAT:
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
143 switch (bits) {
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
144 case 32: printf("float"); break;
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
145 case 64: printf("double"); break;
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
146 default: break;
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
147 }
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
148 }
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
149 }
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
150
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
151 static void altivec_2op(int op, int type, int bits, int size)
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
152 {
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
153 static const char *op_altivec[] = {
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
154 [OP_ADD] = "add",
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
155 [OP_SUB] = "sub",
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
156 [OP_MUL] = "mul",
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
157 [OP_DIV] = "div",
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
158 [OP_MOD] = "mod",
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
159 [OP_AND] = "and",
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
160 [OP_OR] = "or",
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
161 [OP_XOR] = "xor",
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
162 [OP_CMPLT] = "cmplt",
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
163 [OP_CMPEQ] = "cmpeq",
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
164 [OP_CMPGT] = "cmpgt",
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
165 [OP_CMPLE] = "cmple",
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
166 [OP_CMPGE] = "cmpge",
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
167 [OP_MIN] = "min",
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
168 [OP_MAX] = "max",
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
169 [OP_AVG] = "avg",
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
170 [OP_LSHIFT] = "sl",
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
171 [OP_LRSHIFT] = "sr",
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
172 };
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
173
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
174 printf("\t");
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
175 gen_print_vtype(type, bits, size);
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
176 printf(" vec;\n");
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
177
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
178 if (op == OP_RSHIFT) {
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
179 printf("\tvec.altivec = vec_sr%s(vec1.altivec, vec2.altivec);\n", (type == TYPE_INT) ? "a" : "");
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
180 } else {
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
181 printf("\tvec.altivec = (");
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
182 altivec_print_native_type(type, bits);
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
183 printf(")vec_%s(vec1.altivec, vec2.altivec);\n", op_altivec[op]);
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
184 }
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
185
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
186 puts("\treturn vec;");
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
187 }
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
188
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
189 /* ------------------------------------------------------------------------ */
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
190
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
191 static struct op_impl op_impl[OP_FINAL_] = {
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
192 [OP_SPLAT] = {altivec_check, NULL, altivec_splat},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
193 [OP_LOAD_ALIGNED] = {altivec_check, NULL, altivec_load_aligned},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
194 [OP_LOAD] = {altivec_check, NULL, altivec_load},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
195 [OP_STORE_ALIGNED] = {altivec_check, NULL, altivec_store_aligned},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
196
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
197 /* arithmetic */
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
198 [OP_ADD] = {altivec_check, NULL, altivec_2op},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
199 [OP_SUB] = {altivec_check, NULL, altivec_2op},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
200 [OP_MUL] = {altivec_check, NULL, altivec_2op},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
201 #ifdef USE_VSX_EXTENSIONS
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
202 /* GCC fails to compile integer division, so limit to floats */
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
203 [OP_DIV] = {altivec_check_float, NULL, altivec_2op},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
204 #endif
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
205 #if 0
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
206 /* This is Power10. I don't have any Power10 hardware :)
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
207 * (well, I also don't have any VSX hardware. whatever) */
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
208 [OP_MOD] = {altivec_check_int, NULL, altivec_2op},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
209 #endif
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
210 [OP_AVG] = {altivec_check_int, NULL, altivec_2op},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
211
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
212 /* bitwise */
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
213 [OP_AND] = {altivec_check, NULL, altivec_2op},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
214 [OP_OR] = {altivec_check, NULL, altivec_2op},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
215 [OP_XOR] = {altivec_check, NULL, altivec_2op},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
216
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
217 /* min/max */
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
218 [OP_MIN] = {altivec_check, NULL, altivec_2op},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
219 [OP_MAX] = {altivec_check, NULL, altivec_2op},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
220
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
221 /* bitshift */
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
222 [OP_LSHIFT] = {altivec_check, NULL, altivec_2op},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
223 [OP_LRSHIFT] = {altivec_check, NULL, altivec_2op},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
224 [OP_RSHIFT] = {altivec_check, NULL, altivec_2op},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
225
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
226 /* comparison */
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
227 [OP_CMPLT] = {altivec_check, NULL, altivec_2op},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
228 #ifdef USE_VSX_EXTENSIONS
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
229 [OP_CMPLE] = {altivec_check, NULL, altivec_2op},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
230 #endif
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
231 [OP_CMPEQ] = {altivec_check, NULL, altivec_2op},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
232 #ifdef USE_VSX_EXTENSIONS
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
233 [OP_CMPGE] = {altivec_check, NULL, altivec_2op},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
234 #endif
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
235 [OP_CMPGT] = {altivec_check, NULL, altivec_2op},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
236 };
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
237
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
238
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
239 int main(void)
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
240 {
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
241 gen(op_impl,
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
242 #ifdef USE_POWER8_EXTENSIONS
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
243 "power8"
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
244 #elif defined(USE_VSX_EXTENSIONS)
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
245 "vsx"
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
246 #else
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
247 "altivec"
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
248 #endif
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
249 );
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
250 }