📄 mips.igen
字号:
"lh r<RT>, <OFFSET>(r<BASE>)"*mipsI:*mipsII:*mipsIII:*mipsIV:*mipsV:*mips32:*mips64:*vr4100:*vr5000:*r3900:{ GPR[RT] = EXTEND16 (do_load (SD_, AccessLength_HALFWORD, GPR[BASE], EXTEND16 (OFFSET)));}100101,5.BASE,5.RT,16.OFFSET:NORMAL:32::LHU"lhu r<RT>, <OFFSET>(r<BASE>)"*mipsI:*mipsII:*mipsIII:*mipsIV:*mipsV:*mips32:*mips64:*vr4100:*vr5000:*r3900:{ GPR[RT] = do_load (SD_, AccessLength_HALFWORD, GPR[BASE], EXTEND16 (OFFSET));}110000,5.BASE,5.RT,16.OFFSET:NORMAL:32::LL"ll r<RT>, <OFFSET>(r<BASE>)"*mipsII:*mipsIII:*mipsIV:*mipsV:*mips32:*mips64:*vr4100:*vr5000:{ address_word base = GPR[BASE]; address_word offset = EXTEND16 (OFFSET); { address_word vaddr = loadstore_ea (SD_, base, offset); address_word paddr; int uncached; if ((vaddr & 3) != 0) { SIM_CORE_SIGNAL (SD, CPU, cia, read_map, 4, vaddr, read_transfer, sim_core_unaligned_signal); } else { if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL)) { unsigned64 memval = 0; unsigned64 memval1 = 0; unsigned64 mask = 0x7; unsigned int shift = 2; unsigned int reverse = (ReverseEndian ? (mask >> shift) : 0); unsigned int bigend = (BigEndianCPU ? (mask >> shift) : 0); unsigned int byte; paddr = ((paddr & ~mask) | ((paddr & mask) ^ (reverse << shift))); LoadMemory(&memval,&memval1,uncached,AccessLength_WORD,paddr,vaddr,isDATA,isREAL); byte = ((vaddr & mask) ^ (bigend << shift)); GPR[RT] = EXTEND32 (memval >> (8 * byte)); LLBIT = 1; } } }}110100,5.BASE,5.RT,16.OFFSET:NORMAL:64::LLD"lld r<RT>, <OFFSET>(r<BASE>)"*mipsIII:*mipsIV:*mipsV:*mips64:*vr4100:*vr5000:{ address_word base = GPR[BASE]; address_word offset = EXTEND16 (OFFSET); check_u64 (SD_, instruction_0); { address_word vaddr = loadstore_ea (SD_, base, offset); address_word paddr; int uncached; if ((vaddr & 7) != 0) { SIM_CORE_SIGNAL (SD, CPU, cia, read_map, 8, vaddr, read_transfer, sim_core_unaligned_signal); } else { if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL)) { unsigned64 memval = 0; unsigned64 memval1 = 0; LoadMemory(&memval,&memval1,uncached,AccessLength_DOUBLEWORD,paddr,vaddr,isDATA,isREAL); GPR[RT] = memval; LLBIT = 1; } } }}001111,00000,5.RT,16.IMMEDIATE:NORMAL:32::LUI"lui r<RT>, %#lx<IMMEDIATE>"*mipsI:*mipsII:*mipsIII:*mipsIV:*mipsV:*mips32:*mips64:*vr4100:*vr5000:*r3900:{ TRACE_ALU_INPUT1 (IMMEDIATE); GPR[RT] = EXTEND32 (IMMEDIATE << 16); TRACE_ALU_RESULT (GPR[RT]);}100011,5.BASE,5.RT,16.OFFSET:NORMAL:32::LW"lw r<RT>, <OFFSET>(r<BASE>)"*mipsI:*mipsII:*mipsIII:*mipsIV:*mipsV:*mips32:*mips64:*vr4100:*vr5000:*r3900:{ GPR[RT] = EXTEND32 (do_load (SD_, AccessLength_WORD, GPR[BASE], EXTEND16 (OFFSET)));}1100,ZZ!0!1!3,5.BASE,5.RT,16.OFFSET:NORMAL:32::LWCz"lwc<ZZ> r<RT>, <OFFSET>(r<BASE>)"*mipsI:*mipsII:*mipsIII:*mipsIV:*mipsV:*mips32:*mips64:*vr4100:*vr5000:*r3900:{ COP_LW (ZZ, RT, do_load (SD_, AccessLength_WORD, GPR[BASE], EXTEND16 (OFFSET)));}100010,5.BASE,5.RT,16.OFFSET:NORMAL:32::LWL"lwl r<RT>, <OFFSET>(r<BASE>)"*mipsI:*mipsII:*mipsIII:*mipsIV:*mipsV:*mips32:*mips64:*vr4100:*vr5000:*r3900:{ GPR[RT] = EXTEND32 (do_load_left (SD_, AccessLength_WORD, GPR[BASE], EXTEND16 (OFFSET), GPR[RT]));}100110,5.BASE,5.RT,16.OFFSET:NORMAL:32::LWR"lwr r<RT>, <OFFSET>(r<BASE>)"*mipsI:*mipsII:*mipsIII:*mipsIV:*mipsV:*mips32:*mips64:*vr4100:*vr5000:*r3900:{ GPR[RT] = EXTEND32 (do_load_right (SD_, AccessLength_WORD, GPR[BASE], EXTEND16 (OFFSET), GPR[RT]));}100111,5.BASE,5.RT,16.OFFSET:NORMAL:64::LWU"lwu r<RT>, <OFFSET>(r<BASE>)"*mipsIII:*mipsIV:*mipsV:*mips64:*vr4100:*vr5000:{ check_u64 (SD_, instruction_0); GPR[RT] = do_load (SD_, AccessLength_WORD, GPR[BASE], EXTEND16 (OFFSET));}011100,5.RS,5.RT,00000,00000,000000:SPECIAL2:32::MADD"madd r<RS>, r<RT>"*mips32:*mips64:*vr5500:{ signed64 temp; check_mult_hilo (SD_, HIHISTORY, LOHISTORY); if (NotWordValue (GPR[RS]) || NotWordValue (GPR[RT])) Unpredictable (); TRACE_ALU_INPUT2 (GPR[RS], GPR[RT]); temp = (U8_4 (VL4_8 (HI), VL4_8 (LO)) + ((signed64) EXTEND32 (GPR[RT]) * (signed64) EXTEND32 (GPR[RS]))); LO = EXTEND32 (temp); HI = EXTEND32 (VH4_8 (temp)); TRACE_ALU_RESULT2 (HI, LO);}011100,5.RS,5.RT,00000,00000,000001:SPECIAL2:32::MADDU"maddu r<RS>, r<RT>"*mips32:*mips64:*vr5500:{ unsigned64 temp; check_mult_hilo (SD_, HIHISTORY, LOHISTORY); if (NotWordValue (GPR[RS]) || NotWordValue (GPR[RT])) Unpredictable (); TRACE_ALU_INPUT2 (GPR[RS], GPR[RT]); temp = (U8_4 (VL4_8 (HI), VL4_8 (LO)) + ((unsigned64) VL4_8 (GPR[RS]) * (unsigned64) VL4_8 (GPR[RT]))); LO = EXTEND32 (temp); HI = EXTEND32 (VH4_8 (temp)); TRACE_ALU_RESULT2 (HI, LO);}:function:::void:do_mfhi:int rd{ check_mf_hilo (SD_, HIHISTORY, LOHISTORY); TRACE_ALU_INPUT1 (HI); GPR[rd] = HI; TRACE_ALU_RESULT (GPR[rd]);}000000,0000000000,5.RD,00000,010000:SPECIAL:32::MFHI"mfhi r<RD>"*mipsI:*mipsII:*mipsIII:*mipsIV:*mipsV:*mips32:*mips64:*vr4100:*vr5000:*r3900:{ do_mfhi (SD_, RD);}:function:::void:do_mflo:int rd{ check_mf_hilo (SD_, LOHISTORY, HIHISTORY); TRACE_ALU_INPUT1 (LO); GPR[rd] = LO; TRACE_ALU_RESULT (GPR[rd]);}000000,0000000000,5.RD,00000,010010:SPECIAL:32::MFLO"mflo r<RD>"*mipsI:*mipsII:*mipsIII:*mipsIV:*mipsV:*mips32:*mips64:*vr4100:*vr5000:*r3900:{ do_mflo (SD_, RD);}000000,5.RS,5.RT,5.RD,00000,001011:SPECIAL:32::MOVN"movn r<RD>, r<RS>, r<RT>"*mipsIV:*mipsV:*mips32:*mips64:*vr5000:{ if (GPR[RT] != 0) { GPR[RD] = GPR[RS]; TRACE_ALU_RESULT (GPR[RD]); }}000000,5.RS,5.RT,5.RD,00000,001010:SPECIAL:32::MOVZ"movz r<RD>, r<RS>, r<RT>"*mipsIV:*mipsV:*mips32:*mips64:*vr5000:{ if (GPR[RT] == 0) { GPR[RD] = GPR[RS]; TRACE_ALU_RESULT (GPR[RD]); }}011100,5.RS,5.RT,00000,00000,000100:SPECIAL2:32::MSUB"msub r<RS>, r<RT>"*mips32:*mips64:*vr5500:{ signed64 temp; check_mult_hilo (SD_, HIHISTORY, LOHISTORY); if (NotWordValue (GPR[RS]) || NotWordValue (GPR[RT])) Unpredictable (); TRACE_ALU_INPUT2 (GPR[RS], GPR[RT]); temp = (U8_4 (VL4_8 (HI), VL4_8 (LO)) - ((signed64) EXTEND32 (GPR[RT]) * (signed64) EXTEND32 (GPR[RS]))); LO = EXTEND32 (temp); HI = EXTEND32 (VH4_8 (temp)); TRACE_ALU_RESULT2 (HI, LO);}011100,5.RS,5.RT,00000,00000,000101:SPECIAL2:32::MSUBU"msubu r<RS>, r<RT>"*mips32:*mips64:*vr5500:{ unsigned64 temp; check_mult_hilo (SD_, HIHISTORY, LOHISTORY); if (NotWordValue (GPR[RS]) || NotWordValue (GPR[RT])) Unpredictable (); TRACE_ALU_INPUT2 (GPR[RS], GPR[RT]); temp = (U8_4 (VL4_8 (HI), VL4_8 (LO)) - ((unsigned64) VL4_8 (GPR[RS]) * (unsigned64) VL4_8 (GPR[RT]))); LO = EXTEND32 (temp); HI = EXTEND32 (VH4_8 (temp)); TRACE_ALU_RESULT2 (HI, LO);}000000,5.RS,000000000000000,010001:SPECIAL:32::MTHI"mthi r<RS>"*mipsI:*mipsII:*mipsIII:*mipsIV:*mipsV:*mips32:*mips64:*vr4100:*vr5000:*r3900:{ check_mt_hilo (SD_, HIHISTORY); HI = GPR[RS];}000000,5.RS,000000000000000,010011:SPECIAL:32::MTLO"mtlo r<RS>"*mipsI:*mipsII:*mipsIII:*mipsIV:*mipsV:*mips32:*mips64:*vr4100:*vr5000:*r3900:{ check_mt_hilo (SD_, LOHISTORY); LO = GPR[RS];}011100,5.RS,5.RT,5.RD,00000,000010:SPECIAL2:32::MUL"mul r<RD>, r<RS>, r<RT>"*mips32:*mips64:*vr5500:{ signed64 prod; if (NotWordValue (GPR[RS]) || NotWordValue (GPR[RT])) Unpredictable (); TRACE_ALU_INPUT2 (GPR[RS], GPR[RT]); prod = (((signed64)(signed32) GPR[RS]) * ((signed64)(signed32) GPR[RT])); GPR[RD] = EXTEND32 (VL4_8 (prod)); TRACE_ALU_RESULT (GPR[RD]);}:function:::void:do_mult:int rs, int rt, int rd{ signed64 prod; check_mult_hilo (SD_, HIHISTORY, LOHISTORY); if (NotWordValue (GPR[rs]) || NotWordValue (GPR[rt])) Unpredictable (); TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]); prod = (((signed64)(signed32) GPR[rs]) * ((signed64)(signed32) GPR[rt])); LO = EXTEND32 (VL4_8 (prod)); HI = EXTEND32 (VH4_8 (prod)); if (rd != 0) GPR[rd] = LO; TRACE_ALU_RESULT2 (HI, LO);}000000,5.RS,5.RT,0000000000,011000:SPECIAL:32::MULT"mult r<RS>, r<RT>"*mipsI:*mipsII:*mipsIII:*mipsIV:*mipsV:*mips32:*mips64:*vr4100:{ do_mult (SD_, RS, RT, 0);}000000,5.RS,5.RT,5.RD,00000,011000:SPECIAL:32::MULT"mult r<RS>, r<RT>":RD == 0"mult r<RD>, r<RS>, r<RT>"*vr5000:*r3900:{ do_mult (SD_, RS, RT, RD);}:function:::void:do_multu:int rs, int rt, int rd{ unsigned64 prod; check_mult_hilo (SD_, HIHISTORY, LOHISTORY); if (NotWordValue (GPR[rs]) || NotWordValue (GPR[rt])) Unpredictable (); TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]); prod = (((unsigned64)(unsigned32) GPR[rs]) * ((unsigned64)(unsigned32) GPR[rt])); LO = EXTEND32 (VL4_8 (prod)); HI = EXTEND32 (VH4_8 (prod)); if (rd != 0) GPR[rd] = LO; TRACE_ALU_RESULT2 (HI, LO);}000000,5.RS,5.RT,0000000000,011001:SPECIAL:32::MULTU"multu r<RS>, r<RT>"*mipsI:*mipsII:*mipsIII:*mipsIV:*mipsV:*mips32:*mips64:*vr4100:{ do_multu (SD_, RS, RT, 0);}000000,5.RS,5.RT,5.RD,00000,011001:SPECIAL:32::MULTU"multu r<RS>, r<RT>":RD == 0"multu r<RD>, r<RS>, r<RT>"*vr5000:*r3900:{ do_multu (SD_, RS, RT, RD);}:function:::void:do_nor:int rs, int rt, int rd{ TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]); GPR[rd] = ~ (GPR[rs] | GPR[rt]); TRACE_ALU_RESULT (GPR[rd]);}000000,5.RS,5.RT,5.RD,00000,100111:SPECIAL:32::NOR"nor r<RD>, r<RS>, r<RT>"*mipsI:*mipsII:*mipsIII:*mipsIV:*mipsV:*mips32:*mips64:*vr4100:*vr5000:*r3900:{ do_nor (SD_, RS, RT, RD);}:function:::void:do_or:int rs, int rt, int rd{ TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]); GPR[rd] = (GPR[rs] | GPR[rt]); TRACE_ALU_RESULT (GPR[rd]);}000000,5.RS,5.RT,5.RD,00000,100101:SPECIAL:32::OR"or r<RD>, r<RS>, r<RT>"*mipsI:*mipsII:*mipsIII:*mipsIV:*mipsV:*mips32:*mips64:*vr4100:*vr5000:*r3900:{ do_or (SD_, RS, RT, RD);}:function:::void:do_ori:int rs, int rt, unsigned immediate{ TRACE_ALU_INPUT2 (GPR[rs], immediate); GPR[rt] = (GPR[rs] | immediate); TRACE_ALU_RESULT (GPR[rt]);}001101,5.RS,5.RT,16.IMMEDIATE:NORMAL:32::ORI"ori r<RT>, r<RS>, %#lx<IMMEDIATE>"*mipsI:*mipsII:*mipsIII:*mipsIV:*mipsV:*mips32:*mips64:*vr4100:*vr5000:*r3900:{ do_ori (SD_, RS, RT, IMMEDIATE);}110011,5.BASE,5.HINT,16.OFFSET:NORMAL:32::PREF"pref <HINT>, <OFFSET>(r<BASE>)"*mipsIV:*mipsV:*mips32:*mips64:*vr5000:{ address_word base = GPR[BASE]; address_word offset = EXTEND16 (OFFSET); { address_word vaddr = loadstore_ea (SD_, base, offset); address_word paddr; int uncached; { if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL)) Prefetch(uncached,paddr,vaddr,isDATA,HINT); } }}:function:::void:do_store:unsigned access, address_word base, address_word offset, unsigned_word word{ address_word mask = (WITH_TARGET_WORD_BITSIZE == 64 ? 0x7 : 0x3); address_word reverseendian = (ReverseEndian ? (mask ^ access) : 0); address_word bigendiancpu = (BigEndianCPU ? (mask ^ access) : 0); unsigned int byte; address_word paddr; int uncached; unsigned64 memval; address_word vaddr; vaddr = loadstore_ea (SD_, base, offset); if ((vaddr & access) != 0) { SIM_CORE_SIGNAL (SD, STATE_CPU(SD, 0), cia, read_map, access+1, vaddr, write_transfer, sim_core_unaligned_signal); } AddressTranslation (vaddr, isDATA, isSTORE, &paddr, &uncached, isTARGET, isREAL); paddr = ((paddr & ~mask) | ((paddr & mask) ^ reverseendian)); byte = ((vaddr & mask) ^ bigendiancpu); memval = (word << (8 * byte)); StoreMemory (uncached, access, memval, 0, paddr, vaddr, isREAL);}:function:::void:do_store_left:unsigned access, address_word base, address_word offset, unsigned_word rt{ address_word mask = (WITH_TARGET_WORD_BITSIZE == 64 ? 0x7 : 0x3); address_word reverseendian = (ReverseEndian ? -1 : 0); address_word bigendiancpu = (BigEndianCPU ? -1 : 0); unsigned int byte; unsigned int word; address_word paddr; int uncached; unsigned64 memval; address_word vaddr; int nr_lhs_bits; int nr_rhs_bits; vaddr = loadstore_ea (SD_, base, offset); AddressTranslation (vaddr, isDATA, isSTORE, &paddr, &uncached, isTARGET, isREAL); paddr = (paddr ^ (reverseendian & mask)); if (BigEndianMem == 0) paddr = paddr & ~access; /* compute where within the word/mem we are */ byte = ((vaddr ^ bigendiancpu) & access); /* 0..access */ word = ((vaddr ^ bigendiancpu) & (mask & ~access)) / (access + 1); /* 0..1 */ nr_lhs_bits = 8 * byte + 8; nr_rhs_bits = 8 * access - 8 * byte; /* nr_lhs_bits + nr_rhs_bits == 8 * (accesss + 1) */ /* fprintf (stderr, "s[wd]l: 0x%08lx%08lx 0x%08lx%08lx %d:%d %d+%d\n", (long) ((unsigned64) vaddr >> 32), (long) vaddr, (long) ((unsigned64) paddr >> 32), (long) paddr, word, byte, nr_lhs_bits, nr_rhs_bits); */ if (word == 0) { memval = (rt >> nr_rhs_bits); } else { memval = (rt << nr_lhs_bits); } /* fprintf (stderr, "s[wd]l: 0x%08lx%08lx -> 0x%08lx%08lx\n", (long) ((unsigned64) rt >> 32), (long) rt, (long) ((unsigned64) memval >> 32), (long) memval); */ StoreMemory (uncached, byte, memval, 0, paddr, vaddr, isREAL);}:function:::void:do_store_right:unsigned access, address_word base, address_word offset, unsigned_word rt
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -