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;
39 struct ProgramConfiguration;
40 class SuperscalarProgram;
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> &);
56 return (ProgramFunc*)code;
57 }
59 return (DatasetInitFunc*)code;
60 }
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
int * count
Definition: gmock_stress_test.cc:176
Definition: base.py:1
Definition: allocator.cpp:35
void() DatasetInitFunc(randomx_cache *cache, uint8_t *dataset, uint32_t startBlock, uint32_t endBlock)
Definition: common.hpp:182
constexpr int RegistersCount
Definition: common.hpp:149
void(JitCompilerX86::* InstructionGeneratorX86)(Instruction &, int)
Definition: jit_compiler_x86.hpp:44
void() ProgramFunc(RegisterFile &, MemoryRegisters &, uint8_t *, uint64_t)
Definition: common.hpp:181
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