| 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); |
nothing calls this directly
no outgoing calls
no test coverage detected