Monero
Loading...
Searching...
No Matches
jit_compiler_rv64.cpp File Reference
#include <stdexcept>
#include <cstring>
#include <climits>
#include <cassert>
#include "jit_compiler_rv64.hpp"
#include "jit_compiler_rv64_static.hpp"
#include "superscalar.hpp"
#include "program.hpp"
#include "reciprocal.h"
#include "virtual_memory.h"
#include "instruction_weights.hpp"
Include dependency graph for jit_compiler_rv64.cpp:

Namespaces

namespace  rv64
namespace  randomx

Macros

#define HANDLER_ARGS   randomx::CompilerState& state, randomx::Instruction isn, int i
#define INST_HANDLE1(x)
#define INST_HANDLE2(x)

Functions

constexpr int randomx::maskLog2 (uint32_t x, int prev)
constexpr int32_t randomx::unsigned32ToSigned2sCompl (uint32_t x)
constexpr int randomx::rvrd (int reg)
constexpr int randomx::rvrs1 (int reg)
constexpr int randomx::rvrs2 (int reg)
constexpr int randomx::rvcrs (int reg)
constexpr uint32_t randomx::rvi (uint32_t op, int rd, int rs1, int rs2=0)
constexpr uint16_t randomx::rvc (uint16_t op, int rd, int rs)
constexpr uint16_t randomx::rvc (uint16_t op, int imm5, int rd, int imm40)
constexpr int randomx::regR (int reg)
constexpr int randomx::regLoA (int reg)
constexpr int randomx::regHiA (int reg)
constexpr int randomx::regLoF (int reg)
constexpr int randomx::regHiF (int reg)
constexpr int randomx::regLoE (int reg)
constexpr int randomx::regHiE (int reg)
constexpr int randomx::regRcp (int reg)
constexpr int randomx::regRcpF (int reg)
constexpr int randomx::regSS (int reg)
static void randomx::clearCache (CodeBuffer &buf)
static void randomx::emitImm32 (CodeBuffer &buf, int32_t imm, int dst, int src=0, int tmp=0)
static void randomx::genAddressRegImm (CodeBuffer &buf, const Instruction &isn)
static void randomx::genAddressReg (CodeBuffer &buf, const Instruction &isn)
static void randomx::loadFromScratchpad (CodeBuffer &buf, const Instruction &isn)
static void randomx::genAddressRegDst (CodeBuffer &buf, const Instruction &isn)
static void randomx::emitRcpLiteral1 (CodeBuffer &buf, uint64_t literal)
static void randomx::emitRcpLiteral2 (CodeBuffer &buf, uint64_t literal, int32_t numLiterals)
static void randomx::emitJump (CodeBuffer &buf, int dst, int32_t codePos, int32_t targetPos)
static void randomx::emitInstruction (CompilerState &state, Instruction isn, int i)
static void randomx::emitProgramPrefix (CompilerState &state, Program &prog, ProgramConfiguration &pcfg)
static void randomx::emitProgramSuffix (CompilerState &state, ProgramConfiguration &pcfg)
static void randomx::generateSuperscalarCode (CodeBuffer &buf, Instruction isn, const std::vector< uint64_t > &reciprocalCache)
static void randomx::v1_IADD_RS (HANDLER_ARGS)
static void randomx::v1_IADD_M (HANDLER_ARGS)
static void randomx::v1_ISUB_R (HANDLER_ARGS)
static void randomx::v1_ISUB_M (HANDLER_ARGS)
static void randomx::v1_IMUL_R (HANDLER_ARGS)
static void randomx::v1_IMUL_M (HANDLER_ARGS)
static void randomx::v1_IMULH_R (HANDLER_ARGS)
static void randomx::v1_IMULH_M (HANDLER_ARGS)
static void randomx::v1_ISMULH_R (HANDLER_ARGS)
static void randomx::v1_ISMULH_M (HANDLER_ARGS)
static void randomx::v1_IMUL_RCP (HANDLER_ARGS)
static void randomx::v1_INEG_R (HANDLER_ARGS)
static void randomx::v1_IXOR_R (HANDLER_ARGS)
static void randomx::v1_IXOR_M (HANDLER_ARGS)
static void randomx::v1_IROR_R (HANDLER_ARGS)
static void randomx::v1_IROL_R (HANDLER_ARGS)
static void randomx::v1_ISWAP_R (HANDLER_ARGS)
static void randomx::v1_FSWAP_R (HANDLER_ARGS)
static void randomx::v1_FADD_R (HANDLER_ARGS)
static void randomx::v1_FADD_M (HANDLER_ARGS)
static void randomx::v1_FSUB_R (HANDLER_ARGS)
static void randomx::v1_FSUB_M (HANDLER_ARGS)
static void randomx::v1_FSCAL_R (HANDLER_ARGS)
static void randomx::v1_FMUL_R (HANDLER_ARGS)
static void randomx::v1_FDIV_M (HANDLER_ARGS)
static void randomx::v1_FSQRT_R (HANDLER_ARGS)
static void randomx::v1_CBRANCH (HANDLER_ARGS)
static void randomx::v1_CFROUND (HANDLER_ARGS)
static void randomx::v1_ISTORE (HANDLER_ARGS)
static void randomx::v1_NOP (HANDLER_ARGS)

