Monero
Loading...
Searching...
No Matches
jit_compiler_x86.hpp
Go to the documentation of this file.
1/*
2Copyright (c) 2018-2019, tevador <tevador@gmail.com>
3
4All rights reserved.
5
6Redistribution and use in source and binary forms, with or without
7modification, are permitted provided that the following conditions are met:
8 * Redistributions of source code must retain the above copyright
9 notice, this list of conditions and the following disclaimer.
10 * Redistributions in binary form must reproduce the above copyright
11 notice, this list of conditions and the following disclaimer in the
12 documentation and/or other materials provided with the distribution.
13 * Neither the name of the copyright holder nor the
14 names of its contributors may be used to endorse or promote products
15 derived from this software without specific prior written permission.
16
17THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
18ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
21FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
23SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
24CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
25OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27*/
28
29#pragma once
30
31#include <cstdint>
32#include <cstring>
33#include <vector>
34#include "common.hpp"
35
36namespace randomx {
37
38 class Program;
41 class JitCompilerX86;
42 class Instruction;
43
45
47 public:
52 template<size_t N>
53 void generateSuperscalarHash(SuperscalarProgram (&programs)[N], std::vector<uint64_t> &);
62 return code;
63 }
64 size_t getCodeSize();
65 void enableWriting();
66 void enableExecution();
67 void enableAll();
68 private:
70 std::vector<int32_t> instructionOffsets;
74
77 void genAddressReg(Instruction&, bool);
80 void genSIB(int scale, int index, int base);
81
82 void generateCode(Instruction&, int);
83 void generateSuperscalarCode(Instruction &, std::vector<uint64_t> &);
84
85 void emitByte(uint8_t val) {
86 code[codePos] = val;
87 codePos++;
88 }
89
90 void emit32(uint32_t val) {
91 memcpy(code + codePos, &val, sizeof val);
92 codePos += sizeof val;
93 }
94
95 void emit64(uint64_t val) {
96 memcpy(code + codePos, &val, sizeof val);
97 codePos += sizeof val;
98 }
99
100 template<size_t N>
101 void emit(const uint8_t (&src)[N]) {
102 emit(src, N);
103 }
104
105 void emit(const uint8_t* src, size_t count) {
106 memcpy(code + codePos, src, count);
107 codePos += count;
108 }
109
110 void h_IADD_RS(Instruction&, int);
111 void h_IADD_M(Instruction&, int);
112 void h_ISUB_R(Instruction&, int);
113 void h_ISUB_M(Instruction&, int);
114 void h_IMUL_R(Instruction&, int);
115 void h_IMUL_M(Instruction&, int);
116 void h_IMULH_R(Instruction&, int);
117 void h_IMULH_M(Instruction&, int);
118 void h_ISMULH_R(Instruction&, int);
119 void h_ISMULH_M(Instruction&, int);
120 void h_IMUL_RCP(Instruction&, int);
121 void h_INEG_R(Instruction&, int);
122 void h_IXOR_R(Instruction&, int);
123 void h_IXOR_M(Instruction&, int);
124 void h_IROR_R(Instruction&, int);
125 void h_IROL_R(Instruction&, int);
126 void h_ISWAP_R(Instruction&, int);
127 void h_FSWAP_R(Instruction&, int);
128 void h_FADD_R(Instruction&, int);
129 void h_FADD_M(Instruction&, int);
130 void h_FSUB_R(Instruction&, int);
131 void h_FSUB_M(Instruction&, int);
132 void h_FSCAL_R(Instruction&, int);
133 void h_FMUL_R(Instruction&, int);
134 void h_FDIV_M(Instruction&, int);
135 void h_FSQRT_R(Instruction&, int);
136 void h_CBRANCH(Instruction&, int);
137 void h_CFROUND(Instruction&, int);
138 void h_ISTORE(Instruction&, int);
139 void h_NOP(Instruction&, int);
140 };
141
142}
Definition instruction.hpp:75
Definition jit_compiler_x86.hpp:46
size_t getCodeSize()
Definition jit_compiler_x86.cpp:222
void h_IMUL_R(Instruction &, int)
Definition jit_compiler_x86.cpp:534
void h_IXOR_M(Instruction &, int)
Definition jit_compiler_x86.cpp:650
void h_INEG_R(Instruction &, int)
Definition jit_compiler_x86.cpp:631
DatasetInitFunc * getDatasetInitFunc()
Definition jit_compiler_x86.hpp:58
uint8_t * getCode()
Definition jit_compiler_x86.hpp:61
void generateProgramEpilogue(Program &, ProgramConfiguration &)
Definition jit_compiler_x86.cpp:326
int32_t codePos
Definition jit_compiler_x86.hpp:73
void h_ISTORE(Instruction &, int)
Definition jit_compiler_x86.cpp:800
void h_FSWAP_R(Instruction &, int)
Definition jit_compiler_x86.cpp:704
void h_IROL_R(Instruction &, int)
Definition jit_compiler_x86.cpp:680
void h_ISUB_M(Instruction &, int)
Definition jit_compiler_x86.cpp:519
~JitCompilerX86()
Definition jit_compiler_x86.cpp:234
void h_FADD_R(Instruction &, int)
Definition jit_compiler_x86.cpp:710
void emit32(uint32_t val)
Definition jit_compiler_x86.hpp:90
void emitByte(uint8_t val)
Definition jit_compiler_x86.hpp:85
void h_FSUB_R(Instruction &, int)
Definition jit_compiler_x86.cpp:725
void h_FSCAL_R(Instruction &, int)
Definition jit_compiler_x86.cpp:740
void enableAll()
Definition jit_compiler_x86.cpp:238
int registerUsage[RegistersCount]
Definition jit_compiler_x86.hpp:71
uint8_t * code
Definition jit_compiler_x86.hpp:72
ProgramFunc * getProgramFunc()
Definition jit_compiler_x86.hpp:55
void h_IXOR_R(Instruction &, int)
Definition jit_compiler_x86.cpp:637
void generateProgramLight(Program &, ProgramConfiguration &, uint32_t)
Definition jit_compiler_x86.cpp:257
void h_CFROUND(Instruction &, int)
Definition jit_compiler_x86.cpp:768
void h_ISWAP_R(Instruction &, int)
Definition jit_compiler_x86.cpp:695
void emit(const uint8_t *src, size_t count)
Definition jit_compiler_x86.hpp:105
void genSIB(int scale, int index, int base)
Definition jit_compiler_x86.cpp:502
std::vector< int32_t > instructionOffsets
Definition jit_compiler_x86.hpp:70
void h_ISMULH_R(Instruction &, int)
Definition jit_compiler_x86.cpp:591
static InstructionGeneratorX86 engine[256]
Definition jit_compiler_x86.hpp:69
void h_IMULH_M(Instruction &, int)
Definition jit_compiler_x86.cpp:572
void h_ISUB_R(Instruction &, int)
Definition jit_compiler_x86.cpp:506
void emit64(uint64_t val)
Definition jit_compiler_x86.hpp:95
void h_FDIV_M(Instruction &, int)
Definition jit_compiler_x86.cpp:753
void h_IMULH_R(Instruction &, int)
Definition jit_compiler_x86.cpp:562
void emit(const uint8_t(&src)[N])
Definition jit_compiler_x86.hpp:101
void generateSuperscalarCode(Instruction &, std::vector< uint64_t > &)
Definition jit_compiler_x86.cpp:347
void enableExecution()
Definition jit_compiler_x86.cpp:246
void generateDatasetInitCode()
Definition jit_compiler_x86.cpp:300
void h_NOP(Instruction &, int)
Definition jit_compiler_x86.cpp:807
void genAddressRegDst(Instruction &)
Definition jit_compiler_x86.cpp:455
void h_IMUL_M(Instruction &, int)
Definition jit_compiler_x86.cpp:547
void enableWriting()
Definition jit_compiler_x86.cpp:242
void generateCode(Instruction &, int)
Definition jit_compiler_x86.cpp:341
void genAddressImm(Instruction &)
Definition jit_compiler_x86.cpp:471
void generateProgram(Program &, ProgramConfiguration &)
Definition jit_compiler_x86.cpp:250
void h_CBRANCH(Instruction &, int)
Definition jit_compiler_x86.cpp:779
void h_IADD_RS(Instruction &, int)
Definition jit_compiler_x86.cpp:475
void h_FMUL_R(Instruction &, int)
Definition jit_compiler_x86.cpp:746
void generateProgramPrologue(Program &, ProgramConfiguration &)
Definition jit_compiler_x86.cpp:304
void generateSuperscalarHash(SuperscalarProgram(&programs)[N], std::vector< uint64_t > &)
Definition jit_compiler_x86.cpp:269
void h_IADD_M(Instruction &, int)
Definition jit_compiler_x86.cpp:487
void h_FSUB_M(Instruction &, int)
Definition jit_compiler_x86.cpp:732
JitCompilerX86()
Definition jit_compiler_x86.cpp:226
void h_FADD_M(Instruction &, int)
Definition jit_compiler_x86.cpp:717
void genAddressReg(Instruction &, bool)
Definition jit_compiler_x86.cpp:441
void h_FSQRT_R(Instruction &, int)
Definition jit_compiler_x86.cpp:762
void h_IROR_R(Instruction &, int)
Definition jit_compiler_x86.cpp:665
void h_IMUL_RCP(Instruction &, int)
Definition jit_compiler_x86.cpp:620
void h_ISMULH_M(Instruction &, int)
Definition jit_compiler_x86.cpp:601
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 base.py:1
Definition allocator.cpp:35
void ProgramFunc(RegisterFile &, MemoryRegisters &, uint8_t *, uint64_t)
Definition common.hpp:188
constexpr int RegistersCount
Definition common.hpp:156
void(JitCompilerX86::* InstructionGeneratorX86)(Instruction &, int)
Definition jit_compiler_x86.hpp:44
void DatasetInitFunc(randomx_cache *cache, uint8_t *dataset, uint32_t startBlock, uint32_t endBlock)
Definition common.hpp:189
unsigned int uint32_t
Definition stdint.h:126
signed int int32_t
Definition stdint.h:123
unsigned char uint8_t
Definition stdint.h:124
unsigned __int64 uint64_t
Definition stdint.h:136
Definition program.hpp:39