122 lines
4.2 KiB
C
122 lines
4.2 KiB
C
|
|
#define u32 uint32_t
|
|
#define u8 uint8_t
|
|
|
|
#include <stdio.h>
|
|
#include <stdint.h>
|
|
#include "mips_codegen.h"
|
|
|
|
int main() {
|
|
u32 buffer[1024];
|
|
u8 *translation_ptr = (u8*)&buffer[0];
|
|
|
|
mips_emit_nop();
|
|
mips_emit_nop();
|
|
|
|
mips_emit_addu(mips_reg_a0, mips_reg_a1, mips_reg_a2);
|
|
mips_emit_addu(mips_reg_sp, mips_reg_ra, mips_reg_s4);
|
|
mips_emit_subu(mips_reg_a0, mips_reg_a1, mips_reg_a2);
|
|
mips_emit_subu(mips_reg_sp, mips_reg_ra, mips_reg_s4);
|
|
mips_emit_xor(mips_reg_a0, mips_reg_a1, mips_reg_a2);
|
|
mips_emit_xor(mips_reg_sp, mips_reg_ra, mips_reg_s4);
|
|
mips_emit_and(mips_reg_a0, mips_reg_a1, mips_reg_a2);
|
|
mips_emit_and(mips_reg_sp, mips_reg_ra, mips_reg_s4);
|
|
mips_emit_or(mips_reg_a0, mips_reg_a1, mips_reg_a2);
|
|
mips_emit_or(mips_reg_sp, mips_reg_ra, mips_reg_s4);
|
|
mips_emit_nor(mips_reg_a0, mips_reg_a1, mips_reg_a2);
|
|
mips_emit_nor(mips_reg_sp, mips_reg_ra, mips_reg_s4);
|
|
|
|
mips_emit_slt(mips_reg_a0, mips_reg_a1, mips_reg_a2);
|
|
mips_emit_slt(mips_reg_sp, mips_reg_ra, mips_reg_s4);
|
|
mips_emit_sltu(mips_reg_a0, mips_reg_a1, mips_reg_a2);
|
|
mips_emit_sltu(mips_reg_sp, mips_reg_ra, mips_reg_s4);
|
|
|
|
mips_emit_sllv(mips_reg_a0, mips_reg_a1, mips_reg_a2);
|
|
mips_emit_sllv(mips_reg_sp, mips_reg_ra, mips_reg_s4);
|
|
mips_emit_srlv(mips_reg_a0, mips_reg_a1, mips_reg_a2);
|
|
mips_emit_srlv(mips_reg_sp, mips_reg_ra, mips_reg_s4);
|
|
mips_emit_srav(mips_reg_a0, mips_reg_a1, mips_reg_a2);
|
|
mips_emit_srav(mips_reg_sp, mips_reg_ra, mips_reg_s4);
|
|
mips_emit_rotrv(mips_reg_a0, mips_reg_a1, mips_reg_a2);
|
|
mips_emit_rotrv(mips_reg_sp, mips_reg_ra, mips_reg_s4);
|
|
|
|
for (unsigned i = 0; i < 4; i++) {
|
|
mips_emit_sll(mips_reg_a0, mips_reg_a1, (i & 1) + (i >> 1) * 30);
|
|
mips_emit_srl(mips_reg_a0, mips_reg_a1, (i & 1) + (i >> 1) * 30);
|
|
mips_emit_sra(mips_reg_a0, mips_reg_a1, (i & 1) + (i >> 1) * 30);
|
|
mips_emit_rotr(mips_reg_a0, mips_reg_a1, (i & 1) + (i >> 1) * 30);
|
|
}
|
|
|
|
mips_emit_lui(mips_reg_a0, 0xFFFF);
|
|
mips_emit_lui(mips_reg_a0, 0x8000);
|
|
mips_emit_lui(mips_reg_a0, 0);
|
|
mips_emit_lui(mips_reg_a0, 1);
|
|
|
|
const int imm[] = {-1, 0, 1, 0x8000, 0x7FFF};
|
|
for (unsigned i = 0; i < 5; i++) {
|
|
mips_emit_addiu(mips_reg_a0, mips_reg_s6, imm[i]);
|
|
mips_emit_xori(mips_reg_a0, mips_reg_s6, imm[i]);
|
|
mips_emit_ori(mips_reg_a0, mips_reg_s6, imm[i]);
|
|
mips_emit_andi(mips_reg_a0, mips_reg_s6, imm[i]);
|
|
mips_emit_slti(mips_reg_a0, mips_reg_s6, imm[i]);
|
|
mips_emit_sltiu(mips_reg_a0, mips_reg_s6, imm[i]);
|
|
}
|
|
|
|
mips_emit_mflo(mips_reg_a3);
|
|
mips_emit_mflo(mips_reg_fp);
|
|
mips_emit_mfhi(mips_reg_a3);
|
|
mips_emit_mfhi(mips_reg_fp);
|
|
mips_emit_mtlo(mips_reg_a3);
|
|
mips_emit_mtlo(mips_reg_fp);
|
|
mips_emit_mthi(mips_reg_a3);
|
|
mips_emit_mthi(mips_reg_fp);
|
|
|
|
mips_emit_mult(mips_reg_a2, mips_reg_a3);
|
|
mips_emit_mult(mips_reg_s2, mips_reg_s4);
|
|
mips_emit_multu(mips_reg_a2, mips_reg_a3);
|
|
mips_emit_multu(mips_reg_s2, mips_reg_s4);
|
|
mips_emit_div(mips_reg_a2, mips_reg_a3);
|
|
mips_emit_div(mips_reg_s2, mips_reg_s4);
|
|
mips_emit_divu(mips_reg_a2, mips_reg_a3);
|
|
mips_emit_divu(mips_reg_s2, mips_reg_s4);
|
|
|
|
mips_emit_jr(mips_reg_a1);
|
|
mips_emit_jr(mips_reg_ra);
|
|
mips_emit_jalr(mips_reg_a1);
|
|
mips_emit_jalr(mips_reg_s4);
|
|
|
|
mips_emit_bltzal(mips_reg_a0, 5);
|
|
mips_emit_bltzal(mips_reg_s4, 4);
|
|
mips_emit_bgezal(mips_reg_a0, 3);
|
|
mips_emit_bgezal(mips_reg_s4, 2);
|
|
mips_emit_bltz(mips_reg_a0, 1);
|
|
mips_emit_bltz(mips_reg_s4, 0);
|
|
|
|
const int off[] = {0, 1, -1, 0x7FFF, -0x8000};
|
|
for (unsigned i = 0; i < 5; i++) {
|
|
mips_emit_lb(mips_reg_a0, mips_reg_a1, off[i]);
|
|
mips_emit_lbu(mips_reg_a0, mips_reg_a1, off[i]);
|
|
mips_emit_lh(mips_reg_a0, mips_reg_a1, off[i]);
|
|
mips_emit_lhu(mips_reg_a0, mips_reg_a1, off[i]);
|
|
mips_emit_lw(mips_reg_a0, mips_reg_a1, off[i]);
|
|
}
|
|
for (unsigned i = 0; i < 5; i++) {
|
|
mips_emit_sb(mips_reg_a0, mips_reg_a1, off[i]);
|
|
mips_emit_sh(mips_reg_a0, mips_reg_a1, off[i]);
|
|
mips_emit_sw(mips_reg_a0, mips_reg_a1, off[i]);
|
|
}
|
|
|
|
// MIPS32r2/PSP instructions
|
|
mips_emit_ext(mips_reg_v0, mips_reg_a1, 20, 4);
|
|
mips_emit_ext(mips_reg_t7, mips_reg_s4, 3, 9);
|
|
mips_emit_ins(mips_reg_v0, mips_reg_a1, 20, 4);
|
|
mips_emit_ins(mips_reg_t7, mips_reg_s4, 3, 9);
|
|
|
|
mips_emit_seb(mips_reg_a3, mips_reg_t1);
|
|
mips_emit_seh(mips_reg_a3, mips_reg_t1);
|
|
|
|
fwrite(buffer, 1, translation_ptr-(u8*)buffer, stdout);
|
|
}
|
|
|
|
|