annotate gen/gengeneric.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 void op_builtin_pbody(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 const char *ops[OP_FINAL_] = {
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
32 [OP_ADD] = "+",
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
33 [OP_SUB] = "-",
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
34 [OP_MUL] = "*",
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
35 [OP_AND] = "&",
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
36 [OP_OR] = "|",
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
37 [OP_XOR] = "^",
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
38 };
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
39 int i;
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 for (i = 0; i < size; i++)
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
42 printf("\tvec1.generic[%d] = (vec1.generic[%d] %s vec2.generic[%d]);\n", i, i, ops[op], i);
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
43
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
44 puts("\treturn vec1;");
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
45
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
46 (void)bits;
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
47 }
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
48
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
49 static void op_builtin_avg_pbody(int op, int type, int bits, int size)
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
50 {
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
51 int i;
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 switch (type) {
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
54 case TYPE_INT:
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
55 printf("\t");
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
56 gen_print_stype(type, bits);
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
57 printf(" x_d_rem, y_d_rem, rem_d_quot, rem_d_rem;\n");
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 for (i = 0; i < size; i++)
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
60 printf(
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
61 "\tx_d_rem = (vec1.generic[%d] % 2);\n"
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
62 "\ty_d_rem = (vec2.generic[%d] % 2);\n"
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
63 "\trem_d_quot = ((x_d_rem + y_d_rem) / 2);\n"
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
64 "\trem_d_rem = ((x_d_rem + y_d_rem) % 2);\n"
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
65 "\n"
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
66 "\tvec1.generic[%d] = ((vec1.generic[%d] / 2) + (vec2.generic[%d] / 2)) + (rem_d_quot) + (rem_d_rem == 1);\n"
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
67 , i, i, i, i, i);
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
68 break;
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
69 case TYPE_UINT:
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("vec1.generic[%d] = (vec1.generic[%d] >> 1) + (vec2.generic[%d] >> 1) + ((vec1.generic[%d] | vec2.generic[%d]) & 1);\n", i, i, i, i, i);
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
72 break;
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
73 case TYPE_FLOAT:
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
74 /* this is probably fine. */
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
75 for (i = 0; i < size; i++)
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
76 printf("\tvec1.generic[%d] = (vec1.generic[%d] + vec2.generic[%d]) / 2;\n", i, i, i);
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
77 break;
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
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
80 printf("\treturn vec1;\n");
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
81 }
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 static void op_builtin_not_pbody(int op, int type, int bits, int size)
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
84 {
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
85 int i;
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 for (i = 0; i < size; i++)
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
88 printf("\tvec.generic[%d] = ~vec.generic[%d];\n", i, i);
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
89
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
90 puts("\treturn vec;");
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 op_builtin_shift_pbody(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 int i;
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 switch (type) {
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
98 case TYPE_UINT: {
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
99 const char *ops[] = {
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
100 [OP_LSHIFT] = "<<",
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
101 [OP_RSHIFT] = ">>",
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
102 [OP_LRSHIFT] = ">>",
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
103 };
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 for (i = 0; i < size; i++)
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
106 printf("\tvec1.generic[%d] %s= vec2.generic[%d];\n", i, ops[op]);
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
107 break;
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 case TYPE_INT: {
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
110 switch (op) {
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
111 case OP_LSHIFT:
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
112 case OP_LRSHIFT: {
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
113 const char *ops[] = {
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
114 [OP_LSHIFT] = "<<",
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
115 [OP_LRSHIFT] = ">>",
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
116 };
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
117
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
118 printf("\tunion { ");
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
119 gen_print_stype(TYPE_UINT, bits);
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
120 printf(" u; ");
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
121 gen_print_stype(TYPE_INT, bits);
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
122 puts(" s; } x;\n");
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
123
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
124 for (i = 0; i < size; i++)
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
125 printf(
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
126 "\tx.s = vec1.generic[%d];\n"
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
127 "\tx.u %s= vec2.generic[%d];\n"
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
128 "\tvec1.generic[%d] = x.s;\n",
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
129 i, ops[op], i, i);
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
130 break;
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
131 }
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
132 case OP_RSHIFT:
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
133 for (i = 0; i < size; i++)
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
134 printf("vec1.generic[%d] = ((~vec1.generic[%d]) >> vec2.generic[%d]);\n", i, i, i);
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
135 break;
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
136 }
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 }
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
139 }
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 puts("\treturn vec1;");
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 op_builtin_nonzero_pbody(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 const char *ops[OP_FINAL_] = {
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
147 [OP_DIV] = "/",
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
148 [OP_MOD] = "%",
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 int i;
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
151
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
152 if (op == OP_MOD && type == TYPE_FLOAT) {
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
153 for (i = 0; i < size; i++)
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
154 printf("\tvec1.generic[%d] = (vec2.generic[%d] ? fmod(vec1.generic[%d], vec2.generic[%d]) : 0);\n", i, i, i, i);
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
155 } else {
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
156 for (i = 0; i < size; i++)
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
157 printf("\tvec1.generic[%d] = (vec2.generic[%d] ? (vec1.generic[%d] %s vec2.generic[%d]) : 0);\n", i, i, i, ops[op], i);
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
158 }
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
159
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
160 puts("\treturn vec1;");
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
161
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
162 (void)bits;
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
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
165 static void op_cmp_pbody(int op, int type, int bits, int size)
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 const char *ops[OP_FINAL_] = {
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
168 [OP_CMPLT] = "<",
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
169 [OP_CMPLE] = "<=",
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
170 [OP_CMPEQ] = "==",
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
171 [OP_CMPGE] = ">=",
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
172 [OP_CMPGT] = ">",
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 int i;
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
175
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
176 /* this is portable for int uint and float*/
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
177 for (i = 0; i < size; i++)
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
178 printf("\tmemset(&vec1.generic[%d], (vec1.generic[%d] %s vec2.generic[%d]) ? 0xFF : 0, %d);\n", i, i, ops[op], i, bits / 8);
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
179
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
180 puts("\treturn vec1;");
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
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
183 static void op_minmax_pbody(int op, int type, int bits, int size)
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 const char *ops[OP_FINAL_] = {
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
186 [OP_MIN] = "<",
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
187 [OP_MAX] = ">",
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 int i;
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 for (i = 0; i < size; i++)
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
192 printf("\tvec1.generic[%d] = (vec1.generic[%d] %s vec2.generic[%d]) ? (vec1.generic[%d]) : (vec2.generic[%d]);\n", i, i, ops[op], i, i, i);
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
193
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
194 puts("\treturn vec1;");
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
195 }
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 static void op_splat_pbody(int op, int type, int bits, int size)
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 int i;
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
200
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
201 printf("\t");
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
202 gen_print_vtype(type, bits, size);
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
203 printf(" vec;\n");
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
204
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
205 for (i = 0; i < size; i++)
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
206 printf("\tvec.generic[%d] = x;\n", i);
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 puts("\treturn vec;");
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
209 }
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
210
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
211 static void op_load_pbody(int op, int type, int bits, int size)
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
212 {
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
213 int i;
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 printf("\t");
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
216 gen_print_vtype(type, bits, size);
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
217 printf(" vec;\n");
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
218
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
219 printf("\tmemcpy(vec.generic, x, %d);\n", (bits / 8) * size);
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 puts("\treturn vec;");
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
222 }
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
223
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
224 static void op_store_pbody(int op, int type, int bits, int size)
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 printf("\tmemcpy(x, vec.generic, %d);\n", (bits / 8) * size);
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
227 }
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
228
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
229 /* ------------------------------------------------------------------------ */
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
230
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
231 static struct op_impl op_impl[OP_FINAL_] = {
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
232 [OP_SPLAT] = {NULL, NULL, op_splat_pbody},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
233 [OP_LOAD_ALIGNED] = {NULL, NULL, op_load_pbody},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
234 [OP_LOAD] = {NULL, NULL, op_load_pbody},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
235 [OP_STORE_ALIGNED] = {NULL, NULL, op_store_pbody},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
236 [OP_STORE] = {NULL, NULL, op_store_pbody},
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 /* arithmetic */
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
239 [OP_ADD] = {NULL, NULL, op_builtin_pbody},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
240 [OP_SUB] = {NULL, NULL, op_builtin_pbody},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
241 [OP_MUL] = {NULL, NULL, op_builtin_pbody},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
242 [OP_DIV] = {NULL, NULL, op_builtin_nonzero_pbody},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
243 [OP_MOD] = {NULL, NULL, op_builtin_nonzero_pbody},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
244 [OP_AVG] = {NULL, NULL, op_builtin_avg_pbody},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
245
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
246 /* bitwise */
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
247 [OP_AND] = {NULL, NULL, op_builtin_pbody},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
248 [OP_OR] = {NULL, NULL, op_builtin_pbody},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
249 [OP_XOR] = {NULL, NULL, op_builtin_pbody},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
250 [OP_NOT] = {NULL, NULL, op_builtin_not_pbody},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
251
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
252 /* min/max */
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
253 [OP_MIN] = {NULL, NULL, op_minmax_pbody},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
254 [OP_MAX] = {NULL, NULL, op_minmax_pbody},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
255
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
256 /* bitshift */
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
257 [OP_LSHIFT] = {NULL, NULL, op_builtin_shift_pbody},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
258 [OP_LRSHIFT] = {NULL, NULL, op_builtin_shift_pbody},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
259 [OP_RSHIFT] = {NULL, NULL, op_builtin_shift_pbody},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
260
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
261 /* comparison */
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
262 [OP_CMPLT] = {NULL, NULL, op_cmp_pbody},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
263 [OP_CMPLE] = {NULL, NULL, op_cmp_pbody},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
264 [OP_CMPEQ] = {NULL, NULL, op_cmp_pbody},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
265 [OP_CMPGE] = {NULL, NULL, op_cmp_pbody},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
266 [OP_CMPGT] = {NULL, NULL, op_cmp_pbody},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
267 };
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
268
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
269 int main(void)
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
270 {
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
271 gen(op_impl, "generic");
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
272
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
273 return 0;
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
274 }