83 lines
1.1 KiB
C++
83 lines
1.1 KiB
C++
/*
|
|
* E_Branches.h
|
|
*
|
|
*/
|
|
#pragma once
|
|
|
|
|
|
|
|
namespace ARM
|
|
{
|
|
|
|
EAPI B(u32 sImm24, ConditionCode CC=AL)
|
|
{
|
|
DECL_Id(0x0A000000);
|
|
|
|
SET_CC;
|
|
I |= ((sImm24>>2)&0xFFFFFF);
|
|
EMIT_I;
|
|
}
|
|
|
|
EAPI BL(u32 sImm24, ConditionCode CC=AL)
|
|
{
|
|
DECL_Id(0x0B000000);
|
|
|
|
SET_CC;
|
|
I |= ((sImm24>>2)&0xFFFFFF);
|
|
EMIT_I;
|
|
}
|
|
|
|
|
|
// Note: Either X variant will switch to THUMB* if bit0 of addr is 1
|
|
//
|
|
|
|
EAPI BX(eReg Rm, ConditionCode CC=AL)
|
|
{
|
|
DECL_Id(0x012FFF10);
|
|
|
|
SET_CC;
|
|
I |= (Rm&15);
|
|
EMIT_I;
|
|
}
|
|
|
|
EAPI BLX(eReg Rm, ConditionCode CC=AL) // Form II
|
|
{
|
|
DECL_Id(0x012FFF30);
|
|
|
|
SET_CC;
|
|
I |= (Rm&15);
|
|
EMIT_I;
|
|
}
|
|
|
|
EAPI BXJ(eReg Rm, ConditionCode CC=AL)
|
|
{
|
|
DECL_Id(0x012FFF20);
|
|
|
|
SET_CC;
|
|
I |= (Rm&15);
|
|
EMIT_I;
|
|
}
|
|
|
|
|
|
|
|
|
|
// This encoding looks correct, but segfaults, the pc val is align(pc,4) but this should be right in ARM
|
|
//
|
|
#if defined(_DEVEL)
|
|
EAPI BLX(u32 sImm24, bool toThumb) // Form I * H is derived so not needed, fixup sImm24 so one can just pass a real addr
|
|
{
|
|
DECL_Id(0xFA000000);
|
|
|
|
if(toThumb)
|
|
I |= 1<<24; // SET_H
|
|
|
|
I |= ((sImm24>>2)&0xFFFFFF);
|
|
EMIT_I;
|
|
}
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
}; |