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)