diff options
Diffstat (limited to 'c_compiler/src/expression.cpp')
-rw-r--r-- | c_compiler/src/expression.cpp | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/c_compiler/src/expression.cpp b/c_compiler/src/expression.cpp index 5b407d8..4c00c94 100644 --- a/c_compiler/src/expression.cpp +++ b/c_compiler/src/expression.cpp @@ -678,14 +678,22 @@ VariableStackBindings Identifier::printAsm(VariableStackBindings bindings, unsig if(bindings.bindingExists(id_)) { - if(bindings.stackPosition(id_) == -1) + int stack_position = bindings.stackPosition(id_); + if(stack_position == -1) { // it's a global variable printf("\tlui\t$2,%%hi(%s)\n\tlw\t$2,%%lo(%s)($2)\n", id_.c_str(), id_.c_str()); } else { - printf("\tlw\t$2,%d($fp)\n", bindings.stackPosition(id_)); + if(std::dynamic_pointer_cast<Array>(bindings.getType(id_)) != nullptr) + { + printf("\taddiu\t$2,$fp,%d\n", stack_position); + } + else + { + printf("\tlw\t$2,%d($fp)\n", stack_position); + } } } else |