MCPcopy Create free account
hub / github.com/chigraph/chigraph / codegen

Method codegen

libchigraph/src/LangModule.cpp:488–533  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

486 }
487
488 Result codegen(
489 size_t /*execInputID*/, const llvm::DebugLoc& nodeLocation,
490 const std::vector<llvm::Value*>& io, llvm::BasicBlock* codegenInto,
491 const std::vector<llvm::BasicBlock*>& outputBlocks,
492 std::unordered_map<std::string, std::shared_ptr<void>>& /*compileCache*/) override {
493 assert(io.size() == 3 && codegenInto != nullptr && outputBlocks.size() == 1);
494
495 llvm::IRBuilder<> builder(codegenInto);
496 builder.SetCurrentDebugLocation(nodeLocation);
497
498 llvm::Value* result = nullptr;
499 if (mType.unqualifiedName() == "i32") {
500 result = [&](CmpOp b) -> llvm::Value* {
501 switch (b) {
502 case CmpOp::Lt: return builder.CreateICmpSLT(io[0], io[1]);
503 case CmpOp::Gt: return builder.CreateICmpSGT(io[0], io[1]);
504 case CmpOp::Let: return builder.CreateICmpSLE(io[0], io[1]);
505 case CmpOp::Get: return builder.CreateICmpSGE(io[0], io[1]);
506 case CmpOp::Eq: return builder.CreateICmpEQ(io[0], io[1]);
507 case CmpOp::Neq: return builder.CreateICmpNE(io[0], io[1]);
508 default: return nullptr;
509 }
510 return nullptr;
511 }(mCompOp);
512
513 } else {
514 result = [&](CmpOp b) -> llvm::Value* {
515 switch (b) {
516 case CmpOp::Lt: return builder.CreateFCmpULT(io[0], io[1]);
517 case CmpOp::Gt: return builder.CreateFCmpUGT(io[0], io[1]);
518 case CmpOp::Let: return builder.CreateFCmpULE(io[0], io[1]);
519 case CmpOp::Get: return builder.CreateFCmpUGE(io[0], io[1]);
520 case CmpOp::Eq: return builder.CreateFCmpUEQ(io[0], io[1]);
521 case CmpOp::Neq: return builder.CreateFCmpUNE(io[0], io[1]);
522 default: return nullptr;
523 }
524 return nullptr;
525 }(mCompOp);
526 }
527
528 builder.CreateStore(result, io[2]);
529
530 builder.CreateBr(outputBlocks[0]);
531
532 return {};
533 }
534
535 std::unique_ptr<NodeType> clone() const override {
536 return std::make_unique<CompareNodeType>(*this);

Callers

nothing calls this directly

Calls

no outgoing calls

Tested by

no test coverage detected