aboutsummaryrefslogtreecommitdiff
path: root/fptr_ast/main.c
diff options
context:
space:
mode:
authorKimplul <kimi.h.kuparinen@gmail.com>2025-08-31 14:25:07 +0300
committerKimplul <kimi.h.kuparinen@gmail.com>2025-08-31 14:25:07 +0300
commita0c6ff2c222beb72493f2e40ed27492061dfdf22 (patch)
treea3a8c8279135fb92e3032dc85e9e4c6a06ca71e2 /fptr_ast/main.c
downloadplayground-a0c6ff2c222beb72493f2e40ed27492061dfdf22.tar.gz
playground-a0c6ff2c222beb72493f2e40ed27492061dfdf22.zip
initial fptr ast programs
Diffstat (limited to 'fptr_ast/main.c')
-rw-r--r--fptr_ast/main.c155
1 files changed, 155 insertions, 0 deletions
diff --git a/fptr_ast/main.c b/fptr_ast/main.c
new file mode 100644
index 0000000..84d0b17
--- /dev/null
+++ b/fptr_ast/main.c
@@ -0,0 +1,155 @@
+#include <stdio.h>
+#include "common.h"
+
+#if defined(STRUCT)
+#include "struct.c"
+#elif defined(FPTR)
+#include "fptr.c"
+#endif
+
+int main()
+{
+ /* predefine variables so gen_varref can just return a pointer to speed
+ * things up and hopefully match real AST runners more closely */
+ proc *proc = gen_proc(
+ /* input parameters, pointers to matrixes
+ * MATRIX_SIZE*MATRIX_SIZE */
+ "A", "B", "C",
+ /* temporary variables */
+ "R", "I", "J", "K");
+
+ /* A[I][K] */
+ node *fetch_a =
+ gen_load(
+ gen_add(
+ gen_var(proc, "A"),
+ gen_mul(
+ gen_const(sizeof(intptr_t)),
+ gen_add(
+ gen_var(proc, "K"),
+ gen_mul(
+ gen_var(proc, "I"),
+ gen_const(MATRIX_SIZE))))));
+
+ /* B[K][J] */
+ node *fetch_b =
+ gen_load(
+ gen_add(
+ gen_var(proc, "B"),
+ gen_mul(
+ gen_const(sizeof(intptr_t)),
+ gen_add(
+ gen_var(proc, "J"),
+ gen_mul(
+ gen_var(proc, "K"),
+ gen_const(MATRIX_SIZE))))));
+
+ /* R += fetch_a * fetch_b */
+ node *inner_body =
+ gen_assign(
+ gen_varref(proc, "R"),
+ gen_add(
+ gen_var(proc, "R"),
+ gen_mul(fetch_a, fetch_b)));
+
+ /* for (intptr_t K = 0; K < MATRIX_SIZE; ++K) inner_body */
+ node *inner_loop =
+ gen_for(
+ gen_assign(
+ gen_varref(proc, "K"),
+ gen_const(0)),
+
+ gen_lt(
+ gen_var(proc, "K"),
+ gen_const(MATRIX_SIZE)),
+
+ gen_assign(
+ gen_varref(proc, "K"),
+ gen_add(
+ gen_var(proc, "K"),
+ gen_const(1))),
+
+ inner_body);
+
+ /* &C[I][J] */
+ node *ref_c =
+ gen_add(
+ gen_var(proc, "C"),
+ gen_mul(
+ gen_const(sizeof(intptr_t)),
+ gen_add(
+ gen_var(proc, "J"),
+ gen_mul(
+ gen_var(proc, "I"),
+ gen_const(MATRIX_SIZE)))));
+
+ /* R = 0; inner_loop; *ref_c = R */
+ node *midder_body =
+ gen_body(
+ gen_assign(
+ gen_varref(proc, "R"),
+ gen_const(0)),
+
+ inner_loop,
+
+ gen_store(
+ ref_c,
+ gen_var(proc, "R")));
+
+ /* for (intptr_t J = 0; J < MATRIX_SIZE; ++J) midder_body */
+ node *midder_loop =
+ gen_for(
+ gen_assign(
+ gen_varref(proc, "J"),
+ gen_const(0)),
+
+ gen_lt(
+ gen_var(proc, "J"),
+ gen_const(MATRIX_SIZE)),
+
+ gen_assign(
+ gen_varref(proc, "J"),
+ gen_add(
+ gen_var(proc, "J"),
+ gen_const(1))),
+
+ midder_body);
+
+ /* for (intptr_t I = 0; I < MATRIX_SIZE; ++I) midder_loop */
+ node *outer_loop =
+ gen_for(
+ gen_assign(
+ gen_varref(proc, "I"),
+ gen_const(0)),
+
+ gen_lt(
+ gen_var(proc, "I"),
+ gen_const(MATRIX_SIZE)),
+
+ gen_assign(
+ gen_varref(proc, "I"),
+ gen_add(
+ gen_var(proc, "I"),
+ gen_const(1))),
+
+ midder_loop);
+
+ intptr_t *A = calloc(MATRIX_SIZE * MATRIX_SIZE, sizeof(intptr_t));
+ assert(A);
+
+ intptr_t *B = calloc(MATRIX_SIZE * MATRIX_SIZE, sizeof(intptr_t));
+ assert(B);
+
+ intptr_t *C = calloc(MATRIX_SIZE * MATRIX_SIZE, sizeof(intptr_t));
+ assert(C);
+
+ init_matrices(A, B);
+
+ proc_set(proc, "A", (intptr_t)A);
+ proc_set(proc, "B", (intptr_t)B);
+ proc_set(proc, "C", (intptr_t)C);
+
+ run(outer_loop);
+
+ printf("%zu\n", hash(C));
+}