diff options
Diffstat (limited to 'c_compiler/src/type.cpp')
-rw-r--r-- | c_compiler/src/type.cpp | 136 |
1 files changed, 125 insertions, 11 deletions
diff --git a/c_compiler/src/type.cpp b/c_compiler/src/type.cpp index e05a03e..6a8f45c 100644 --- a/c_compiler/src/type.cpp +++ b/c_compiler/src/type.cpp @@ -46,7 +46,7 @@ void Array::print() const void Array::printXml() const {} -VariableStackBindings Array::printAsm(VariableStackBindings bindings, unsigned &) const +VariableStackBindings Array::printAsm(VariableStackBindings bindings, int &) const { return bindings; } @@ -77,16 +77,31 @@ void Array::increaseStackPosition(VariableStackBindings &bindings) const } } +void Array::load() const +{ + type_->load(); +} + void Array::load(const int ®, const int &position) const { type_->load(reg, position); } +void Array::store() const +{ + type_->store(); +} + void Array::store(const int &position) const { type_->store(position); } +void Array::store(const int ®, const int &position) const +{ + type_->store(reg, position); +} + // Pointer definition @@ -101,7 +116,7 @@ void Pointer::print() const void Pointer::printXml() const {} -VariableStackBindings Pointer::printAsm(VariableStackBindings bindings, unsigned &) const +VariableStackBindings Pointer::printAsm(VariableStackBindings bindings, int &) const { return bindings; } @@ -129,14 +144,29 @@ void Pointer::increaseStackPosition(VariableStackBindings &bindings) const bindings.increaseStackPosition(4); } +void Pointer::load() const +{ + printf("\tlw\t$2,0($t0)\n"); +} + void Pointer::load(const int ®, const int &position) const { printf("\tlw\t$%d,%d($fp)\n", reg, position); } +void Pointer::store() const +{ + printf("\tsw\t$2,0($t0)\n"); +} + void Pointer::store(const int &position) const { - type_->store(position); + printf("\tsw\t$2,%d($fp)\n", position); +} + +void Pointer::store(const int ®, const int &position) const +{ + printf("\tsw\t$%d,%d($fp)\n", reg, position); } @@ -155,7 +185,7 @@ void TypeContainer::print() const void TypeContainer::printXml() const {} -VariableStackBindings TypeContainer::printAsm(VariableStackBindings bindings, unsigned &) const +VariableStackBindings TypeContainer::printAsm(VariableStackBindings bindings, int &) const { return bindings; } @@ -185,16 +215,31 @@ void TypeContainer::increaseStackPosition(VariableStackBindings &bindings) const type_->increaseStackPosition(bindings); } +void TypeContainer::load() const +{ + type_->load(); +} + void TypeContainer::load(const int ®, const int &position) const { type_->load(reg, position); } +void TypeContainer::store() const +{ + type_->store(); +} + void TypeContainer::store(const int &position) const { type_->store(position); } +void TypeContainer::store(const int ®, const int &position) const +{ + type_->store(reg, position); +} + void TypeContainer::setSigned(bool _signed) { signed_ = _signed; @@ -252,7 +297,7 @@ void Int::print() const void Int::printXml() const {} -VariableStackBindings Int::printAsm(VariableStackBindings bindings, unsigned &) const +VariableStackBindings Int::printAsm(VariableStackBindings bindings, int &) const { return bindings; } @@ -262,16 +307,31 @@ void Int::increaseStackPosition(VariableStackBindings &bindings) const bindings.increaseStackPosition(4); } +void Int::load() const +{ + printf("\tlw\t$2,0($t0)\n"); +} + void Int::load(const int ®, const int &position) const { printf("\tlw\t$%d,%d($fp)\n", reg, position); } +void Int::store() const +{ + printf("\tsw\t$2,0($t0)\n"); +} + void Int::store(const int &position) const { printf("\tsw\t$2,%d($fp)\n", position); } +void Int::store(const int ®, const int &position) const +{ + printf("\tsw\t$%d,%d($fp)\n", reg, position); +} + // Void definition @@ -286,7 +346,7 @@ void Void::print() const void Void::printXml() const {} -VariableStackBindings Void::printAsm(VariableStackBindings bindings, unsigned &) const +VariableStackBindings Void::printAsm(VariableStackBindings bindings, int &) const { return bindings; } @@ -294,12 +354,21 @@ VariableStackBindings Void::printAsm(VariableStackBindings bindings, unsigned &) void Void::increaseStackPosition(VariableStackBindings &) const {} +void Void::load() const +{} + void Void::load(const int &, const int &) const {} +void Void::store() const +{} + void Void::store(const int &) const {} +void Void::store(const int &, const int &) const +{} + // Short definition @@ -314,7 +383,7 @@ void Short::print() const void Short::printXml() const {} -VariableStackBindings Short::printAsm(VariableStackBindings bindings, unsigned &) const +VariableStackBindings Short::printAsm(VariableStackBindings bindings, int &) const { return bindings; } @@ -324,9 +393,19 @@ void Short::increaseStackPosition(VariableStackBindings &bindings) const bindings.increaseStackPosition(2); } +void Short::load() const +{ + printf("\tlhu\t$2,0($t0)\n"); +} + void Short::load(const int ®, const int &position) const { - printf("\tlh\t$%d,%d($fp)\n", reg, position); + printf("\tlhu\t$%d,%d($fp)\n", reg, position); +} + +void Short::store() const +{ + printf("\tsh\t$2,0($t0)\n"); } void Short::store(const int &position) const @@ -334,6 +413,11 @@ void Short::store(const int &position) const printf("\tsh\t$2,%d($fp)\n", position); } +void Short::store(const int ®, const int &position) const +{ + printf("\tsh\t$%d,%d($fp)\n", reg, position); +} + // Char definition @@ -348,7 +432,7 @@ void Char::print() const void Char::printXml() const {} -VariableStackBindings Char::printAsm(VariableStackBindings bindings, unsigned &) const +VariableStackBindings Char::printAsm(VariableStackBindings bindings, int &) const { return bindings; } @@ -358,9 +442,19 @@ void Char::increaseStackPosition(VariableStackBindings &bindings) const bindings.increaseStackPosition(1); } +void Char::load() const +{ + printf("\tlbu\t$2,0($t0)\n"); +} + void Char::load(const int ®, const int &position) const { - printf("\tlb\t$%d,%d($fp)\n", reg, position); + printf("\tlbu\t$%d,%d($fp)\n", reg, position); +} + +void Char::store() const +{ + printf("\tsb\t$2,0($t0)\n"); } void Char::store(const int &position) const @@ -368,6 +462,11 @@ void Char::store(const int &position) const printf("\tsb\t$2,%d($fp)\n", position); } +void Char::store(const int ®, const int &position) const +{ + printf("\tsb\t$%d,%d($fp)\n", reg, position); +} + // Float definition @@ -382,7 +481,7 @@ void Float::print() const void Float::printXml() const {} -VariableStackBindings Float::printAsm(VariableStackBindings bindings, unsigned &) const +VariableStackBindings Float::printAsm(VariableStackBindings bindings, int &) const { return bindings; } @@ -392,12 +491,27 @@ void Float::increaseStackPosition(VariableStackBindings &bindings) const bindings.increaseStackPosition(4); } +void Float::load() const +{ + throw std::runtime_error("Error : Cannot load float yet"); +} + void Float::load(const int &, const int &) const { throw std::runtime_error("Error : Cannot load float yet"); } +void Float::store() const +{ + throw std::runtime_error("Error : Cannot store float yet"); +} + void Float::store(const int &) const { throw std::runtime_error("Error : Cannot store float yet"); } + +void Float::store(const int &, const int &) const +{ + throw std::runtime_error("Error : Cannot store float yet"); +} |