annotate gen/gengeneric.c @ 46:31cee67540b5

f32/f64: add floor, ceil, round, and trunc operations we also need saturated add sub mul etc
author Paper <paper@tflc.us>
date Sat, 09 Aug 2025 15:55:59 -0400
parents 7955bed1d169
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:
46
31cee67540b5 f32/f64: add floor, ceil, round, and trunc operations
Paper <paper@tflc.us>
parents: 45
diff changeset
133 /* ehhhh this feels weird ... */
45
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
134 for (i = 0; i < size; i++)
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
135 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
136 break;
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
137 }
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
138 break;
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
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
142 puts("\treturn vec1;");
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
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
145 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
146 {
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
147 const char *ops[OP_FINAL_] = {
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
148 [OP_DIV] = "/",
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
149 [OP_MOD] = "%",
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 int i;
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 if (op == OP_MOD && type == TYPE_FLOAT) {
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
154 for (i = 0; i < size; i++)
46
31cee67540b5 f32/f64: add floor, ceil, round, and trunc operations
Paper <paper@tflc.us>
parents: 45
diff changeset
155 printf("\tvec1.generic[%d] = (vec2.generic[%d] ? fmod%s(vec1.generic[%d], vec2.generic[%d]) : 0);\n", i, i, (bits == 32) ? "f" : "", i, i);
45
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
156 } else {
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
157 for (i = 0; i < size; i++)
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
158 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
159 }
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
160
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
161 puts("\treturn vec1;");
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 (void)bits;
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
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
166 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
167 {
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
168 const char *ops[OP_FINAL_] = {
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
169 [OP_CMPLT] = "<",
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
170 [OP_CMPLE] = "<=",
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
171 [OP_CMPEQ] = "==",
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
172 [OP_CMPGE] = ">=",
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
173 [OP_CMPGT] = ">",
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 int i;
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
176
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
177 /* this is portable for int uint and float*/
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
178 for (i = 0; i < size; i++)
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
179 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
180
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
181 puts("\treturn vec1;");
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
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
184 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
185 {
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
186 const char *ops[OP_FINAL_] = {
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
187 [OP_MIN] = "<",
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
188 [OP_MAX] = ">",
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 int i;
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
191
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
192 for (i = 0; i < size; i++)
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
193 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
194
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
195 puts("\treturn vec1;");
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
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
198 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
199 {
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
200 int i;
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
201
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
202 printf("\t");
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
203 gen_print_vtype(type, bits, size);
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
204 printf(" vec;\n");
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
205
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
206 for (i = 0; i < size; i++)
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
207 printf("\tvec.generic[%d] = x;\n", i);
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
208
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
209 puts("\treturn vec;");
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
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
212 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
213 {
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
214 int i;
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 printf("\t");
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
217 gen_print_vtype(type, bits, size);
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
218 printf(" vec;\n");
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
219
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
220 printf("\tmemcpy(vec.generic, x, %d);\n", (bits / 8) * size);
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
221
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
222 puts("\treturn vec;");
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
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
225 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
226 {
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
227 printf("\tmemcpy(x, vec.generic, %d);\n", (bits / 8) * size);
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
46
31cee67540b5 f32/f64: add floor, ceil, round, and trunc operations
Paper <paper@tflc.us>
parents: 45
diff changeset
230 static void op_fmath_pbody(int op, int type, int bits, int size)
31cee67540b5 f32/f64: add floor, ceil, round, and trunc operations
Paper <paper@tflc.us>
parents: 45
diff changeset
231 {
31cee67540b5 f32/f64: add floor, ceil, round, and trunc operations
Paper <paper@tflc.us>
parents: 45
diff changeset
232 static const char *ops[OP_FINAL_] = {
31cee67540b5 f32/f64: add floor, ceil, round, and trunc operations
Paper <paper@tflc.us>
parents: 45
diff changeset
233 [OP_FLOOR] = "floor",
31cee67540b5 f32/f64: add floor, ceil, round, and trunc operations
Paper <paper@tflc.us>
parents: 45
diff changeset
234 [OP_CEIL] = "ceil",
31cee67540b5 f32/f64: add floor, ceil, round, and trunc operations
Paper <paper@tflc.us>
parents: 45
diff changeset
235 [OP_ROUND] = "round",
31cee67540b5 f32/f64: add floor, ceil, round, and trunc operations
Paper <paper@tflc.us>
parents: 45
diff changeset
236 [OP_TRUNC] = "trunc",
31cee67540b5 f32/f64: add floor, ceil, round, and trunc operations
Paper <paper@tflc.us>
parents: 45
diff changeset
237 };
31cee67540b5 f32/f64: add floor, ceil, round, and trunc operations
Paper <paper@tflc.us>
parents: 45
diff changeset
238 int i;
31cee67540b5 f32/f64: add floor, ceil, round, and trunc operations
Paper <paper@tflc.us>
parents: 45
diff changeset
239
31cee67540b5 f32/f64: add floor, ceil, round, and trunc operations
Paper <paper@tflc.us>
parents: 45
diff changeset
240 for (i = 0; i < size; i++)
31cee67540b5 f32/f64: add floor, ceil, round, and trunc operations
Paper <paper@tflc.us>
parents: 45
diff changeset
241 printf("\tvec.generic[%d] = %s%s(vec.generic[%d]);\n", i, ops[op], (bits == 32) ? "f" : "", i);
31cee67540b5 f32/f64: add floor, ceil, round, and trunc operations
Paper <paper@tflc.us>
parents: 45
diff changeset
242
31cee67540b5 f32/f64: add floor, ceil, round, and trunc operations
Paper <paper@tflc.us>
parents: 45
diff changeset
243 puts("\treturn vec;");
31cee67540b5 f32/f64: add floor, ceil, round, and trunc operations
Paper <paper@tflc.us>
parents: 45
diff changeset
244 }
31cee67540b5 f32/f64: add floor, ceil, round, and trunc operations
Paper <paper@tflc.us>
parents: 45
diff changeset
245
45
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
246 /* ------------------------------------------------------------------------ */
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
247
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
248 static struct op_impl op_impl[OP_FINAL_] = {
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
249 [OP_SPLAT] = {NULL, NULL, op_splat_pbody},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
250 [OP_LOAD_ALIGNED] = {NULL, NULL, op_load_pbody},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
251 [OP_LOAD] = {NULL, NULL, op_load_pbody},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
252 [OP_STORE_ALIGNED] = {NULL, NULL, op_store_pbody},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
253 [OP_STORE] = {NULL, NULL, op_store_pbody},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
254
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
255 /* arithmetic */
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
256 [OP_ADD] = {NULL, NULL, op_builtin_pbody},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
257 [OP_SUB] = {NULL, NULL, op_builtin_pbody},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
258 [OP_MUL] = {NULL, NULL, op_builtin_pbody},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
259 [OP_DIV] = {NULL, NULL, op_builtin_nonzero_pbody},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
260 [OP_MOD] = {NULL, NULL, op_builtin_nonzero_pbody},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
261 [OP_AVG] = {NULL, NULL, op_builtin_avg_pbody},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
262
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
263 /* bitwise */
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
264 [OP_AND] = {NULL, NULL, op_builtin_pbody},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
265 [OP_OR] = {NULL, NULL, op_builtin_pbody},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
266 [OP_XOR] = {NULL, NULL, op_builtin_pbody},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
267 [OP_NOT] = {NULL, NULL, op_builtin_not_pbody},
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 /* min/max */
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
270 [OP_MIN] = {NULL, NULL, op_minmax_pbody},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
271 [OP_MAX] = {NULL, NULL, op_minmax_pbody},
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 /* bitshift */
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
274 [OP_LSHIFT] = {NULL, NULL, op_builtin_shift_pbody},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
275 [OP_LRSHIFT] = {NULL, NULL, op_builtin_shift_pbody},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
276 [OP_RSHIFT] = {NULL, NULL, op_builtin_shift_pbody},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
277
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
278 /* comparison */
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
279 [OP_CMPLT] = {NULL, NULL, op_cmp_pbody},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
280 [OP_CMPLE] = {NULL, NULL, op_cmp_pbody},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
281 [OP_CMPEQ] = {NULL, NULL, op_cmp_pbody},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
282 [OP_CMPGE] = {NULL, NULL, op_cmp_pbody},
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
283 [OP_CMPGT] = {NULL, NULL, op_cmp_pbody},
46
31cee67540b5 f32/f64: add floor, ceil, round, and trunc operations
Paper <paper@tflc.us>
parents: 45
diff changeset
284
31cee67540b5 f32/f64: add floor, ceil, round, and trunc operations
Paper <paper@tflc.us>
parents: 45
diff changeset
285 [OP_FLOOR] = {NULL, NULL, op_fmath_pbody},
31cee67540b5 f32/f64: add floor, ceil, round, and trunc operations
Paper <paper@tflc.us>
parents: 45
diff changeset
286 [OP_ROUND] = {NULL, NULL, op_fmath_pbody},
31cee67540b5 f32/f64: add floor, ceil, round, and trunc operations
Paper <paper@tflc.us>
parents: 45
diff changeset
287 [OP_CEIL] = {NULL, NULL, op_fmath_pbody},
31cee67540b5 f32/f64: add floor, ceil, round, and trunc operations
Paper <paper@tflc.us>
parents: 45
diff changeset
288 [OP_TRUNC] = {NULL, NULL, op_fmath_pbody},
45
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
289 };
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
290
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
291 int main(void)
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
292 {
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
293 gen(op_impl, "generic");
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
294
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
295 return 0;
7955bed1d169 *: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff changeset
296 }