Added ISUB_R instruction

armv8-a-jit
SChernykh 5 years ago
parent 3a1c58946d
commit e6065a95e9

@ -84,7 +84,7 @@ Total sum of frequencies must be 256
//Integer instructions
#define RANDOMX_FREQ_IADD_RS 16
#define RANDOMX_FREQ_IADD_M 7
#define RANDOMX_FREQ_ISUB_R 0
#define RANDOMX_FREQ_ISUB_R 16
#define RANDOMX_FREQ_ISUB_M 0
#define RANDOMX_FREQ_IMUL_R 0
#define RANDOMX_FREQ_IMUL_M 0
@ -119,7 +119,7 @@ Total sum of frequencies must be 256
#define RANDOMX_FREQ_ISTORE 0
//No-op instruction
#define RANDOMX_FREQ_NOP 233
#define RANDOMX_FREQ_NOP 217
/* ------
256
*/

@ -65,8 +65,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#define REP40(x) REP32(x) REP8(x)
#define REP64(x) REP32(x) REP32(x)
#define REP128(x) REP32(x) REP32(x) REP32(x) REP32(x)
#define REP217(x) REP128(x) REP64(x) REP25(x)
#define REP232(x) REP128(x) REP40(x) REP40(x) REP24(x)
#define REP233(x) REP128(x) REP64(x) REP32(x) REP9(x)
#define REP256(x) REP128(x) REP128(x)
#define REPNX(x,N) REP##N(x)
#define REPN(x,N) REPNX(x,N)

@ -37,6 +37,7 @@ constexpr uint32_t B = 0x14000000;
constexpr uint32_t EOR = 0xCA000000;
constexpr uint32_t EOR32 = 0x4A000000;
constexpr uint32_t ADD = 0x8B000000;
constexpr uint32_t SUB = 0xCB000000;
constexpr uint32_t MOVZ = 0xD2800000;
constexpr uint32_t MOVN = 0x92800000;
constexpr uint32_t MOVK = 0xF2800000;
@ -226,6 +227,26 @@ void JitCompilerA64::h_IADD_M(Instruction& instr, int i, uint32_t& codePos)
codePos = k;
}
void JitCompilerA64::h_ISUB_R(Instruction& instr, int i, uint32_t& codePos)
{
uint32_t k = codePos;
const uint32_t src = IntRegMap[instr.src];
const uint32_t dst = IntRegMap[instr.dst];
if (src != dst)
{
// sub dst, dst, src
emit32(ARMV8A::SUB | dst | (dst << 5) | (src << 16), code, k);
}
else
{
emitAddImmediate(dst, dst, -instr.getImm32(), code, k);
}
codePos = k;
}
void JitCompilerA64::h_NOP(Instruction& instr, int i, uint32_t& codePos)
{
}

@ -91,6 +91,7 @@ namespace randomx {
void h_IADD_RS(Instruction&, int, uint32_t&);
void h_IADD_M(Instruction&, int, uint32_t&);
void h_ISUB_R(Instruction&, int, uint32_t&);
void h_NOP(Instruction&, int, uint32_t&);
};
}

Loading…
Cancel
Save