comparison 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
comparison
equal deleted inserted replaced
45:7955bed1d169 46:31cee67540b5
128 "\tvec1.generic[%d] = x.s;\n", 128 "\tvec1.generic[%d] = x.s;\n",
129 i, ops[op], i, i); 129 i, ops[op], i, i);
130 break; 130 break;
131 } 131 }
132 case OP_RSHIFT: 132 case OP_RSHIFT:
133 /* ehhhh this feels weird ... */
133 for (i = 0; i < size; i++) 134 for (i = 0; i < size; i++)
134 printf("vec1.generic[%d] = ((~vec1.generic[%d]) >> vec2.generic[%d]);\n", i, i, i); 135 printf("vec1.generic[%d] = ((~vec1.generic[%d]) >> vec2.generic[%d]);\n", i, i, i);
135 break; 136 break;
136 } 137 }
137 break; 138 break;
149 }; 150 };
150 int i; 151 int i;
151 152
152 if (op == OP_MOD && type == TYPE_FLOAT) { 153 if (op == OP_MOD && type == TYPE_FLOAT) {
153 for (i = 0; i < size; i++) 154 for (i = 0; i < size; i++)
154 printf("\tvec1.generic[%d] = (vec2.generic[%d] ? fmod(vec1.generic[%d], vec2.generic[%d]) : 0);\n", i, i, i, i); 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);
155 } else { 156 } else {
156 for (i = 0; i < size; i++) 157 for (i = 0; i < size; i++)
157 printf("\tvec1.generic[%d] = (vec2.generic[%d] ? (vec1.generic[%d] %s vec2.generic[%d]) : 0);\n", i, i, i, ops[op], i); 158 printf("\tvec1.generic[%d] = (vec2.generic[%d] ? (vec1.generic[%d] %s vec2.generic[%d]) : 0);\n", i, i, i, ops[op], i);
158 } 159 }
159 160
222 } 223 }
223 224
224 static void op_store_pbody(int op, int type, int bits, int size) 225 static void op_store_pbody(int op, int type, int bits, int size)
225 { 226 {
226 printf("\tmemcpy(x, vec.generic, %d);\n", (bits / 8) * size); 227 printf("\tmemcpy(x, vec.generic, %d);\n", (bits / 8) * size);
228 }
229
230 static void op_fmath_pbody(int op, int type, int bits, int size)
231 {
232 static const char *ops[OP_FINAL_] = {
233 [OP_FLOOR] = "floor",
234 [OP_CEIL] = "ceil",
235 [OP_ROUND] = "round",
236 [OP_TRUNC] = "trunc",
237 };
238 int i;
239
240 for (i = 0; i < size; i++)
241 printf("\tvec.generic[%d] = %s%s(vec.generic[%d]);\n", i, ops[op], (bits == 32) ? "f" : "", i);
242
243 puts("\treturn vec;");
227 } 244 }
228 245
229 /* ------------------------------------------------------------------------ */ 246 /* ------------------------------------------------------------------------ */
230 247
231 static struct op_impl op_impl[OP_FINAL_] = { 248 static struct op_impl op_impl[OP_FINAL_] = {
262 [OP_CMPLT] = {NULL, NULL, op_cmp_pbody}, 279 [OP_CMPLT] = {NULL, NULL, op_cmp_pbody},
263 [OP_CMPLE] = {NULL, NULL, op_cmp_pbody}, 280 [OP_CMPLE] = {NULL, NULL, op_cmp_pbody},
264 [OP_CMPEQ] = {NULL, NULL, op_cmp_pbody}, 281 [OP_CMPEQ] = {NULL, NULL, op_cmp_pbody},
265 [OP_CMPGE] = {NULL, NULL, op_cmp_pbody}, 282 [OP_CMPGE] = {NULL, NULL, op_cmp_pbody},
266 [OP_CMPGT] = {NULL, NULL, op_cmp_pbody}, 283 [OP_CMPGT] = {NULL, NULL, op_cmp_pbody},
284
285 [OP_FLOOR] = {NULL, NULL, op_fmath_pbody},
286 [OP_ROUND] = {NULL, NULL, op_fmath_pbody},
287 [OP_CEIL] = {NULL, NULL, op_fmath_pbody},
288 [OP_TRUNC] = {NULL, NULL, op_fmath_pbody},
267 }; 289 };
268 290
269 int main(void) 291 int main(void)
270 { 292 {
271 gen(op_impl, "generic"); 293 gen(op_impl, "generic");