Monero
Loading...
Searching...
No Matches
jit_compiler_a64.hpp
Go to the documentation of this file.
1/*
2Copyright (c) 2018-2019, tevador <tevador@gmail.com>
3Copyright (c) 2019, SChernykh <https://github.com/SChernykh>
4
5All rights reserved.
6
7Redistribution and use in source and binary forms, with or without
8modification, are permitted provided that the following conditions are met:
9 * Redistributions of source code must retain the above copyright
10 notice, this list of conditions and the following disclaimer.
11 * Redistributions in binary form must reproduce the above copyright
12 notice, this list of conditions and the following disclaimer in the
13 documentation and/or other materials provided with the distribution.
14 * Neither the name of the copyright holder nor the
15 names of its contributors may be used to endorse or promote products
16 derived from this software without specific prior written permission.
17
18THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
19ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
22FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
24SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
25CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
26OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28*/
29
30#pragma once
31
32#include <cstdint>
33#include <vector>
34#include <stdexcept>
35#include "common.hpp"
37
38namespace randomx {
39
40 class Program;
43 class Instruction;
44
46
48 public:
51
54
55 template<size_t N>
56 void generateSuperscalarHash(SuperscalarProgram(&programs)[N], std::vector<uint64_t> &);
57
59
60 ProgramFunc* getProgramFunc() { return reinterpret_cast<ProgramFunc*>(code); }
62 uint8_t* getCode() { return code; }
63 size_t getCodeSize();
64
65 void enableWriting();
66 void enableExecution();
67 void enableAll();
68
69 private:
75
76 static void emit32(uint32_t val, uint8_t* code, uint32_t& codePos)
77 {
78 *(uint32_t*)(code + codePos) = val;
79 codePos += sizeof(val);
80 }
81
82 static void emit64(uint64_t val, uint8_t* code, uint32_t& codePos)
83 {
84 memcpy(code + codePos, &val, sizeof(val));
85 codePos += sizeof(val);
86 }
87
88 void emitMovImmediate(uint32_t dst, uint32_t imm, uint8_t* code, uint32_t& codePos);
89 void emitAddImmediate(uint32_t dst, uint32_t src, uint32_t imm, uint8_t* code, uint32_t& codePos);
90
91 template<uint32_t tmp_reg>
92 void emitMemLoad(uint32_t dst, uint32_t src, Instruction& instr, uint8_t* code, uint32_t& codePos);
93
94 template<uint32_t tmp_reg_fp>
95 void emitMemLoadFP(uint32_t src, Instruction& instr, uint8_t* code, uint32_t& codePos);
96
126 void h_NOP(Instruction&, uint32_t&);
127 };
128}
Definition instruction.hpp:75
Definition jit_compiler_a64.hpp:47
void h_ISMULH_M(Instruction &, uint32_t &)
Definition jit_compiler_a64.cpp:670
void h_IADD_RS(Instruction &, uint32_t &)
Definition jit_compiler_a64.cpp:515
void emitAddImmediate(uint32_t dst, uint32_t src, uint32_t imm, uint8_t *code, uint32_t &codePos)
Definition jit_compiler_a64.cpp:412
static void emit32(uint32_t val, uint8_t *code, uint32_t &codePos)
Definition jit_compiler_a64.hpp:76
uint8_t * getCode()
Definition jit_compiler_a64.hpp:62
void h_IMULH_M(Instruction &, uint32_t &)
Definition jit_compiler_a64.cpp:639
void h_FMUL_R(Instruction &, uint32_t &)
Definition jit_compiler_a64.cpp:908
size_t getCodeSize()
Definition jit_compiler_a64.cpp:359
void h_ISUB_M(Instruction &, uint32_t &)
Definition jit_compiler_a64.cpp:571
void h_IXOR_M(Instruction &, uint32_t &)
Definition jit_compiler_a64.cpp:755
void h_IXOR_R(Instruction &, uint32_t &)
Definition jit_compiler_a64.cpp:735
void enableAll()
Definition jit_compiler_a64.cpp:121
uint32_t literalPos
Definition jit_compiler_a64.hpp:73
void h_IMUL_M(Instruction &, uint32_t &)
Definition jit_compiler_a64.cpp:608
void generateSuperscalarHash(SuperscalarProgram(&programs)[N], std::vector< uint64_t > &)
Definition jit_compiler_a64.cpp:235
void emitMemLoadFP(uint32_t src, Instruction &instr, uint8_t *code, uint32_t &codePos)
Definition jit_compiler_a64.cpp:481
static void emit64(uint64_t val, uint8_t *code, uint32_t &codePos)
Definition jit_compiler_a64.hpp:82
void h_INEG_R(Instruction &, uint32_t &)
Definition jit_compiler_a64.cpp:725
void enableExecution()
Definition jit_compiler_a64.cpp:116
void h_FSUB_M(Instruction &, uint32_t &)
Definition jit_compiler_a64.cpp:886
void h_FSQRT_R(Instruction &, uint32_t &)
Definition jit_compiler_a64.cpp:937
uint8_t * code
Definition jit_compiler_a64.hpp:72
void h_IROR_R(Instruction &, uint32_t &)
Definition jit_compiler_a64.cpp:772
JitCompilerA64()
Definition jit_compiler_a64.cpp:91
void emitMemLoad(uint32_t dst, uint32_t src, Instruction &instr, uint8_t *code, uint32_t &codePos)
Definition jit_compiler_a64.cpp:448
void generateProgram(Program &, ProgramConfiguration &)
Definition jit_compiler_a64.cpp:126
void generateDatasetInitCode()
Definition jit_compiler_a64.hpp:58
static InstructionGeneratorA64 engine[256]
Definition jit_compiler_a64.hpp:70
void h_IMULH_R(Instruction &, uint32_t &)
Definition jit_compiler_a64.cpp:625
void h_ISTORE(Instruction &, uint32_t &)
Definition jit_compiler_a64.cpp:995
void h_CFROUND(Instruction &, uint32_t &)
Definition jit_compiler_a64.cpp:971
uint32_t reg_changed_offset[8]
Definition jit_compiler_a64.hpp:71
void h_IROL_R(Instruction &, uint32_t &)
Definition jit_compiler_a64.cpp:791
void enableWriting()
Definition jit_compiler_a64.cpp:111
void h_IADD_M(Instruction &, uint32_t &)
Definition jit_compiler_a64.cpp:533
void h_ISWAP_R(Instruction &, uint32_t &)
Definition jit_compiler_a64.cpp:818
void generateProgramLight(Program &, ProgramConfiguration &, uint32_t)
Definition jit_compiler_a64.cpp:177
void h_FSUB_R(Instruction &, uint32_t &)
Definition jit_compiler_a64.cpp:878
void h_NOP(Instruction &, uint32_t &)
Definition jit_compiler_a64.cpp:1025
void h_FADD_M(Instruction &, uint32_t &)
Definition jit_compiler_a64.cpp:863
void h_IMUL_RCP(Instruction &, uint32_t &)
Definition jit_compiler_a64.cpp:687
~JitCompilerA64()
Definition jit_compiler_a64.cpp:106
void h_CBRANCH(Instruction &, uint32_t &)
Definition jit_compiler_a64.cpp:944
DatasetInitFunc * getDatasetInitFunc()
Definition jit_compiler_a64.cpp:354
void h_FSWAP_R(Instruction &, uint32_t &)
Definition jit_compiler_a64.cpp:838
void h_ISUB_R(Instruction &, uint32_t &)
Definition jit_compiler_a64.cpp:550
void emitMovImmediate(uint32_t dst, uint32_t imm, uint8_t *code, uint32_t &codePos)
Definition jit_compiler_a64.cpp:364
void h_FDIV_M(Instruction &, uint32_t &)
Definition jit_compiler_a64.cpp:916
void h_ISMULH_R(Instruction &, uint32_t &)
Definition jit_compiler_a64.cpp:656
void h_FADD_R(Instruction &, uint32_t &)
Definition jit_compiler_a64.cpp:855
ProgramFunc * getProgramFunc()
Definition jit_compiler_a64.hpp:60
void h_FSCAL_R(Instruction &, uint32_t &)
Definition jit_compiler_a64.cpp:901
void h_IMUL_R(Instruction &, uint32_t &)
Definition jit_compiler_a64.cpp:588
uint32_t num32bitLiterals
Definition jit_compiler_a64.hpp:74
Definition program.hpp:44
Definition superscalar_program.hpp:37
void * memcpy(void *a, const void *b, size_t c)
Definition glibc_compat.cpp:16
Definition allocator.cpp:35
void ProgramFunc(RegisterFile &, MemoryRegisters &, uint8_t *, uint64_t)
Definition common.hpp:188
void(JitCompilerA64::* InstructionGeneratorA64)(Instruction &, uint32_t &)
Definition jit_compiler_a64.hpp:45
void DatasetInitFunc(randomx_cache *cache, uint8_t *dataset, uint32_t startBlock, uint32_t endBlock)
Definition common.hpp:189
const portMappingElt code
Definition portlistingparse.c:22
unsigned int uint32_t
Definition stdint.h:126
unsigned char uint8_t
Definition stdint.h:124
unsigned __int64 uint64_t
Definition stdint.h:136
Definition program.hpp:39