annotate gen/gengcc.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 static int gcc_minmax_only_integer(int op, int type, int bits, int size)
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 return (type == TYPE_INT || type == TYPE_UINT);
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
32 }
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 /* ------------------------------------------------------------------------ */
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 static void pp_gcc_prereq_4_3_0(int op, int type, int bits, int size)
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
37 {
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
38 printf("VEC_GNUC_ATLEAST(4, 3, 0)");
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
39 }
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
40
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
41 static void gcc_print_easy_op(int op, int type, int bits, int size)
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
42 {
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
43 static const char *op_builtins[] = {
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
44 [OP_ADD] = "+",
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
45 [OP_SUB] = "-",
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
46 [OP_MUL] = "*",
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
47 [OP_DIV] = "/",
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
48 [OP_MOD] = "%",
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
49 [OP_AND] = "&",
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
50 [OP_OR] = "|",
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
51 [OP_XOR] = "^",
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
52 [OP_CMPLT] = "<",
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
53 [OP_CMPLE] = "<=",
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
54 [OP_CMPEQ] = "==",
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
55 [OP_CMPGE] = ">=",
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
56 [OP_CMPGT] = ">",
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
57 };
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 printf("\tvec1.gcc = (vec1.gcc %s vec2.gcc);\n", op_builtins[op]);
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
60 printf("\treturn vec1;\n");
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
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
63 static void gcc_print_splat(int op, int type, int bits, int size)
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
64 {
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
65 int i;
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 printf("\t");
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
68 gen_print_vtype(type, bits, size);
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
69 printf(" vec;\n");
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
70 for (i = 0; i < size; i++)
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
71 printf("\tvec.gcc[%d] = x;\n", i);
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
72 printf("\treturn vec;\n");
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
73 }
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 static void gcc_print_load_aligned(int op, int type, int bits, int size)
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 printf("\t");
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
78 gen_print_vtype(type, bits, size);
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
79 printf(" vec;\n");
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
80 puts("\tvec.gcc = *(__typeof__(vec.gcc) *)x;");
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
81 printf("\treturn 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
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
84 static void gcc_print_load(int op, int type, int bits, int size)
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 printf("\t");
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
87 gen_print_vtype(type, bits, size);
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
88 printf(" vec;\n");
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
89 puts("\tmemcpy(&vec, x, sizeof(vec));");
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
90 printf("\treturn vec;\n");
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
91 }
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 static void gcc_print_store_aligned(int op, int type, int bits, int size)
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
94 {
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
95 puts("\t*(__typeof__(vec.gcc) *)x = vec.gcc;");
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
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
98 static void gcc_print_store(int op, int type, int bits, int size)
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
99 {
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
100 puts("\tmemcpy(x, &vec, sizeof(vec));");
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
101 }
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 static void gcc_print_rorlshift(int op, int type, int bits, int size)
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
104 {
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
105 static const char *op_builtins[] = {
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
106 [OP_LSHIFT] = "<<",
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
107 [OP_RSHIFT] = ">>",
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
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
110 printf("\tvec1.gcc = (vec1.gcc %s vec2.gcc);\n", op_builtins[op]);
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
111 printf("\treturn vec1;\n");
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
112 }
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 gcc_print_lrshift(int op, int type, int bits, int size)
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 printf("\tvec1.gcc = (__typeof__(vec1.gcc))((vec_uint%d __attribute__((__vector_size__(%d))))vec1.gcc >> vec2.gcc);\n", bits, bits * size / 8);
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
117 printf("\treturn vec1;\n");
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
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
120 static void gcc_print_minmax(int op, int type, int bits, int size)
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
121 {
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
122 static const char *op_builtins[] = {
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
123 [OP_MIN] = "<",
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
124 [OP_MAX] = ">"
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
125 };
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
126
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
127 switch (type) {
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
128 case TYPE_INT:
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
129 case TYPE_UINT:
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
130 /* yay */
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
131 printf("\t");
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
132 gen_print_vtype(type, bits, size);
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
133 printf(" mask;\n");
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
134 printf("\tmask.gcc = (vec1.gcc %s vec2.gcc);\n", op_builtins[op]);
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
135 printf("\tvec1.gcc = (vec1.gcc & mask.gcc) | (vec2.gcc & ~mask.gcc);\n");
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
136 printf("\treturn vec1;\n");
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
137 break;
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
138 default:
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
139 /* hm? */
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
140 break;
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
141 }
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
142 }
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
143
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
144 static void gcc_print_avg(int op, int type, int bits, int size)
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
145 {
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
146 switch (type) {
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
147 case TYPE_INT:
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
148 printf("\tvint%dx%d ones = vint%dx%d_splat(1);\n", bits, size, bits, size);
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
149 puts("\t__typeof__(vec1.gcc) x_d_rem = (vec1.gcc % 2);");
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
150 puts("\t__typeof__(vec1.gcc) y_d_rem = (vec2.gcc % 2);");
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
151 puts("\t__typeof__(vec1.gcc) rem_d_quot = ((x_d_rem + y_d_rem) / 2);");
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
152 puts("\t__typeof__(vec1.gcc) rem_d_rem = ((x_d_rem + y_d_rem) % 2);");
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
153 puts("");
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
154 printf("\tvec1.gcc = ((vec1.gcc / 2) + (vec2.gcc / 2)) + (rem_d_quot) + ((rem_d_rem == 1) & ones.gcc);\n");
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
155 break;
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
156 case TYPE_UINT:
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
157 printf("\tvec1.gcc = (vec1.gcc >> 1) + (vec2.gcc >> 1) + ((vec1.gcc | vec2.gcc) & 1);\n");
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
158 break;
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
159 case TYPE_FLOAT:
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
160 printf("\tvec1.gcc = (vec1.gcc + vec2.gcc) / 2;\n");
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
161 break;
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
162 }
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
163
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
164 printf("\treturn vec1;\n");
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
165 }
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
166
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
167 static void gcc_print_not(int op, int type, int bits, int size)
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
168 {
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
169 printf("\tvec.gcc = ~vec.gcc;\n");
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
170 printf("\treturn vec;\n");
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
171 }
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
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
175 static struct op_impl op_impl[OP_FINAL_] = {
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
176 [OP_SPLAT] = {NULL, NULL, gcc_print_splat},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
177 [OP_LOAD_ALIGNED] = {NULL, NULL, gcc_print_load_aligned},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
178 [OP_LOAD] = {NULL, NULL, gcc_print_load},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
179 [OP_STORE_ALIGNED] = {NULL, NULL, gcc_print_store_aligned},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
180 [OP_STORE] = {NULL, NULL, gcc_print_store},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
181
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
182 /* arithmetic */
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
183 [OP_ADD] = {NULL, NULL, gcc_print_easy_op},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
184 [OP_SUB] = {NULL, NULL, gcc_print_easy_op},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
185 [OP_MUL] = {NULL, NULL, gcc_print_easy_op},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
186 #if 0
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
187 /* no defined divide by zero behavior */
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
188 [OP_DIV] = {NULL, NULL, gcc_print_easy_op},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
189 [OP_MOD] = {NULL, NULL, gcc_print_easy_op},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
190 #endif
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
191 [OP_AVG] = {NULL, pp_gcc_prereq_4_3_0, gcc_print_avg},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
192
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
193 /* bitwise */
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
194 [OP_AND] = {NULL, NULL, gcc_print_easy_op},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
195 [OP_OR] = {NULL, NULL, gcc_print_easy_op},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
196 [OP_XOR] = {NULL, NULL, gcc_print_easy_op},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
197 [OP_NOT] = {NULL, NULL, gcc_print_not},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
198
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
199 /* min/max */
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
200 [OP_MIN] = {gcc_minmax_only_integer, pp_gcc_prereq_4_3_0, gcc_print_minmax},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
201 [OP_MAX] = {gcc_minmax_only_integer, pp_gcc_prereq_4_3_0, gcc_print_minmax},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
202
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
203 /* bitshift */
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
204 [OP_LSHIFT] = {NULL, pp_gcc_prereq_4_3_0, gcc_print_rorlshift},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
205 [OP_LRSHIFT] = {NULL, pp_gcc_prereq_4_3_0, gcc_print_lrshift},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
206 [OP_RSHIFT] = {NULL, pp_gcc_prereq_4_3_0, gcc_print_rorlshift},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
207
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
208 /* comparison */
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
209 [OP_CMPLT] = {NULL, pp_gcc_prereq_4_3_0, gcc_print_easy_op},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
210 [OP_CMPLE] = {NULL, pp_gcc_prereq_4_3_0, gcc_print_easy_op},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
211 [OP_CMPEQ] = {NULL, pp_gcc_prereq_4_3_0, gcc_print_easy_op},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
212 [OP_CMPGE] = {NULL, pp_gcc_prereq_4_3_0, gcc_print_easy_op},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
213 [OP_CMPGT] = {NULL, pp_gcc_prereq_4_3_0, gcc_print_easy_op},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
214 };
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
215
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
216 int main(void)
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
217 {
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
218 gen(op_impl, "gcc");
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
219 }