From e9f36a3c2d35a166a36a854f696c3a8607526007 Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Fri, 28 Nov 2025 21:37:28 -0500 Subject: [PATCH] xo-interpreter: multiply (i64) primitive --- xo-expression/src/expression/PrimitiveExpr.cpp | 16 ++++++++-------- .../include/xo/interpreter/BuiltinPrimitives.hpp | 15 +++++++++++++++ .../src/interpreter/BuiltinPrimitives.cpp | 5 ++++- 3 files changed, 27 insertions(+), 9 deletions(-) diff --git a/xo-expression/src/expression/PrimitiveExpr.cpp b/xo-expression/src/expression/PrimitiveExpr.cpp index 4d73b14c..72b3160d 100644 --- a/xo-expression/src/expression/PrimitiveExpr.cpp +++ b/xo-expression/src/expression/PrimitiveExpr.cpp @@ -180,10 +180,10 @@ namespace xo { static rp s_retval; if (!s_retval) - s_retval = PrimitiveExpr::make("add2_i64", - &add2_i64, - true /*explicit_symbol_def*/, - llvmintrinsic::i_add); + s_retval = PrimitiveExpr::make("@add2_i64", + &add2_i64, + true /*explicit_symbol_def*/, + llvmintrinsic::i_add); return s_retval; } @@ -208,10 +208,10 @@ namespace xo { static rp s_retval; if (!s_retval) - s_retval = PrimitiveExpr::make("mul2_i64", - &mul2_i64, - true /*explicit_symbol_def*/, - llvmintrinsic::i_mul); + s_retval = PrimitiveExpr::make("@mul2_i64", + &mul2_i64, + true /*explicit_symbol_def*/, + llvmintrinsic::i_mul); return s_retval; } diff --git a/xo-interpreter/include/xo/interpreter/BuiltinPrimitives.hpp b/xo-interpreter/include/xo/interpreter/BuiltinPrimitives.hpp index 300e7f08..feb85051 100644 --- a/xo-interpreter/include/xo/interpreter/BuiltinPrimitives.hpp +++ b/xo-interpreter/include/xo/interpreter/BuiltinPrimitives.hpp @@ -5,6 +5,7 @@ #include "xo/object/ObjectConverter.hpp" #include "xo/alloc/IAlloc.hpp" +#include "Primitive.hpp" #include "GlobalEnv.hpp" namespace xo { @@ -26,6 +27,20 @@ namespace xo { **/ static void install_interpreter_conversions(ObjectConverter * target); + template + static void install_pm(gc::IAlloc * mm, rp pm_expr, gp env) { + gp rhs + = xo::obj::make_primitive(mm, pm_expr->name(), pm_expr->value()); + + /* store in env using this variable-expr */ + rp lhs + = Variable::make(pm_expr->name(), pm_expr->value_td()); + + gp * addr = env->establish_var(lhs.borrow()); + + *addr = rhs; + } + static void install(gc::IAlloc * mm, gp env); }; } diff --git a/xo-interpreter/src/interpreter/BuiltinPrimitives.cpp b/xo-interpreter/src/interpreter/BuiltinPrimitives.cpp index edc8bdae..96dcd865 100644 --- a/xo-interpreter/src/interpreter/BuiltinPrimitives.cpp +++ b/xo-interpreter/src/interpreter/BuiltinPrimitives.cpp @@ -46,7 +46,7 @@ namespace xo { *addr = rhs; } - // add2_i64 + // @add2_i64 { auto pm_expr = PrimitiveExpr_i64::make_add2_i64(); @@ -57,6 +57,9 @@ namespace xo { *addr = rhs; } + + // @mul2_i64 + install_pm(mm, PrimitiveExpr_i64::make_mul2_i64(), env); } } }