| 
1 | 1 | #include <cassert>  // for assert  | 
2 | 2 | #include <cstdio>   // for fprintf, stderr, fputc  | 
3 | 3 | #include <cstdlib>  // for exit  | 
4 |  | -#include <fstream>  // for operator<<  | 
5 | 4 | #include <iostream>  | 
6 |  | -#include <map>      // for map, operator==, _Rb_tree_ite...  | 
7 |  | -#include <memory>   // for unique_ptr, allocator, make_u...  | 
8 |  | -#include <numeric>  // for accumulate  | 
9 |  | -#include <sstream>  | 
 | 5 | +#include <map>           // for map, operator==, _Rb_tree_ite...  | 
 | 6 | +#include <memory>        // for unique_ptr, allocator, make_u...  | 
10 | 7 | #include <string>        // for string, operator<=>, operator+  | 
11 | 8 | #include <system_error>  // for error_code  | 
12 | 9 | #include <utility>       // for pair, move  | 
@@ -101,7 +98,7 @@ auto ASTToObjectVisitor::getFunction(std::string name) -> void {  | 
101 | 98 | auto ASTToObjectVisitor::CreateEntryBlockAlloca(  | 
102 | 99 |   llvm::Function* fn, llvm::StringRef var_name) -> llvm::AllocaInst* {  | 
103 | 100 |   llvm::IRBuilder<> TmpB(&fn->getEntryBlock(), fn->getEntryBlock().begin());  | 
104 |  | -  return TmpB.CreateAlloca(ArxLLVM::DOUBLE_TYPE, nullptr, var_name);  | 
 | 101 | +  return TmpB.CreateAlloca(ArxLLVM::FLOAT_TYPE, nullptr, var_name);  | 
105 | 102 | }  | 
106 | 103 | 
 
  | 
107 | 104 | /**  | 
@@ -136,7 +133,7 @@ auto ASTToObjectVisitor::visit(VariableExprAST& expr) -> void {  | 
136 | 133 |   }  | 
137 | 134 | 
 
  | 
138 | 135 |   this->result_val = ArxLLVM::ir_builder->CreateLoad(  | 
139 |  | -    ArxLLVM::DOUBLE_TYPE, expr_var, expr.name.c_str());  | 
 | 136 | +    ArxLLVM::FLOAT_TYPE, expr_var, expr.name.c_str());  | 
140 | 137 | }  | 
141 | 138 | 
 
  | 
142 | 139 | /**  | 
@@ -227,9 +224,9 @@ auto ASTToObjectVisitor::visit(BinaryExprAST& expr) -> void {  | 
227 | 224 |     case '<':  | 
228 | 225 |       llvm_val_lhs = ArxLLVM::ir_builder->CreateFCmpULT(  | 
229 | 226 |         llvm_val_lhs, llvm_val_rhs, "cmptmp");  | 
230 |  | -      // Convert bool 0/1 to double 0.0 or 1.0 //  | 
 | 227 | +      // Convert bool 0/1 to float 0.0 or 1.0 //  | 
231 | 228 |       this->result_val = ArxLLVM::ir_builder->CreateUIToFP(  | 
232 |  | -        llvm_val_lhs, ArxLLVM::DOUBLE_TYPE, "booltmp");  | 
 | 229 | +        llvm_val_lhs, ArxLLVM::FLOAT_TYPE, "booltmp");  | 
233 | 230 |       return;  | 
234 | 231 |   }  | 
235 | 232 | 
 
  | 
@@ -341,7 +338,7 @@ auto ASTToObjectVisitor::visit(IfExprAST& expr) -> void {  | 
341 | 338 |   fn->getBasicBlockList().push_back(MergeBB);  | 
342 | 339 |   ArxLLVM::ir_builder->SetInsertPoint(MergeBB);  | 
343 | 340 |   llvm::PHINode* PN =  | 
344 |  | -    ArxLLVM::ir_builder->CreatePHI(ArxLLVM::DOUBLE_TYPE, 2, "iftmp");  | 
 | 341 | +    ArxLLVM::ir_builder->CreatePHI(ArxLLVM::FLOAT_TYPE, 2, "iftmp");  | 
345 | 342 | 
 
  | 
346 | 343 |   PN->addIncoming(ThenV, ThenBB);  | 
347 | 344 |   PN->addIncoming(ElseV, ElseBB);  | 
@@ -426,7 +423,7 @@ auto ASTToObjectVisitor::visit(ForExprAST& expr) -> void {  | 
426 | 423 |   // Reload, increment, and restore the alloca.  This handles the case  | 
427 | 424 |   // where the body of the loop mutates the variable.  | 
428 | 425 |   llvm::Value* CurVar = ArxLLVM::ir_builder->CreateLoad(  | 
429 |  | -    ArxLLVM::DOUBLE_TYPE, alloca, expr.var_name.c_str());  | 
 | 426 | +    ArxLLVM::FLOAT_TYPE, alloca, expr.var_name.c_str());  | 
430 | 427 |   llvm::Value* NextVar =  | 
431 | 428 |     ArxLLVM::ir_builder->CreateFAdd(CurVar, StepVal, "nextvar");  | 
432 | 429 |   ArxLLVM::ir_builder->CreateStore(NextVar, alloca);  | 
@@ -455,7 +452,7 @@ auto ASTToObjectVisitor::visit(ForExprAST& expr) -> void {  | 
455 | 452 |   }  | 
456 | 453 | 
 
  | 
457 | 454 |   // for expr always returns 0.0.  | 
458 |  | -  this->result_val = llvm::Constant::getNullValue(ArxLLVM::DOUBLE_TYPE);  | 
 | 455 | +  this->result_val = llvm::Constant::getNullValue(ArxLLVM::FLOAT_TYPE);  | 
459 | 456 | }  | 
460 | 457 | 
 
  | 
461 | 458 | /**  | 
@@ -523,8 +520,8 @@ auto ASTToObjectVisitor::visit(VarExprAST& expr) -> void {  | 
523 | 520 |  *  | 
524 | 521 |  */  | 
525 | 522 | auto ASTToObjectVisitor::visit(PrototypeAST& expr) -> void {  | 
526 |  | -  std::vector<llvm::Type*> args_type(expr.args.size(), ArxLLVM::DOUBLE_TYPE);  | 
527 |  | -  llvm::Type* return_type = ArxLLVM::get_data_type("double");  | 
 | 523 | +  std::vector<llvm::Type*> args_type(expr.args.size(), ArxLLVM::FLOAT_TYPE);  | 
 | 524 | +  llvm::Type* return_type = ArxLLVM::get_data_type("float");  | 
528 | 525 | 
 
  | 
529 | 526 |   llvm::FunctionType* fn_type =  | 
530 | 527 |     llvm::FunctionType::get(return_type, args_type, false /* isVarArg */);  | 
@@ -616,7 +613,7 @@ auto ASTToObjectVisitor::initialize() -> void {  | 
616 | 613 |   ArxLLVM::ir_builder = std::make_unique<llvm::IRBuilder<>>(*ArxLLVM::context);  | 
617 | 614 | 
 
  | 
618 | 615 |   /* Data Types */  | 
619 |  | -  ArxLLVM::DOUBLE_TYPE = llvm::Type::getFloatTy(*ArxLLVM::context);  | 
 | 616 | +  ArxLLVM::FLOAT_TYPE = llvm::Type::getFloatTy(*ArxLLVM::context);  | 
620 | 617 |   ArxLLVM::DOUBLE_TYPE = llvm::Type::getDoubleTy(*ArxLLVM::context);  | 
621 | 618 |   ArxLLVM::INT8_TYPE = llvm::Type::getInt8Ty(*ArxLLVM::context);  | 
622 | 619 |   ArxLLVM::INT32_TYPE = llvm::Type::getInt32Ty(*ArxLLVM::context);  | 
@@ -644,19 +641,19 @@ auto ASTToObjectVisitor::main_loop(TreeAST& ast) -> void {  | 
644 | 641 | #endif  | 
645 | 642 | 
 
  | 
646 | 643 | /**  | 
647 |  | - * @brief putchar that takes a double and returns 0.  | 
 | 644 | + * @brief putchar that takes a float and returns 0.  | 
648 | 645 |  *  | 
649 | 646 |  */  | 
650 |  | -extern "C" DLLEXPORT auto putchard(double X) -> double {  | 
 | 647 | +extern "C" DLLEXPORT auto putchard(float X) -> float {  | 
651 | 648 |   fputc(static_cast<char>(X), stderr);  | 
652 | 649 |   return 0;  | 
653 | 650 | }  | 
654 | 651 | 
 
  | 
655 | 652 | /**  | 
656 |  | - * @brief printf that takes a double prints it as "%f\n", returning 0.  | 
 | 653 | + * @brief printf that takes a float prints it as "%f\n", returning 0.  | 
657 | 654 |  *  | 
658 | 655 |  */  | 
659 |  | -extern "C" DLLEXPORT auto printd(double X) -> double {  | 
 | 656 | +extern "C" DLLEXPORT auto printd(float X) -> float {  | 
660 | 657 |   fprintf(stderr, "%f\n", X);  | 
661 | 658 |   return 0;  | 
662 | 659 | }  | 
 | 
0 commit comments