📄 mips.igen
字号:
} TRACE_ALU_RESULT2 (HI, LO);}000000,5.RS,5.RT,0000000000,011010:SPECIAL:32::DIV"div r<RS>, r<RT>"*mipsI:*mipsII:*mipsIII:*mipsIV:*mipsV:*mips32:*mips64:*vr4100:*vr5000:*r3900:{ do_div (SD_, RS, RT);}:function:::void:do_divu:int rs, int rt{ check_div_hilo (SD_, HIHISTORY, LOHISTORY); TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]); { unsigned32 n = GPR[rs]; unsigned32 d = GPR[rt]; if (d == 0) { LO = EXTEND32 (0x80000000); HI = EXTEND32 (0); } else { LO = EXTEND32 (n / d); HI = EXTEND32 (n % d); } } TRACE_ALU_RESULT2 (HI, LO);}000000,5.RS,5.RT,0000000000,011011:SPECIAL:32::DIVU"divu r<RS>, r<RT>"*mipsI:*mipsII:*mipsIII:*mipsIV:*mipsV:*mips32:*mips64:*vr4100:*vr5000:*r3900:{ do_divu (SD_, RS, RT);}:function:::void:do_dmultx:int rs, int rt, int rd, int signed_p{ unsigned64 lo; unsigned64 hi; unsigned64 m00; unsigned64 m01; unsigned64 m10; unsigned64 m11; unsigned64 mid; int sign; unsigned64 op1 = GPR[rs]; unsigned64 op2 = GPR[rt]; check_mult_hilo (SD_, HIHISTORY, LOHISTORY); TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]); /* make signed multiply unsigned */ sign = 0; if (signed_p) { if ((signed64) op1 < 0) { op1 = - op1; ++sign; } if ((signed64) op2 < 0) { op2 = - op2; ++sign; } } /* multiply out the 4 sub products */ m00 = ((unsigned64) VL4_8 (op1) * (unsigned64) VL4_8 (op2)); m10 = ((unsigned64) VH4_8 (op1) * (unsigned64) VL4_8 (op2)); m01 = ((unsigned64) VL4_8 (op1) * (unsigned64) VH4_8 (op2)); m11 = ((unsigned64) VH4_8 (op1) * (unsigned64) VH4_8 (op2)); /* add the products */ mid = ((unsigned64) VH4_8 (m00) + (unsigned64) VL4_8 (m10) + (unsigned64) VL4_8 (m01)); lo = U8_4 (mid, m00); hi = (m11 + (unsigned64) VH4_8 (mid) + (unsigned64) VH4_8 (m01) + (unsigned64) VH4_8 (m10)); /* fix the sign */ if (sign & 1) { lo = -lo; if (lo == 0) hi = -hi; else hi = -hi - 1; } /* save the result HI/LO (and a gpr) */ LO = lo; HI = hi; if (rd != 0) GPR[rd] = lo; TRACE_ALU_RESULT2 (HI, LO);}:function:::void:do_dmult:int rs, int rt, int rd{ do_dmultx (SD_, rs, rt, rd, 1);}000000,5.RS,5.RT,0000000000,011100:SPECIAL:64::DMULT"dmult r<RS>, r<RT>"*mipsIII:*mipsIV:*mipsV:*mips64:*vr4100:{ check_u64 (SD_, instruction_0); do_dmult (SD_, RS, RT, 0);}000000,5.RS,5.RT,5.RD,00000,011100:SPECIAL:64::DMULT"dmult r<RS>, r<RT>":RD == 0"dmult r<RD>, r<RS>, r<RT>"*vr5000:{ check_u64 (SD_, instruction_0); do_dmult (SD_, RS, RT, RD);}:function:::void:do_dmultu:int rs, int rt, int rd{ do_dmultx (SD_, rs, rt, rd, 0);}000000,5.RS,5.RT,0000000000,011101:SPECIAL:64::DMULTU"dmultu r<RS>, r<RT>"*mipsIII:*mipsIV:*mipsV:*mips64:*vr4100:{ check_u64 (SD_, instruction_0); do_dmultu (SD_, RS, RT, 0);}000000,5.RS,5.RT,5.RD,00000,011101:SPECIAL:64::DMULTU"dmultu r<RD>, r<RS>, r<RT>":RD == 0"dmultu r<RS>, r<RT>"*vr5000:{ check_u64 (SD_, instruction_0); do_dmultu (SD_, RS, RT, RD);}:function:::void:do_dsll:int rt, int rd, int shift{ TRACE_ALU_INPUT2 (GPR[rt], shift); GPR[rd] = GPR[rt] << shift; TRACE_ALU_RESULT (GPR[rd]);}000000,00000,5.RT,5.RD,5.SHIFT,111000:SPECIAL:64::DSLL"dsll r<RD>, r<RT>, <SHIFT>"*mipsIII:*mipsIV:*mipsV:*mips64:*vr4100:*vr5000:{ check_u64 (SD_, instruction_0); do_dsll (SD_, RT, RD, SHIFT);}000000,00000,5.RT,5.RD,5.SHIFT,111100:SPECIAL:64::DSLL32"dsll32 r<RD>, r<RT>, <SHIFT>"*mipsIII:*mipsIV:*mipsV:*mips64:*vr4100:*vr5000:{ int s = 32 + SHIFT; check_u64 (SD_, instruction_0); TRACE_ALU_INPUT2 (GPR[RT], s); GPR[RD] = GPR[RT] << s; TRACE_ALU_RESULT (GPR[RD]);}:function:::void:do_dsllv:int rs, int rt, int rd{ int s = MASKED64 (GPR[rs], 5, 0); TRACE_ALU_INPUT2 (GPR[rt], s); GPR[rd] = GPR[rt] << s; TRACE_ALU_RESULT (GPR[rd]);}000000,5.RS,5.RT,5.RD,00000,010100:SPECIAL:64::DSLLV"dsllv r<RD>, r<RT>, r<RS>"*mipsIII:*mipsIV:*mipsV:*mips64:*vr4100:*vr5000:{ check_u64 (SD_, instruction_0); do_dsllv (SD_, RS, RT, RD);}:function:::void:do_dsra:int rt, int rd, int shift{ TRACE_ALU_INPUT2 (GPR[rt], shift); GPR[rd] = ((signed64) GPR[rt]) >> shift; TRACE_ALU_RESULT (GPR[rd]);}000000,00000,5.RT,5.RD,5.SHIFT,111011:SPECIAL:64::DSRA"dsra r<RD>, r<RT>, <SHIFT>"*mipsIII:*mipsIV:*mipsV:*mips64:*vr4100:*vr5000:{ check_u64 (SD_, instruction_0); do_dsra (SD_, RT, RD, SHIFT);}000000,00000,5.RT,5.RD,5.SHIFT,111111:SPECIAL:64::DSRA32"dsra32 r<RD>, r<RT>, <SHIFT>"*mipsIII:*mipsIV:*mipsV:*mips64:*vr4100:*vr5000:{ int s = 32 + SHIFT; check_u64 (SD_, instruction_0); TRACE_ALU_INPUT2 (GPR[RT], s); GPR[RD] = ((signed64) GPR[RT]) >> s; TRACE_ALU_RESULT (GPR[RD]);}:function:::void:do_dsrav:int rs, int rt, int rd{ int s = MASKED64 (GPR[rs], 5, 0); TRACE_ALU_INPUT2 (GPR[rt], s); GPR[rd] = ((signed64) GPR[rt]) >> s; TRACE_ALU_RESULT (GPR[rd]);}000000,5.RS,5.RT,5.RD,00000,010111:SPECIAL:64::DSRAV"dsrav r<RD>, r<RT>, r<RS>"*mipsIII:*mipsIV:*mipsV:*mips64:*vr4100:*vr5000:{ check_u64 (SD_, instruction_0); do_dsrav (SD_, RS, RT, RD);}:function:::void:do_dsrl:int rt, int rd, int shift{ TRACE_ALU_INPUT2 (GPR[rt], shift); GPR[rd] = (unsigned64) GPR[rt] >> shift; TRACE_ALU_RESULT (GPR[rd]);}000000,00000,5.RT,5.RD,5.SHIFT,111010:SPECIAL:64::DSRL"dsrl r<RD>, r<RT>, <SHIFT>"*mipsIII:*mipsIV:*mipsV:*mips64:*vr4100:*vr5000:{ check_u64 (SD_, instruction_0); do_dsrl (SD_, RT, RD, SHIFT);}000000,00000,5.RT,5.RD,5.SHIFT,111110:SPECIAL:64::DSRL32"dsrl32 r<RD>, r<RT>, <SHIFT>"*mipsIII:*mipsIV:*mipsV:*mips64:*vr4100:*vr5000:{ int s = 32 + SHIFT; check_u64 (SD_, instruction_0); TRACE_ALU_INPUT2 (GPR[RT], s); GPR[RD] = (unsigned64) GPR[RT] >> s; TRACE_ALU_RESULT (GPR[RD]);}:function:::void:do_dsrlv:int rs, int rt, int rd{ int s = MASKED64 (GPR[rs], 5, 0); TRACE_ALU_INPUT2 (GPR[rt], s); GPR[rd] = (unsigned64) GPR[rt] >> s; TRACE_ALU_RESULT (GPR[rd]);}000000,5.RS,5.RT,5.RD,00000,010110:SPECIAL:64::DSRLV"dsrlv r<RD>, r<RT>, r<RS>"*mipsIII:*mipsIV:*mipsV:*mips64:*vr4100:*vr5000:{ check_u64 (SD_, instruction_0); do_dsrlv (SD_, RS, RT, RD);}000000,5.RS,5.RT,5.RD,00000,101110:SPECIAL:64::DSUB"dsub r<RD>, r<RS>, r<RT>"*mipsIII:*mipsIV:*mipsV:*mips64:*vr4100:*vr5000:{ check_u64 (SD_, instruction_0); TRACE_ALU_INPUT2 (GPR[RS], GPR[RT]); { ALU64_BEGIN (GPR[RS]); ALU64_SUB (GPR[RT]); ALU64_END (GPR[RD]); /* This checks for overflow. */ } TRACE_ALU_RESULT (GPR[RD]);}:function:::void:do_dsubu: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,101111:SPECIAL:64::DSUBU"dsubu r<RD>, r<RS>, r<RT>"*mipsIII:*mipsIV:*mipsV:*mips64:*vr4100:*vr5000:{ check_u64 (SD_, instruction_0); do_dsubu (SD_, RS, RT, RD);}000010,26.INSTR_INDEX:NORMAL:32::J"j <INSTR_INDEX>"*mipsI:*mipsII:*mipsIII:*mipsIV:*mipsV:*mips32:*mips64:*vr4100:*vr5000:*r3900:{ /* NOTE: The region used is that of the delay slot NIA and NOT the current instruction */ address_word region = (NIA & MASK (63, 28)); DELAY_SLOT (region | (INSTR_INDEX << 2));}000011,26.INSTR_INDEX:NORMAL:32::JAL"jal <INSTR_INDEX>"*mipsI:*mipsII:*mipsIII:*mipsIV:*mipsV:*mips32:*mips64:*vr4100:*vr5000:*r3900:{ /* NOTE: The region used is that of the delay slot and NOT the current instruction */ address_word region = (NIA & MASK (63, 28)); GPR[31] = CIA + 8; DELAY_SLOT (region | (INSTR_INDEX << 2));}000000,5.RS,00000,5.RD,00000,001001:SPECIAL:32::JALR"jalr r<RS>":RD == 31"jalr r<RD>, r<RS>"*mipsI:*mipsII:*mipsIII:*mipsIV:*mipsV:*mips32:*mips64:*vr4100:*vr5000:*r3900:{ address_word temp = GPR[RS]; GPR[RD] = CIA + 8; DELAY_SLOT (temp);}000000,5.RS,000000000000000,001000:SPECIAL:32::JR"jr r<RS>"*mipsI:*mipsII:*mipsIII:*mipsIV:*mipsV:*mips32:*mips64:*vr4100:*vr5000:*r3900:{ DELAY_SLOT (GPR[RS]);}:function:::unsigned_word:do_load:unsigned access, address_word base, address_word offset{ 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, read_transfer, sim_core_unaligned_signal); } AddressTranslation (vaddr, isDATA, isLOAD, &paddr, &uncached, isTARGET, isREAL); paddr = ((paddr & ~mask) | ((paddr & mask) ^ reverseendian)); LoadMemory (&memval, NULL, uncached, access, paddr, vaddr, isDATA, isREAL); byte = ((vaddr & mask) ^ bigendiancpu); return (memval >> (8 * byte));}:function:::unsigned_word:do_load_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; unsigned_word lhs_mask; unsigned_word temp; vaddr = loadstore_ea (SD_, base, offset); AddressTranslation (vaddr, isDATA, isLOAD, &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, "l[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); */ LoadMemory (&memval, NULL, uncached, byte, paddr, vaddr, isDATA, isREAL); if (word == 0) { /* GPR{31..32-NR_LHS_BITS} = memval{NR_LHS_BITS-1..0} */ temp = (memval << nr_rhs_bits); } else { /* GPR{31..32-NR_LHS_BITS = memval{32+NR_LHS_BITS..32} */ temp = (memval >> nr_lhs_bits); } lhs_mask = LSMASK (nr_lhs_bits + nr_rhs_bits - 1, nr_rhs_bits); rt = (rt & ~lhs_mask) | (temp & lhs_mask); /* fprintf (stderr, "l[wd]l: 0x%08lx%08lx -> 0x%08lx%08lx & 0x%08lx%08lx -> 0x%08lx%08lx\n", (long) ((unsigned64) memval >> 32), (long) memval, (long) ((unsigned64) temp >> 32), (long) temp, (long) ((unsigned64) lhs_mask >> 32), (long) lhs_mask, (long) (rt >> 32), (long) rt); */ return rt;}:function:::unsigned_word:do_load_right: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; address_word paddr; int uncached; unsigned64 memval; address_word vaddr; vaddr = loadstore_ea (SD_, base, offset); AddressTranslation (vaddr, isDATA, isLOAD, &paddr, &uncached, isTARGET, isREAL); /* NOTE: SPEC is wrong, has `BigEndianMem == 0' not `BigEndianMem != 0' */ paddr = (paddr ^ (reverseendian & mask)); if (BigEndianMem != 0) paddr = paddr & ~access; byte = ((vaddr & mask) ^ (bigendiancpu & mask)); /* NOTE: SPEC is wrong, had `byte' not `access - byte'. See SW. */ LoadMemory (&memval, NULL, uncached, access - (access & byte), paddr, vaddr, isDATA, isREAL); /* printf ("lr: 0x%08lx %d@0x%08lx 0x%08lx\n", (long) paddr, byte, (long) paddr, (long) memval); */ { unsigned_word screen = LSMASK (8 * (access - (byte & access) + 1) - 1, 0); rt &= ~screen; rt |= (memval >> (8 * byte)) & screen; } return rt;}100000,5.BASE,5.RT,16.OFFSET:NORMAL:32::LB"lb r<RT>, <OFFSET>(r<BASE>)"*mipsI:*mipsII:*mipsIII:*mipsIV:*mipsV:*mips32:*mips64:*vr4100:*vr5000:*r3900:{ GPR[RT] = EXTEND8 (do_load (SD_, AccessLength_BYTE, GPR[BASE], EXTEND16 (OFFSET)));}100100,5.BASE,5.RT,16.OFFSET:NORMAL:32::LBU"lbu r<RT>, <OFFSET>(r<BASE>)"*mipsI:*mipsII:*mipsIII:*mipsIV:*mipsV:*mips32:*mips64:*vr4100:*vr5000:*r3900:{ GPR[RT] = do_load (SD_, AccessLength_BYTE, GPR[BASE], EXTEND16 (OFFSET));}110111,5.BASE,5.RT,16.OFFSET:NORMAL:64::LD"ld r<RT>, <OFFSET>(r<BASE>)"*mipsIII:*mipsIV:*mipsV:*mips64:*vr4100:*vr5000:{ check_u64 (SD_, instruction_0); GPR[RT] = EXTEND64 (do_load (SD_, AccessLength_DOUBLEWORD, GPR[BASE], EXTEND16 (OFFSET)));}1101,ZZ!0!1!3,5.BASE,5.RT,16.OFFSET:NORMAL:64::LDCz"ldc<ZZ> r<RT>, <OFFSET>(r<BASE>)"*mipsII:*mipsIII:*mipsIV:*mipsV:*mips32:*mips64:*vr4100:*vr5000:*r3900:{ COP_LD (ZZ, RT, do_load (SD_, AccessLength_DOUBLEWORD, GPR[BASE], EXTEND16 (OFFSET)));}011010,5.BASE,5.RT,16.OFFSET:NORMAL:64::LDL"ldl r<RT>, <OFFSET>(r<BASE>)"*mipsIII:*mipsIV:*mipsV:*mips64:*vr4100:*vr5000:{ check_u64 (SD_, instruction_0); GPR[RT] = do_load_left (SD_, AccessLength_DOUBLEWORD, GPR[BASE], EXTEND16 (OFFSET), GPR[RT]);}011011,5.BASE,5.RT,16.OFFSET:NORMAL:64::LDR"ldr r<RT>, <OFFSET>(r<BASE>)"*mipsIII:*mipsIV:*mipsV:*mips64:*vr4100:*vr5000:{ check_u64 (SD_, instruction_0); GPR[RT] = do_load_right (SD_, AccessLength_DOUBLEWORD, GPR[BASE], EXTEND16 (OFFSET), GPR[RT]);}100001,5.BASE,5.RT,16.OFFSET:NORMAL:32::LH
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -