Commit eda3505d authored by lxq's avatar lxq

finish most integer instructions

parent 793fd3dd
#ifndef CODEGEN_HPP #ifndef CODEGEN_HPP
#define CODEGEN_HPP #define CODEGEN_HPP
#include "BasicBlock.h"
#include "Function.h" #include "Function.h"
#include "Instruction.h" #include "Instruction.h"
#include "Module.h" #include "Module.h"
...@@ -8,8 +9,11 @@ ...@@ -8,8 +9,11 @@
#include "logging.hpp" #include "logging.hpp"
#include <map> #include <map>
#include <ostream>
#define STACK_ALIGN(x) (((x / 16) + (x % 16 ? 1 : 0)) * 16) #define ALIGN(x, align) (((x / align) + (x % align ? 1 : 0)) * align)
// #define STACK_ALIGN(x) (((x / 16) + (x % 16 ? 1 : 0)) * 16)
#define STACK_ALIGN(x) ALIGN(x, 16)
using std::map; using std::map;
using std::string; using std::string;
...@@ -32,18 +36,23 @@ class CodeGen { ...@@ -32,18 +36,23 @@ class CodeGen {
void run(); void run();
private: private:
void IR2assem(Instruction &);
void IR2assem(ReturnInst *);
void IR2assem(LoadInst *); void IR2assem(LoadInst *);
void IR2assem(StoreInst *); void IR2assem(StoreInst *);
void IR2assem(ReturnInst *);
void IR2assem(BranchInst *) {} void IR2assem(Instruction &);
void IR2assem(BinaryInst *) {}
void IR2assem(AllocaInst *) {}
void IR2assem(PhiInst *) {}
void IR2assem(CallInst *) {}
void IR2assem(GetElementPtrInst *); void IR2assem(GetElementPtrInst *);
void IR2assem(CallInst *);
void IR2assem(BranchInst *);
// The Instructions below will do nothing
void IR2assem(AllocaInst *) {}
// integration with BranchInst
void IR2assem(CmpInst *) {}
void IR2assem(ZextInst *) {} void IR2assem(ZextInst *) {}
void IR2assem(BinaryInst *);
void IR2assem(PhiInst *) {}
void IR2assem(FCmpInst *) {}
void IR2assem(FpToSiInst *) {} void IR2assem(FpToSiInst *) {}
void IR2assem(SiToFpInst *) {} void IR2assem(SiToFpInst *) {}
...@@ -54,11 +63,16 @@ class CodeGen { ...@@ -54,11 +63,16 @@ class CodeGen {
// - for global variables and pointers from alloca and GEP, read through // - for global variables and pointers from alloca and GEP, read through
// address // address
// only use register a_id and t_ // only use register a_id and t_
void value2reg(Value *, int id = 0); void value2reg(Value *, int id = 0, bool is_float = false);
// load the content in ptr to specified register. // load the content in ptr to specified register.
// only use register a_id and t_ // only use register a_id and t_
void ptrContent2reg(Value *, int id = 0); void ptrContent2reg(Value *, int id = 0);
void compute_arg_info(Function *);
string bool2branch(Instruction *);
string label_in_assem(BasicBlock *bb) {
return cur_func->get_name() + bb->get_name().substr(5);
}
int typeLen(Type *type) { int typeLen(Type *type) {
if (type->is_float_type()) if (type->is_float_type())
return 4; return 4;
...@@ -73,8 +87,16 @@ class CodeGen { ...@@ -73,8 +87,16 @@ class CodeGen {
auto arr_tp = static_cast<ArrayType *>(type); auto arr_tp = static_cast<ArrayType *>(type);
int n = arr_tp->get_num_of_elements(); int n = arr_tp->get_num_of_elements();
return n * typeLen(arr_tp->get_element_type()); return n * typeLen(arr_tp->get_element_type());
} else } else {
assert(false && "unexpected case while computing type-length"); assert(false && "unexpected case while computing type-length");
}
}
void back2stack(Instruction *instr, string reg = "$a0") {
// std::cerr << instr->print() << std::endl;
string suff = suffix(typeLen(instr->get_type()));
string addr = "$fp, -" + std::to_string(off[instr]);
output.push_back("st" + suff + " " + reg + " " + addr);
} }
string suffix(int len) { string suffix(int len) {
...@@ -91,8 +113,19 @@ class CodeGen { ...@@ -91,8 +113,19 @@ class CodeGen {
assert(false && "no such suffix"); assert(false && "no such suffix");
} }
std::map<Value *, unsigned int> off; bool no_stack_alloca(Instruction *instr) {
unsigned int N; if (instr->is_void())
return true;
if (instr->is_cmp() or instr->is_zext())
return true;
return false;
}
std::map<Value *, unsigned int> off; // to $fp
std::map<Function *, std::map<int, int>> func_arg_off; // to $sp
std::map<Function *, int> func_arg_N;
unsigned int stackN;
Function *cur_func; Function *cur_func;
......
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment