xo-jit: in MachPipeline use intrinsic for faster code path

This commit is contained in:
Roland Conybeare 2024-06-21 14:08:07 -04:00
commit 88cc8885b6

View file

@ -13,6 +13,7 @@ namespace xo {
using xo::ast::Variable;
using xo::ast::Apply;
using xo::ast::IfExpr;
using xo::ast::llvmintrinsic;
using xo::reflect::Reflect;
using xo::reflect::TypeDescr;
using std::cerr;
@ -295,6 +296,7 @@ namespace xo {
|| apply->fn()->extype() == exprtype::lambda)
{
llvm::Function * llvm_fn = nullptr;
llvmintrinsic intrinsic = llvmintrinsic::invalid;
FunctionInterface * fn = nullptr;
{
// TODO: codgen_function()
@ -303,6 +305,8 @@ namespace xo {
if (pm) {
fn = pm.get();
llvm_fn = this->codegen_primitive(pm);
/* hint, when available. use faster alternative to IRBuilder::CreateCall below */
intrinsic = pm->intrinsic();
}
auto lm = Lambda::from(apply->fn());
@ -361,6 +365,25 @@ namespace xo {
args.push_back(arg);
}
switch(intrinsic) {
case llvmintrinsic::i_add:
return llvm_ir_builder_->CreateAdd(args[0], args[1]);
case llvmintrinsic::i_mul:
return llvm_ir_builder_->CreateMul(args[0], args[1]);
case llvmintrinsic::fp_add:
return llvm_ir_builder_->CreateFAdd(args[0], args[1]);
case llvmintrinsic::fp_mul:
return llvm_ir_builder_->CreateFMul(args[0], args[1]);
case llvmintrinsic::invalid:
case llvmintrinsic::fp_sqrt:
case llvmintrinsic::fp_pow:
case llvmintrinsic::fp_sin:
case llvmintrinsic::fp_cos:
case llvmintrinsic::fp_tan:
case llvmintrinsic::n_intrinsic: /* n_intrinsic: not reachable */
break;
}
return llvm_ir_builder_->CreateCall(llvm_fn, args, "calltmp");
} else {
cerr << "MachPipeline::codegen_apply: error: only allowing call to known primitives at present" << endl;