BizHawk/attic/PsxHawk.Core/asm.h

53 lines
1.4 KiB
C

#pragma once
#include "types.h"
//jtype
#define OPCODE_J 2
#define OPCODE_JAL 3
//rtype
#define FUNCTION_JR 8
#define FUNCTION_BREAK 13
//itype
#define OPCODE_ORI 13
#define OPCODE_LUI 15
inline u32 ASM_JTYPE(const u32 opcode, const u32 target)
{
assert((target&3)==0);
assert(opcode<64);
const u32 _target = target & ~0xF0000000;
return (opcode<<26)|(_target>>2);
}
inline u32 ASM_JAL(const u32 target) { return ASM_JTYPE(OPCODE_JAL,target); }
inline u32 ASM_RTYPE(const u32 function, const u32 rs, const u32 rt, const u32 rd, const u32 sa)
{
assert(function<64);
assert(rs<32);
assert(rt<32);
assert(rd<32);
assert(sa<32);
return (rs<<21)|(rt<<16)|(rd<<11)|(sa<<6)|function;
}
inline u32 ASM_JR(const u32 rs) { return ASM_RTYPE(FUNCTION_JR, rs, 0, 0, 0); }
inline u32 ASM_NOP() { return 0; }
inline u32 ASM_BREAK(const u32 code)
{
assert(code<(1<<20));
return (code<<6)|FUNCTION_BREAK;
}
inline u32 ASM_ITYPE(const u32 opcode, const u32 rs, const u32 rt, const u32 immediate)
{
assert(opcode<64);
assert(rs<32);
assert(rt<32);
assert(immediate<65536);
return (opcode<<26)|(rs<<21)|(rt<<16)|immediate;
}
inline u32 ASM_LUI(const u32 rt, const u32 immediate) { return ASM_ITYPE(OPCODE_LUI,0,rt,immediate); }
inline u32 ASM_ORI(const u32 rt, const u32 rs, const u32 immediate) { return ASM_ITYPE(OPCODE_ORI,rs,rt,immediate); }