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