00001 #ifndef __sparc_pat_H__
00002 #define __sparc_pat_H__
00003 class InstructionPatterns {
00004 private:
00005 static int SP;
00006 static int FP;
00007 static int o0;
00008 static int i0;
00009 static int i7;
00010 static int o7;
00011 static int g0;
00012 public:
00013 static Logue* std_call(CSR& csr, ADDRESS& lc, int& addr);
00014 static Logue* struct_call(CSR& csr, ADDRESS& lc, int& addr, int& imm22);
00015 static Logue* call_rst_ui_reg(CSR& csr, ADDRESS& lc, int& addr, int& imm22, int& rs1, int& rs2, int& rd);
00016 static Logue* call_rst_ui_imm(CSR& csr, ADDRESS& lc, int& addr, int& imm22, int& rs1, int& imm, int& rd);
00017 static Logue* call_restore_reg(CSR& csr, ADDRESS& lc, int& addr, int& rs1, int& rs2, int& rd);
00018 static Logue* call_restore_imm(CSR& csr, ADDRESS& lc, int& addr, int& rs1, int& imm, int& rd);
00019 static Logue* move_call_move(CSR& csr, ADDRESS& lc, int& addr, int& rd);
00020 static Logue* move_x_call_move(CSR& csr, ADDRESS& lc, int& addr, int& rd);
00021 static Logue* call_add(CSR& csr, ADDRESS& lc, int& addr, int& imm);
00022 static Logue* jmp_restore_reg(CSR& csr, ADDRESS& lc, int& rs1j, int& rdj, int& rs1, int& rs2, int& rd);
00023 static Logue* jmp_restore_imm(CSR& csr, ADDRESS& lc, int& rs1j, int& rdj, int& rs1, int& imm, int& rd);
00024 static Logue* new_reg_win(CSR& csr, ADDRESS& lc, int& locals);
00025 static Logue* same_reg_win(CSR& csr, ADDRESS& lc, int& locals);
00026 static Logue* new_reg_win_large(CSR& csr, ADDRESS& lc, int& hiVal, int& loVal, int& reg);
00027 static Logue* same_reg_win_large(CSR& csr, ADDRESS& lc, int& hiVal, int& loVal, int& reg);
00028 static Logue* none(CSR& csr, ADDRESS& lc);
00029 static Logue* std_ret(CSR& csr, ADDRESS& lc);
00030 static Logue* ret_reg_val(CSR& csr, ADDRESS& lc, int& rs1, int& rs2);
00031 static Logue* ret_imm_val(CSR& csr, ADDRESS& lc, int& rs1, int& imm);
00032 static Logue* leaf_ret(CSR& csr, ADDRESS& lc);
00033 static Logue* ret_struct4(CSR& csr, ADDRESS& lc);
00034 private:
00035 static bool ADD$imode(ADDRESS& lc, int& a, bool a_isVAR, int& b, bool b_isVAR, int& c, bool c_isVAR);
00036 static bool ADD$rmode(ADDRESS& lc, int& a, bool a_isVAR, int& b, bool b_isVAR, int& c, bool c_isVAR);
00037 static bool JMPL$dispA(ADDRESS& lc, int& a, bool a_isVAR, int& b, bool b_isVAR, int& c, bool c_isVAR);
00038 static bool JMPL$indirectA(ADDRESS& lc, int& a, bool a_isVAR, int& b, bool b_isVAR);
00039 static bool OR$imode(ADDRESS& lc, int& a, bool a_isVAR, int& b, bool b_isVAR, int& c, bool c_isVAR);
00040 static bool RESTORE$imode(ADDRESS& lc, int& a, bool a_isVAR, int& b, bool b_isVAR, int& c, bool c_isVAR);
00041 static bool RESTORE$rmode(ADDRESS& lc, int& a, bool a_isVAR, int& b, bool b_isVAR, int& c, bool c_isVAR);
00042 static bool SAVE$imode(ADDRESS& lc, int& a, bool a_isVAR, int& b, bool b_isVAR, int& c, bool c_isVAR);
00043 static bool SAVE$rmode(ADDRESS& lc, int& a, bool a_isVAR, int& b, bool b_isVAR, int& c, bool c_isVAR);
00044 static bool SUB$imode(ADDRESS& lc, int& a, bool a_isVAR, int& b, bool b_isVAR, int& c, bool c_isVAR);
00045 static bool UNIMP(ADDRESS& lc, int& a, bool a_isVAR);
00046 static bool call__(ADDRESS& lc, int& a, bool a_isVAR);
00047 static bool dispA(ADDRESS& lc, int& a, bool a_isVAR, int& b, bool b_isVAR);
00048 static bool imode(ADDRESS& lc, int& a, bool a_isVAR);
00049 static bool indirectA(ADDRESS& lc, int& a, bool a_isVAR);
00050 static bool mov_(ADDRESS& lc, int& a, bool a_isVAR, int& b, bool b_isVAR);
00051 static bool restore_(ADDRESS& lc);
00052 static bool ret(ADDRESS& lc);
00053 static bool retl(ADDRESS& lc);
00054 static bool rmode(ADDRESS& lc, int& a, bool a_isVAR);
00055 static bool sethi(ADDRESS& lc, int& a, bool a_isVAR, int& b, bool b_isVAR);
00056 };
00057 #endif