53 lines
1.4 KiB
C
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); } |