class MMArch { string Arch = "micromips"; list Pattern = []; } class ADD_FM_MM op, bits<10> funct> : MMArch { bits<5> rt; bits<5> rs; bits<5> rd; bits<32> Inst; let Inst{31-26} = op; let Inst{25-21} = rt; let Inst{20-16} = rs; let Inst{15-11} = rd; let Inst{10} = 0; let Inst{9-0} = funct; } class ADDI_FM_MM op> : MMArch { bits<5> rs; bits<5> rt; bits<16> imm16; bits<32> Inst; let Inst{31-26} = op; let Inst{25-21} = rt; let Inst{20-16} = rs; let Inst{15-0} = imm16; } class SLTI_FM_MM op> : MMArch { bits<5> rt; bits<5> rs; bits<16> imm16; bits<32> Inst; let Inst{31-26} = op; let Inst{25-21} = rs; let Inst{20-16} = rt; let Inst{15-0} = imm16; } class LUI_FM_MM : MMArch { bits<5> rt; bits<16> imm16; bits<32> Inst; let Inst{31-26} = 0x10; let Inst{25-21} = 0xd; let Inst{20-16} = rt; let Inst{15-0} = imm16; } class MULT_FM_MM funct> : MMArch { bits<5> rs; bits<5> rt; bits<32> Inst; let Inst{31-26} = 0x00; let Inst{25-21} = rt; let Inst{20-16} = rs; let Inst{15-6} = funct; let Inst{5-0} = 0x3c; } class SRA_FM_MM funct, bit rotate> : MMArch { bits<5> rd; bits<5> rt; bits<5> shamt; bits<32> Inst; let Inst{31-26} = 0; let Inst{25-21} = rd; let Inst{20-16} = rt; let Inst{15-11} = shamt; let Inst{10} = rotate; let Inst{9-0} = funct; } class SRLV_FM_MM funct, bit rotate> : MMArch { bits<5> rd; bits<5> rt; bits<5> rs; bits<32> Inst; let Inst{31-26} = 0; let Inst{25-21} = rt; let Inst{20-16} = rs; let Inst{15-11} = rd; let Inst{10} = rotate; let Inst{9-0} = funct; } class LW_FM_MM op> : MMArch { bits<5> rt; bits<21> addr; bits<32> Inst; let Inst{31-26} = op; let Inst{25-21} = rt; let Inst{20-16} = addr{20-16}; let Inst{15-0} = addr{15-0}; } class LWL_FM_MM funct> { bits<5> rt; bits<21> addr; bits<32> Inst; let Inst{31-26} = 0x18; let Inst{25-21} = rt; let Inst{20-16} = addr{20-16}; let Inst{15-12} = funct; let Inst{11-0} = addr{11-0}; } class CMov_F_I_FM_MM func> : MMArch { bits<5> rd; bits<5> rs; bits<3> fcc; bits<32> Inst; let Inst{31-26} = 0x15; let Inst{25-21} = rd; let Inst{20-16} = rs; let Inst{15-13} = fcc; let Inst{12-6} = func; let Inst{5-0} = 0x3b; } class MTLO_FM_MM funct> : MMArch { bits<5> rs; bits<32> Inst; let Inst{31-26} = 0x00; let Inst{25-21} = 0x00; let Inst{20-16} = rs; let Inst{15-6} = funct; let Inst{5-0} = 0x3c; } class MFLO_FM_MM funct> : MMArch { bits<5> rd; bits<32> Inst; let Inst{31-26} = 0x00; let Inst{25-21} = 0x00; let Inst{20-16} = rd; let Inst{15-6} = funct; let Inst{5-0} = 0x3c; } class CLO_FM_MM funct> : MMArch { bits<5> rd; bits<5> rs; bits<32> Inst; let Inst{31-26} = 0x00; let Inst{25-21} = rd; let Inst{20-16} = rs; let Inst{15-6} = funct; let Inst{5-0} = 0x3c; } class SEB_FM_MM funct> : MMArch { bits<5> rd; bits<5> rt; bits<32> Inst; let Inst{31-26} = 0x00; let Inst{25-21} = rd; let Inst{20-16} = rt; let Inst{15-6} = funct; let Inst{5-0} = 0x3c; } class EXT_FM_MM funct> : MMArch { bits<5> rt; bits<5> rs; bits<5> pos; bits<5> size; bits<32> Inst; let Inst{31-26} = 0x00; let Inst{25-21} = rt; let Inst{20-16} = rs; let Inst{15-11} = size; let Inst{10-6} = pos; let Inst{5-0} = funct; }