aboutsummaryrefslogtreecommitdiffstats
path: root/c_compiler/src/expression.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'c_compiler/src/expression.cpp')
-rw-r--r--c_compiler/src/expression.cpp110
1 files changed, 62 insertions, 48 deletions
diff --git a/c_compiler/src/expression.cpp b/c_compiler/src/expression.cpp
index fe5f1cf..2dc3a54 100644
--- a/c_compiler/src/expression.cpp
+++ b/c_compiler/src/expression.cpp
@@ -22,12 +22,12 @@ void Expression::print() const
void Expression::printXml() const
{}
-void Expression::countArguments(unsigned &) const
+void Expression::countArguments(int &) const
{
// by default don't do anything to the count
}
-void Expression::expressionDepth(unsigned &depth_count) const
+void Expression::expressionDepth(int &depth_count) const
{
if(next_expression_ != nullptr)
next_expression_->expressionDepth(depth_count);
@@ -72,10 +72,10 @@ int OperationExpression::constantFold() const
throw std::runtime_error("Error : Cannot constant fold expression");
}
-void OperationExpression::expressionDepth(unsigned &depth_count) const
+void OperationExpression::expressionDepth(int &depth_count) const
{
- unsigned lhs_depth_count = depth_count;
- unsigned rhs_depth_count = depth_count+1;
+ int lhs_depth_count = depth_count;
+ int rhs_depth_count = depth_count+1;
lhs_->expressionDepth(lhs_depth_count);
rhs_->expressionDepth(rhs_depth_count);
@@ -101,7 +101,7 @@ ExpressionPtr OperationExpression::getRhs() const
return rhs_;
}
-void OperationExpression::evaluateExpression(VariableStackBindings bindings, unsigned &label_count) const
+void OperationExpression::evaluateExpression(VariableStackBindings bindings, int &label_count) const
{
// I can just evaluate the lhs with the same entry stack position
lhs_->printAsm(bindings, label_count);
@@ -115,14 +115,14 @@ void OperationExpression::evaluateExpression(VariableStackBindings bindings, uns
// now I have them evaluated at two positions in the stack and can load both into registers
// $2 and $3
- printf("\tlw\t$2,%d($fp)\n\tlw\t$3,%d($fp)\n",
- lhs_stack_position, bindings.currentExpressionStackPosition());
+ lhs_->getType(bindings)->load(2, lhs_stack_position);
+ printf("\tlw\t$3,%d($fp)\n", bindings.currentExpressionStackPosition());
}
// Unary expression definition
-void UnaryExpression::stackPosition(VariableStackBindings, unsigned &) const
+void UnaryExpression::stackPosition(VariableStackBindings, int &) const
{
throw std::runtime_error("Error : Cannot get stack position of expression");
}
@@ -134,15 +134,16 @@ PostfixArrayElement::PostfixArrayElement(Expression *postfix_expression, Express
: postfix_expression_(postfix_expression), index_expression_(index_expression)
{}
-VariableStackBindings PostfixArrayElement::printAsm(VariableStackBindings bindings, unsigned &label_count) const
+VariableStackBindings PostfixArrayElement::printAsm(VariableStackBindings bindings, int &label_count) const
{
stackPosition(bindings, label_count);
- printf("\tlw\t$2,0($t0)\n");
+ TypePtr type_ptr = postfix_expression_->getType(bindings);
+ type_ptr->load();
printf("\tsw\t$2,%d($fp)\n", bindings.currentExpressionStackPosition());
return bindings;
}
-void PostfixArrayElement::stackPosition(VariableStackBindings bindings, unsigned &label_count) const
+void PostfixArrayElement::stackPosition(VariableStackBindings bindings, int &label_count) const
{
index_expression_->printAsm(bindings, label_count);
@@ -153,7 +154,7 @@ void PostfixArrayElement::stackPosition(VariableStackBindings bindings, unsigned
printf("\tli\t$3,4\n\tmul\t$2,$2,$3\n\taddu\t$t0,$t0,$2\n");
}
-void PostfixArrayElement::expressionDepth(unsigned &depth_count) const
+void PostfixArrayElement::expressionDepth(int &depth_count) const
{
if(nextExpression() != nullptr)
nextExpression()->expressionDepth(depth_count);
@@ -174,11 +175,11 @@ PostfixFunctionCall::PostfixFunctionCall(Expression *argument_expression_list)
: argument_expression_list_(argument_expression_list)
{}
-VariableStackBindings PostfixFunctionCall::printAsm(VariableStackBindings bindings, unsigned &label_count) const
+VariableStackBindings PostfixFunctionCall::printAsm(VariableStackBindings bindings, int &label_count) const
{
std::vector<ExpressionPtr> argument_vector;
ExpressionPtr current_argument = argument_expression_list_;
- unsigned argument_counter = 0;
+ int argument_counter = 0;
while(current_argument != nullptr)
{
@@ -193,7 +194,7 @@ VariableStackBindings PostfixFunctionCall::printAsm(VariableStackBindings bindin
if(argument_counter < 4)
printf("\tmove\t$%d,$2\n", 4+argument_counter);
else
- printf("\tsw\t$2,%d($fp)\n", 4*argument_counter);
+ (*itr)->getType(bindings)->store(4*argument_counter);
argument_counter++;
}
@@ -203,7 +204,7 @@ VariableStackBindings PostfixFunctionCall::printAsm(VariableStackBindings bindin
return bindings;
}
-void PostfixFunctionCall::countArguments(unsigned &argument_count) const
+void PostfixFunctionCall::countArguments(int &argument_count) const
{
ExpressionPtr current_argument = argument_expression_list_;
@@ -222,7 +223,7 @@ void PostfixFunctionCall::setPostfixExpression(Expression *postfix_expression)
postfix_expression_ = expression_ptr;
}
-void PostfixFunctionCall::expressionDepth(unsigned &depth_count) const
+void PostfixFunctionCall::expressionDepth(int &depth_count) const
{
if(argument_expression_list_ != nullptr)
argument_expression_list_->expressionDepth(depth_count);
@@ -240,7 +241,7 @@ PostfixPostIncDecExpression::PostfixPostIncDecExpression(const std::string &_ope
: operator_(_operator), postfix_expression_(postfix_expression)
{}
-VariableStackBindings PostfixPostIncDecExpression::printAsm(VariableStackBindings bindings, unsigned &label_count) const
+VariableStackBindings PostfixPostIncDecExpression::printAsm(VariableStackBindings bindings, int &label_count) const
{
postfix_expression_->printAsm(bindings, label_count);
if(operator_ == "++")
@@ -255,8 +256,20 @@ VariableStackBindings PostfixPostIncDecExpression::printAsm(VariableStackBinding
printf("\tsw\t$2,%d($fp)\n", bindings.currentExpressionStackPosition());
unary_expression->stackPosition(bindings, label_count);
- printf("\tsw\t$3,0($t0)\n");
-
+ TypePtr tmp_ptr = postfix_expression_->getType(bindings);
+ if(std::dynamic_pointer_cast<Char>(tmp_ptr))
+ {
+ printf("\tsb\t$3,0($t0)\n");
+ }
+ else if(std::dynamic_pointer_cast<Short>(tmp_ptr))
+ {
+ printf("\tsh\t$3,0($t0)\n");
+ }
+ else
+ {
+ printf("\tsw\t$3,0($t0)\n");
+ }
+
return bindings;
}
@@ -272,7 +285,7 @@ UnaryPreIncDecExpression::UnaryPreIncDecExpression(const std::string &_operator,
: operator_(_operator), unary_expression_(unary_expression)
{}
-VariableStackBindings UnaryPreIncDecExpression::printAsm(VariableStackBindings bindings, unsigned &label_count) const
+VariableStackBindings UnaryPreIncDecExpression::printAsm(VariableStackBindings bindings, int &label_count) const
{
unary_expression_->printAsm(bindings, label_count);
if(operator_ == "++")
@@ -287,7 +300,7 @@ VariableStackBindings UnaryPreIncDecExpression::printAsm(VariableStackBindings b
printf("\tsw\t$2,%d($fp)\n", bindings.currentExpressionStackPosition());
unary_expression->stackPosition(bindings, label_count);
- printf("\tsw\t$2,0($t0)\n");
+ unary_expression_->getType(bindings)->store();
return bindings;
}
@@ -303,7 +316,7 @@ OperatorUnaryExpression::OperatorUnaryExpression(const std::string &_operator, E
: operator_(_operator), cast_expression_(cast_expression)
{}
-VariableStackBindings OperatorUnaryExpression::printAsm(VariableStackBindings bindings, unsigned &label_count) const
+VariableStackBindings OperatorUnaryExpression::printAsm(VariableStackBindings bindings, int &label_count) const
{
cast_expression_->printAsm(bindings, label_count);
if(operator_ == "!")
@@ -335,7 +348,7 @@ VariableStackBindings OperatorUnaryExpression::printAsm(VariableStackBindings bi
return bindings;
}
-void OperatorUnaryExpression::stackPosition(VariableStackBindings bindings, unsigned &label_count) const
+void OperatorUnaryExpression::stackPosition(VariableStackBindings bindings, int &label_count) const
{
if(operator_ == "*")
{
@@ -358,12 +371,12 @@ CastExpression::CastExpression(Type *type, Expression *expression)
: type_(type), expression_(expression)
{}
-VariableStackBindings CastExpression::printAsm(VariableStackBindings bindings, unsigned &label_count) const
+VariableStackBindings CastExpression::printAsm(VariableStackBindings bindings, int &label_count) const
{
return bindings;
}
-void CastExpression::expressionDepth(unsigned &depth_count) const
+void CastExpression::expressionDepth(int &depth_count) const
{
if(nextExpression() != nullptr)
nextExpression()->expressionDepth(depth_count);
@@ -383,7 +396,7 @@ AdditiveExpression::AdditiveExpression(Expression *lhs, const std::string &_oper
: OperationExpression(lhs, rhs), operator_(_operator)
{}
-VariableStackBindings AdditiveExpression::printAsm(VariableStackBindings bindings, unsigned &label_count) const
+VariableStackBindings AdditiveExpression::printAsm(VariableStackBindings bindings, int &label_count) const
{
evaluateExpression(bindings, label_count);
@@ -417,7 +430,7 @@ MultiplicativeExpression::MultiplicativeExpression(Expression *lhs, const std::s
: OperationExpression(lhs, rhs), operator_(_operator)
{}
-VariableStackBindings MultiplicativeExpression::printAsm(VariableStackBindings bindings, unsigned &label_count) const
+VariableStackBindings MultiplicativeExpression::printAsm(VariableStackBindings bindings, int &label_count) const
{
evaluateExpression(bindings, label_count);
@@ -462,7 +475,7 @@ ShiftExpression::ShiftExpression(Expression* lhs, const std::string &_operator,
: OperationExpression(lhs, rhs), operator_(_operator)
{}
-VariableStackBindings ShiftExpression::printAsm(VariableStackBindings bindings, unsigned &label_count) const
+VariableStackBindings ShiftExpression::printAsm(VariableStackBindings bindings, int &label_count) const
{
evaluateExpression(bindings, label_count);
@@ -498,7 +511,7 @@ RelationalExpression::RelationalExpression(Expression* lhs, const std::string &_
: OperationExpression(lhs, rhs), operator_(_operator)
{}
-VariableStackBindings RelationalExpression::printAsm(VariableStackBindings bindings, unsigned &label_count) const
+VariableStackBindings RelationalExpression::printAsm(VariableStackBindings bindings, int &label_count) const
{
evaluateExpression(bindings, label_count);
@@ -553,7 +566,7 @@ EqualityExpression::EqualityExpression(Expression *lhs, const std::string &_oper
: OperationExpression(lhs, rhs), operator_(_operator)
{}
-VariableStackBindings EqualityExpression::printAsm(VariableStackBindings bindings, unsigned &label_count) const
+VariableStackBindings EqualityExpression::printAsm(VariableStackBindings bindings, int &label_count) const
{
evaluateExpression(bindings, label_count);
printf("\txor\t$2,$2,$3\n");
@@ -590,7 +603,7 @@ AndExpression::AndExpression(Expression *lhs, Expression *rhs)
: OperationExpression(lhs, rhs)
{}
-VariableStackBindings AndExpression::printAsm(VariableStackBindings bindings, unsigned &label_count) const
+VariableStackBindings AndExpression::printAsm(VariableStackBindings bindings, int &label_count) const
{
evaluateExpression(bindings, label_count);
printf("\tand\t$2,$2,$3\n\tsw\t$2,%d($fp)\n", bindings.currentExpressionStackPosition());
@@ -609,7 +622,7 @@ ExclusiveOrExpression::ExclusiveOrExpression(Expression *lhs, Expression *rhs)
: OperationExpression(lhs, rhs)
{}
-VariableStackBindings ExclusiveOrExpression::printAsm(VariableStackBindings bindings, unsigned &label_count) const
+VariableStackBindings ExclusiveOrExpression::printAsm(VariableStackBindings bindings, int &label_count) const
{
evaluateExpression(bindings, label_count);
printf("\txor\t$2,$2,$3\n\tsw\t$2,%d($fp)\n", bindings.currentExpressionStackPosition());
@@ -628,7 +641,7 @@ InclusiveOrExpression::InclusiveOrExpression(Expression *lhs, Expression *rhs)
: OperationExpression(lhs, rhs)
{}
-VariableStackBindings InclusiveOrExpression::printAsm(VariableStackBindings bindings, unsigned &label_count) const
+VariableStackBindings InclusiveOrExpression::printAsm(VariableStackBindings bindings, int &label_count) const
{
evaluateExpression(bindings, label_count);
printf("\tor\t$2,$2,$3\n\tsw\t$2,%d($fp)\n", bindings.currentExpressionStackPosition());
@@ -647,9 +660,9 @@ LogicalAndExpression::LogicalAndExpression(Expression *lhs, Expression *rhs)
: OperationExpression(lhs, rhs)
{}
-VariableStackBindings LogicalAndExpression::printAsm(VariableStackBindings bindings, unsigned &label_count) const
+VariableStackBindings LogicalAndExpression::printAsm(VariableStackBindings bindings, int &label_count) const
{
- unsigned log_and = label_count++;
+ int log_and = label_count++;
lhs_->printAsm(bindings, label_count);
printf("\tbeq\t$2,$0,$%d_log_and_load_0\n\tnop\n", log_and);
rhs_->printAsm(bindings, label_count);
@@ -672,9 +685,9 @@ LogicalOrExpression::LogicalOrExpression(Expression *lhs, Expression *rhs)
: OperationExpression(lhs, rhs)
{}
-VariableStackBindings LogicalOrExpression::printAsm(VariableStackBindings bindings, unsigned &label_count) const
+VariableStackBindings LogicalOrExpression::printAsm(VariableStackBindings bindings, int &label_count) const
{
- unsigned log_or = label_count++;
+ int log_or = label_count++;
lhs_->printAsm(bindings, label_count);
printf("\tbne\t$2,$0,$%d_log_or_load_1\n\tnop\n", log_or);
rhs_->printAsm(bindings, label_count);
@@ -700,7 +713,7 @@ ConditionalExpression::ConditionalExpression(Expression *logical_or,
conditional_expression_(conditional_expression)
{}
-VariableStackBindings ConditionalExpression::printAsm(VariableStackBindings bindings, unsigned &label_count) const
+VariableStackBindings ConditionalExpression::printAsm(VariableStackBindings bindings, int &label_count) const
{
return bindings;
}
@@ -721,7 +734,7 @@ AssignmentExpression::AssignmentExpression(ExpressionPtr lhs, Expression *rhs)
: OperationExpression(lhs, rhs)
{}
-VariableStackBindings AssignmentExpression::printAsm(VariableStackBindings bindings, unsigned &label_count) const
+VariableStackBindings AssignmentExpression::printAsm(VariableStackBindings bindings, int &label_count) const
{
// TODO add stack and store results in there, also for addition and multiplication.
@@ -740,9 +753,10 @@ VariableStackBindings AssignmentExpression::printAsm(VariableStackBindings bindi
// we are assigning so we don't have to evaluate the lhs as it will be overwritten anyways
lhs_postfix->stackPosition(bindings, label_count);
- // now the result of the rhs will be in that stack position, so we can load it into $2
- printf("\tlw\t$2,%d($fp)\n", expression_stack_position);
- printf("\tsw\t$2,0($t0)\n");
+ // now the result of the rhs will be in that stack position, so we can load it into $2
+ TypePtr tmp_ptr = lhs_->getType(bindings);
+ tmp_ptr->load(2, expression_stack_position);
+ tmp_ptr->store();
return bindings;
}
@@ -753,7 +767,7 @@ Identifier::Identifier(const std::string &id)
: id_(id)
{}
-VariableStackBindings Identifier::printAsm(VariableStackBindings bindings, unsigned &) const
+VariableStackBindings Identifier::printAsm(VariableStackBindings bindings, int &) const
{
if(bindings.bindingExists(id_))
{
@@ -771,7 +785,7 @@ VariableStackBindings Identifier::printAsm(VariableStackBindings bindings, unsig
}
else
{
- printf("\tlw\t$2,%d($fp)\n", stack_position);
+ bindings.getType(id_)->load(2, stack_position);
}
}
}
@@ -784,7 +798,7 @@ VariableStackBindings Identifier::printAsm(VariableStackBindings bindings, unsig
return bindings;
}
-void Identifier::stackPosition(VariableStackBindings bindings, unsigned &) const
+void Identifier::stackPosition(VariableStackBindings bindings, int &) const
{
if(bindings.bindingExists(id_))
{
@@ -812,7 +826,7 @@ Constant::Constant(const int32_t &constant)
: constant_(constant)
{}
-VariableStackBindings Constant::printAsm(VariableStackBindings bindings, unsigned &) const
+VariableStackBindings Constant::printAsm(VariableStackBindings bindings, int &) const
{
// constant only has to load to $2 because the other expression will take care of the rest
printf("\tli\t$2,%d\n", constant_);