Variables

constexpr uint16_t rv64::C_LUI = 0x6001
constexpr uint32_t rv64::LUI = 0x00000037
constexpr uint16_t rv64::C_ADDI = 0x0001
constexpr uint32_t rv64::ADDI = 0x00000013
constexpr uint32_t rv64::ADDIW = 0x0000001b
constexpr uint16_t rv64::C_ADD = 0x9002
constexpr uint32_t rv64::ADD = 0x00000033
constexpr uint32_t rv64::SHXADD = 0x20000033
constexpr uint32_t rv64::SLL = 0x00001033
constexpr uint32_t rv64::SRL = 0x00005033
constexpr uint32_t rv64::SLLI = 0x00001013
constexpr uint32_t rv64::C_SLLI = 0x0002
constexpr uint32_t rv64::SRLI = 0x00005013
constexpr uint32_t rv64::AND = 0x00007033
constexpr uint32_t rv64::ANDI = 0x00007013
constexpr uint16_t rv64::C_AND = 0x8c61
constexpr uint16_t rv64::C_ANDI = 0x8801
constexpr uint32_t rv64::OR = 0x00006033
constexpr uint16_t rv64::C_OR = 0x8c41
constexpr uint32_t rv64::XOR = 0x00004033
constexpr uint16_t rv64::C_XOR = 0x8c21
constexpr uint32_t rv64::LD = 0x00003003
constexpr uint16_t rv64::C_LD = 0x6000
constexpr uint16_t rv64::C_LW = 0x4000
constexpr uint32_t rv64::SD = 0x00003023
constexpr uint32_t rv64::SUB = 0x40000033
constexpr uint16_t rv64::C_SUB = 0x8c01
constexpr uint32_t rv64::MUL = 0x02000033
constexpr uint32_t rv64::MULHU = 0x02003033
constexpr uint32_t rv64::MULH = 0x02001033
constexpr uint16_t rv64::C_MV = 0x8002
constexpr uint32_t rv64::ROR = 0x60005033
constexpr uint32_t rv64::RORI = 0x60005013
constexpr uint32_t rv64::ROL = 0x60001033
constexpr uint32_t rv64::FMV_X_D = 0xe2000053
constexpr uint32_t rv64::FMV_D_X = 0xf2000053
constexpr uint32_t rv64::FMV_D = 0x22000053
constexpr uint32_t rv64::FADD_D = 0x02007053
constexpr uint32_t rv64::FSUB_D = 0x0a007053
constexpr uint32_t rv64::FMUL_D = 0x12007053
constexpr uint32_t rv64::FDIV_D = 0x1a007053
constexpr uint32_t rv64::FSQRT_D = 0x5a007053
constexpr uint32_t rv64::FCVT_D_W = 0xd2000053
constexpr uint32_t rv64::FSRM = 0x00201073
constexpr uint16_t rv64::C_BEQZ = 0xc001
constexpr uint32_t rv64::BEQ = 0x00000063
constexpr uint16_t rv64::C_BNEZ = 0xe001
constexpr uint32_t rv64::JAL = 0x0000006f
constexpr uint16_t rv64::C_RET = 0x8082
constexpr size_t randomx::MaxRandomXInstrCodeSize = 56
constexpr size_t randomx::MaxSuperscalarInstrSize = 12
constexpr size_t randomx::SuperscalarProgramHeader = 136
constexpr size_t randomx::CodeAlign = 4096
constexpr size_t randomx::LiteralPoolSize = CodeAlign
constexpr size_t randomx::SuperscalarLiteraPoolSize = RANDOMX_CACHE_ACCESSES * CodeAlign
constexpr size_t randomx::ReserveCodeSize = CodeAlign
constexpr size_t randomx::RandomXCodeSize = alignSize(LiteralPoolSize + ReserveCodeSize + MaxRandomXInstrCodeSize * RANDOMX_PROGRAM_SIZE, CodeAlign)
constexpr size_t randomx::SuperscalarSize = alignSize(SuperscalarLiteraPoolSize + ReserveCodeSize + (SuperscalarProgramHeader + MaxSuperscalarInstrSize * SuperscalarMaxSize) * RANDOMX_CACHE_ACCESSES, CodeAlign)
constexpr uint32_t randomx::ExecutableSize = CodeSize - LiteralPoolSize
constexpr int32_t randomx::LiteralPoolOffset = LiteralPoolSize / 2
constexpr int32_t randomx::SuperScalarLiteralPoolOffset = RandomXCodeSize
constexpr int32_t randomx::SuperScalarLiteralPoolRefOffset = RandomXCodeSize + (RANDOMX_CACHE_ACCESSES - 1) * LiteralPoolSize + LiteralPoolOffset
constexpr int32_t randomx::SuperScalarHashOffset = SuperScalarLiteralPoolOffset + SuperscalarLiteraPoolSize
constexpr int randomx::MaskL1Shift = 32 - maskLog2(RANDOMX_SCRATCHPAD_L1, 0)
constexpr int randomx::MaskL2Shift = 32 - maskLog2(RANDOMX_SCRATCHPAD_L2, 0)
constexpr int randomx::MaskL3Shift = 32 - maskLog2(RANDOMX_SCRATCHPAD_L3, 0)
constexpr int randomx::RcpLiteralsOffset = 144
constexpr int randomx::LiteralPoolReg = 3
constexpr int randomx::SpadReg = 5
constexpr int randomx::DataReg = 6
constexpr int randomx::SuperscalarReg = 7
constexpr int randomx::SshTmp1Reg = 28
constexpr int randomx::SshTmp2Reg = 29
constexpr int randomx::SshPoolReg = 30
constexpr int randomx::SshRcpReg = 31
constexpr int randomx::Tmp1Reg = 8
constexpr int randomx::Tmp2Reg = 9
constexpr int randomx::Tmp1RegF = 24
constexpr int randomx::Tmp2RegF = 25
constexpr int randomx::MaskL1Reg = 10
constexpr int randomx::MaskL2Reg = 11
constexpr int randomx::MaskFscalReg = 12
constexpr int randomx::MaskEclear = 13
constexpr int randomx::MaskEsetLo = 14
constexpr int randomx::MaskEsetHi = 15
constexpr int randomx::MaskL3Reg = 1
constexpr int randomx::ReturnReg = 1
constexpr int randomx::SpAddr0Reg = 26
constexpr int randomx::OffsetXC = -8
constexpr int randomx::OffsetR = 16
constexpr int randomx::OffsetF = 0
constexpr int randomx::OffsetE = 8
constexpr int randomx::OffsetA = 16
constexpr int randomx::OffsetRcp = 28
constexpr int randomx::OffsetRcpF = 22
constexpr int randomx::OffsetSsh = 8
static const uint8_trandomx::codeLiterals = (uint8_t*)&randomx_riscv64_literals
static const uint8_trandomx::codeLiteralsEnd = (uint8_t*)&randomx_riscv64_literals_end
static const uint8_trandomx::codeDataInit = (uint8_t*)&randomx_riscv64_data_init
static const uint8_trandomx::codeFixDataCall = (uint8_t*)&randomx_riscv64_fix_data_call
static const uint8_trandomx::codePrologue = (uint8_t*)&randomx_riscv64_prologue
static const uint8_trandomx::codeLoopBegin = (uint8_t*)&randomx_riscv64_loop_begin
static const uint8_trandomx::codeDataRead = (uint8_t*)&randomx_riscv64_data_read
static const uint8_trandomx::codeDataReadLight = (uint8_t*)&randomx_riscv64_data_read_light
static const uint8_trandomx::codeFixLoopCall = (uint8_t*)&randomx_riscv64_fix_loop_call
static const uint8_trandomx::codeSpadStore = (uint8_t*)&randomx_riscv64_spad_store
static const uint8_trandomx::codeSpadStoreHardAes = (uint8_t*)&randomx_riscv64_spad_store_hardaes
static const uint8_trandomx::codeSpadStoreSoftAes = (uint8_t*)&randomx_riscv64_spad_store_softaes
static const uint8_trandomx::codeLoopEnd = (uint8_t*)&randomx_riscv64_loop_end
static const uint8_trandomx::codeFixContinueLoop = (uint8_t*)&randomx_riscv64_fix_continue_loop
static const uint8_trandomx::codeEpilogue = (uint8_t*)&randomx_riscv64_epilogue
static const uint8_trandomx::codeSoftAes = (uint8_t*)&randomx_riscv64_softaes
static const uint8_trandomx::codeProgramEnd = (uint8_t*)&randomx_riscv64_program_end
static const uint8_trandomx::codeSshInit = (uint8_t*)&randomx_riscv64_ssh_init
static const uint8_trandomx::codeSshLoad = (uint8_t*)&randomx_riscv64_ssh_load
static const uint8_trandomx::codeSshPrefetch = (uint8_t*)&randomx_riscv64_ssh_prefetch
static const uint8_trandomx::codeSshEnd = (uint8_t*)&randomx_riscv64_ssh_end
static const int32_t randomx::sizeLiterals = codeLiteralsEnd - codeLiterals
static const int32_t randomx::sizeDataInit = codePrologue - codeDataInit
static const int32_t randomx::sizePrologue = codeLoopBegin - codePrologue
static const int32_t randomx::sizeLoopBegin = codeDataRead - codeLoopBegin
static const int32_t randomx::sizeDataRead = codeDataReadLight - codeDataRead
static const int32_t randomx::sizeDataReadLight = codeSpadStore - codeDataReadLight
static const int32_t randomx::sizeSpadStore = codeSpadStoreHardAes - codeSpadStore
static const int32_t randomx::sizeSpadStoreSoftAes = codeLoopEnd - codeSpadStoreSoftAes
static const int32_t randomx::sizeLoopEnd = codeEpilogue - codeLoopEnd
static const int32_t randomx::sizeEpilogue = codeSoftAes - codeEpilogue
static const int32_t randomx::sizeSoftAes = codeProgramEnd - codeSoftAes
static const int32_t randomx::sizeSshInit = codeSshLoad - codeSshInit
static const int32_t randomx::sizeSshLoad = codeSshPrefetch - codeSshLoad
static const int32_t randomx::sizeSshPrefetch = codeSshEnd - codeSshPrefetch
static const int32_t randomx::offsetFixDataCall = codeFixDataCall - codeDataInit
static const int32_t randomx::offsetFixLoopCall = codeFixLoopCall - codeDataReadLight
static const int32_t randomx::offsetFixContinueLoop = codeFixContinueLoop - codeLoopEnd
static const int32_t randomx::LoopTopPos = LiteralPoolSize + sizeDataInit + sizePrologue
static const int32_t randomx::RandomXCodePos = LoopTopPos + sizeLoopBegin

Macro Definition Documentation

◆ HANDLER_ARGS

#define HANDLER_ARGS   randomx::CompilerState& state, randomx::Instruction isn, int i

◆ INST_HANDLE1

#define INST_HANDLE1 ( x)
Value:
REPN(&randomx::v1_##x, WT(x))
#define REPN(x, N)
#define WT(x)

◆ INST_HANDLE2

#define INST_HANDLE2 ( x)
Value:
REPN(&randomx::v2_##x, WT(x))