📄 mips_emit.h
字号:
#define mips_emit_sltu(rd, rs, rt) \ mips_emit_special(sltu, rs, rt, rd, 0) \#define mips_emit_sllv(rd, rt, rs) \ mips_emit_special(sllv, rs, rt, rd, 0) \#define mips_emit_srlv(rd, rt, rs) \ mips_emit_special(srlv, rs, rt, rd, 0) \#define mips_emit_srav(rd, rt, rs) \ mips_emit_special(srav, rs, rt, rd, 0) \#define mips_emit_rotrv(rd, rt, rs) \ mips_emit_special(srlv, rs, rt, rd, 1) \#define mips_emit_sll(rd, rt, shift) \ mips_emit_special(sll, 0, rt, rd, shift) \#define mips_emit_srl(rd, rt, shift) \ mips_emit_special(srl, 0, rt, rd, shift) \#define mips_emit_sra(rd, rt, shift) \ mips_emit_special(sra, 0, rt, rd, shift) \#define mips_emit_rotr(rd, rt, shift) \ mips_emit_special(srl, 1, rt, rd, shift) \#define mips_emit_mfhi(rd) \ mips_emit_special(mfhi, 0, 0, rd, 0) \#define mips_emit_mflo(rd) \ mips_emit_special(mflo, 0, 0, rd, 0) \#define mips_emit_mthi(rs) \ mips_emit_special(mthi, rs, 0, 0, 0) \#define mips_emit_mtlo(rs) \ mips_emit_special(mtlo, rs, 0, 0, 0) \#define mips_emit_mult(rs, rt) \ mips_emit_special(mult, rs, rt, 0, 0) \#define mips_emit_multu(rs, rt) \ mips_emit_special(multu, rs, rt, 0, 0) \#define mips_emit_div(rs, rt) \ mips_emit_special(div, rs, rt, 0, 0) \#define mips_emit_divu(rs, rt) \ mips_emit_special(divu, rs, rt, 0, 0) \#define mips_emit_madd(rs, rt) \ mips_emit_special(madd, rs, rt, 0, 0) \#define mips_emit_maddu(rs, rt) \ mips_emit_special(maddu, rs, rt, 0, 0) \#define mips_emit_movn(rd, rs, rt) \ mips_emit_special(movn, rs, rt, rd, 0) \#define mips_emit_movz(rd, rs, rt) \ mips_emit_special(movz, rs, rt, rd, 0) \#define mips_emit_lb(rt, rs, offset) \ mips_emit_imm(lb, rs, rt, offset) \#define mips_emit_lbu(rt, rs, offset) \ mips_emit_imm(lbu, rs, rt, offset) \#define mips_emit_lh(rt, rs, offset) \ mips_emit_imm(lh, rs, rt, offset) \#define mips_emit_lhu(rt, rs, offset) \ mips_emit_imm(lhu, rs, rt, offset) \#define mips_emit_lw(rt, rs, offset) \ mips_emit_imm(lw, rs, rt, offset) \#define mips_emit_sb(rt, rs, offset) \ mips_emit_imm(sb, rs, rt, offset) \#define mips_emit_sh(rt, rs, offset) \ mips_emit_imm(sh, rs, rt, offset) \#define mips_emit_sw(rt, rs, offset) \ mips_emit_imm(sw, rs, rt, offset) \#define mips_emit_lui(rt, imm) \ mips_emit_imm(lui, 0, rt, imm) \#define mips_emit_addiu(rt, rs, imm) \ mips_emit_imm(addiu, rs, rt, imm) \#define mips_emit_xori(rt, rs, imm) \ mips_emit_imm(xori, rs, rt, imm) \#define mips_emit_ori(rt, rs, imm) \ mips_emit_imm(ori, rs, rt, imm) \#define mips_emit_andi(rt, rs, imm) \ mips_emit_imm(andi, rs, rt, imm) \#define mips_emit_slti(rt, rs, imm) \ mips_emit_imm(slti, rs, rt, imm) \#define mips_emit_sltiu(rt, rs, imm) \ mips_emit_imm(sltiu, rs, rt, imm) \#define mips_emit_ext(rt, rs, pos, size) \ mips_emit_special3(ext, rs, rt, (size - 1), pos) \#define mips_emit_ins(rt, rs, pos, size) \ mips_emit_special3(ins, rs, rt, (pos + size - 1), pos) \// Breaks down if the backpatch offset is greater than 16bits, take care// when using (should be okay if limited to conditional instructions)#define mips_emit_b_filler(type, rs, rt, writeback_location) \ (writeback_location) = translation_ptr; \ mips_emit_imm(type, rs, rt, 0) \// The backpatch code for this has to be handled differently than the above#define mips_emit_j_filler(writeback_location) \ (writeback_location) = translation_ptr; \ mips_emit_jump(j, 0) \#define mips_emit_b(type, rs, rt, offset) \ mips_emit_imm(type, rs, rt, offset) \#define mips_emit_j(offset) \ mips_emit_jump(j, offset) \#define mips_emit_jal(offset) \ mips_emit_jump(jal, offset) \#define mips_emit_jr(rs) \ mips_emit_special(jr, rs, 0, 0, 0) \#define mips_emit_bltzal(rs, offset) \ mips_emit_regimm(bltzal, rs, offset) \#define mips_emit_nop() \ mips_emit_sll(reg_zero, reg_zero, 0) \#define reg_base mips_reg_s0#define reg_cycles mips_reg_s1#define reg_a0 mips_reg_a0#define reg_a1 mips_reg_a1#define reg_a2 mips_reg_a2#define reg_rv mips_reg_v0#define reg_pc mips_reg_s3#define reg_temp mips_reg_at#define reg_zero mips_reg_zero#define reg_n_cache mips_reg_s4#define reg_z_cache mips_reg_s5#define reg_c_cache mips_reg_s6#define reg_v_cache mips_reg_s7#define reg_r0 mips_reg_v1#define reg_r1 mips_reg_a3#define reg_r2 mips_reg_t0#define reg_r3 mips_reg_t1#define reg_r4 mips_reg_t2#define reg_r5 mips_reg_t3#define reg_r6 mips_reg_t4#define reg_r7 mips_reg_t5#define reg_r8 mips_reg_t6#define reg_r9 mips_reg_t7#define reg_r10 mips_reg_s2#define reg_r11 mips_reg_t8#define reg_r12 mips_reg_t9#define reg_r13 mips_reg_gp#define reg_r14 mips_reg_fp// Writing to r15 goes straight to a0, to be chained with other opsu32 arm_to_mips_reg[] ={ reg_r0, reg_r1, reg_r2, reg_r3, reg_r4, reg_r5, reg_r6, reg_r7, reg_r8, reg_r9, reg_r10, reg_r11, reg_r12, reg_r13, reg_r14, reg_a0, reg_a1, reg_a2, reg_temp};#define arm_reg_a0 15#define arm_reg_a1 16#define arm_reg_a2 17#define arm_reg_temp 18#define generate_load_reg(ireg, reg_index) \ mips_emit_addu(ireg, arm_to_mips_reg[reg_index], reg_zero) \#define generate_load_imm(ireg, imm) \ if(((s32)imm >= -32768) && ((s32)imm <= 32767)) \ { \ mips_emit_addiu(ireg, reg_zero, imm); \ } \ else \ { \ if(((u32)imm >> 16) == 0x0000) \ { \ mips_emit_ori(ireg, reg_zero, imm); \ } \ else \ { \ mips_emit_lui(ireg, imm >> 16); \ \ if(((u32)imm & 0x0000FFFF) != 0x00000000) \ { \ mips_emit_ori(ireg, ireg, imm & 0xFFFF); \ } \ } \ } \#define generate_load_pc(ireg, new_pc) \
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -