Mercurial > vec
diff 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 |
line wrap: on
line diff
--- a/gen/gengeneric.c Wed Apr 30 18:36:38 2025 -0400 +++ b/gen/gengeneric.c Sat Aug 09 15:55:59 2025 -0400 @@ -130,6 +130,7 @@ break; } case OP_RSHIFT: + /* ehhhh this feels weird ... */ for (i = 0; i < size; i++) printf("vec1.generic[%d] = ((~vec1.generic[%d]) >> vec2.generic[%d]);\n", i, i, i); break; @@ -151,7 +152,7 @@ if (op == OP_MOD && type == TYPE_FLOAT) { for (i = 0; i < size; i++) - printf("\tvec1.generic[%d] = (vec2.generic[%d] ? fmod(vec1.generic[%d], vec2.generic[%d]) : 0);\n", i, i, i, i); + printf("\tvec1.generic[%d] = (vec2.generic[%d] ? fmod%s(vec1.generic[%d], vec2.generic[%d]) : 0);\n", i, i, (bits == 32) ? "f" : "", i, i); } else { for (i = 0; i < size; i++) printf("\tvec1.generic[%d] = (vec2.generic[%d] ? (vec1.generic[%d] %s vec2.generic[%d]) : 0);\n", i, i, i, ops[op], i); @@ -226,6 +227,22 @@ printf("\tmemcpy(x, vec.generic, %d);\n", (bits / 8) * size); } +static void op_fmath_pbody(int op, int type, int bits, int size) +{ + static const char *ops[OP_FINAL_] = { + [OP_FLOOR] = "floor", + [OP_CEIL] = "ceil", + [OP_ROUND] = "round", + [OP_TRUNC] = "trunc", + }; + int i; + + for (i = 0; i < size; i++) + printf("\tvec.generic[%d] = %s%s(vec.generic[%d]);\n", i, ops[op], (bits == 32) ? "f" : "", i); + + puts("\treturn vec;"); +} + /* ------------------------------------------------------------------------ */ static struct op_impl op_impl[OP_FINAL_] = { @@ -264,6 +281,11 @@ [OP_CMPEQ] = {NULL, NULL, op_cmp_pbody}, [OP_CMPGE] = {NULL, NULL, op_cmp_pbody}, [OP_CMPGT] = {NULL, NULL, op_cmp_pbody}, + + [OP_FLOOR] = {NULL, NULL, op_fmath_pbody}, + [OP_ROUND] = {NULL, NULL, op_fmath_pbody}, + [OP_CEIL] = {NULL, NULL, op_fmath_pbody}, + [OP_TRUNC] = {NULL, NULL, op_fmath_pbody}, }; int main(void)