Add binops
This commit is contained in:
parent
9791c9c8da
commit
bb4d1c6045
@ -3,6 +3,61 @@
|
||||
|
||||
namespace types {
|
||||
std::vector<BinopDefinition> create_binops() {
|
||||
std::vector<BinopDefinition> definitions{};
|
||||
|
||||
auto int_ty = std::shared_ptr<types::Type>{
|
||||
new types::FundamentalType{ types::FundamentalTypeKind::Int } };
|
||||
auto char_ty = std::shared_ptr<types::Type>{
|
||||
new types::FundamentalType{ types::FundamentalTypeKind::Char } };
|
||||
auto bool_ty = std::shared_ptr<types::Type>{
|
||||
new types::FundamentalType{ types::FundamentalTypeKind::Bool } };
|
||||
|
||||
for (auto& ty : { int_ty, char_ty, bool_ty }) {
|
||||
// Arithmetic binops
|
||||
definitions.push_back(BinopDefinition{
|
||||
ty, types::BinOp::Add, ty,
|
||||
ty, [](codegen::Builder& builder, llvm::Value* lhs, llvm::Value* rhs) {
|
||||
return builder.builder->CreateAdd(lhs, rhs, "add");
|
||||
} });
|
||||
|
||||
definitions.push_back(BinopDefinition{
|
||||
ty, types::BinOp::Sub, ty,
|
||||
ty, [](codegen::Builder& builder, llvm::Value* lhs, llvm::Value* rhs) {
|
||||
return builder.builder->CreateSub(lhs, rhs, "sub");
|
||||
} });
|
||||
|
||||
// Comparisons
|
||||
definitions.push_back(BinopDefinition{
|
||||
ty, types::BinOp::LessThan, ty,
|
||||
bool_ty, [](codegen::Builder& builder, llvm::Value* lhs, llvm::Value* rhs) {
|
||||
return builder.builder->CreateICmpSLE(lhs, rhs, "icmpsle");
|
||||
} });
|
||||
|
||||
definitions.push_back(BinopDefinition{
|
||||
ty, types::BinOp::GreaterThan, ty,
|
||||
bool_ty, [](codegen::Builder& builder, llvm::Value* lhs, llvm::Value* rhs) {
|
||||
return builder.builder->CreateICmpSGT(lhs, rhs, "icmpsgt");
|
||||
} });
|
||||
}
|
||||
|
||||
return definitions;
|
||||
}
|
||||
|
||||
std::optional<BinopDefinition> find_binop(
|
||||
std::vector<BinopDefinition>& binops,
|
||||
std::shared_ptr<types::Type> lhs,
|
||||
BinOp op,
|
||||
std::shared_ptr<types::Type> rhs) {
|
||||
for (auto& binop : binops) {
|
||||
if (binop.op != op) {
|
||||
continue;
|
||||
}
|
||||
if (!types_equal(lhs, binop.lhs) || !types_equal(rhs, binop.rhs)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
return binop;
|
||||
}
|
||||
return {};
|
||||
}
|
||||
}
|
||||
@ -23,11 +23,17 @@ namespace types {
|
||||
BinOp op;
|
||||
std::shared_ptr<Type> rhs;
|
||||
std::shared_ptr<Type> result;
|
||||
llvm::Value* (*codegen)(codegen::Builder& builder);
|
||||
llvm::Value* (*codegen)(codegen::Builder& builder, llvm::Value* lhs, llvm::Value* rhs);
|
||||
};
|
||||
|
||||
std::vector<BinopDefinition> create_binops();
|
||||
|
||||
std::optional<BinopDefinition> find_binop(
|
||||
std::vector<BinopDefinition>& binops,
|
||||
std::shared_ptr<types::Type> lhs,
|
||||
BinOp op,
|
||||
std::shared_ptr<types::Type> rhs);
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
Loading…
Reference in New Issue
Block a user